Auto merge of #23610 - servo-wpt-sync:wpt_update_23-06-2019, r=servo-wpt-sync

Sync WPT with upstream (23-06-2019)

Automated downstream sync of changes from upstream as of 23-06-2019.
[no-wpt-sync]
This commit is contained in:
bors-servo 2019-06-23 10:05:56 -04:00 committed by GitHub
commit 223d6cd13c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
204 changed files with 5112 additions and 1445 deletions

View file

@ -14,6 +14,9 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL
[url-with-fetch.any.html]
[Untitled]
@ -34,3 +37,6 @@
[Revoke blob URL after creating Request, will fetch]
expected: FAIL
[Revoke blob URL after calling fetch, fetch should succeed]
expected: FAIL

File diff suppressed because it is too large Load diff

View file

@ -74,6 +74,3 @@
[opacity end]
expected: FAIL
[outline-width end]
expected: FAIL

View file

@ -0,0 +1,10 @@
[appearance-parsing.html]
[parsing via modification of cssText]
expected: FAIL
[parsing via attribute change steps of CSS declaration block's owner node]
expected: FAIL
[parsing via creation of CSS declaration block]
expected: FAIL

View file

@ -0,0 +1,13 @@
[appearance-property.html]
[property access]
expected: FAIL
[removeProperty]
expected: FAIL
[getPropertyValue]
expected: FAIL
[setProperty]
expected: FAIL

View file

@ -0,0 +1,10 @@
[appearance-serialization.html]
[serialization via CSSStyleRule]
expected: FAIL
[serialization via CSSStyleDeclaration]
expected: FAIL
[serialization via CSSMediaRule]
expected: FAIL

View file

@ -0,0 +1,10 @@
[webkit-appearance-parsing.html]
[parsing via modification of cssText]
expected: FAIL
[parsing via attribute change steps of CSS declaration block's owner node]
expected: FAIL
[parsing via creation of CSS declaration block]
expected: FAIL

View file

@ -0,0 +1,40 @@
[webkit-appearance-property.html]
[removeProperty - camel-cased property name (ignored)]
expected: FAIL
[removeProperty - webkit-cased property name (ignored)]
expected: FAIL
[setProperty - CSS property name]
expected: FAIL
[property assignment - webkit-cased property name]
expected: FAIL
[setProperty - camel-cased property name (ignored)]
expected: FAIL
[property assignment - camel-cased property name]
expected: FAIL
[property access - CSS property name]
expected: FAIL
[removeProperty - CSS property name]
expected: FAIL
[property access - webkit-cased property name]
expected: FAIL
[property access - camel-cased property name]
expected: FAIL
[getPropertyValue - CSS property name]
expected: FAIL
[property assignment - CSS property name]
expected: FAIL
[setProperty - webkit-cased property name (ignored)]
expected: FAIL

View file

@ -0,0 +1,10 @@
[webkit-appearance-serialization.html]
[serialization via CSSStyleRule]
expected: FAIL
[serialization via CSSStyleDeclaration]
expected: FAIL
[serialization via CSSMediaRule]
expected: FAIL

View file

@ -0,0 +1,2 @@
[backdrop-filter-plus-mask.html]
expected: FAIL

View file

@ -2,7 +2,6 @@
type: testharness
[single-byte-decoder.html?document]
expected: TIMEOUT
[ISO-8859-4: iso_8859-4:1988 (document.characterSet and document.inputEncoding)]
expected: FAIL

View file

@ -321,12 +321,15 @@
[<iframe>: separate response Content-Type: */* text/html]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;x=" text/plain]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" text/plain]
expected: FAIL
[<iframe>: separate response Content-Type: text/html;" \\" text/plain]
expected: FAIL
[<iframe>: combined response Content-Type: text/html */*;charset=gbk]
expected: FAIL
[<iframe>: combined response Content-Type: text/html;" \\" text/plain]
expected: FAIL

View file

@ -56,3 +56,9 @@
[separate text/javascript x/x]
expected: FAIL
[separate text/javascript;charset=windows-1252 error text/javascript]
expected: FAIL
[separate text/javascript ]
expected: FAIL

View file

@ -11,6 +11,6 @@
[X-Content-Type-Options%3A%20nosniff%0C]
expected: FAIL
[X-Content-Type-Options%3A%20%2Cnosniff]
[X-Content-Type-Options%3A%20'NosniFF']
expected: FAIL

View file

@ -0,0 +1,20 @@
[multiple-redirect-https-downgrade-upgrade.tentative.sub.html]
expected: ERROR
[Https downgrade-upgrade iframe => No headers]
expected: FAIL
[Https downgrade-upgrade script => No headers]
expected: FAIL
[Https downgrade-upgrade top level navigation => No headers]
expected: FAIL
[Https downgrade-upgrade fetch() api => No headers]
expected: NOTRUN
[Https downgrade-upgrade embed => No headers]
expected: TIMEOUT
[Https downgrade-upgrade object => No headers]
expected: NOTRUN

View file

@ -0,0 +1,20 @@
[redirect-http-upgrade.tentative.sub.html]
expected: ERROR
[Http upgrade object => No headers]
expected: NOTRUN
[Http upgrade embed => No headers]
expected: TIMEOUT
[Http upgrade script => No headers]
expected: FAIL
[Http upgrade iframe => No headers]
expected: FAIL
[Http upgrade top level navigation => No headers]
expected: FAIL
[Http upgrade fetch() api => No headers]
expected: NOTRUN

View file

@ -0,0 +1,11 @@
[redirect-https-downgrade.tentative.sub.html]
expected: ERROR
[Https downgrade fetch() api => No headers]
expected: NOTRUN
[Https downgrade object => No headers]
expected: NOTRUN
[Https downgrade embed => No headers]
expected: TIMEOUT

View file

@ -1,4 +1,4 @@
[traverse_the_history_4.html]
[traverse_the_history_3.html]
[Multiple history traversals, last would be aborted]
expected: FAIL

View file

@ -0,0 +1,55 @@
[new_window_null.tentative.html]
[null document opening popup to http://not-web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[null document opening popup to http://web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[null document opening popup to http://web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[null document opening popup to http://web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[null document opening popup to http://not-web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[null document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[null document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[null document opening popup to http://web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[null document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[null document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[null document opening popup to http://www1.web-platform.test:8000 with COOP: ""]
expected: FAIL
[null document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[null document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[null document opening popup to http://www1.web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[null document opening popup to http://web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[null document opening popup to http://web-platform.test:8000 with COOP: ""]
expected: FAIL
[null document opening popup to http://not-web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[null document opening popup to http://not-web-platform.test:8000 with COOP: ""]
expected: FAIL

View file

@ -0,0 +1,55 @@
[new_window_same_origin.tentative.html]
[same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-origin document opening popup to http://web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-origin document opening popup to http://web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-origin document opening popup to http://not-web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-origin document opening popup to http://web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-origin document opening popup to http://not-web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-origin document opening popup to http://not-web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-origin document opening popup to http://web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-origin document opening popup to http://not-web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-origin document opening popup to http://web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-origin document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-origin document opening popup to http://web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-origin document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL

View file

@ -0,0 +1,55 @@
[new_window_same_origin_unsafe_allow_outgoing.tentative.html]
[same-origin_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-origin_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site"]
expected: FAIL

View file

@ -0,0 +1,55 @@
[new_window_same_site.tentative.html]
[same-site document opening popup to http://not-web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-site document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-site document opening popup to http://web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-site document opening popup to http://web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-site document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-site document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-site document opening popup to http://web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-site document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-site document opening popup to http://www1.web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-site document opening popup to http://not-web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-site document opening popup to http://not-web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-site document opening popup to http://not-web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-site document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-site document opening popup to http://web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-site document opening popup to http://web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-site document opening popup to http://web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-site document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-site document opening popup to http://www1.web-platform.test:8000 with COOP: ""]
expected: FAIL

View file

@ -0,0 +1,55 @@
[new_window_same_site_unsafe_allow_outgoing.tentative.html]
[same-site_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: ""]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "jibberish"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://not-web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL
[same-site_unsafe-allow-outgoing document opening popup to http://www1.web-platform.test:8000 with COOP: "same-origin"]
expected: FAIL

View file

@ -0,0 +1,37 @@
[unload-event-same-origin-check.html]
[Redirect chain with a partial TAO opt-in]
expected: FAIL
[No previous document with same origin redirect]
expected: FAIL
[cross-cross-same Redirect chain with no TAO opt-in]
expected: FAIL
[Same-cross-same redirect chain with no TAO opt-in]
expected: FAIL
[Same origin previous document with same origin redirect]
expected: FAIL
[Redirect chain with full TAO opt-in]
expected: FAIL
[Previous document same origin]
expected: FAIL
[No previous document]
expected: FAIL
[No previous document with cross origin redirect]
expected: FAIL
[Previous document cross origin]
expected: FAIL
[No previous document with cross origin redirect with TAO]
expected: FAIL
[No previous document with cross origin redirect with partial TAO]
expected: FAIL

View file

@ -0,0 +1,4 @@
[subresource-integrity.html]
[Style: Same-origin with correct sha256 and sha512 hash, rel='alternate stylesheet' enabled]
expected: FAIL

View file

@ -1,4 +1,5 @@
[realtimeanalyser-fft-scaling.html]
expected: TIMEOUT
[X 2048-point FFT peak position is not equal to 64. Got 0.]
expected: FAIL

View file

@ -40,3 +40,7 @@
[test_height_width_larger_than_max]
expected: FAIL
[test_negative_x_y]
expected: FAIL

View file

@ -0,0 +1,4 @@
[alerts.py]
[test_retain_tab_modal_status]
expected: FAIL

View file

@ -0,0 +1,5 @@
[remove-own-iframe-during-onerror.window.html]
expected: TIMEOUT
[removing an iframe from within an onerror handler should work]
expected: TIMEOUT

View file

@ -85,11 +85,11 @@ jobs:
- template: tools/ci/azure/install_safari.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl $(Build.ArtifactStagingDirectory)/chrome.tbpl.log --log-tbpl-level info --channel dev chrome infrastructure/
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl - --log-tbpl-level info --channel dev chrome infrastructure/
displayName: 'Run tests: Chrome Dev'
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl $(Build.ArtifactStagingDirectory)/firefox.tbpl.log --log-tbpl-level info --channel nightly firefox infrastructure/
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl - --log-tbpl-level info --channel nightly firefox infrastructure/
displayName: 'Run tests: Firefox Nightly'
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl $(Build.ArtifactStagingDirectory)/safari.tbpl.log --log-tbpl-level info --channel preview safari infrastructure/
- script: no_proxy='*' ./wpt run --yes --no-manifest-update --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl - --log-tbpl-level info --channel preview safari infrastructure/
displayName: 'Run tests: Safari Technology Preview'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
@ -223,7 +223,7 @@ jobs:
- template: tools/ci/azure/install_edge.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- script: python ./wpt run --yes --no-manifest-update --install-fonts --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl $(Build.ArtifactStagingDirectory)/edge.tbpl.log --log-tbpl-level info --channel dev edgechromium infrastructure/
- script: python ./wpt run --yes --no-manifest-update --install-fonts --manifest MANIFEST.json --metadata infrastructure/metadata/ --log-tbpl - --log-tbpl-level info --channel dev edgechromium infrastructure/
displayName: 'Run tests: Edge Dev'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
@ -256,7 +256,7 @@ jobs:
- template: tools/ci/azure/install_edge.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- script: python ./wpt run --yes --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --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 --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --channel dev edgechromium
- script: python ./wpt run --yes --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --channel dev edgechromium
displayName: 'Run tests: Edge Dev'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
@ -293,7 +293,7 @@ jobs:
- script: |
# TODO: drop this when `safaridriver --version` is supported.
SAFARI_VERSION="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' /Applications/Safari.app/Contents/Info.plist) ($(/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' /Applications/Safari.app/Contents/Info.plist))"
no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --browser-version "$SAFARI_VERSION" safari
no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --browser-version "$SAFARI_VERSION" safari
displayName: 'Run tests'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'
@ -324,7 +324,7 @@ jobs:
- template: tools/ci/azure/install_safari.yml
- template: tools/ci/azure/update_hosts.yml
- template: tools/ci/azure/update_manifest.yml
- script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --channel preview safari
- script: no_proxy='*' ./wpt run --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --this-chunk=$(System.JobPositionInPhase) --total-chunks=$(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-tbpl - --log-tbpl-level info --channel preview safari
displayName: 'Run tests'
- task: PublishBuildArtifacts@1
displayName: 'Publish results'

View file

@ -6,12 +6,13 @@
<script src=support.js></script>
<script>
var open_rq = createdb(async_test(), 'database_name', 13);
var database_name = document.location + '-database_name';
var open_rq = createdb(async_test(), database_name, 13);
open_rq.onupgradeneeded = function(e) {};
open_rq.onsuccess = function(e) {
var db = e.target.result;
assert_equals(db.name, 'database_name', 'db.name');
assert_equals(db.name, database_name, 'db.name');
assert_equals(db.version, 13, 'db.version');
this.done();
}

View file

@ -6,7 +6,7 @@
<script src=support.js></script>
<script>
var open_rq = createdb(async_test(), 'database_name');
var open_rq = createdb(async_test(), document.location + '-database_name');
open_rq.onupgradeneeded = function(e) {
assert_equals(e.target.result.version, 1, "db.version");

View file

@ -6,7 +6,7 @@
<script src=support.js></script>
<script>
var open_rq = createdb(async_test(), 'database_name');
var open_rq = createdb(async_test(), document.location + '-database_name');
open_rq.onupgradeneeded = function() {};
open_rq.onsuccess = function(e) {

View file

@ -7,12 +7,19 @@
<script src='/resources/testharnessreport.js'></script>
<script nonce='abc'>
var t_spv = async_test("Should fire violation events for every failed violation");
window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) {
assert_equals(e.violatedDirective, "script-src");
}));
window.addEventListener(
"securitypolicyviolation", t_spv.unreached_func("securitypolicyviolation should not be emitted"));
window.addEventListener("load", function() {
t_spv.done();
});
</script>
<script src='positiveTest.js'></script>
<script nonce='abc'>t_spv.done();</script>
<script nonce='abc'>
test(function() {
assert_true(window.cspPositiveTest);
}, "Allows scripts from the same host.");
</script>
</head>
<body>
<h1>'self' keyword positive test</h1>

View file

@ -9,17 +9,16 @@
<script>
var t = async_test("Test that script does not fire violation event");
window.addEventListener("securitypolicyviolation", t.unreached_func("Should not have fired a violation event"));
window.addEventListener("load", t.step_func(function() {
assert_true(window.wildcardHostTestRan);
t.done();
}));
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "http://www." + location.hostname + ":" + location.port + "/content-security-policy/generic/wildcardHostTestSuceeds.js";
head.appendChild(script);
</script>
<script>
t.done();
</script>
</head>
<body>
<h1>test wildcard host name matching (asterisk as a subdomain of the current domain)</h1>

View file

@ -8,8 +8,13 @@
<script src='wildcardHostTestFailure.js'></script>
<script>
var t_spv = async_test("Should fire violation events for every failed violation");
window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) {
assert_equals(e.violatedDirective, "script-src-elem");
var spvEvent;
window.addEventListener("securitypolicyviolation", t_spv.step_func(function(e) {
spvEvent = e;
}));
addEventListener("load", t_spv.step_func_done(function() {
assert_true(!!spvEvent);
assert_equals(spvEvent.violatedDirective, "script-src-elem");
}));
var head = document.getElementsByTagName('head')[0];

View file

@ -9,6 +9,9 @@
<script>
var t = async_test("Test that script does not fire violation event");
window.addEventListener("securitypolicyviolation", t.unreached_func("Should not have fired a violation event"));
window.addEventListener("load", function() {
t.done();
});
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
@ -16,10 +19,6 @@
script.src = "http://" + location.hostname + ":{{ports[http][1]}}/content-security-policy/generic/wildcardPortTestSuceeds.js";
head.appendChild(script);
</script>
<script>
t.done();
</script>
</head>
<body>
<h1>test wildcard port number matching</h1>

View file

@ -18,11 +18,24 @@
<br>
<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAABACAIAAAABPqsMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QoMCC8h3if5rgAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAAGD0lEQVR42u2aa0yTVxiA39ILxa4KIkKrVCCIitzrqkAXQiXDSFjQHyZDBRRdtoDzgooao5uaoInID4hRJFC8RBOzxQuKigyYokuDSB0WlaJQlQrITRCwte1+nKVhpbT9aGUue59fb84573dO+uR7v/drS4OfAPkf4oQfAYpHUDyC4hEUj6B4BMUjKB5B8QiKR1A8guIRFI+geATFIygeQfEIikdQPEIVxmd1GsN+w9hBrV7bN9Kn7FHWqmqLHxY3vW2ycIWtS7Yeiz9G4h0VO47eO2rj1p4cz7WhayW+kuCZwdNdpjsznIe0Q53vO1X9qsbOxrr2uprWmrb+Nofn/lvQPqs/W5oVb0KBrCDrVpZGpzE7++iHR8Ezg0ms6FIsPL7Qho+Ali3O3h+zn81gW1n5M82BuVjqqZEpyjyVeMrs1CL+IqN1AAj0CBTNElm9YGFiYc7SHKvmHJ6Lpd7K/cF0YvK5/KV+S3eLd/tP9weAlNAUaYO0qrXKJGtd2DoS6A16J5oTGZG9llnYKDEgcUPEBhI/636WL8uvelHV1t82rB1mM9geHA8fV58QzxAhTxjjE+PAXCz15ku92cLIZXFr1tWEe4UDwLk/z635dc3oWWe6s3q72o3tBgD7qvYdiD0AAH0jfbxc3sjHkfF2LF9dvsx/GQDcbLmZdCHJwkrH5mKpp8CAZiC7IpvEUd5RJrMrFqwg1pU9ykO/H2rpbQEAV7brygUrLVxz8ezFJNh2cxtVc/bkonhq3Ht5jwReX3iNV+elDVIDGKQNUpNxs0x1nkoCZY+S6mHsyUXxE30oGP7R/3tP9Y7ziyNP91J5KQCUNpTqDXoAkPhKBNME412ne6ibBEEzg6iewZ5cFE8NY4XveN8xejw1LJV0cxXPK169ewUAL9+9vP38NgA40ZxSQ1OtlpDCxMI50+ZMrPxMIBfFU4DD5ByOO2zyoRPSwtJIUPyw2DhojNPC0mhg/jU67488AxgAQMgTNv/YfPXbq5miTNEskQvDxep57MnFrt56V890YvK4vFif2D1f7QlwDyCDcafjKl9UkjhmTkx1WjUA9Az38HP5H3Qfxvb5saWx1a3VZjfdsmRL7te5pGAY0Rl0ii7FnbY7l55cqnxRSZ4ajs1F8WbEW8bkXU6aJCXFvEBWsKl80+iVBcsLMr7MAIDT8tOpl8Yt+JGzIw9KDkp8JWYLg7JHmXUr68rTKw7PRfEUxJ98cHJz+Wbjbc1lcdXb1RwmBwCEhcJ6df3oxUKesO67OgAY0g55HfUa0AxYuLJgmmD53OVigTiCFxHgHkCn0UfP7rq960jtkU+Ri+LH/ZGmf6S/pbelVlVb0lDS2Nk4ejY9PL3omyIAkHfIw06EjU2Xfy8P8QwBgI1XNxbVF9l4EheGi5AvTJibkB6R7jHFAwAMYBAXi016C4fn4jPe1p807q6/G+0dbWMTHl0cTfVIbmy3suQy8jZxUXFx1cVVk5OLXb0lAtwDbLROXgWNvaHt9I70ZlzPILFYIJ60XBRvCcvfytm/ntDU9fc/AEjdnrTcTwrjv2udTqOnhKaQOOlC0uWnl8dbmTA3oSy5DABSQlP2/rZXZ9BR2mjejHkksNwbOjwX73jzxPvH87l8AOh433Gt+ZqFlTeUN9SDagDgc/nx/vGUdpnCnJIXn0fiB+0PJi0X73jrdfvso7Mf9R8trNQZdGfkZ3ZG7yRZ15uvG6dUW1W1qtp6db2iS9HW36YeUA9qBrV6LYfJ8XPzk/hKMkWZfm5+ZLHJS4E9udjVT7Crd3dxb89qZ9FZABB0POhx12PL6+fPmN+U0QQAGp2Gn8vvHu6m9JWR2bbcnlws9RNkdchqYl32WmbVOgA8efvk/qv7AMCis5KDkyntpdFpcu7mJP+SPIFz2pOLpd5SnS9pKLExpeRhSeTsSABYH74+X5ZPBgV5gijvqAheRKBHoI+rD4/L47K4TDpzWDv8ZvCNoktR3Vp9vvF8+0D72Avak4ulHsFSj6B4BMUjKB5B8QiKR1A8guIRFI+geATFo3gExSMoHkHxCIpHUDyC4hEUj6B45HPmL9so2ZKs94sNAAAAAElFTkSuQmCC'>
<script>
var allowedScriptRan = true;
setup({ explicit_done: true });
test(function() {
assert_true(window.cspPositiveTest);
}, "Allows scripts from the same host.");
</script>
<div id='log'></div>
<script async defer src='../support/checkReport.sub.js?reportExists=false'></script>
<script>
var script = document.createElement('script');
script.src = '../support/checkReport.sub.js?reportExists=false';
script.async = true;
script.defer = true;
script.addEventListener('load', function() {
done();
});
document.body.appendChild(script);
</script>
</body>
</html>

View file

@ -1,6 +1 @@
onload = function() {
test(function() {
assert_true(true, 'Script ran.')},
"Allows scripts from the same host."
);
}
window.cspPositiveTest = true;

View file

@ -0,0 +1,54 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="base-uri {{location[scheme]}}://{{domains[]}}:{{ports[http][0]}}/base/">
<title>base-uri works correctly inside a sandboxed iframe.</title>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
</head>
<body>
<h1>self is derived correctly inside inside a sandboxed iframe.</h1>
<div id='log'></div>
<script>
window.addEventListener('securitypolicyviolation', function(e) {
assert_unreached('No CSP violation report should have been fired.');
});
async_test(function(t) {
var i = document.createElement('iframe');
i.sandbox = 'allow-scripts';
i.style.display = 'none';
i.srcdoc = `
<meta http-equiv="Content-Security-Policy" content="img-src 'self'">
<body>
<script>
var img = document.createElement('img');
img.src = '../support/fail.png';
img.onerror = function() {
top.postMessage('FAIL', '*');
};
img.onload = function() {
top.postMessage('PASS', '*');
};
document.body.appendChild(img);
</sc` + `ript></body>`;
window.addEventListener('message', t.step_func(function(e) {
if (e.source === i.contentWindow) {
assert_equals(e.data, 'PASS');
t.done();
}
}));
document.body.appendChild(i);
}, 'img-src \'self\' works when specified in a meta tag.');
</script>
</body>
</html>

View file

@ -34,6 +34,12 @@
script.defer = true;
script.src = '../support/checkReport.sub.js?reportExists=false'
document.body.appendChild(script);
// Immediately declare a test so that the harness does not infer
// completion if the image loads before the script.
var checkReportTest = async_test("checkReport tests loaded");
script.onload = checkReportTest.step_func_done();
script.onerror = checkReportTest.unreached_func();
});
</script>
</body>

View file

@ -8,8 +8,6 @@
</head>
<body>
<script nonce="abc">
var t1 = async_test("Check that we received a message from the child frame");
window.onmessage = function(e) {
if (e.data == 'cookie set') {
var s = document.createElement('script');
@ -17,8 +15,6 @@
s.defer = true;
s.src = '../support/checkReport.sub.js?reportField=violated-directive&reportValue=script-src%20%27self%27%20%27nonce-abc%27&reportCookieName=generate-csp-report';
document.body.appendChild(s);
t1.done();
}
}
</script>

View file

@ -1,6 +1,5 @@
try {
importScripts("/content-security-policy/support/post-message.js");
postMessage("importScripts allowed");
} catch (e) {
postMessage("importScripts blocked");
}

View file

@ -8,11 +8,21 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
setup({ explicit_done: true });
var t = async_test("Test that violation report event was fired");
window.addEventListener("securitypolicyviolation", t.step_func_done(function(e) {
assert_equals(e.violatedDirective, "style-src");
}));
window.onload = function() {
try {
runTests();
} finally {
done();
}
};
function runTests() {
window.nodes = document.getElementById('nodes');
window.node1 = document.getElementById('node1');
window.node1.style.background = "yellow";
@ -101,7 +111,7 @@
test(function() {
assert_equals(ops.id, clonedOps.id)
});
};
}
</script>
</head>

View file

@ -9,12 +9,18 @@ self.addEventListener('install', (event) => {
// The subscribeToChanges calls are not done in parallel on purpose. Having
// multiple in-flight requests introduces failure modes aside from the
// cookie change logic that this test aims to cover.
try {
await cookieStore.subscribeToChanges([
{ name: 'cookie-name1', matchType: 'equals', url: '/scope/path1' }]);
await cookieStore.subscribeToChanges([
{ }, // Test the default values for subscription properties.
{ name: 'cookie-prefix', matchType: 'starts-with' },
]);
// If the worker enters the "redundant" state, the UA may terminate it
// before all tests have been reported to the client. Stifle errors in
// order to avoid this and ensure all tests are consistently reported.
} catch (err) {}
})());
});

View file

@ -6,8 +6,14 @@ importScripts("/resources/testharness.js");
self.addEventListener('install', (event) => {
event.waitUntil((async () => {
try {
await cookieStore.subscribeToChanges([
{ name: 'cookie-name', matchType: 'equals', url: '/scope/path' }]);
// If the worker enters the "redundant" state, the UA may terminate it
// before all tests have been reported to the client. Stifle errors in
// order to avoid this and ensure all tests are consistently reported.
} catch (err) {}
})());
});

View file

@ -6,7 +6,13 @@ importScripts("/resources/testharness.js");
self.addEventListener('install', (event) => {
event.waitUntil((async () => {
try {
await cookieStore.subscribeToChanges([]);
// If the worker enters the "redundant" state, the UA may terminate it
// before all tests have been reported to the client. Stifle errors in
// order to avoid this and ensure all tests are consistently reported.
} catch (err) {}
})());
});

View file

@ -6,8 +6,14 @@ importScripts("/resources/testharness.js");
self.addEventListener('install', (event) => {
event.waitUntil((async () => {
try {
await cookieStore.subscribeToChanges([
{ name: 'cookie-name', matchType: 'equals', url: '/scope/path' }]);
// If the worker enters the "redundant" state, the UA may terminate it
// before all tests have been reported to the client. Stifle errors in
// order to avoid this and ensure all tests are consistently reported.
} catch (err) {}
})());
});

View file

@ -6,8 +6,14 @@ importScripts("/resources/testharness.js");
self.addEventListener('install', (event) => {
event.waitUntil((async () => {
try {
await cookieStore.subscribeToChanges([
{ name: 'cookie-name', matchType: 'equals', url: '/scope/path' }]);
// If the worker enters the "redundant" state, the UA may terminate it
// before all tests have been reported to the client. Stifle errors in
// order to avoid this and ensure all tests are consistently reported.
} catch (err) {}
})());
});

View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<link rel="help" href="https://crbug.com/972904">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div style="margin-top:-100000000px;">
<div style="margin-bottom:-100000000px; padding-top: 1px;"></div>
text <!-- "text" is placed at the highest possible location due to saturated margin top values. -->
<div style="float: left; width: 60px; height: 20px;"></div>
<div style="margin-top: 10px;">
<div style="float: left; width: 10px;"></div>
<div style="float: left; width: 100px; height: 100px;"></div>
</div>
</div>
<script>
test(() => { }, 'test passes if it does not crash');
</script>

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<title>List item taller than the first opportunity should not crash</title>
<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
<link rel="help" href="https://www.w3.org/TR/CSS22/visuren.html#float-position" title="9.5.1 Positioning the float: the 'float' property">
<link rel="help" href="http://crbug.com/967997">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<div style="float: left; width: 5px; height: 5px;"></div>
<div style="clear: left; float: left; width: 10px; height: 5px;"></div>
<ul>
<li></li>
</ul>
<script>
test(() => {}, "Layout should not crash");
</script>
</body>

View file

@ -0,0 +1,26 @@
<!DOCTYPE html>
<link rel="author" title="Google LLC" href="http://www.google.com" />
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#line-sizing" />
<title>css-flexbox: Tests that we use the aspect ratio, clamped by min/max, to compute the main size</title>
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<style>
.flex {
display: flex;
width: 100px;
flex-direction: column;
}
img {
max-width: 100%;
width: 500px;
min-height: 0;
}
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="flex">
<img src="support/100x100-green.png">
</div>

View file

@ -0,0 +1,49 @@
<!DOCTYPE html>
<title>CSS Flexbox: min-height: auto with nested flexboxes and percentages</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=973924" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<style>
.overlapped-green {
position: absolute;
background-color: green;
width: 100px;
height: 80px;
z-index: 1;
}
.outer {
display: flex;
width: 100px;
background: green;
}
.inner {
width: 100%;
display: flex;
flex-direction: column;
min-width: 0;
}
.flex-item {
height: 100%;
margin-bottom: 20px;
background: red;
}
.inside-of-item {
height: 100%;
width: 100px;
min-height: 80px;
}
</style>
<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
<div class="overlapped-green"></div>
<div class="outer">
<div class="inner">
<a class="flex-item">
<div class="inside-of-item"></div>
</a>
</div>
</div>

View file

@ -0,0 +1,2 @@
<!DOCTYPE html>
<div style="width: 100px; height: 100px; background: green"></div>

View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/css-multicol">
<link rel="match" href="composited-under-clip-under-multicol-ref.html">
<meta name="assert" content="Test that clip under multicol is correctly applied on composited child">
<style>
.columns {
columns: 2;
column-gap: 20px;
width: 220px;
height: 100px;
}
.clip {
height: 100px;
overflow: hidden;
}
.composited {
will-change: transform;
margin-top: -20px;
margin-left: -20px;
border: 20px solid red;
width: 200px;
height: 200px;
background: green;
}
</style>
<div class="columns">
<div class="clip">
<div class="composited"></div>
</div>
<div class="clip"></div>
</div>

View file

@ -0,0 +1,37 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://crbug.com/974760">
<meta name="assert" content="fixed children inside inline container do not crash">
<style>
#container {
position: relative;
overflow: auto;
width: 200px;
height: 200px;
}
#inline-fixed-container {
filter:url("");
}
#fixed-container {
position: fixed;
}
#target {
position: fixed;
}
</style>
<div id="container">
<span id="inline-fixed-container">
<div id="fixed-container">
<div id="target"></div>
</div>
</span>
</div>
<script>
test(() => {
document.body.offsetTop;
document.querySelector("#target").appendChild(
document.createTextNode("foo"));
document.body.offsetTop;
}, 'this test passes if it does not crash');
</script>

View file

@ -0,0 +1,30 @@
<!DOCTYPE html>
<title>CSS Test: Check computing min-/max-content does not cause crash</title>
<link rel="help" href="https://crbug.com/976859">
<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#sizing-values">
<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
body {
width: fit-content;
}
#target {
display: block;
writing-mode: vertical-lr;
columns: 2;
}
.after #target {
float: left;
}
</style>
<body>
<div id="target"></div>
<script>
test(() => {
const body = document.body;
body.offsetTop;
body.classList.add("after");
});
</script>
</body>

