Update web-platform-tests to revision 78f764c05c229883e87ad135c7153051a66e2851
|
@ -0,0 +1,19 @@
|
|||
[global-immutable-prototype.any.worker.html]
|
||||
[Setting to a different prototype]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[global-immutable-prototype.any.sharedworker.html]
|
||||
[Immutability of the global prototype chain]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[global-immutable-prototype.any.serviceworker.html]
|
||||
[Immutability of the global prototype chain]
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[global-immutable-prototype.any.html]
|
||||
[Setting to a different prototype]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[flex-basis-010.html]
|
||||
expected: FAIL
|
|
@ -323,3 +323,15 @@
|
|||
[Matching font-style: 'italic' should prefer 'oblique 20deg' over 'oblique 30deg 60deg']
|
||||
expected: FAIL
|
||||
|
||||
[Matching font-style: 'oblique 10deg' should prefer 'oblique -50deg -20deg' over 'oblique -40deg -30deg']
|
||||
expected: FAIL
|
||||
|
||||
[Matching font-weight: '399' should prefer '500 501' over '502 510']
|
||||
expected: FAIL
|
||||
|
||||
[Matching font-stretch: '100%' should prefer '100%' over '110% 120%']
|
||||
expected: FAIL
|
||||
|
||||
[Matching font-style: 'oblique -10deg' should prefer 'oblique -50deg -40deg' over 'italic']
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[stacking-context-001.html]
|
||||
expected: TIMEOUT
|
|
@ -3,3 +3,18 @@
|
|||
[customElements.define must upgrade elements in the shadow-including tree order]
|
||||
expected: FAIL
|
||||
|
||||
[customElements.define must get "observedAttributes" property on the constructor prototype when "attributeChangedCallback" is present]
|
||||
expected: FAIL
|
||||
|
||||
[customElements.define must rethrow an exception thrown while retrieving Symbol.iterator on disabledFeatures]
|
||||
expected: FAIL
|
||||
|
||||
[customElements.define must rethrow an exception thrown while getting disabledFeatures on the constructor prototype]
|
||||
expected: FAIL
|
||||
|
||||
[customElements.define must rethrow an exception thrown while iterating over disabledFeatures to sequence<DOMString>]
|
||||
expected: FAIL
|
||||
|
||||
[customElements.define must rethrow an exception thrown while converting the value of disabledFeatures to sequence<DOMString>]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[HTMLMediaElement.html]
|
||||
expected: CRASH
|
|
@ -0,0 +1,7 @@
|
|||
[HTMLMetaElement.html]
|
||||
[httpEquiv on HTMLMetaElement must enqueue an attributeChanged reaction when adding a new attribute]
|
||||
expected: FAIL
|
||||
|
||||
[httpEquiv on HTMLMetaElement must enqueue an attributeChanged reaction when replacing an existing attribute]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[Event-dispatch-listener-order.window.html]
|
||||
[Event-dispatch-listener-order]
|
||||
expected: FAIL
|
||||
|
109
tests/wpt/metadata/dom/nodes/Document-createEvent.https.html.ini
Normal file
|
@ -0,0 +1,109 @@
|
|||
[Document-createEvent.https.html]
|
||||
[createEvent('TextEvent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[compositionevent should be an alias for CompositionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('DRAGEVENT') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[DEVICEMOTIONEVENT should be an alias for DeviceMotionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "CloseEvent"]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('DeviceMotionEvent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "ProgressEvent"]
|
||||
expected: FAIL
|
||||
|
||||
[TEXTEVENT should be an alias for CompositionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('compositionevent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[devicemotionevent should be an alias for DeviceMotionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('DeviceOrientationEvent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "PageTransitionEvent"]
|
||||
expected: FAIL
|
||||
|
||||
[DRAGEVENT should be an alias for DragEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[TextEvent should be an alias for CompositionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('COMPOSITIONEVENT') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[DEVICEORIENTATIONEVENT should be an alias for DeviceOrientationEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('dragevent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('textevent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[CompositionEvent should be an alias for CompositionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('DEVICEMOTIONEVENT') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('devicemotionevent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[DragEvent should be an alias for DragEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[dragevent should be an alias for DragEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[textevent should be an alias for CompositionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "PopStateEvent"]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('CompositionEvent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[deviceorientationevent should be an alias for DeviceOrientationEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[DeviceOrientationEvent should be an alias for DeviceOrientationEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "WebGLContextEvent"]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('DEVICEORIENTATIONEVENT') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('TEXTEVENT') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('DragEvent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "ErrorEvent"]
|
||||
expected: FAIL
|
||||
|
||||
[COMPOSITIONEVENT should be an alias for CompositionEvent.]
|
||||
expected: FAIL
|
||||
|
||||
[createEvent('deviceorientationevent') should be initialized correctly.]
|
||||
expected: FAIL
|
||||
|
||||
[DeviceMotionEvent should be an alias for DeviceMotionEvent.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
[report.tentative.https.sub.html]
|
||||
expected: TIMEOUT
|
|
@ -1,4 +0,0 @@
|
|||
[javascript-url-abort-return-value-string.tentative.html]
|
||||
[Aborting fetch for javascript:string navigation]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
[navigation-unload-same-origin-fragment.html]
|
||||
[Tests that a fragment navigation in the unload handler will not block the initial navigation]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_1.html]
|
||||
[Multiple history traversals from the same task]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[traverse_the_history_5.html]
|
||||
[Multiple history traversals, last would be aborted]
|
||||
expected: FAIL
|
||||
|
|
@ -8,3 +8,12 @@
|
|||
[Integer value of 0 should not activate the feature]
|
||||
expected: FAIL
|
||||
|
||||
[Invalid feature names should not tokenize as "noopener"]
|
||||
expected: FAIL
|
||||
|
||||
[Integer value of 0 should not activate "noopener"]
|
||||
expected: FAIL
|
||||
|
||||
[Feature "noopener" should be converted to ASCII lowercase]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
[open-features-tokenization-noreferrer.html]
|
||||
[Tokenizing "noreferrer" should ignore window feature separators except "," after initial "=" and before value]
|
||||
expected: FAIL
|
||||
|
||||
[Tokenizing "noreferrer" should read characters until first window feature separator as `value`]
|
||||
expected: FAIL
|
||||
|
||||
[After "noreferrer", tokenization should skip window features separators that are not "=" or ","]
|
||||
expected: FAIL
|
||||
|
||||
[Integer values other than 0 should activate the feature]
|
||||
expected: FAIL
|
||||
|
||||
[Tokenization of "noreferrer" should skip window features separators before feature]
|
||||
expected: FAIL
|
||||
|
||||
[Feature "noreferrer" should be converted to ASCII lowercase]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[window-open-noreferrer.html]
|
||||
[window.open() with "noreferrer" tests]
|
||||
expected: FAIL
|
||||
|
|
@ -6783,12 +6783,6 @@
|
|||
[HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -6807,12 +6801,6 @@
|
|||
[HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -6831,12 +6819,6 @@
|
|||
[HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: attribute crossOrigin]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -6855,12 +6837,6 @@
|
|||
[HTMLMediaElement interface: attribute controls]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLMediaElement interface: attribute audioTracks]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMediaElement interface: attribute videoTracks]
|
||||
expected: PASS
|
||||
|
||||
[HTMLMapElement interface: attribute name]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -9375,6 +9351,27 @@
|
|||
[HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLOptionElement interface: named constructor]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLOptionElement interface: named constructor prototype property]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLAudioElement interface: named constructor without 'new']
|
||||
expected: FAIL
|
||||
|
||||
[HTMLOptionElement interface: named constructor object]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLOptionElement interface: named constructor name]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLOptionElement interface: named constructor length]
|
||||
expected: FAIL
|
||||
|
||||
[HTMLImageElement interface: named constructor without 'new']
|
||||
expected: FAIL
|
||||
|
||||
|
||||
[interfaces.https.html?exclude=(Document|Window|HTML.*)]
|
||||
[HTML IDL tests]
|
||||
|
@ -9407,177 +9404,12 @@
|
|||
[DOMStringList interface: operation contains(DOMString)]
|
||||
expected: FAIL
|
||||
|
||||
[AudioTrackList interface: existence and properties of interface object]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface object length]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface object name]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: existence and properties of interface prototype object]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: attribute length]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: operation getTrackById(DOMString)]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: attribute onchange]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: attribute onaddtrack]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrackList interface: attribute onremovetrack]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: existence and properties of interface object]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface object length]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface object name]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: existence and properties of interface prototype object]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: attribute id]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: attribute kind]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: attribute label]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: attribute language]
|
||||
expected: PASS
|
||||
|
||||
[AudioTrack interface: attribute enabled]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: existence and properties of interface object]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface object length]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface object name]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: existence and properties of interface prototype object]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: attribute length]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: operation getTrackById(DOMString)]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: attribute selectedIndex]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: attribute onchange]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: attribute onaddtrack]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrackList interface: attribute onremovetrack]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: existence and properties of interface object]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface object length]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface object name]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: existence and properties of interface prototype object]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: attribute id]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: attribute kind]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: attribute label]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: attribute language]
|
||||
expected: PASS
|
||||
|
||||
[VideoTrack interface: attribute selected]
|
||||
expected: PASS
|
||||
|
||||
[TextTrack interface: attribute inBandMetadataTrackDispatchType]
|
||||
expected: FAIL
|
||||
|
||||
[TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[TrackEvent interface: existence and properties of interface object]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface object length]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface object name]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface: existence and properties of interface prototype object]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface: existence and properties of interface prototype object's @@unscopables property]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface: attribute track]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})]
|
||||
expected: PASS
|
||||
|
||||
[Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})]
|
||||
expected: PASS
|
||||
|
||||
[TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type]
|
||||
expected: PASS
|
||||
|
||||
[ValidityState must be primary interface of document.createElement("input").validity]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
[table-ua-stylesheet.html]
|
||||
[Computed 'display' on table should match html spec]
|
||||
expected: FAIL
|
||||
|
||||
[Computed 'box-sizing' on table should match html spec]
|
||||
expected: FAIL
|
||||
|
||||
[Computed 'border-collapse' on table should match html spec]
|
||||
expected: FAIL
|
||||
|
||||
[Computed 'text-indent' on table should match html spec]
|
||||
expected: FAIL
|
||||
|
||||
[Computed 'border-spacing' on table should match html spec]
|
||||
expected: FAIL
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
[non-active-document.html]
|
||||
[DOMParser]
|
||||
expected: FAIL
|
||||
|
||||
[createHTMLDocument]
|
||||
expected: FAIL
|
||||
|
||||
[<template>]
|
||||
expected: FAIL
|
||||
|
|
@ -30,3 +30,6 @@
|
|||
[Option constructor does not set dirtiness (so, manipulating the selected content attribute still updates the selected IDL attribute)]
|
||||
expected: FAIL
|
||||
|
||||
[Prototype of object created with named constructor]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
[activation-behavior.window.html]
|
||||
[<a> that is not connected should be followed]
|
||||
expected: FAIL
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[script-onerror-insertion-point-2.html]
|
||||
expected: TIMEOUT
|
|
@ -0,0 +1,4 @@
|
|||
[activation-transfer-without-click.tentative.html]
|
||||
[User activation transfer from inactive frame]
|
||||
expected: FAIL
|
||||
|
13
tests/wpt/metadata/workers/Worker-messageport.html.ini
Normal file
|
@ -0,0 +1,13 @@
|
|||
[Worker-messageport.html]
|
||||
[Test sending message to a worker on a port.]
|
||||
expected: FAIL
|
||||
|
||||
[Test sending messages to workers with no port.]
|
||||
expected: FAIL
|
||||
|
||||
[Test getting messages from a worker on a port.]
|
||||
expected: FAIL
|
||||
|
||||
[Test sending many messages to workers using ports.]
|
||||
expected: FAIL
|
||||
|
22
tests/wpt/metadata/workers/Worker-multi-port.html.ini
Normal file
|
@ -0,0 +1,22 @@
|
|||
[Worker-multi-port.html]
|
||||
[Test postMessage without sequence throws exception]
|
||||
expected: FAIL
|
||||
|
||||
[Test postMessage on channel with previous failed postMessage calls.]
|
||||
expected: FAIL
|
||||
|
||||
[Test postMessage with no port.]
|
||||
expected: FAIL
|
||||
|
||||
[Test postMessage with two ports.]
|
||||
expected: FAIL
|
||||
|
||||
[Test postMessage with no ports and empty array.]
|
||||
expected: FAIL
|
||||
|
||||
[Test postMessage with null ports throws exception.]
|
||||
expected: FAIL
|
||||
|
||||
[Test postMessage with incorrect ports throws exception]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
[WorkerGlobalScope-close.html]
|
||||
[Test sending a message after closing.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
[005.html]
|
||||
expected: ERROR
|
||||
[dedicated worker in shared worker in dedicated worker]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -183,7 +183,7 @@ jobs:
|
|||
- template: tools/ci/azure/install_certs.yml
|
||||
- template: tools/ci/azure/update_hosts.yml
|
||||
- template: tools/ci/azure/update_manifest.yml
|
||||
- script: python ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --test-types reftest testharness --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-tbpl - --log-tbpl-level info --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json edge_webdriver
|
||||
- script: python ./wpt run --no-manifest-update --no-fail-on-unexpected --install-fonts --test-types reftest testharness --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-tbpl - --log-tbpl-level info --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json edge_webdriver
|
||||
displayName: 'Run tests'
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: 'Publish results'
|
||||
|
|
|
@ -89,6 +89,7 @@ tasks:
|
|||
--this-chunk=${chunk[1]}
|
||||
--total-chunks=${chunk[2]};
|
||||
- $if: tasks_for == "github-pull-request"
|
||||
# PR tasks that run the tests in various configurations
|
||||
then:
|
||||
# Taskcluster responds to a number of events issued by the GitHub API
|
||||
# which should not trigger re-validation.
|
||||
|
@ -166,3 +167,66 @@ tasks:
|
|||
--
|
||||
--channel=${browser.channel}
|
||||
${operation.extra_args};
|
||||
- $map:
|
||||
- name: lint
|
||||
description: >-
|
||||
Lint for wpt-specific requirements
|
||||
script: tools/ci/ci_lint.sh
|
||||
conditions:
|
||||
push
|
||||
pull-request
|
||||
each(operation):
|
||||
# Note: jsone doesn't short-circuit evaluation so all parts of the conditional are evaluated
|
||||
# Accessing properties using the [] notation allows them to evaluate as null in case they're undefined
|
||||
# TODO: Allow running pushes on branches other than master
|
||||
- $if: ("push" in operation.conditions && tasks_for == "github-push" && event['ref'] == "refs/heads/master") || ("pull-request" in operation.conditions && tasks_for == "github-pull-request" && event['action'] in ['opened', 'reopened', 'synchronize'])
|
||||
then:
|
||||
$let:
|
||||
checkout_ref:
|
||||
$if: tasks_for == "github-push"
|
||||
then:
|
||||
${event.ref}
|
||||
else:
|
||||
refs/pull/${event.number}/merge
|
||||
in:
|
||||
taskId: {$eval: 'as_slugid(operation.name)'}
|
||||
taskGroupId: {$eval: 'as_slugid("task group")'}
|
||||
created: {$fromNow: ''}
|
||||
deadline: {$fromNow: '24 hours'}
|
||||
provisionerId: aws-provisioner-v1
|
||||
workerType:
|
||||
$if: event.repository.full_name == 'web-platform-tests/wpt'
|
||||
then:
|
||||
wpt-docker-worker
|
||||
else:
|
||||
github-worker
|
||||
metadata:
|
||||
name: ${operation.name}
|
||||
description: ${operation.description}
|
||||
owner: ${event.sender.login}@users.noreply.github.com
|
||||
source: ${event.repository.url}
|
||||
payload:
|
||||
image: harjgam/web-platform-tests:0.29
|
||||
maxRunTime: 7200
|
||||
artifacts:
|
||||
public/results:
|
||||
path: /home/test/artifacts
|
||||
type: directory
|
||||
# Fetch the GitHub-provided merge commit (rather than the pull
|
||||
# request branch) so that the tasks simulate the behavior of the
|
||||
# submitted patch after it is merged. Using the merge commit also
|
||||
# simplifies detection of modified files because the first parent
|
||||
# of the merge commit can consistently be used to summarize the
|
||||
# changes.
|
||||
command:
|
||||
- /bin/bash
|
||||
- --login
|
||||
- -c
|
||||
- set -ex;
|
||||
~/start.sh
|
||||
${event.repository.clone_url}
|
||||
${checkout_ref}
|
||||
FETCH_HEAD
|
||||
none;
|
||||
cd ~/web-platform-tests;
|
||||
${operation.script};
|
||||
|
|
|
@ -28,11 +28,6 @@ matrix:
|
|||
secure: "EljDx50oNpDLs7rzwIv+z1PxIgB5KMnx1W0OQkpNvltR0rBW9g/aQaE+Z/c8M/sPqN1bkvKPybKzGKjb6j9Dw3/EJhah4SskH78r3yMAe2DU/ngxqqjjfXcCc2t5MKxzHAILTAxqScPj2z+lG1jeK1Z+K5hTbSP9lk+AvS0D16w="
|
||||
file: $WPT_MANIFEST_FILE.gz
|
||||
skip_cleanup: true
|
||||
- name: "lint"
|
||||
# lint is run both on master and on PRs
|
||||
os: linux
|
||||
python: "2.7"
|
||||
env: JOB=lint SCRIPT=tools/ci/ci_lint.sh
|
||||
- name: "update-built-tests.sh"
|
||||
if: type = pull_request
|
||||
os: linux
|
||||
|
|
|
@ -198,7 +198,7 @@
|
|||
("empty", "", None),
|
||||
("onlyspace", " ", None),
|
||||
("space", " 100", 100),
|
||||
("whitespace", "\n\t\f100", 100),
|
||||
("whitespace", "\r\n\t\f100", 100),
|
||||
("plus", "+100", 100),
|
||||
("minus", "-100", None),
|
||||
("octal", "0100", 100),
|
||||
|
@ -235,11 +235,13 @@
|
|||
for name, string, exp in cases:
|
||||
code = ""
|
||||
code, testing, expected = gen(name, string, exp, code)
|
||||
# We need to replace \r with 
 because \r\n gets converted to \n in the HTML parser.
|
||||
htmlString = string.replace('\r', '
')
|
||||
tests.append( {
|
||||
"name": "size.attributes.parse.%s" % name,
|
||||
"desc": "Parsing of non-negative integers",
|
||||
"testing": testing,
|
||||
"canvas": 'width="%s" height="%s"' % (string, string),
|
||||
"canvas": 'width="%s" height="%s"' % (htmlString, htmlString),
|
||||
"code": code,
|
||||
"expected": expected
|
||||
} )
|
||||
|
|
|
@ -4,101 +4,79 @@
|
|||
<meta name="help" href="https://w3c.github.io/IndexedDB/#inject-key-into-value">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="support.js"></script>
|
||||
<script src="support-promises.js"></script>
|
||||
<script>
|
||||
|
||||
indexeddb_test(
|
||||
(t, db) => {
|
||||
promise_test(async t => {
|
||||
const db = await createDatabase(t, db => {
|
||||
db.createObjectStore('store');
|
||||
},
|
||||
(t, db) => {
|
||||
const tx = db.transaction('store', 'readwrite');
|
||||
const request = tx.objectStore('store').put(
|
||||
'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']);
|
||||
});
|
||||
|
||||
const setter_called = false;
|
||||
Object.defineProperty(Object.prototype, '10', {
|
||||
configurable: true,
|
||||
set: t.step_func((value) => { setter_called = true; }),
|
||||
});
|
||||
request.onerror = t.unreached_func('request should not fail');
|
||||
request.onsuccess = t.step_func(() => {
|
||||
const result = request.result;
|
||||
assert_false(setter_called,
|
||||
'Setter should not be called for key result.');
|
||||
assert_true(
|
||||
result.hasOwnProperty('10'),
|
||||
'Result should have own-property overriding prototype setter.');
|
||||
assert_equals(result[10], 'key',
|
||||
'Result should have expected property.');
|
||||
let setter_called = false;
|
||||
Object.defineProperty(Object.prototype, '10', {
|
||||
configurable: true,
|
||||
set: value => { setter_called = true; },
|
||||
});
|
||||
t.add_cleanup(() => { delete Object.prototype['10']; });
|
||||
|
||||
delete Object.prototype['10'];
|
||||
t.done();
|
||||
});
|
||||
},
|
||||
'Returning keys to script should bypass prototype setters'
|
||||
);
|
||||
const tx = db.transaction('store', 'readwrite');
|
||||
const result = await promiseForRequest(t, tx.objectStore('store').put(
|
||||
'value', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'key']));
|
||||
|
||||
indexeddb_test(
|
||||
(t, db) => {
|
||||
assert_false(setter_called,
|
||||
'Setter should not be called for key result.');
|
||||
assert_true(result.hasOwnProperty('10'),
|
||||
'Result should have own-property overriding prototype setter.');
|
||||
assert_equals(result[10], 'key',
|
||||
'Result should have expected property.');
|
||||
}, 'Returning keys to script should bypass prototype setters');
|
||||
|
||||
promise_test(async t => {
|
||||
const db = await createDatabase(t, db => {
|
||||
db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'});
|
||||
},
|
||||
(t, db) => {
|
||||
const tx = db.transaction('store', 'readwrite');
|
||||
tx.objectStore('store').put({});
|
||||
const request = tx.objectStore('store').get(1);
|
||||
});
|
||||
|
||||
const setter_called = false;
|
||||
Object.defineProperty(Object.prototype, 'id', {
|
||||
configurable: true,
|
||||
set: t.step_func(function(value) { setter_called = true; }),
|
||||
});
|
||||
request.onerror = t.unreached_func('request should not fail');
|
||||
request.onsuccess = t.step_func(function() {
|
||||
const result = request.result;
|
||||
assert_false(setter_called,
|
||||
'Setter should not be called for key result.');
|
||||
assert_true(
|
||||
result.hasOwnProperty('id'),
|
||||
'Result should have own-property overriding prototype setter.');
|
||||
assert_equals(result.id, 1,
|
||||
'Own property should match primary key generator value');
|
||||
let setter_called = false;
|
||||
Object.defineProperty(Object.prototype, 'id', {
|
||||
configurable: true,
|
||||
set: value => { setter_called = true; },
|
||||
});
|
||||
t.add_cleanup(() => { delete Object.prototype['id']; });
|
||||
|
||||
delete Object.prototype['id'];
|
||||
t.done();
|
||||
});
|
||||
},
|
||||
'Returning values to script should bypass prototype setters'
|
||||
);
|
||||
const tx = db.transaction('store', 'readwrite');
|
||||
tx.objectStore('store').put({});
|
||||
const result = await promiseForRequest(t, tx.objectStore('store').get(1));
|
||||
|
||||
indexeddb_test(
|
||||
(t, db) => {
|
||||
assert_false(setter_called,
|
||||
'Setter should not be called for key result.');
|
||||
assert_true(result.hasOwnProperty('id'),
|
||||
'Result should have own-property overriding prototype setter.');
|
||||
assert_equals(result.id, 1,
|
||||
'Own property should match primary key generator value');
|
||||
}, 'Returning values to script should bypass prototype setters');
|
||||
|
||||
promise_test(async t => {
|
||||
const db = await createDatabase(t, db => {
|
||||
db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.c'});
|
||||
},
|
||||
(t, db) => {
|
||||
const tx = db.transaction('store', 'readwrite');
|
||||
tx.objectStore('store').put({});
|
||||
const request = tx.objectStore('store').get(1);
|
||||
});
|
||||
|
||||
Object.prototype.a = {b: {c: 'on proto'}};
|
||||
Object.prototype.a = {b: {c: 'on proto'}};
|
||||
t.add_cleanup(() => { delete Object.prototype.a; });
|
||||
|
||||
request.onerror = t.unreached_func('request should not fail');
|
||||
request.onsuccess = t.step_func(function() {
|
||||
const result = request.result;
|
||||
assert_true(result.hasOwnProperty('a'),
|
||||
'Result should have own-properties overriding prototype.');
|
||||
assert_true(result.a.hasOwnProperty('b'),
|
||||
'Result should have own-properties overriding prototype.');
|
||||
assert_true(result.a.b.hasOwnProperty('c'),
|
||||
'Result should have own-properties overriding prototype.');
|
||||
assert_equals(result.a.b.c, 1,
|
||||
'Own property should match primary key generator value');
|
||||
assert_equals(Object.prototype.a.b.c, 'on proto',
|
||||
'Prototype should not be modified');
|
||||
t.done();
|
||||
});
|
||||
},
|
||||
'Returning values to script should bypass prototype chain'
|
||||
);
|
||||
const tx = db.transaction('store', 'readwrite');
|
||||
tx.objectStore('store').put({});
|
||||
const result = await promiseForRequest(t, tx.objectStore('store').get(1));
|
||||
|
||||
assert_true(result.hasOwnProperty('a'),
|
||||
'Result should have own-properties overriding prototype.');
|
||||
assert_true(result.a.hasOwnProperty('b'),
|
||||
'Result should have own-properties overriding prototype.');
|
||||
assert_true(result.a.b.hasOwnProperty('c'),
|
||||
'Result should have own-properties overriding prototype.');
|
||||
assert_equals(result.a.b.c, 1,
|
||||
'Own property should match primary key generator value');
|
||||
assert_equals(Object.prototype.a.b.c, 'on proto',
|
||||
'Prototype should not be modified');
|
||||
}, 'Returning values to script should bypass prototype chain');
|
||||
|
||||
</script>
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
// META: global=window,worker
|
||||
// META: title=Immutability of the global prototype chain
|
||||
|
||||
const objects = [];
|
||||
setup(() => {
|
||||
for (let object = self; object; object = Object.getPrototypeOf(object)) {
|
||||
objects.push(object);
|
||||
}
|
||||
});
|
||||
|
||||
test(() => {
|
||||
for (const object of objects) {
|
||||
assert_throws(new TypeError(), () => {
|
||||
Object.setPrototypeOf(object, {});
|
||||
});
|
||||
}
|
||||
}, "Setting to a different prototype");
|
||||
|
||||
test(() => {
|
||||
for (const object of objects) {
|
||||
const expected = Object.getPrototypeOf(object);
|
||||
Object.setPrototypeOf(object, expected);
|
||||
assert_equals(Object.getPrototypeOf(object), expected);
|
||||
}
|
||||
}, "Setting to the same prototype");
|
0
tests/wpt/web-platform-tests/acid/acid2/reference.html
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid2/reference.png
Executable file → Normal file
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
0
tests/wpt/web-platform-tests/acid/acid2/test.html
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/empty.css
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/empty.html
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/empty.png
Executable file → Normal file
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 260 B |
0
tests/wpt/web-platform-tests/acid/acid3/empty.txt
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/empty.xml
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/favicon.ico
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/reference.png
Executable file → Normal file
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
0
tests/wpt/web-platform-tests/acid/acid3/reference.sub.html
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/support-a.png
Executable file → Normal file
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
0
tests/wpt/web-platform-tests/acid/acid3/support-b.png
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/svg.xml
Executable file → Normal file
Before Width: | Height: | Size: 386 B After Width: | Height: | Size: 386 B |
0
tests/wpt/web-platform-tests/acid/acid3/xhtml.1
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/xhtml.2
Executable file → Normal file
0
tests/wpt/web-platform-tests/acid/acid3/xhtml.3
Executable file → Normal file
|
@ -48,7 +48,11 @@ async_test(t => {
|
|||
animation.play();
|
||||
|
||||
assert_equals(data, '0.4');
|
||||
waitForAsyncAnimationFrames(1).then(t.step_func_done(() => {
|
||||
|
||||
// wait until local times are synced back to the main thread.
|
||||
waitForAnimationFrameWithCondition(_ => {
|
||||
return getComputedStyle(target).opacity != '1';
|
||||
}).then(t.step_func_done(() => {
|
||||
assert_equals(getComputedStyle(target).opacity, '0.5');
|
||||
}));
|
||||
});
|
||||
|
|
|
@ -16,7 +16,10 @@
|
|||
const animation = new WorkletAnimation('constant_time', effect);
|
||||
animation.play();
|
||||
|
||||
await waitForAsyncAnimationFrames(1);
|
||||
// wait until local times are synced back to the main thread.
|
||||
await waitForAnimationFrameWithCondition(_ => {
|
||||
return getComputedStyle(target).opacity != '1';
|
||||
});
|
||||
assert_equals(getComputedStyle(target).opacity, "0.5");
|
||||
}, "Simple worklet animation should output values at specified local time");
|
||||
</script>
|
|
@ -29,7 +29,10 @@
|
|||
const animation = new WorkletAnimation('test_animator', effect, document.timeline, options);
|
||||
animation.play();
|
||||
|
||||
await waitForAsyncAnimationFrames(1);
|
||||
// wait until local times are synced back to the main thread.
|
||||
await waitForAnimationFrameWithCondition(_ => {
|
||||
return getComputedStyle(target).opacity != '1';
|
||||
});
|
||||
assert_equals(getComputedStyle(target).opacity, "0.5");
|
||||
}, "Animator should be able to use options to update the animation");
|
||||
</script>
|
|
@ -16,6 +16,19 @@ function registerConstantLocalTimeAnimator(localTime) {
|
|||
`);
|
||||
}
|
||||
|
||||
// TODO(majidvp): This is used to sidestep a bug where we currently animate
|
||||
// with currentTime=NaN when scroll timeline is not active. Remove once we fix
|
||||
// http://crbug.com/937456
|
||||
function registerPassthroughExceptNaNAnimator() {
|
||||
return runInAnimationWorklet(`
|
||||
registerAnimator('passthrough_except_nan', class {
|
||||
animate(currentTime, effect) {
|
||||
if (Number.isNaN(currentTime)) return;
|
||||
effect.localTime = currentTime;
|
||||
}
|
||||
});
|
||||
`);
|
||||
}
|
||||
|
||||
function runInAnimationWorklet(code) {
|
||||
return CSS.animationWorklet.addModule(
|
||||
|
|
|
@ -33,7 +33,11 @@ runInAnimationWorklet(
|
|||
const effect = new KeyframeEffect(target, [{ opacity: 0 }], { duration: 1000 });
|
||||
const animation = new WorkletAnimation('iframe_animator', effect);
|
||||
animation.play();
|
||||
waitForAnimationFrames(2).then(_ => {
|
||||
|
||||
// wait until local times are synced back to the main thread.
|
||||
waitForAnimationFrameWithCondition(_ => {
|
||||
return getComputedStyle(target).opacity != '1';
|
||||
}).then(_ => {
|
||||
window.parent.postMessage(getComputedStyle(target).opacity, '*');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -57,14 +57,15 @@ function createAndPlayTestAnimation(elements, timeline_orientation) {
|
|||
timeRange: 1000,
|
||||
orientation: timeline_orientation
|
||||
});
|
||||
const animation = new WorkletAnimation('passthrough', effect, timeline);
|
||||
const animation = new WorkletAnimation('passthrough_except_nan', effect, timeline);
|
||||
animation.play();
|
||||
return animation;
|
||||
}
|
||||
|
||||
setup(setupAndRegisterTests, {explicit_done: true});
|
||||
|
||||
function setupAndRegisterTests() {
|
||||
registerPassthroughAnimator().then(() => {
|
||||
registerPassthroughExceptNaNAnimator().then(() => {
|
||||
// Note that block horizontal-tb is tested implicitly in the basic
|
||||
// ScrollTimeline tests (as it is the default).
|
||||
async_test(
|
||||
|
@ -90,14 +91,14 @@ function setupAndRegisterTests() {
|
|||
|
||||
function block_vertical_lr(t) {
|
||||
const elements = createTestDOM(true, 'vertical-lr', 'ltr');
|
||||
createAndPlayTestAnimation(elements, 'block');
|
||||
const animation = createAndPlayTestAnimation(elements, 'block');
|
||||
|
||||
// Move the scroller to the 25% point.
|
||||
const maxScroll =
|
||||
elements.scroller.scrollWidth - elements.scroller.clientWidth;
|
||||
elements.scroller.scrollLeft = 0.25 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
|
||||
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
|
||||
assert_equals(
|
||||
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
|
||||
}));
|
||||
|
@ -105,7 +106,7 @@ function block_vertical_lr(t) {
|
|||
|
||||
function block_vertical_rl(t) {
|
||||
const elements = createTestDOM(true, 'vertical-rl', 'ltr');
|
||||
createAndPlayTestAnimation(elements, 'block');
|
||||
const animation = createAndPlayTestAnimation(elements, 'block');
|
||||
|
||||
// Move the scroller to the 75% point. Since it is vertical-rl, this is
|
||||
// equivalent to the 25% point for the ScrollTimeline.
|
||||
|
@ -113,7 +114,7 @@ function block_vertical_rl(t) {
|
|||
elements.scroller.scrollWidth - elements.scroller.clientWidth;
|
||||
elements.scroller.scrollLeft = 0.75 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
|
||||
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
|
||||
assert_equals(
|
||||
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
|
||||
}));
|
||||
|
@ -121,7 +122,7 @@ function block_vertical_rl(t) {
|
|||
|
||||
function inline_horizontal_tb_rtl(t) {
|
||||
const elements = createTestDOM(true, 'horizontal-tb', 'rtl');
|
||||
createAndPlayTestAnimation(elements, 'inline');
|
||||
const animation = createAndPlayTestAnimation(elements, 'inline');
|
||||
|
||||
// Move the scroller to the 75% point. Since it is direction: rtl, this is
|
||||
// equivalent to the 25% point for the ScrollTimeline.
|
||||
|
@ -129,7 +130,7 @@ function inline_horizontal_tb_rtl(t) {
|
|||
elements.scroller.scrollWidth - elements.scroller.clientWidth;
|
||||
elements.scroller.scrollLeft = 0.75 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
|
||||
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
|
||||
assert_equals(
|
||||
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
|
||||
}));
|
||||
|
@ -137,14 +138,14 @@ function inline_horizontal_tb_rtl(t) {
|
|||
|
||||
function inline_vertical_writing_mode_ltr(t) {
|
||||
const elements = createTestDOM(false, 'vertical-lr', 'ltr');
|
||||
createAndPlayTestAnimation(elements, 'inline');
|
||||
const animation = createAndPlayTestAnimation(elements, 'inline');
|
||||
|
||||
// Move the scroller to the 25% point.
|
||||
const maxScroll =
|
||||
elements.scroller.scrollHeight - elements.scroller.clientHeight;
|
||||
elements.scroller.scrollTop = 0.25 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
|
||||
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
|
||||
assert_equals(
|
||||
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
|
||||
}));
|
||||
|
@ -152,7 +153,7 @@ function inline_vertical_writing_mode_ltr(t) {
|
|||
|
||||
function inline_vertical_writing_mode_rtl(t) {
|
||||
const elements = createTestDOM(false, 'vertical-lr', 'rtl');
|
||||
createAndPlayTestAnimation(elements, 'inline');
|
||||
const animation = createAndPlayTestAnimation(elements, 'inline');
|
||||
|
||||
// Move the scroller to the 75% point. Since this is a vertical writing mode
|
||||
// and direction: rtl, this is 25% of the ScrollTimeline currentTime.
|
||||
|
@ -160,7 +161,7 @@ function inline_vertical_writing_mode_rtl(t) {
|
|||
elements.scroller.scrollHeight - elements.scroller.clientHeight;
|
||||
elements.scroller.scrollTop = 0.75 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(2).then(t.step_func_done(() => {
|
||||
waitForNotNullLocalTime(animation).then(t.step_func_done(() => {
|
||||
assert_equals(
|
||||
getComputedStyle(elements.box).transform, 'matrix(1, 0, 0, 1, 0, 50)');
|
||||
}));
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
<html class="reftest-wait">
|
||||
<title>Scroll timeline with WorkletAnimation and transition from display:none to display:block</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
|
||||
<meta name="assert" content="Scroll timeline should properly handle going from display:none to display:block">
|
||||
<link rel="match" href="worklet-animation-with-scroll-timeline-ref.html">
|
||||
|
||||
<script src="/web-animations/testcommon.js"></script>
|
||||
<script src="/common/reftest-wait.js"></script>
|
||||
<script src="common.js"></script>
|
||||
|
||||
<style>
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#scroller {
|
||||
overflow: auto;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.removed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#contents {
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
<div id="scroller">
|
||||
<div id="contents"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
registerPassthroughAnimator().then(()=>{
|
||||
const box = document.getElementById('box');
|
||||
const effect = new KeyframeEffect(box,
|
||||
[
|
||||
{ transform: 'translateY(0)', opacity: 1 },
|
||||
{ transform: 'translateY(200px)', opacity: 0 }
|
||||
], {
|
||||
duration: 1000,
|
||||
}
|
||||
);
|
||||
|
||||
const scroller = document.getElementById('scroller');
|
||||
scroller.classList.add('removed');
|
||||
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
|
||||
const animation = new WorkletAnimation('passthrough', effect, timeline);
|
||||
animation.play();
|
||||
|
||||
waitForAsyncAnimationFrames(1).then(_ => {
|
||||
scroller.classList.remove('removed');
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(1).then(_ => {
|
||||
takeScreenshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,43 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Scroll timeline with WorkletAnimation using a scroller with overflow hidden</title>
|
||||
<style>
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
transform: translate(0, 100px);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#scroller {
|
||||
overflow: hidden;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
#contents {
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
<div id="scroller">
|
||||
<div id="contents"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
// Move the scroller to halfway.
|
||||
const scroller = document.getElementById("scroller");
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,68 @@
|
|||
<html class="reftest-wait">
|
||||
<title>Scroll timeline with WorkletAnimation using a scroller with overflow hidden</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
|
||||
<meta name="assert" content="Worklet animation correctly updates values when using a overflow: hidden on the scroller being used as the source for the ScrollTimeline">
|
||||
<link rel="match" href="worklet-animation-with-scroll-timeline-and-overflow-hidden-ref.html">
|
||||
|
||||
<script src="/web-animations/testcommon.js"></script>
|
||||
<script src="/common/reftest-wait.js"></script>
|
||||
<script src="common.js"></script>
|
||||
|
||||
<style>
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#scroller {
|
||||
overflow: hidden;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
#contents {
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
<div id="scroller">
|
||||
<div id="contents"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
registerPassthroughAnimator().then(_ => {
|
||||
const box = document.getElementById('box');
|
||||
const effect = new KeyframeEffect(box,
|
||||
[
|
||||
{transform: 'translateY(0)', opacity: 1},
|
||||
{transform: 'translateY(200px)', opacity: 0}
|
||||
], {
|
||||
duration: 1000,
|
||||
}
|
||||
);
|
||||
|
||||
const scroller = document.getElementById('scroller');
|
||||
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
|
||||
const animation = new WorkletAnimation('passthrough', effect, timeline);
|
||||
animation.play();
|
||||
|
||||
// Move the scroller to the halfway point.
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
waitForAnimationFrameWithCondition(_ => {
|
||||
return getComputedStyle(box).transform != 'matrix(1, 0, 0, 1, 0, 0)';
|
||||
}).then(_ => {
|
||||
takeScreenshot();
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,45 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for Animation Worklet with scroll timeline tests</title>
|
||||
<style>
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
transform: translate(0, 100px);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#scroller {
|
||||
overflow: auto;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
/* TODO(yigu): Rewrite the test to not rely on compositing. */
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
#contents {
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
<div id="scroller">
|
||||
<div id="contents"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
// Move the scroller to halfway.
|
||||
const scroller = document.getElementById("scroller");
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,36 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Reference for Scroll timeline with WorkletAnimation using the root scroller</title>
|
||||
<style>
|
||||
html {
|
||||
min-height: 100%;
|
||||
min-width: 100%;
|
||||
padding-bottom: 100px;
|
||||
padding-right: 100px;
|
||||
}
|
||||
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
transform: translate(0, 100px);
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
// Move the scroller to halfway.
|
||||
const scroller = document.scrollingElement;
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,62 @@
|
|||
<html class="reftest-wait">
|
||||
<title>Scroll timeline with WorkletAnimation using the root scroller</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
|
||||
<meta name="assert" content="Worklet animation correctly updates values when using the root scroller as the source for the ScrollTimeline">
|
||||
<link rel="match" href="worklet-animation-with-scroll-timeline-root-scroller-ref.html">
|
||||
|
||||
<script src="/web-animations/testcommon.js"></script>
|
||||
<script src="/common/reftest-wait.js"></script>
|
||||
<script src="common.js"></script>
|
||||
|
||||
<style>
|
||||
html {
|
||||
min-height: 100%;
|
||||
min-width: 100%;
|
||||
padding-bottom: 100px;
|
||||
padding-right: 100px;
|
||||
}
|
||||
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
|
||||
<script>
|
||||
registerPassthroughAnimator().then(()=>{
|
||||
const box = document.getElementById('box');
|
||||
const effect = new KeyframeEffect(box,
|
||||
[
|
||||
{transform: 'translateY(0)', opacity: 1},
|
||||
{transform: 'translateY(200px)', opacity: 0}
|
||||
], {
|
||||
duration: 1000,
|
||||
}
|
||||
);
|
||||
|
||||
const scroller = document.scrollingElement;
|
||||
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
|
||||
const animation = new WorkletAnimation('passthrough', effect, timeline);
|
||||
animation.play();
|
||||
|
||||
// Move the scroller to the halfway point.
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
|
||||
waitForAnimationFrameWithCondition(_ => {
|
||||
return getComputedStyle(box).transform != 'matrix(1, 0, 0, 1, 0, 0)';
|
||||
}).then(_ => {
|
||||
takeScreenshot();
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,67 @@
|
|||
<html class="reftest-wait">
|
||||
<title>Basic use of scroll timeline with WorkletAnimation</title>
|
||||
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
|
||||
<meta name="assert" content="Should be able to use the scroll timeline to drive the worklet animation timing">
|
||||
<link rel="match" href="worklet-animation-with-scroll-timeline-ref.html">
|
||||
|
||||
<script src="/web-animations/testcommon.js"></script>
|
||||
<script src="/common/reftest-wait.js"></script>
|
||||
<script src="common.js"></script>
|
||||
|
||||
<style>
|
||||
#box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
}
|
||||
|
||||
#covered {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#scroller {
|
||||
overflow: auto;
|
||||
height: 100px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
#contents {
|
||||
height: 1000px;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="box"></div>
|
||||
<div id="covered"></div>
|
||||
<div id="scroller">
|
||||
<div id="contents"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
registerPassthroughAnimator().then(() => {
|
||||
const box = document.getElementById('box');
|
||||
const effect = new KeyframeEffect(box,
|
||||
[
|
||||
{ transform: 'translateY(0)', opacity: 1},
|
||||
{ transform: 'translateY(200px)', opacity: 0}
|
||||
], {
|
||||
duration: 1000,
|
||||
}
|
||||
);
|
||||
|
||||
const scroller = document.getElementById('scroller');
|
||||
const timeline = new ScrollTimeline({ scrollSource: scroller, timeRange: 1000, orientation: 'block' });
|
||||
const animation = new WorkletAnimation('passthrough', effect, timeline);
|
||||
animation.play();
|
||||
|
||||
// Move the scroller to the halfway point.
|
||||
const maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
||||
scroller.scrollTop = 0.5 * maxScroll;
|
||||
|
||||
waitForAsyncAnimationFrames(1).then(_ => {
|
||||
takeScreenshot();
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -1,44 +0,0 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>Test setSinkId behavior </title>
|
||||
<div id='log'></div>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
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("nonexistent_device_id")),
|
||||
"setSinkId fails with NotFoundError on made up deviceid");
|
||||
|
||||
promise_test(async t => {
|
||||
const list = await navigator.mediaDevices.enumerateDevices();
|
||||
const outputDevicesList = list.filter(({kind}) => kind == "audiooutput");
|
||||
assert_not_equals(outputDevicesList.length, 0,
|
||||
"media device list includes at least one audio output device");
|
||||
|
||||
let acceptedDevices = 0;
|
||||
for (const {deviceId} of outputDevicesList) {
|
||||
const {deviceId} = outputDevicesList[0];
|
||||
const p1 = audio.setSinkId(deviceId);
|
||||
assert_equals(audio.sinkId, "", "before it resolves, setSinkId is unchanged");
|
||||
try {
|
||||
let r = await p1;
|
||||
assert_equals(acceptedDevices, 0, "only the default sink device can be set");
|
||||
acceptedDevices++;
|
||||
assert_equals(r, undefined, "setSinkId resolves with undefined");
|
||||
assert_equals(audio.sinkId, deviceId, "when it resolves, setSinkId updates sinkId to the requested deviceId");
|
||||
r = await audio.setSinkId(deviceId);
|
||||
assert_equals(r, undefined, "resetting sinkid on same current value should always work");
|
||||
r = await audio.setSinkId("");
|
||||
assert_equals(r, undefined, "resetting sinkid on default audio output should always work");
|
||||
} catch (e) {
|
||||
assert_equals(e.name, "NotAllowedError", "Non-default devices are failing with NotAllowed error");
|
||||
}
|
||||
}
|
||||
}, "List device, setSinkId should be allowed on the default, the rest of the devices will get a NotAllowedError");
|
||||
|
||||
</script>
|
|
@ -1,5 +1,6 @@
|
|||
<html>
|
||||
<title>Accept-CH-Lifetime test with same-origin iframe</title>
|
||||
<meta name="timeout" content="long">
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<html>
|
||||
<title>Accept-CH-Lifetime test with subresource</title>
|
||||
<meta name="timeout" content="long">
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
|
|
@ -18,3 +18,5 @@ def main(request, response):
|
|||
response.headers.set("downlink-received", request.headers.get("downlink"))
|
||||
if "ect" in request.headers:
|
||||
response.headers.set("ect-received", request.headers.get("ect"))
|
||||
if "Sec-CH-Lang" in request.headers:
|
||||
response.headers.set("lang-received", request.headers.get("Sec-CH-Lang"))
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<html>
|
||||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect">
|
||||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect, lang">
|
||||
<title>Accept-CH http-equiv insecure transport test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
@ -27,6 +27,7 @@ promise_test(t => {
|
|||
assert_false(r.headers.has("rtt-received"), "rtt-received");
|
||||
assert_false(r.headers.has("downlink-received"), "downlink-received");
|
||||
assert_false(r.headers.has("ect-received"), "ect-received");
|
||||
assert_false(r.headers.has("lang-received"), "lang-received");
|
||||
});
|
||||
}, "Accept-CH http-equiv test over insecure transport");
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<html>
|
||||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect">
|
||||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect, lang">
|
||||
<title>Accept-CH http-equiv cross-navigation test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
@ -39,9 +39,9 @@ promise_test(t => {
|
|||
// not persisted for the origin.
|
||||
window.open("resources/do_not_expect_client_hints_headers.html");
|
||||
async_test(t => {
|
||||
window.addEventListener('message', function(event) {
|
||||
t.done();
|
||||
})
|
||||
window.addEventListener('message', t.step_func_done(e => {
|
||||
assert_equals(e.data, 'PASS');
|
||||
}));
|
||||
}, "Loading of resources/do_not_expect_client_hints_headers.html did not finish.");
|
||||
|
||||
</script>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<html>
|
||||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect">
|
||||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width, Device-Memory, rtt, downlink, ect, lang">
|
||||
<title>Accept-CH http-equiv same-origin and cross-origin test</title>
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
|
@ -38,6 +38,8 @@ promise_test(t => {
|
|||
|
||||
assert_in_array(r.headers.get("ect-received"), ["slow-2g", "2g",
|
||||
"3g", "4g"], 'ect-received is unexpected');
|
||||
|
||||
assert_true(r.headers.has("lang-received"), "lang-received");
|
||||
});
|
||||
}, "Same origin Accept-CH http-equiv test");
|
||||
|
||||
|
@ -52,6 +54,7 @@ promise_test(t => {
|
|||
assert_false(r.headers.has("rtt-received"), "rtt-received");
|
||||
assert_false(r.headers.has("downlink-received"), "downlink-received");
|
||||
assert_false(r.headers.has("ect-received"), "ect-received");
|
||||
assert_false(r.headers.has("lang-received"), "lang-received");
|
||||
});
|
||||
}, "Cross-Origin Accept-CH http-equiv test");
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<html>
|
||||
<title>Accept-CH-Lifetime test with same-origin iframe</title>
|
||||
<meta name="timeout" content="long">
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<html>
|
||||
<title>Accept-CH-Lifetime test with subresource</title>
|
||||
<meta name="timeout" content="long">
|
||||
<body>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
|
|
@ -5,6 +5,14 @@
|
|||
"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-aria/live-events/test-case-live-event-1-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/name-computation-general/597-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/name-computation-general/598-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/name-computation-general/599-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/name-computation-img/557-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/name-computation-img/565-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/name-computation-img/566-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"html-aria/properties-global-norole/properties-global-norole-aria-label-Test-string-value-haswarn.html": "Possible misuse of \u201caria-label\u201d. (If you disagree with this warning, file an issue report or send e-mail to www-validator@w3.org.)",
|
||||
"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.",
|
||||
|
|
|
@ -15,6 +15,36 @@
|
|||
t2.done();
|
||||
}));
|
||||
}, "Event is fired");
|
||||
|
||||
async_test(function(t3) {
|
||||
var observer = new ReportingObserver(function(reports, observer) {
|
||||
t3.step(function() {
|
||||
assert_equals(reports.length, 1);
|
||||
|
||||
// Ensure that the contents of the report are valid.
|
||||
var base_url = "{{location[scheme]}}://{{location[host]}}/content-security-policy/"
|
||||
var document_url = base_url + "reporting-api/reporting-api-sends-reports-on-violation.https.sub.html";
|
||||
assert_equals(reports[0].type, "csp-violation");
|
||||
assert_equals(reports[0].url, document_url);
|
||||
assert_equals(reports[0].body.documentURL, document_url);
|
||||
assert_equals(reports[0].body.referrer, null);
|
||||
assert_equals(reports[0].body.blockedURL,
|
||||
base_url + "support/fail.png");
|
||||
assert_equals(reports[0].body.effectiveDirective, "img-src");
|
||||
assert_equals(reports[0].body.originalPolicy,
|
||||
"script-src 'self' 'unsafe-inline'; img-src 'none'; report-to csp-group");
|
||||
assert_equals(reports[0].body.sourceFile, document_url);
|
||||
assert_equals(reports[0].body.sample, null);
|
||||
assert_equals(reports[0].body.disposition, "enforce");
|
||||
assert_equals(reports[0].body.statusCode, 0);
|
||||
assert_equals(reports[0].body.lineNumber, 53);
|
||||
assert_equals(reports[0].body.columnNumber, 0);
|
||||
});
|
||||
|
||||
t3.done();
|
||||
});
|
||||
observer.observe();
|
||||
}, "Report is observable to ReportingObserver");
|
||||
</script>
|
||||
<img src='/content-security-policy/support/fail.png'
|
||||
onload='t1.unreached_func("The image should not have loaded");'
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
span
|
||||
{
|
||||
background-color: yellow;
|
||||
font-size: large;
|
||||
font-size: larger;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
|
|
@ -374,12 +374,12 @@ test(t => {
|
|||
assert_equals(animations[1].effect.target.type, '::before',
|
||||
'The animation targeting the ::before pseudo-element ' +
|
||||
'should be returned second');
|
||||
assert_equals(animations[1].effect.target.parentElement, parent,
|
||||
assert_equals(animations[1].effect.target.element, parent,
|
||||
'This ::before element should be child of parent element');
|
||||
assert_equals(animations[2].effect.target.type, '::after',
|
||||
'The animation targeting the ::after pesudo-element ' +
|
||||
'should be returned third');
|
||||
assert_equals(animations[2].effect.target.parentElement, parent,
|
||||
assert_equals(animations[2].effect.target.element, parent,
|
||||
'This ::after element should be child of parent element');
|
||||
|
||||
assert_equals(animations[3].effect.target, child,
|
||||
|
@ -388,12 +388,12 @@ test(t => {
|
|||
assert_equals(animations[4].effect.target.type, '::before',
|
||||
'The animation targeting the ::before pseudo-element ' +
|
||||
'should be returned fifth');
|
||||
assert_equals(animations[4].effect.target.parentElement, child,
|
||||
assert_equals(animations[4].effect.target.element, child,
|
||||
'This ::before element should be child of child element');
|
||||
assert_equals(animations[5].effect.target.type, '::after',
|
||||
'The animation targeting the ::after pesudo-element ' +
|
||||
'should be returned last');
|
||||
assert_equals(animations[5].effect.target.parentElement, child,
|
||||
assert_equals(animations[5].effect.target.element, child,
|
||||
'This ::after element should be child of child element');
|
||||
}, '{ subtree: true } on an element with a child returns animations from the'
|
||||
+ ' element, its pseudo-elements, its child and its child pseudo-elements');
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Flexbox Test: Indefinite % flex-basis should cause height to be ignored</title>
|
||||
<link rel="author" title="Google LLC" href="https://www.google.com">
|
||||
<link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#flex-basis-property">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
|
||||
<style>
|
||||
#container {
|
||||
background-color: red;
|
||||
display: flex;
|
||||
width: 100px;
|
||||
flex-direction: column;
|
||||
}
|
||||
#item {
|
||||
flex: 0 0 0%;
|
||||
height: 500px;
|
||||
background-color: red;
|
||||
}
|
||||
#child {
|
||||
height: 100px;
|
||||
background-color: green;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
<div id="container">
|
||||
<div id="item">
|
||||
<div id="child"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
|
@ -0,0 +1,49 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<title>CSS Flexbox: min-height: auto with nested flexboxes</title>
|
||||
<link rel="author" title="Google LLC" href="https://www.google.com/" />
|
||||
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto" />
|
||||
<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=933931" />
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
|
||||
|
||||
<style>
|
||||
.outer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 20px;
|
||||
width: 100px;
|
||||
background: red;
|
||||
}
|
||||
|
||||
.middle {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: green;
|
||||
}
|
||||
|
||||
.inner {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.tall {
|
||||
width: 50px;
|
||||
height: 100px;
|
||||
background: green;
|
||||
}
|
||||
</style>
|
||||
<body>
|
||||
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
|
||||
<div class="outer">
|
||||
<div class="middle">
|
||||
<div class="inner">
|
||||
<div class="tall"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE html>
|
||||
<link rel="author" title="Google LLC" href="http://www.google.com" />
|
||||
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#cross-sizing" />
|
||||
<title>css-flexbox: Tests that we size items in a wrapping column flexbox as fit-content</title>
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
|
||||
<meta name="assert" content="The flexbox here should have one flex line, 100px by 100px. The flex items overflow but are transparent." />
|
||||
|
||||
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
|
||||
|
||||
<!-- This makes sure that we only see green if the flex items are sized correctly -->
|
||||
<div style="position: absolute; width: 100px; height: 100px; background: green;"></div>
|
||||
|
||||
<div style="display: flex; flex-direction: column; flex-wrap: wrap; width: 200px; height: 100px; line-height: 20px; align-content: flex-start;">
|
||||
<div style="background-color: red; height: 100px; max-width: 50%; align-self: center;">
|
||||
<!-- These zero-height divs give the flex item a min-content width of
|
||||
50px and a max-content width of 250px -->
|
||||
<div style="width: 50px; display: inline-block;"></div>
|
||||
<div style="width: 50px; display: inline-block;"></div>
|
||||
<div style="width: 50px; display: inline-block;"></div>
|
||||
<div style="width: 50px; display: inline-block;"></div>
|
||||
<div style="width: 50px; display: inline-block;"></div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,9 +0,0 @@
|
|||
<title>In quirks mode a flex item should resolve its percentage height against its first ancestor with a defined height.</title>
|
||||
<link rel="help" href="https://quirks.spec.whatwg.org/#the-percentage-height-calculation-quirk">
|
||||
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
|
||||
<p style="margin-top: 1em;">Test passes if there is a filled green square.</p>
|
||||
<div style="width: 200px; height: 200px;">
|
||||
<div style="display: flex;">
|
||||
<div style="width: 50%; height: 50%; background: green;"></div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,17 @@
|
|||
<!-- quirks mode -->
|
||||
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
|
||||
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#the-height-property">
|
||||
<meta name="assert" content="The percentage height resolution quirk isn't applied to flexboxes.">
|
||||
<p>There should be a green square to the left of a blue square, and no red.</p>
|
||||
<div id="container" style="width:200px; height:456px;">
|
||||
<div style="display:flex; background:blue;" data-expected-height="100">
|
||||
<img style="width:100px; height: 50%;" src="support/1x1-green.png" data-expected-height="100">
|
||||
<div style="width: 50px; height: 100%; background: red;" data-expected-height="0"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
<script>
|
||||
checkLayout("#container");
|
||||
</script>
|
|
@ -0,0 +1,23 @@
|
|||
|
||||
<!doctype html>
|
||||
<title>Testing font-style angle's unit type consideration</title>
|
||||
<link rel="help" href="https://www.w3.org/TR/css-fonts-4/#font-style-prop" />
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<style>
|
||||
|
||||
body {
|
||||
font-style: oblique 0.785398165rad;
|
||||
}
|
||||
|
||||
</style>
|
||||
<script>
|
||||
var test_description = "font-style angle's unit type must be considered";
|
||||
promise_test(
|
||||
t => {
|
||||
return new Promise(test => addEventListener('load', () => test()))
|
||||
.then(test => assert_equals(getComputedStyle(document.querySelector("body"))['font-style'], "oblique 45deg", "Invalid gCS($(\"body\"))['font-style'];"))
|
||||
},
|
||||
test_description
|
||||
);
|
||||
</script>
|
|
@ -0,0 +1,96 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Grid Layout Test: minimum contribution with baseline-alignment shim</title>
|
||||
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content" title="11.5. Resolve Intrinsic Track Sizes">
|
||||
<meta name="assert" content="Checks that the minimum contribution takes the baseline-alignment shim into account when calculating the outer size that grid items would have if their preferred size were their minimum size. Also checks that the shim is used again when clamping the automatic minimum size to less than or equal to the stretch fit into the grid area.">
|
||||
<style>
|
||||
.grid {
|
||||
display: grid;
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
height: 0;
|
||||
width: 0;
|
||||
margin-bottom: 125px;
|
||||
grid-template-rows: 50px 50px;
|
||||
justify-items: baseline;
|
||||
}
|
||||
.item1, .item2 {
|
||||
writing-mode: vertical-lr;
|
||||
}
|
||||
.item1 {
|
||||
padding-left: 25px;
|
||||
background: yellow;
|
||||
}
|
||||
.item2 {
|
||||
padding-right: 25px;
|
||||
background: magenta;
|
||||
}
|
||||
.item1::before, .item2::before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
vertical-align: top;
|
||||
}
|
||||
.item2::before {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
.area {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
grid-column: 1 / 2;
|
||||
grid-row: 1 / 3;
|
||||
background: cyan;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 0px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="75" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 75px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="75" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 88px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="88" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 100px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 150px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, auto);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
checkLayout(".grid");
|
||||
</script>
|
|
@ -0,0 +1,96 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Grid Layout Test: minimum contribution with baseline-alignment shim</title>
|
||||
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content" title="11.5. Resolve Intrinsic Track Sizes">
|
||||
<meta name="assert" content="Checks that the minimum contribution takes the baseline-alignment shim into account when calculating the outer size that grid items would have if their preferred size were their minimum size. Also checks that the shim is used again when clamping the automatic minimum size to less than or equal to the stretch fit into the grid area.">
|
||||
<style>
|
||||
.grid {
|
||||
display: grid;
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
height: 0;
|
||||
width: 0;
|
||||
margin-bottom: 125px;
|
||||
grid-template-rows: 50px 50px;
|
||||
justify-items: baseline;
|
||||
}
|
||||
.item1, .item2 {
|
||||
writing-mode: vertical-rl;
|
||||
}
|
||||
.item1 {
|
||||
padding-left: 25px;
|
||||
background: yellow;
|
||||
}
|
||||
.item2 {
|
||||
padding-right: 25px;
|
||||
background: magenta;
|
||||
}
|
||||
.item1::before, .item2::before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
vertical-align: top;
|
||||
}
|
||||
.item2::before {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
.area {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
grid-column: 1 / 2;
|
||||
grid-row: 1 / 3;
|
||||
background: cyan;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 0px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="75" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 75px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="75" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 88px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="88" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 100px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, 150px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-columns: minmax(auto, auto);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
checkLayout(".grid");
|
||||
</script>
|
|
@ -0,0 +1,93 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>CSS Grid Layout Test: minimum contribution with baseline-alignment shim</title>
|
||||
<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content" title="11.5. Resolve Intrinsic Track Sizes">
|
||||
<meta name="assert" content="Checks that the minimum contribution takes the baseline-alignment shim into account when calculating the outer size that grid items would have if their preferred size were their minimum size. Also checks that the shim is used again when clamping the automatic minimum size to less than or equal to the stretch fit into the grid area.">
|
||||
<style>
|
||||
.grid {
|
||||
display: grid;
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
height: 0;
|
||||
width: 0;
|
||||
margin-bottom: 125px;
|
||||
grid-template-columns: 50px 50px;
|
||||
align-items: baseline;
|
||||
}
|
||||
.item1 {
|
||||
padding-top: 25px;
|
||||
background: yellow;
|
||||
}
|
||||
.item2 {
|
||||
padding-bottom: 25px;
|
||||
background: magenta;
|
||||
}
|
||||
.item1::before, .item2::before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
.item2::before {
|
||||
vertical-align: top;
|
||||
}
|
||||
.area {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
grid-column: 1 / 3;
|
||||
grid-row: 1 / 2;
|
||||
background: cyan;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/resources/check-layout-th.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<div class="grid" style="grid-template-rows: minmax(auto, 0px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="75"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-rows: minmax(auto, 75px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="75"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-rows: minmax(auto, 88px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="88"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-rows: minmax(auto, 100px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-rows: minmax(auto, 150px);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<div class="grid" style="grid-template-rows: minmax(auto, auto);">
|
||||
<div class="item1" data-offset-x="0" data-offset-y="0"></div>
|
||||
<div class="item2" data-offset-x="50" data-offset-y="50"></div>
|
||||
<div class="area" data-expected-width="100" data-expected-height="100"></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
checkLayout(".grid");
|
||||
</script>
|
|
@ -0,0 +1,41 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Hit-test of clip-path objectBoundingBox <clipPath> with additional transform</title>
|
||||
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
.box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: blue;
|
||||
margin: 100px;
|
||||
clip-path: url(#clip);
|
||||
}
|
||||
</style>
|
||||
<div class="box"></div>
|
||||
<svg height="0">
|
||||
<clipPath id="clip" clipPathUnits="objectBoundingBox" transform="scale(0.01, 0.01)">
|
||||
<polygon points="50,0 100,50 50,100 0,50"/>
|
||||
</clipPath>
|
||||
</svg>
|
||||
<script>
|
||||
function assert_element_at(element, pointlist) {
|
||||
for (let point of pointlist) {
|
||||
let result = document.elementFromPoint(point[0], point[1]);
|
||||
assert_equals(result, element, point.join(','));
|
||||
}
|
||||
}
|
||||
|
||||
test(function() {
|
||||
let div = document.querySelector('.box');
|
||||
|
||||
// Points inside clip-path.
|
||||
assert_element_at(div, [[150, 150], [150, 125], [150, 175], [125, 150], [175, 150]]);
|
||||
|
||||
// Points outside clip-path.
|
||||
assert_element_at(document.body, [[120, 120], [180, 120], [120, 180], [180, 180]]);
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,44 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Hit-test of clip-path nested objectBoundingBox <clipPath></title>
|
||||
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
.box {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
background-color: blue;
|
||||
margin: 100px;
|
||||
clip-path: url(#clip);
|
||||
}
|
||||
</style>
|
||||
<div class="box"></div>
|
||||
<svg height="0">
|
||||
<clipPath id="nested" clipPathUnits="objectBoundingBox">
|
||||
<circle cx="0.25" cy="0.25" r="0.25"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip" clipPathUnits="objectBoundingBox" clip-path="url(#nested)">
|
||||
<rect width="0.5" height="0.5"/>
|
||||
</clipPath>
|
||||
</svg>
|
||||
<script>
|
||||
function assert_element_at(element, pointlist) {
|
||||
for (let point of pointlist) {
|
||||
let result = document.elementFromPoint(point[0], point[1]);
|
||||
assert_equals(result, element, point.join(','));
|
||||
}
|
||||
}
|
||||
|
||||
test(function() {
|
||||
let div = document.querySelector('.box');
|
||||
|
||||
// Points inside clip-path.
|
||||
assert_element_at(div, [[150, 150], [150, 125], [150, 175], [125, 150], [175, 150]]);
|
||||
|
||||
// Points outside clip-path.
|
||||
assert_element_at(document.body, [[110, 110], [190, 110], [110, 190], [190, 190]]);
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,41 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Hit-test of clip-path userSpaceOnUse <clipPath></title>
|
||||
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
.box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: blue;
|
||||
margin: 100px;
|
||||
clip-path: url(#clip);
|
||||
}
|
||||
</style>
|
||||
<div class="box"></div>
|
||||
<svg height="0">
|
||||
<clipPath id="clip" clipPathUnits="userSpaceOnUse">
|
||||
<polygon points="50,0 100,50 50,100 0,50"/>
|
||||
</clipPath>
|
||||
</svg>
|
||||
<script>
|
||||
function assert_element_at(element, pointlist) {
|
||||
for (let point of pointlist) {
|
||||
let result = document.elementFromPoint(point[0], point[1]);
|
||||
assert_equals(result, element, point.join(','));
|
||||
}
|
||||
}
|
||||
|
||||
test(function() {
|
||||
let div = document.querySelector('.box');
|
||||
|
||||
// Points inside clip-path.
|
||||
assert_element_at(div, [[150, 150], [150, 125], [150, 175], [125, 150], [175, 150]]);
|
||||
|
||||
// Points outside clip-path.
|
||||
assert_element_at(document.body, [[120, 120], [180, 120], [120, 180], [180, 180]]);
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,36 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Hit-test of clip-path polygon combined with box-shadow</title>
|
||||
<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-clip-path">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
.box {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
background-color: blue;
|
||||
box-shadow: -100px 0px red;
|
||||
clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
|
||||
}
|
||||
</style>
|
||||
<div class="box"></div>
|
||||
<script>
|
||||
function assert_element_at(element, pointlist) {
|
||||
for (let point of pointlist) {
|
||||
let result = document.elementFromPoint(point[0], point[1]);
|
||||
assert_equals(result, element, point.join(','));
|
||||
}
|
||||
}
|
||||
|
||||
test(function() {
|
||||
let div = document.querySelector('.box');
|
||||
|
||||
// Points inside clip-path.
|
||||
assert_element_at(div, [[50, 50], [50, 25], [50, 75], [25, 50], [75, 50]]);
|
||||
|
||||
// Points outside clip-path.
|
||||
assert_element_at(document.body, [[20, 20], [80, 20], [20, 80], [80, 80]]);
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<style>
|
||||
#test {
|
||||
width: 100px;
|
||||
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
|
||||
border: solid thin grey;
|
||||
font: 20px 'Ahem';
|
||||
line-height: 40px;
|
||||
}
|
||||
</style>
|
||||
<p>This tests the -webkit-line-clamp property with line-height applied.</p>
|
||||
<div id="test">
|
||||
XXXX XXX
|
||||
</div>
|