View file

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Parsing of `appearance`</title>
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
test(function() {
var input = document.createElement('input');
input.setAttribute('style', 'appearance: none;');
assert_equals(input.style.getPropertyValue('appearance'), 'none');
}, 'parsing via attribute change steps of CSS declaration block\'s owner node');
test(function() {
var input = document.createElement('input');
input.style.cssText = 'appearance: none;';
assert_equals(input.style.getPropertyValue('appearance'), 'none');
}, 'parsing via modification of cssText');
test(function(t) {
var style = document.createElement('style');
style.appendChild(
document.createTextNode('#foo { appearance: none; }')
);
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
assert_equals(style.sheet.cssRules.length, 1);
assert_equals(
style.sheet.cssRules[0].style.getPropertyValue('appearance'),
'none'
);
}, 'parsing via creation of CSS declaration block');
</script>
</body>

View file

@ -0,0 +1,56 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Property references to `appearance`</title>
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
function create(initialValue) {
var style = document.createElement('input').style;
style.setProperty('appearance', initialValue);
return style;
}
test(function() {
var style = create('');
style.setProperty('appearance', 'none');
assert_equals(style.appearance, 'none');
}, 'setProperty');
test(function() {
var style = create('none');
style.removeProperty('appearance');
assert_equals(style.appearance, '');
}, 'removeProperty');
test(function() {
var style = create('');
style['appearance'] = 'none';
assert_equals(style.appearance, 'none');
}, 'property assignment');
test(function() {
var style = create('none');
assert_equals(style.getPropertyValue('appearance'), 'none');
}, 'getPropertyValue');
test(function() {
var style = create('none');
assert_equals(style['appearance'], 'none');
}, 'property access');
</script>
</body>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Serialization of `appearance`</title>
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
test(function() {
var input = document.createElement('input');
input.style.setProperty('appearance', 'none');
assert_equals(input.style.cssText, 'appearance: none;');
}, 'serialization via CSSStyleDeclaration');
test(function(t) {
var style = document.createElement('style');
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
style.sheet.insertRule('#foo {}', 0);
style.sheet.cssRules[0].style.setProperty('appearance', 'none');
assert_equals(
style.sheet.cssRules[0].cssText, '#foo { appearance: none; }'
);
}, 'serialization via CSSStyleRule');
test(function(t) {
var style = document.createElement('style');
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
style.sheet.insertRule('@media print { #foo {} }', 0);
style.sheet.cssRules[0].cssRules[0].style.setProperty('appearance', 'none');
assert_equals(
style.sheet.cssRules[0].cssText,
'@media print {\n #foo { appearance: none; }\n}'
);
}, 'serialization via CSSMediaRule');
</script>
</body>

View file

@ -0,0 +1,43 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Parsing of `-webkit-appearance`</title>
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
test(function() {
var input = document.createElement('input');
input.setAttribute('style', '-webkit-appearance: none;');
assert_equals(input.style.getPropertyValue('appearance'), 'none');
}, 'parsing via attribute change steps of CSS declaration block\'s owner node');
test(function() {
var input = document.createElement('input');
input.style.cssText = '-webkit-appearance: none;';
assert_equals(input.style.getPropertyValue('appearance'), 'none');
}, 'parsing via modification of cssText');
test(function(t) {
var style = document.createElement('style');
style.appendChild(
document.createTextNode('#foo { -webkit-appearance: none; }')
);
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
assert_equals(style.sheet.cssRules.length, 1);
assert_equals(
style.sheet.cssRules[0].style.getPropertyValue('appearance'),
'none'
);
}, 'parsing via creation of CSS declaration block');
</script>
</body>

View file

@ -0,0 +1,128 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Property references to `-webkit-appearance`</title>
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
function create(initialValue) {
var style = document.createElement('input').style;
style.setProperty('appearance', initialValue);
return style;
}
test(function() {
var style = create('');
style.setProperty('-webkit-appearance', 'none');
assert_equals(style.appearance, 'none');
}, 'setProperty - CSS property name');
test(function() {
var style = create('');
style.setProperty('WebkitAppearance', 'none');
assert_equals(style.appearance, '');
}, 'setProperty - camel-cased property name (ignored)');
test(function() {
var style = create('');
style.setProperty('webkitAppearance', 'none');
assert_equals(style.appearance, '');
}, 'setProperty - webkit-cased property name (ignored)');
test(function() {
var style = create('none');
style.removeProperty('-webkit-appearance');
assert_equals(style.appearance, '');
}, 'removeProperty - CSS property name');
test(function() {
var style = create('none');
style.removeProperty('WebkitAppearance');
assert_equals(style.appearance, 'none');
}, 'removeProperty - camel-cased property name (ignored)');
test(function() {
var style = create('none');
style.removeProperty('webkitAppearance');
assert_equals(style.appearance, 'none');
}, 'removeProperty - webkit-cased property name (ignored)');
test(function() {
var style = create('');
style['-webkit-appearance'] = 'none';
assert_equals(style.appearance, 'none');
}, 'property assignment - CSS property name');
test(function() {
var style = create('');
style['WebkitAppearance'] = 'none';
assert_equals(style.appearance, 'none');
}, 'property assignment - camel-cased property name');
test(function() {
var style = create('');
style['webkitAppearance'] = 'none';
assert_equals(style.appearance, 'none');
}, 'property assignment - webkit-cased property name');
test(function() {
var style = create('none');
assert_equals(style.getPropertyValue('-webkit-appearance'), 'none');
}, 'getPropertyValue - CSS property name');
test(function() {
var style = create('none');
assert_equals(style.getPropertyValue('WebkitAppearance'), '');
}, 'getPropertyValue - camel-cased property name (ignored)');
test(function() {
var style = create('none');
assert_equals(style.getPropertyValue('webkitAppearance'), '');
}, 'getPropertyValue - webkit-cased property name (ignored)');
test(function() {
var style = create('none');
assert_equals(style['-webkit-appearance'], 'none');
}, 'property access - CSS property name');
test(function() {
var style = create('none');
assert_equals(style['WebkitAppearance'], 'none');
}, 'property access - camel-cased property name');
test(function() {
var style = create('none');
assert_equals(style['webkitAppearance'], 'none');
}, 'property access - webkit-cased property name');
</script>
</body>

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Serialization of `-webkit-appearance`</title>
<link rel="help" href="https://drafts.csswg.org/css-ui-4/#appearance-switching">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
test(function() {
var input = document.createElement('input');
input.style.setProperty('-webkit-appearance', 'none');
assert_equals(input.style.cssText, 'appearance: none;');
}, 'serialization via CSSStyleDeclaration');
test(function(t) {
var style = document.createElement('style');
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
style.sheet.insertRule('#foo {}', 0);
style.sheet.cssRules[0].style.setProperty('-webkit-appearance', 'none');
assert_equals(
style.sheet.cssRules[0].cssText, '#foo { appearance: none; }'
);
}, 'serialization via CSSStyleRule');
test(function(t) {
var style = document.createElement('style');
document.body.appendChild(style);
t.add_cleanup(function() {
document.body.removeChild(style);
});
style.sheet.insertRule('@media print { #foo {} }', 0);
style.sheet.cssRules[0].cssRules[0].style.setProperty('-webkit-appearance', 'none');
assert_equals(
style.sheet.cssRules[0].cssText,
'@media print {\n #foo { appearance: none; }\n}'
);
}, 'serialization via CSSMediaRule');
</script>
</body>

View file

@ -0,0 +1,36 @@
<!DOCTYPE html>
<title>Verify that colors with var() references apply in visited link context</title>
<link rel="help" href="https://drafts.csswg.org/css-variables/#using-variables">
<style>
div {
min-height: 10px;
margin-bottom: 10px;
}
.color { color: green; }
.background_color { background-color: green; }
.border { border: medium solid green; }
.outline { outline: medium solid green; }
.text_decoration { text-decoration: solid underline green; }
.column_rule { columns: 2; column-rule: medium solid green; }
.stroke { stroke: green; fill: white; }
.fill { fill: green; }
</style>
<a href="">
<div class="color">Text should be green</div>
<div class="background_color"></div>
<div class="border"></div>
<div class="border"></div>
<div class="border"></div>
<div class="border"></div>
<div class="outline"></div>
<div class="outline"></div>
<div class="text_decoration">Underline should be green</div>
<div class="text_decoration">Underline should be green</div>
<div class="column_rule"><div style="height: 20px"></div></div>
<div class="column_rule"><div style="height: 20px"></div></div>
<svg width="20" height="50">
<rect class="stroke" x="5" y="5" width="10" height="10" />
<rect class="fill" x="5" y="20" width="10" height="10" />
</svg>
</a>

View file

@ -0,0 +1,93 @@
<!DOCTYPE html>
<title>Verify that colors with var() references apply in visited link context</title>
<link rel="help" href="https://drafts.csswg.org/css-variables/#using-variables">
<link rel="match" href="variable-reference-visited-ref.html">
<style>
:root { --color: green; }
div {
min-height: 10px;
margin-bottom: 10px;
}
.color {
color: var(--color);
}
.background_color {
background-color: var(--color);
}
.border_color_longhand{
border-style: solid;
border-width: medium;
border-left-color: var(--color);
border-top-color: var(--color);
border-right-color: var(--color);
border-bottom-color: var(--color);
}
.border_shorthand {
border: medium solid var(--color);
}
.border_color_longhand_logical {
border-style: solid;
border-width: medium;
border-inline-start-color: var(--color);
border-inline-end-color: var(--color);
border-block-start-color: var(--color);
border-block-end-color: var(--color);
}
.border_shorthand_logical {
border-inline: medium solid var(--color);
border-block: medium solid var(--color);
}
.outline_color_longhand {
outline-color: var(--color);
outline-style: solid;
outline-width: medium;
}
.outline_shorthand {
outline: medium solid var(--color);
}
.text_decoration_color_longhand {
text-decoration-line: underline;
text-decoration-style: solid;
text-decoration-color: var(--color);
}
.text_decoration_shorthand {
text-decoration: solid underline var(--color);
}
.column_rule_color_longhand {
columns: 2;
column-rule-width: medium;
column-rule-style: solid;
column-rule-color: var(--color);
}
.column_rule_shorthand {
columns: 2;
column-rule: medium solid var(--color);
}
.stroke {
stroke: var(--color);
fill: white;
}
.fill {
fill: var(--color);
}
</style>
<a href="">
<div class="color">Text should be green</div>
<div class="background_color"></div>
<div class="border_color_longhand"></div>
<div class="border_shorthand"></div>
<div class="border_color_longhand_logical"></div>
<div class="border_shorthand_logical"></div>
<div class="outline_color_longhand"></div>
<div class="outline_shorthand"></div>
<div class="text_decoration_color_longhand">Underline should be green</div>
<div class="text_decoration_shorthand">Underline should be green</div>
<div class="column_rule_color_longhand"><div style="height: 20px"></div></div>
<div class="column_rule_shorthand"><div style="height: 20px"></div></div>
<svg width="20" height="50">
<rect class="stroke" x="5" y="5" width="10" height="10" />
<rect class="fill" x="5" y="20" width="10" height="10" />
</svg>
</a>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>backdrop-filter: Correctly apply masks/clips to backdrop-filter content</title>
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
<p>Expected: A black circle.</p>
<div></div>
<style>
div {
position: absolute;
top: 100px;
left: 50px;
width: 200px;
height: 200px;
background: black;
border-radius: 100px;
}
</style>

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>backdrop-filter: Correctly apply masks/clips to backdrop-filter content</title>
<link rel="author" title="Mason Freed" href="mailto:masonfreed@chromium.org">
<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
<link rel="match" href="backdrop-filter-plus-mask-ref.html">
<p>Expected: A black circle.</p>
<div></div>
<style>
div {
position: absolute;
top: 100px;
left: 50px;
width: 200px;
height: 200px;
backdrop-filter: invert(1);
clip-path: circle(100px at center);
}
</style>

View file

@ -90,6 +90,23 @@ test(function () {
assert_attribute_log_entry(logEntries.last(), {name: 'r', oldValue: '100', newValue: null, namespace: 'http://www.w3.org/2000/svg'});
}, 'setAttributeNode and removeAttributeNS must enqueue and invoke attributeChangedCallback for an SVG attribute');
test(function () {
const instance = document.createElement(customElement.name);
assert_array_equals(customElement.takeLog().types(), ['constructed']);
instance.toggleAttribute('title', true);
assert_equals(instance.hasAttribute('title'), true);
var logEntries = customElement.takeLog();
assert_array_equals(logEntries.types(), ['attributeChanged']);
assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: null, newValue: '', namespace: null});
instance.toggleAttribute('title');
assert_equals(instance.hasAttribute('title'), false);
var logEntries = customElement.takeLog();
assert_array_equals(logEntries.types(), ['attributeChanged']);
assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: '', newValue: null, namespace: null});
}, 'toggleAttribute must enqueue and invoke attributeChangedCallback');
test(function () {
const callsToOld = [];
const callsToNew = [];

View file

@ -47,6 +47,31 @@ test(function () {
}, 'setAttribute and removeAttribute must enqueue and invoke attributeChangedCallback');
test(function () {
var instance = document.createElement('my-custom-element');
var anotherInstance = document.createElement('my-custom-element');
var callbackOrder = [];
instance.handler = function () {
callbackOrder.push([this, 'begin']);
anotherInstance.toggleAttribute('data-title');
callbackOrder.push([this, 'end']);
}
anotherInstance.handler = function () {
callbackOrder.push([this, 'begin']);
callbackOrder.push([this, 'end']);
}
instance.toggleAttribute('title');
assert_equals(callbackOrder.length, 4);
assert_array_equals(callbackOrder[0], [instance, 'begin']);
assert_array_equals(callbackOrder[1], [anotherInstance, 'begin']);
assert_array_equals(callbackOrder[2], [anotherInstance, 'end']);
assert_array_equals(callbackOrder[3], [instance, 'end']);
}, 'toggleAttribute must enqueue and invoke attributeChangedCallback');
test(function () {
var shouldCloneAnotherInstance = false;
var anotherInstanceClone;

View file

@ -35,6 +35,15 @@ testAttributeRemover(function (element, name) {
element.removeAttributeNS(null, name);
}, 'removeAttributeNS on Element');
testAttributeRemover(function (element, name, value) {
if (element.hasAttribute(name))
element.toggleAttribute(name);
}, 'toggleAttribute (only removes) on Element');
testAttributeRemover(function (element, name, value) {
element.toggleAttribute(name, false);
}, 'toggleAttribute (force false) on Element');
testAttributeAdder(function (element, name, value) {
var attr = document.createAttribute(name);
attr.value = value;

View file

@ -1 +1,4 @@
_build/
# This directory is created to store symbolic links to additional input
tools/

View file

@ -2,7 +2,7 @@
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXOPTS = -W -n
SPHINXBUILD = sphinx-build
SOURCEDIR = .
BUILDDIR = _build
@ -13,7 +13,11 @@ help:
.PHONY: help Makefile
tools/wptserve:
mkdir -p $(shell dirname $@)
ln -s ../../tools/wptserve $@
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
%: Makefile tools/wptserve
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View file

@ -1,4 +1,4 @@
# WPT documentation
# Project documentation tooling
The documentation for the web-platform-tests project is built using [the Sphinx
documentation generator](http://www.sphinx-doc.org). [The GitHub Actions

View file

@ -3,6 +3,21 @@
This section documents all the information necessary to administer the
infrastructure which makes the project possible.
## Tooling
```eval_rst
.. toctree::
:titlesonly:
../README
../tools/wptserve/docs/index.rst
.. toctree::
:hidden:
../tools/wptserve/README
```
## Secrets
Some aspects of the infrastructure are only accessible to administrators.

View file

@ -42,9 +42,10 @@ If you are a first-time GitHub user, read on for more details of the workflow.
## Fork the test repository
Now that you have Git set up, you will need to fork the test repository. This
will enable you to [submit](#submit) your tests using a pull request (more on this
[below](#submit)).
Now that you have Git set up, you will need to "fork" the test repository. Your
fork will be a completely independent version of the repository, hosted on
GitHub.com. This will enable you to [submit](#submit) your tests using a pull
request (more on this [below](#submit)).
1. In the browser, go to [web-platform-tests on GitHub][main-repo].
@ -61,22 +62,26 @@ will enable you to [submit](#submit) your tests using a pull request (more on th
If your [fork](#fork) was successful, the next step is to clone (download a copy of the files).
### Clone the test repo
At the command prompt, cd into the directory where you want to keep the tests.
### Clone the test repository
Open a command prompt in the directory where you want to keep the tests. Then
execute the following command:
$ git clone https://github.com/username/wpt.git
_This will download the tests into a directory named for the repo:_ `wpt/`.
This will download the tests into a directory named for the repository: `wpt/`.
* You should now have a full copy of the test repository on your local
machine. Feel free to browse the directories on your hard drive. You can also
browse them on [github.com][github-w3c] and see the full history of contributions
there.
You should now have a full copy of the test repository on your local
machine. Feel free to browse the directories on your hard drive. You can also
[browse them on github.com][main-repo] and see the full history of
contributions there.
## Configure Remote / Upstream
Synchronizing your forked repository with the W3C repository will enable you to
keep your forked local copy up-to-date with the latest commits in the W3C
repository.
Your forked repository is completely independent of the canonical repository,
which is commonly referred to as the "upstream" repository. Synchronizing your
forked repository with the upstream repository will keep your forked local copy
up-to-date with the latest commits.
1. On the command line, navigate to to the directory where your forked copy of
the repository is located.
@ -127,8 +132,7 @@ At the command line:
This will create a branch named `topic` and immediately
switch this to be your active working branch.
_The branch name should describe specifically what you are testing.
For Example:_
The branch name should describe specifically what you are testing. For example:
$ git checkout -b flexbox-flex-direction-prop
@ -139,13 +143,13 @@ You're ready to start writing tests! Come back to this page you're ready to
## Commit
Before you submit your tests for review and contribution to the main test
repo, you'll need to first commit them locally, where you now have your own
personal version control system with git. In fact, as you are writing your
repository, you'll need to first commit them locally, where you now have your
own personal version control system with git. In fact, as you are writing your
tests, you may want to save versions of your work as you go before you submit
them to be reviewed and merged.
1. When you're ready to save a version of your work, go to the command
prompt and cd to the directory where your files are.
1. When you're ready to save a version of your work, open a command
prompt and change to the directory where your files are.
2. First, ask git what new or modified files you have:
@ -163,17 +167,16 @@ them to be reviewed and merged.
$ git add [directory_of_files]
4. Run `git status` again to see what you have on the 'Changes to be
committed' list. These files are now 'staged'.
committed' list. These files are now 'staged'. Alternatively, you can run
`git diff --staged` to see a visual representation of the changes to be
committed.
5. Alternatively, you can run `git diff --staged`, which will show you the
diff of things to be committed.
6. Once you've added everything, you can commit and add a message to this
5. Once you've added everything, you can commit and add a message to this
set of changes:
$ git commit -m "Tests for indexed getters in the HTMLExampleInterface"
7. Repeat these steps as many times as you'd like before you submit.
6. Repeat these steps as many times as you'd like before you submit.
## Verify
@ -181,10 +184,8 @@ The Web Platform Test project has an automated tool
to verify that coding conventions have been followed,
and to catch a number of common mistakes.
You can and should run this tool locally.
It will be run on your submissions anyway,
and any failure will be grounds for rejection,
so you might as well fix them first.
We recommend running this tool locally. That will help you discover and fix
issues that would make it hard for us to accept your contribution.
1. On the command line, navigate to to the directory where your clone
of the repository is located.
@ -201,21 +202,21 @@ If you're here now looking for more instructions, that means you've written
some awesome tests and are ready to submit them. Congratulations and welcome
back!
1. The first thing you do before submitting them to the W3C repo is to push
them back up to the server:
1. The first thing you do before submitting them to the web-platform-tests
repository is to push them back up to your fork:
$ git push origin topic
_Note: Here,_ `origin` _refers to remote repo from which you cloned
_Note: Here,_ `origin` _refers to remote repository from which you cloned
(downloaded) the files after you forked, referred to as
web-platform-tests.git in the previous example;_
`topic` _refers to the name of your local branch that
you want to push_.
you want to share_.
2. Now you can send a message that you have changes or additions you'd like
to be reviewed and merged into the main (original) test repository. You do
this by using a pull request. In a browser, open the GitHub page for your
forked repository: **https://github.com/username/wpt**.
this by creating a pull request. In a browser, open the GitHub page for
your forked repository: **https://github.com/username/wpt**.
3. Now create the pull request. There are several ways to create a PR in the
GitHub UI. Below is one method and others can be found on
@ -223,17 +224,16 @@ GitHub UI. Below is one method and others can be found on
1. Click the ![new pull request](../assets/pullrequestbtn.png) button.
2. On the left, you should see the base repo is the
2. On the left, you should see the base repository is the
web-platform-tests/wpt. On the right, you should see your fork of that
repo. In the branch menu of your forked repo, switch to `topic`
repository. In the branch menu of your forked repository, switch to `topic`
**Note:** If you see _'There isn't anything to compare'_,
make sure your fork and your `topic`
branch is selected on the right side.
If you see "There isn't anything to compare", make sure your fork and
your `topic` branch is selected on the right side.
3. Select the ![create pull request](../assets/createpr.png) button at the top.
4. Scroll down and review the diff
4. Scroll down and review the summary of changes.
5. Scroll back up and in the Title field, enter a brief description for
your submission.
@ -251,12 +251,11 @@ accepted, delete your branch (see '[When Pull Request is Accepted](#cleanup)').
That's it! Your pull request will go into a queue and will be reviewed soon.
## Modify
## Refine
Once you submit your pull request, a reviewer will check your proposed changes
for correctness and style. It is likely that this process will lead to some
comments asking for modifications to your code. When you are ready to make the
changes, follow these steps:
for correctness and style. They may ask you to modify your code. When you are
ready to make the changes, follow these steps:
1. Check out the branch corresponding to your changes e.g. if your branch was
called `topic`
@ -280,11 +279,11 @@ platform.
## Cleanup
Once your pull request has been accepted, you will be notified in the GitHub
UI and you may get an email. At this point, your changes have been merged
user interface, and you may get an email. At this point, your changes have been merged
into the main test repository. You do not need to take any further action
on the test but you should delete your branch. This can easily be done in
the GitHub UI by navigating to the pull requests and clicking the
'Delete Branch' button.
the GitHub user interface by navigating to the pull request and clicking the
"Delete Branch" button.
![pull request accepted delete branch](/assets/praccepteddelete.png)
@ -391,7 +390,6 @@ you may also discard your connection to their repo:
[git]: https://git-scm.com/downloads
[git-book]: https://git-scm.com/book
[github]: https://github.com/
[github-w3c]: https://github.com/w3c
[github-fork-docs]: https://help.github.com/articles/fork-a-repo
[github-createpr]: https://help.github.com/articles/creating-a-pull-request
[help]: https://help.github.com/

View file

@ -11,7 +11,12 @@ delimit text to be replaced and `#` represents a digit.
### Test
``` html
<!--
Syntax highlighting cannot be enabled for the following template because it
contains invalid CSS.
-->
```
<!DOCTYPE html>
<meta charset="utf-8">
<title>${1:Test title}</title>
@ -28,7 +33,12 @@ Filename: `{test-topic}-###.html`
### Reference:
``` html
<!--
Syntax highlighting cannot be enabled for the following template because it
contains invalid CSS.
-->
```
<!DOCTYPE html>
<meta charset="utf-8">
<title>${1:Reference title}</title>

View file

@ -58,6 +58,11 @@ source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# These values are used in the documentation of wptserve but are not recognized
# by Sphinx.
# https://stackoverflow.com/questions/51824453/how-to-document-parameter-of-type-function-in-sphinx
nitpick_ignore = [('py:class', 'Callable'), ('py:obj', 'None')]
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
@ -71,10 +76,7 @@ language = None
exclude_patterns = [
'_build',
'Thumbs.db',
'.DS_Store',
'tools/.tox',
'tools/third_party',
'_venv'
'.DS_Store'
]
# Enable inline reStructured Text within Markdown-formatted files

View file

@ -76,7 +76,7 @@ expectations:
expected. They get their name from the JavaScript harness that's used to
execute them.
* [wdspec]() tests are written in Python and test [the WebDriver browser
* [wdspec][] tests are written in Python and test [the WebDriver browser
automation protocol](https://w3c.github.io/webdriver/)
* [Manual tests][manual] rely on a human to run them and determine their

View file

@ -25,6 +25,10 @@ if errorlevel 9009 (
exit /b 1
)
if not exist tools\ ( mkdir tools )
if not exist tools\wptserve\ ( mklink /d tools\wptserve ..\..\tools\wptserve )
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end

View file

@ -48,6 +48,16 @@ python wpt make-hosts-file | Out-File %SystemRoot%\System32\drivers\etc\hosts -E
If you are behind a proxy, you also need to make sure the domains above are
excluded from your proxy lookups.
[The Ahem font](../writing-tests/ahem) is used to test precise rendering
behavior. [Download the font][download-ahem] and install it using the
appropriate steps for your platform:
- On Windows, right-click the downloaded file in File Explorer/Windows Explorer
(depending on Windows version) and select "Install" from the menu.
- On macOS, open the downloaded file in Font Book (the default application for
font files) and then click install.
- On Linux, copy the file to `~/.local/share/fonts` and then run `fc-cache`.
### Windows Notes
Generally Windows Subsystem for Linux will provide the smoothest user
@ -115,6 +125,13 @@ customising the test run:
[A complete listing of the command-line arguments is available
here](command-line-arguments).
```eval_rst
.. toctree::
:hidden:
command-line-arguments
```
Additional browser-specific documentation:
```eval_rst
@ -124,3 +141,5 @@ Additional browser-specific documentation:
chrome_android
safari
```
[download-ahem]: https://github.com/web-platform-tests/wpt/raw/master/fonts/Ahem.ttf

View file

@ -2,7 +2,9 @@
A font called [Ahem][ahem-readme] has been developed which consists of
some very well defined glyphs of precise sizes and shapes; it is
especially useful for testing font and text properties.
especially useful for testing font and text properties. Installation
instructions are available in [Running Tests from the Local
System](../running-tests/from-local-system).
The font's em-square is exactly square. Its ascent and descent
combined is exactly the size of the em square; this means that the
@ -73,20 +75,4 @@ div {
}
```
## Installing Ahem
After [downloading][download-ahem] the font, installation instructions
vary between platforms:
On Windows, right-click the downloaded file in File Explorer/Windows
Explorer (depending on Windows version) and select "Install" from the
menu.
On macOS, open the downloaded file in Font Book (the default
application for font files) and then click install.
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://github.com/web-platform-tests/wpt/raw/master/fonts/Ahem.ttf

View file

@ -51,36 +51,15 @@ href="https://www.w3.org/TR/CSS21/colors.html#background-properties" />
<th>Token</th>
<th>Description</th>
</tr>
<tr>
<td>animated</td>
<td>Test is animated in final state. (Cannot be verified using
reftests/screenshots.)</td>
</tr>
<tr>
<td>asis</td>
<td>The test has particular markup formatting requirements and
cannot be re-serialized.</td>
</tr>
<tr>
<td>font</td>
<td>Requires a specific font to be installed at the OS level. (A link to the
font to be installed must be provided; this is not needed if only web
fonts are used.)</td>
</tr>
<tr>
<td>history</td>
<td>User agent session history is required. Testing :visited is a
good example where this may be used.</td>
</tr>
<tr>
<td>HTMLonly</td>
<td>Test case is only valid for HTML</td>
</tr>
<tr>
<td>interact</td>
<td>Requires human interaction (such as for testing scrolling
behavior)</td>
</tr>
<tr>
<td>invalid</td>
<td>Tests handling of invalid CSS. Note: This case contains CSS
@ -109,6 +88,38 @@ href="https://www.w3.org/TR/CSS21/colors.html#background-properties" />
<td>Behavior tested is RECOMMENDED, but not REQUIRED. <a
href="https://www.ietf.org/rfc/rfc2119.txt">[RFC2119]</a></td>
</tr>
</table>
The following flags are **deprecated** and should not be declared by new tests.
Tests which satisfy the described criteria should simply be designated as
"manual" using [the `-manual` file name flag][file-name-flags].
<table>
<tr>
<th>Token</th>
<th>Description</th>
</tr>
<tr>
<td>animated</td>
<td>Test is animated in final state. (Cannot be verified using
reftests/screenshots.)</td>
</tr>
<tr>
<td>font</td>
<td>Requires a specific font to be installed at the OS level. (A link to the
font to be installed must be provided; this is not needed if only web
fonts are used.)</td>
</tr>
<tr>
<td>history</td>
<td>User agent session history is required. Testing :visited is a
good example where this may be used.</td>
</tr>
<tr>
<td>interact</td>
<td>Requires human interaction (such as for testing scrolling
behavior)</td>
</tr>
<tr>
<td>speech</td>
<td>Device supports audio output. Text-to-speech (TTS) engine
@ -130,7 +141,7 @@ Example 1 (one token applies):
Example 2 (multiple tokens apply):
``` html
<meta name="flags" content="ahem image scroll" />
<meta name="flags" content="asis HTMLonly may" />
```
Example 3 (no tokens apply):
@ -178,3 +189,5 @@ Examples of good test assertions:
* "This test checks that 'text-indent' affects only the first line
of a block container if that line is also the first formatted line
of an element."
[file-name-flags]: {{ site.baseurl }}{% link _writing-tests/file-names.md %}

View file

@ -16,7 +16,7 @@ The wptserver implements a number of Python APIs for controlling traffic.
.. toctree::
:maxdepth: 1
request
response
stash
/tools/wptserve/docs/request
/tools/wptserve/docs/response
/tools/wptserve/docs/stash
```

View file

@ -1,3 +0,0 @@
```eval_rst
.. include:: ../../../tools/wptserve/docs/request.rst
```

View file

@ -1,3 +0,0 @@
```eval_rst
.. include:: ../../../tools/wptserve/docs/response.rst
```

View file

@ -1,3 +0,0 @@
```eval_rst
.. include:: ../../../tools/wptserve/docs/stash.rst
```

View file

@ -0,0 +1,38 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: observe generated CSS text</title>
<style>
p::before {
content: "Generated text prefix";
}
body {
margin: 20px;
}
</style>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/element-timing-helpers.js"></script>
<p elementtiming='my_text' id='text_id'></p>
<script>
async_test(function (t) {
const beforeRender = performance.now();
if (!window.PerformanceElementTiming) {
assert_unreached("PerformanceElementTiming is not implemented");
}
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
checkTextElement(entry, 'my_text', 'text_id', beforeRender, document.getElementById('text_id'));
assert_equals(entry.intersectionRect.left, 20, 'left should be 20.');
assert_equals(entry.intersectionRect.top, 20, 'top should be 20.');
// Try a lower bound of height=10, width=80 for the generated text.
assert_greater_than_equal(entry.intersectionRect.right, 100);
assert_greater_than_equal(entry.intersectionRect.bottom, 30);
})
);
observer.observe({type: 'element', buffered: true});
}, 'Generated text content is observable.');
</script>
</body>

View file

@ -1,50 +0,0 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: observe large elements</title>
<body>
<style>
body {
margin: 0;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/element-timing-helpers.js"></script>
<script>
let beforeRender;
let img;
async_test(function (t) {
if (!window.PerformanceElementTiming) {
assert_unreached("PerformanceElementTiming is not implemented");
}
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
const index = window.location.href.lastIndexOf('/');
const pathname = window.location.href.substring(0, index) +
'/resources/square20.jpg';
checkElement(entry, pathname, '', 'large_one', beforeRender, img);
// Assume viewport hasn't changed, so the element occupies all of it.
checkRect(entry,
[0, document.documentElement.clientWidth, 0, document.documentElement.clientHeight]);
checkNaturalSize(entry, 20, 20);
})
);
observer.observe({entryTypes: ['element']});
// We add the image during onload to be sure that the observer is registered
// in time for it to observe the element timing.
window.onload = () => {
// Add an image setting width and height equal to viewport.
img = document.createElement('img');
img.src = 'resources/square20.jpg';
img.width = document.documentElement.clientWidth;
img.height = document.documentElement.clientHeight;
img.setAttribute('id', 'large_one');
document.body.appendChild(img);
beforeRender = performance.now();
};
}, 'Large img element is observable.');
</script>
</body>

View file

@ -11,8 +11,6 @@ body {
<script src="resources/element-timing-helpers.js"></script>
<div id='target'></div>
<script>
let beforeRender;
let img;
async_test(function (t) {
if (!window.PerformanceElementTiming) {
assert_unreached("PerformanceElementTiming is not implemented");
@ -27,13 +25,12 @@ body {
// in time for it to observe the element timing.
window.onload = () => {
// Add image of width equal to 100 and height equal to 100.
img = document.createElement('img');
const img = document.createElement('img');
img.src = 'resources/square100.png';
img.setAttribute('elementtiming', 'my_image');
img.setAttribute('id', 'my_id');
const shadowRoot = document.getElementById('target').attachShadow({mode: 'closed'});
const shadowRoot = document.getElementById('target').attachShadow({mode: 'open'});
shadowRoot.appendChild(img);
beforeRender = performance.now();
t.step_timeout(() => {
// Assume entry was not dispatched, so test passes.
t.done();

View file

@ -0,0 +1,39 @@
<!DOCTYPE HTML>
<meta charset=utf-8>
<title>Element Timing: do not observe text in shadow tree</title>
<style>
body {
margin: 0;
}
</style>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/element-timing-helpers.js"></script>
<div id='target'></div>
<script>
async_test(function (t) {
if (!window.PerformanceElementTiming) {
assert_unreached("PerformanceElementTiming is not implemented");
}
const observer = new PerformanceObserver(
t.step_func_done(function(entryList) {
assert_unreached('Should not observe text elements in shadow trees!');
})
);
observer.observe({entryTypes: ['element']});
// We add the text during onload to be sure that the observer is registered
// in time for it to observe the element timing.
window.onload = () => {
// Add text of width equal to 100 and height equal to 100.
const text = document.createElement('p');
text.innerHTML = 'Text';
text.setAttribute('elementtiming', 'my_text');
const shadowRoot = document.getElementById('target').attachShadow({mode: 'open'});
shadowRoot.appendChild(text);
t.step_timeout(() => {
// Assume entry was not dispatched, so test passes.
t.done();
}, 500);
};
}, 'Text in shadow tree with elementtiming attribute is not observable.');
</script>

View file

@ -25,11 +25,11 @@ p {
assert_equals(entryList.getEntries().length, 1);
const entry = entryList.getEntries()[0];
checkTextElement(entry, 'my_text', 'text_id', beforeRender, paragraph);
assert_equals(entry.intersectionRect.left, 20);
assert_equals(entry.intersectionRect.left, 20, 'left should be 20.');
// Text box size will vary from device to device, so try lower bounding height by 12, width by 100.
assert_greater_than_equal(entry.intersectionRect.right, 120);
assert_equals(entry.intersectionRect.top, 20);
assert_equals(entry.intersectionRect.top, 20, 'top should be 20.');
assert_greater_than_equal(entry.intersectionRect.bottom, 32);
})
);

View file

@ -0,0 +1,68 @@
<!DOCTYPE html>
<html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/fetch/sec-metadata/resources/helper.js></script>
<script src=/fetch/sec-metadata/resources/redirectTestHelper.sub.js></script>
<script src=/common/security-features/resources/common.js></script>
<script src=/common/utils.js></script>
<style>
@font-face {
font-family: myDowngradeUpgradeFont;
src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fsec-metadata%252Fresources%252Frecord-header.py%253Ffile%253Dfont-https-downgrade-upgrade);
}
#fontTest {
font-family: myDowngradeUpgradeFont;
}
</style>
<body>
<div id="fontTest">Downgraded then upgraded font</div>
<script>
let nonce = token();
let expected = { "dest": "", "site": "same-site", "user": "", "mode": "" };
// Validate various scenarios handle a request that redirects from https => http
// correctly and avoids disclosure of any Sec- headers.
RunCommonRedirectTests("Https downgrade-upgrade", MultipleRedirectTo, expected);
document.fonts.ready.then(function () {
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "font-https-downgrade-upgrade";
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expected))
.then(_ => resolve())
.catch(e => reject(e));
});
}, "Https downgrade-upgrade font => No headers");
});
promise_test(() =>
requestViaImage(secureRedirectURL + encodeURIComponent(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py")))
.then(result => {
headers = result.headers;
got = {
"dest": headers["sec-fetch-dest"],
"mode": headers["sec-fetch-mode"],
"site": headers["sec-fetch-site"],
"user": headers["sec-fetch-user"]
};
assert_header_equals(got, {
// Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
// that `image.py` encodes data.
"dest": undefined,
"site": "same-site",
"user": undefined,
"mode": undefined,
});
}), "Https downgrade-upgrade image => No headers");
</script>
<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fsec-metadata%252Fresources%252Fecho-as-script.py"></script>
<script>
test(t => {
t.add_cleanup(_ => { header = null; });
assert_header_equals(header, expected);
}, "Https downgrade-upgrade script => No headers");
</script>
</body>

View file

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/fetch/sec-metadata/resources/helper.js></script>
<script src=/fetch/sec-metadata/resources/redirectTestHelper.sub.js></script>
<script src=/common/security-features/resources/common.js></script>
<script src=/common/utils.js></script>
<style>
@font-face {
font-family: myUpgradedFont;
src: url(http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-upgrade);
}
#fontTest {
font-family: myUpgradedFont;
}
</style>
<body>
<div id="fontTest">Upgraded font</div>
<script>
let nonce = token();
let expected = { "dest": "", "site": "same-site", "user": "", "mode": "" };
// Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers.
RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected);
document.fonts.ready.then(function () {
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "font-https-upgrade";
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expected))
.then(_ => resolve())
.catch(e => reject(e));
});
}, "Http upgrade font => No headers");
});
promise_test(() =>
requestViaImage(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py"))
.then(result => {
headers = result.headers;
got = {
"dest": headers["sec-fetch-dest"],
"mode": headers["sec-fetch-mode"],
"site": headers["sec-fetch-site"],
"user": headers["sec-fetch-user"]
};
assert_header_equals(got, {
// Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
// that `image.py` encodes data.
"dest": undefined,
"site": "same-site",
"user": undefined,
"mode": undefined,
});
}), "Http upgrade image => No headers");
</script>
<script src="http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Fecho-as-script.py"></script>
<script>
test(t => {
t.add_cleanup(_ => { header = null; });
assert_header_equals(header, expected);
}, "Http upgrade script => No headers");
</script>
</body>

View file

@ -0,0 +1,68 @@
<!DOCTYPE html>
<html>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=/fetch/sec-metadata/resources/helper.js></script>
<script src=/fetch/sec-metadata/resources/redirectTestHelper.sub.js></script>
<script src=/common/security-features/resources/common.js></script>
<script src=/common/utils.js></script>
<style>
@font-face {
font-family: myDowngradedFont;
src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-downgrade);
}
#fontTest {
font-family: myDowngradedFont;
}
</style>
<body>
<div id="fontTest">Downgraded font</div>
<script>
let nonce = token();
let expected = { "dest": "", "site": "", "user": "", "mode": "" };
// Validate various scenarios handle a request that redirects from https => http correctly and avoids disclosure of any Sec- headers.
RunCommonRedirectTests("Https downgrade", downgradeRedirectTo, expected);
document.fonts.ready.then(function () {
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "font-https-downgrade";
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expected))
.then(_ => resolve())
.catch(e => reject(e));
});
}, "Https downgrade font => No headers");
});
promise_test(() =>
requestViaImage(secureRedirectURL + encodeURIComponent("http://{{host}}:{{ports[http][0]}}/common/security-features/subresource/image.py"))
.then(result => {
headers = result.headers;
got = {
"dest": headers["sec-fetch-dest"],
"mode": headers["sec-fetch-mode"],
"site": headers["sec-fetch-site"],
"user": headers["sec-fetch-user"]
};
assert_header_equals(got, {
// Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
// that `image.py` encodes data.
"dest": undefined,
"site": undefined,
"user": undefined,
"mode": undefined,
});
}), "Https downgrade image => No headers");
</script>
<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fsec-metadata%2Fresources%2Fecho-as-script.py"></script>
<script>
test(t => {
t.add_cleanup(_ => { header = null; });
assert_header_equals(header, expected);
}, "Https downgrade script => No headers");
</script>
</body>

View file

@ -0,0 +1,181 @@
function createVideoElement() {
let el = document.createElement('video');
el.src = "/media/movie_5.mp4";
el.setAttribute("controls", "");
el.setAttribute("crossorigin", "");
return el;
}
function createTrack() {
let el = document.createElement("track");
el.setAttribute("default", "");
el.setAttribute("kind", "captions");
el.setAttribute("srclang", "en");
return el;
}
let secureRedirectURL = "https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=";
let insecureRedirectURL = "http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=";
let secureTestURL = "https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/";
let insecureTestURL = "http://{{host}}:{{ports[http][0]}}/fetch/sec-metadata/";
// Helper to craft an URL that will go from HTTPS => HTTP => HTTPS to
// simulate us downgrading then upgrading again during the same redirect chain.
function MultipleRedirectTo(partialPath) {
let finalURL = insecureRedirectURL + encodeURIComponent(secureTestURL + partialPath);
return insecureRedirectURL + encodeURIComponent(finalURL);
}
// Helper to craft an URL that will go from HTTP => HTTPS to simulate upgrading a
// given request.
function upgradeRedirectTo(partialPath) {
return insecureRedirectURL + encodeURIComponent(secureTestURL + partialPath);
}
// Helper to craft an URL that will go from HTTPS => HTTP to simulate downgrading a
// given request.
function downgradeRedirectTo(partialPath) {
return secureRedirectURL + encodeURIComponent(insecureTestURL + partialPath);
}
// Helper to run common redirect test cases that don't require special setup on
// the test page itself.
function RunCommonRedirectTests(testNamePrefix, urlHelperMethod, expectedResults) {
async_test(t => {
let i = document.createElement('iframe');
i.src = urlHelperMethod("resources/post-to-owner.py");
window.addEventListener('message', t.step_func(e => {
if (e.source != i.contentWindow) {
return;
}
assert_header_equals(e.data, expectedResults);
t.done();
}));
document.body.appendChild(i);
}, testNamePrefix + " iframe => No headers");
async_test(t => {
let testWindow = window.open(urlHelperMethod("resources/post-to-owner.py"));
t.add_cleanup(_ => testWindow.close());
window.addEventListener('message', t.step_func(e => {
if (e.source != testWindow) {
return;
}
assert_header_equals(e.data, expectedResults);
t.done();
}));
}, testNamePrefix + " top level navigation => No headers");
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "embed-redirect-redirect" + nonce;
let e = document.createElement('embed');
e.src = urlHelperMethod("resources/record-header.py?file=" + key);
e.onload = e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expectedResults))
.then(_ => resolve())
.catch(e => reject(e));
};
document.body.appendChild(e);
});
}, testNamePrefix + " embed => No headers");
promise_test(t => {
let key = "fetch-redirect" + nonce;
return fetch(urlHelperMethod("resources/echo-as-json.py?" + key))
.then(r => r.json())
.then(j => {assert_header_equals(j, expectedResults);});
}, testNamePrefix + " fetch() api => No headers");
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "object-https-redirect" + nonce;
let e = document.createElement('object');
e.data = urlHelperMethod("resources/record-header.py?file=" + key);
e.onload = e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expectedResults))
.then(_ => resolve())
.catch(e => reject(e));
};
document.body.appendChild(e);
});
}, testNamePrefix + " object => No headers");
if (document.createElement('link').relList.supports('prefetch')) {
async_test(t => {
let key = "prefetch" + nonce;
let e = document.createElement('link');
e.rel = "prefetch";
e.href = urlHelperMethod("resources/record-header.py?file=" + key) + "&simple=true";
e.onload = t.step_func(e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(t.step_func(response => response.text()))
.then(t.step_func_done(text => assert_header_equals(text, expectedResults)))
.catch(t.unreached_func("Fetching and verifying the results should succeed."));
});
e.onerror = t.unreached_func();
document.head.appendChild(e);
}, testNamePrefix + " prefetch => No headers");
}
if (document.createElement('link').relList.supports('preload')) {
async_test(t => {
let key = "preload" + nonce;
let e = document.createElement('link');
e.rel = "preload";
e.href = urlHelperMethod("resources/record-header.py?file=" + key);
e.setAttribute("as", "track");
e.onload = e.onerror = t.step_func_done(e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(t.step_func(response => response.text()))
.then(t.step_func(text => assert_header_equals(text, expectedResults)))
.then(t.step_func_done(_ => resolve()))
.catch(t.unreached_func());
});
document.head.appendChild(e);
}, testNamePrefix + " preload => No headers");
}
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "style-https-redirect" + nonce;
let e = document.createElement('link');
e.rel = "stylesheet";
e.href = urlHelperMethod("resources/record-header.py?file=" + key);
e.onload = e => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expectedResults))
.then(_ => resolve())
.catch(e => reject(e));
};
document.body.appendChild(e);
});
}, testNamePrefix + " stylesheet => No headers");
promise_test(t => {
return new Promise((resolve, reject) => {
let key = "track-https-redirect" + nonce;
let video = createVideoElement();
let el = createTrack();
el.src = urlHelperMethod("resources/record-header.py?file=" + key);
el.onload = t.step_func(_ => {
fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
.then(response => response.text())
.then(text => assert_header_equals(text, expectedResults))
.then(_ => resolve());
});
video.appendChild(el);
document.body.appendChild(video);
});
}, testNamePrefix + " track => No headers");
}

View file

@ -0,0 +1,22 @@
<!doctype html>
<title>API availability following history traversal</title>
<meta charset=utf-8>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<p>Test requires popup blocker disabled</p>
<div id=log></div>
<script>
var t = async_test();
var hasNavigated = false;
var child;
t.step(function() {
child = window.open("resources/api-availability-1.html");
t.add_cleanup(function() {
child.close();
});
});
navigate = t.step_func(function() {
hasNavigated = true;
child.location = child.location.href.replace("api-availability-1.html", "api-availability-2.html");
});
</script>

View file

@ -0,0 +1,31 @@
<!doctype html>
<title>API availability following history traversal - 1</title>
<script>
var controller = opener;
var t = controller.t;
var assert_not_equals = controller.assert_not_equals;
t.step(function() {
// If this document is discarded as a result of navigation, then this script
// will be executed a second time. The semantics this test intends to verify
// cannot be observed under these conditions, the discarding is not itself a
// violation. Silently pass the test in that case.
if (controller.hasNavigated) {
t.done();
return;
}
t.step_timeout(function() {
assert_not_equals(window.history, null, 'history');
assert_not_equals(window.localStorage, null, 'localStorage');
assert_not_equals(window.location, null, 'location');
assert_not_equals(window.navigator, null, 'navigator');
assert_not_equals(window.opener, null, 'opener');
assert_not_equals(window.sessionStorage, null, 'sessionStorage');
t.done();
}, 1000);
controller.navigate();
});
</script>

View file

@ -0,0 +1,3 @@
<!doctype html>
<title>API availability following history traversal - 2</title>
<body onload="history.back()"></body>

View file

@ -23,6 +23,8 @@
var frameWin = document.getElementById("srcdoc-iframe").contentWindow;
assert_equals(frameWin.location.href, "about:srcdoc");
assert_equals(frameWin.scrollY, 0, "Should not have scrolled yet");
frameWin.location.hash = "";
assert_equals(frameWin.location.href, "about:srcdoc#", "Setting an empty hash should result in an empty fragment, not no fragment.");
frameWin.location.hash = "test";
assert_equals(frameWin.location.href, "about:srcdoc#test");
assert_true(frameWin.scrollY > frameWin.innerHeight,

View file

@ -0,0 +1,28 @@
const SAME_ORIGIN = {origin: get_host_info().HTTP_ORIGIN, name: "SAME_ORIGIN"};
const SAME_SITE = {origin: get_host_info().HTTP_REMOTE_ORIGIN, name: "SAME_SITE"};
const CROSS_ORIGIN = {origin: get_host_info().HTTP_NOTSAMESITE_ORIGIN, name: "CROSS_ORIGIN"}
function coop_test(t, host, coop, channelName, hasOpener) {
let bc = new BroadcastChannel(channelName);
bc.onmessage = t.step_func_done((event) => {
let payload = event.data;
assert_equals(payload.name, hasOpener ? channelName : "");
assert_equals(payload.opener, hasOpener);
});
let w = window.open(`${host.origin}/html/cross-origin-opener/resources/coop_window.py?path=window.sub.html&coop=${escape(coop)}&channel=${channelName}`, channelName);
// w will be closed by its postback iframe. When out of process,
// window.close() does not work.
t.add_cleanup(() => w.close());
}
function run_coop_tests(mainTest, testArray) {
for (let test of tests) {
async_test(t => {
coop_test(t, test[0], test[1],
`${mainTest}_to_${test[0].name}_${test[1].replace(/ /g,"-")}`,
test[2]);
}, `${mainTest} document opening popup to ${test[0].origin} with COOP: "${test[1]}"`);
}
}

Some files were not shown because too many files have changed in this diff Show more