diff options
495 files changed, 8588 insertions, 3529 deletions
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 66149b5b86e..517691d2e85 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -16,6 +16,9 @@ on: required: false default: false type: boolean + github-release-id: + required: false + type: string workflow_dispatch: inputs: layout: @@ -82,9 +85,14 @@ jobs: path: target/release/servo-tech-demo.tar.gz - name: Upload if: ${{ inputs.upload }} - run: python3 ./mach upload-nightly ${{ env.PACKAGE }} --secret-from-environment + run: | + python3 ./mach upload-nightly ${{ env.PACKAGE }} \ + --secret-from-environment \ + --github-release-id ${{ inputs.github-release-id }} env: S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }} + NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} + NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds - name: Package binary run: tar -czf target.tar.gz target/release/servo resources - name: Archive binary diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 933683c713c..f8348df28ba 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -14,6 +14,9 @@ on: required: false default: false type: boolean + github-release-id: + required: false + type: string workflow_dispatch: inputs: layout: @@ -91,10 +94,14 @@ jobs: path: target/release/servo-tech-demo.dmg - name: Upload if: ${{ inputs.upload }} - run: python3 ./mach upload-nightly mac --secret-from-environment + run: | + python3 ./mach upload-nightly mac --secret-from-environment \ + --github-release-id ${{ inputs.github-release-id }} env: S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }} GITHUB_HOMEBREW_TOKEN: ${{ secrets.HOMEBREW_TOKEN }} + NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} + NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds - name: Package binary run: gtar -czf target.tar.gz target/release/servo target/release/*.dylib resources - name: Archive binary diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 12aec1ea428..a09de65c789 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -11,42 +11,105 @@ env: SHELL: /bin/bash jobs: + create-draft-release: + # This job is only useful when run on upstream servo. + if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch' + name: Create Draft GH Release + runs-on: ubuntu-20.04 + steps: + - id: create-release + run: | + NIGHTLY_TAG=$(date "+%F") + RELEASE_URL=$(gh release create "${NIGHTLY_TAG}" \ + --draft \ + --title "${NIGHTLY_TAG}" \ + --notes 'Nightly builds based on servo/servo@${{ github.sha }}' \ + --repo ${NIGHTLY_REPO}) + TEMP_TAG=$(basename "$RELEASE_URL") + RELEASE_ID=$( \ + gh api -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + "/repos/${NIGHTLY_REPO}/releases/tags/${TEMP_TAG}" \ + | jq '.id' \ + ) + echo "RELEASE_ID=${RELEASE_ID}" >> ${GITHUB_OUTPUT} + env: + GITHUB_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} + NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds + outputs: + release-id: ${{ steps.create-release.outputs.RELEASE_ID }} + + publish-nightly-release: + # This job is only useful when run on upstream servo. + if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch' + name: Publish GH Release for nightly + runs-on: ubuntu-20.04 + steps: + - run: | + gh api \ + --method PATCH \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/${NIGHTLY_REPO}/releases/${RELEASE_ID} \ + -F draft=false + env: + GITHUB_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} + NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds + RELEASE_ID: ${{ needs.create-draft-release.outputs.release-id }} + needs: + - create-draft-release + - upload-linux + - upload-win + - upload-mac + upload-win: # This job is only useful when run on upstream servo. if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch' name: Upload nightly (Windows) + needs: + - create-draft-release uses: ./.github/workflows/windows.yml with: layout: '2013' upload: true + github-release-id: ${{ needs.create-draft-release.outputs.release-id }} secrets: inherit upload-mac: # This job is only useful when run on upstream servo. if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch' name: Upload nightly (macOS) + needs: + - create-draft-release uses: ./.github/workflows/mac.yml with: layout: '2013' upload: true + github-release-id: ${{ needs.create-draft-release.outputs.release-id }} secrets: inherit upload-linux: # This job is only useful when run on upstream servo. if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch' name: Upload nightly (Linux) + needs: + - create-draft-release uses: ./.github/workflows/linux.yml with: layout: '2013' upload: true + github-release-id: ${{ needs.create-draft-release.outputs.release-id }} secrets: inherit upload-linux-2020: # This job is only useful when run on upstream servo. if: github.repository == 'servo/servo' || github.event_name == 'workflow_dispatch' name: Upload nightly (Linux layout2020) + needs: + - create-draft-release uses: ./.github/workflows/linux.yml with: layout: '2020' upload: true + github-release-id: ${{ needs.create-draft-release.outputs.release-id }} secrets: inherit diff --git a/.github/workflows/wpt-nightly.yml b/.github/workflows/scheduled-wpt-import.yml index 1240e13b439..49bdda984e7 100644 --- a/.github/workflows/wpt-nightly.yml +++ b/.github/workflows/scheduled-wpt-import.yml @@ -1,9 +1,9 @@ -name: WPT import +name: Scheduled WPT import on: schedule: - # Run this job at 00:00 everyday - - cron: "0 0 * * *" + # Run this job every Sunday at 00:00. + - cron: "0 0 * * 0" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -66,7 +66,7 @@ jobs: export CURRENT_DATE=$(date +"%d-%m-%Y") echo $CURRENT_DATE echo "CURRENT_DATE=$CURRENT_DATE" >> $GITHUB_ENV - ./etc/ci/wpt-nightly-update.sh + ./etc/ci/wpt-scheduled-update.sh - name: Push changes uses: ad-m/github-push-action@master with: diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 634f462a1da..9ce880a88f8 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -14,6 +14,9 @@ on: required: false default: false type: boolean + github-release-id: + required: false + type: string workflow_dispatch: inputs: layout: @@ -94,9 +97,13 @@ jobs: - name: Upload if: ${{ inputs.upload }} working-directory: "C:\\a\\${{ github.event.repository.name }}\\${{ github.event.repository.name }}" - run: python mach upload-nightly windows-msvc --secret-from-environment + run: | + python mach upload-nightly windows-msvc --secret-from-environment ` + --github-release-id ${{ inputs.github-release-id }} env: S3_UPLOAD_CREDENTIALS: ${{ secrets.S3_UPLOAD_CREDENTIALS }} + NIGHTLY_REPO_TOKEN: ${{ secrets.NIGHTLY_REPO_TOKEN }} + NIGHTLY_REPO: ${{ github.repository_owner }}/servo-nightly-builds build_result: name: homu build finished diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs index 4527de651d6..2580d4af9bc 100644 --- a/components/layout_2020/positioned.rs +++ b/components/layout_2020/positioned.rs @@ -458,8 +458,7 @@ impl HoistedAbsolutelyPositionedBox { }; let solve_block_axis = |computed_size| { solve_axis( - // TODO(delan) shouldn’t this be cbbs? - cbis, + cbbs, pbm.padding_border_sums.block, pbm.margin.block_start, pbm.margin.block_end, diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index de81bd7dc4c..6d466ea0c61 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -272,10 +272,6 @@ impl Headers { self.guard.get() } - pub fn empty_header_list(&self) { - *self.header_list.borrow_mut() = HyperHeaders::new(); - } - pub fn set_headers(&self, hyper_headers: HyperHeaders) { *self.header_list.borrow_mut() = hyper_headers; } diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs index e301d360cc4..9bb857736a4 100644 --- a/components/script/dom/request.rs +++ b/components/script/dom/request.rs @@ -50,7 +50,6 @@ pub struct Request { request: DomRefCell<NetTraitsRequest>, body_stream: MutNullableDom<ReadableStream>, headers: MutNullableDom<Headers>, - mime_type: DomRefCell<Vec<u8>>, } impl Request { @@ -60,7 +59,6 @@ impl Request { request: DomRefCell::new(net_request_from_global(global, url)), body_stream: MutNullableDom::new(None), headers: Default::default(), - mime_type: DomRefCell::new("".to_string().into_bytes()), } } @@ -81,69 +79,71 @@ impl Request { // Step 2 let mut fallback_mode: Option<NetTraitsRequestMode> = None; - // Step 3 + // FIXME(cybai): As the spec changed in https://github.com/whatwg/fetch/pull/1153, + // we will need to change the default value of credentials for + // NetTraitsRequest and then remove fallback here. let mut fallback_credentials: Option<NetTraitsRequestCredentials> = None; - // Step 4 + // Step 3 let base_url = global.api_base_url(); - // Step 5 TODO: "Let signal be null." + // Step 4 TODO: "Let signal be null." match input { - // Step 6 + // Step 5 RequestInfo::USVString(USVString(ref usv_string)) => { - // Step 6.1 + // Step 5.1 let parsed_url = base_url.join(&usv_string); - // Step 6.2 + // Step 5.2 if parsed_url.is_err() { return Err(Error::Type("Url could not be parsed".to_string())); } - // Step 6.3 + // Step 5.3 let url = parsed_url.unwrap(); if includes_credentials(&url) { return Err(Error::Type("Url includes credentials".to_string())); } - // Step 6.4 + // Step 5.4 temporary_request = net_request_from_global(global, url); - // Step 6.5 + // Step 5.5 fallback_mode = Some(NetTraitsRequestMode::CorsMode); - // Step 6.6 + // FIXME(cybai): remove this line when we can remove the fallback of credentials fallback_credentials = Some(NetTraitsRequestCredentials::CredentialsSameOrigin); }, - // Step 7 + // Step 6 RequestInfo::Request(ref input_request) => { // This looks like Step 38 // TODO do this in the right place to not mask other errors if request_is_disturbed(input_request) || request_is_locked(input_request) { return Err(Error::Type("Input is disturbed or locked".to_string())); } - // Step 7.1 + // Step 6.1 temporary_request = input_request.request.borrow().clone(); - // Step 7.2 TODO: "Set signal to input's signal." + // Step 6.2 TODO: "Set signal to input's signal." }, } - // Step 8 + // Step 7 // TODO: `entry settings object` is not implemented yet. let origin = base_url.origin(); - // Step 9 + // Step 8 let mut window = Window::Client; - // Step 10 + // Step 9 // TODO: `environment settings object` is not implemented in Servo yet. - // Step 11 + // Step 10 if !init.window.handle().is_null_or_undefined() { return Err(Error::Type("Window is present and is not null".to_string())); } - // Step 12 + // Step 11 if !init.window.handle().is_undefined() { window = Window::NoWindow; } - // Step 13 + // Step 12 let mut request: NetTraitsRequest; request = net_request_from_global(global, temporary_request.current_url()); request.method = temporary_request.method; @@ -160,7 +160,7 @@ impl Request { request.redirect_mode = temporary_request.redirect_mode; request.integrity_metadata = temporary_request.integrity_metadata; - // Step 14 + // Step 13 if init.body.is_some() || init.cache.is_some() || init.credentials.is_some() || @@ -173,33 +173,33 @@ impl Request { init.referrerPolicy.is_some() || !init.window.handle().is_undefined() { - // Step 14.1 + // Step 13.1 if request.mode == NetTraitsRequestMode::Navigate { request.mode = NetTraitsRequestMode::SameOrigin; } - // Step 14.2 TODO: "Unset request's reload-navigation flag." - // Step 14.3 TODO: "Unset request's history-navigation flag." - // Step 14.4 + // Step 13.2 TODO: "Unset request's reload-navigation flag." + // Step 13.3 TODO: "Unset request's history-navigation flag." + // Step 13.4 request.referrer = global.get_referrer(); - // Step 14.5 + // Step 13.5 request.referrer_policy = None; } - // Step 15 + // Step 14 if let Some(init_referrer) = init.referrer.as_ref() { - // Step 15.1 + // Step 14.1 let ref referrer = init_referrer.0; - // Step 15.2 + // Step 14.2 if referrer.is_empty() { request.referrer = NetTraitsRequestReferrer::NoReferrer; } else { - // Step 15.3.1 + // Step 14.3.1 let parsed_referrer = base_url.join(referrer); - // Step 15.3.2 + // Step 14.3.2 if parsed_referrer.is_err() { return Err(Error::Type("Failed to parse referrer url".to_string())); } - // Step 15.3.3 + // Step 14.3.3 if let Ok(parsed_referrer) = parsed_referrer { if (parsed_referrer.cannot_be_a_base() && parsed_referrer.scheme() == "about" && @@ -208,55 +208,54 @@ impl Request { { request.referrer = global.get_referrer(); } else { - // Step 15.3.4 + // Step 14.3.4 request.referrer = NetTraitsRequestReferrer::ReferrerUrl(parsed_referrer); } } } } - // Step 16 + // Step 15 if let Some(init_referrerpolicy) = init.referrerPolicy.as_ref() { let init_referrer_policy = init_referrerpolicy.clone().into(); request.referrer_policy = Some(init_referrer_policy); } - // Step 17 + // Step 16 let mode = init .mode .as_ref() .map(|m| m.clone().into()) .or(fallback_mode); - // Step 18 + // Step 17 if let Some(NetTraitsRequestMode::Navigate) = mode { return Err(Error::Type("Request mode is Navigate".to_string())); } - // Step 19 + // Step 18 if let Some(m) = mode { request.mode = m; } - // Step 20 + // Step 19 let credentials = init .credentials .as_ref() .map(|m| m.clone().into()) .or(fallback_credentials); - // Step 21 if let Some(c) = credentials { request.credentials_mode = c; } - // Step 22 + // Step 20 if let Some(init_cache) = init.cache.as_ref() { let cache = init_cache.clone().into(); request.cache_mode = cache; } - // Step 23 + // Step 21 if request.cache_mode == NetTraitsRequestCache::OnlyIfCached { if request.mode != NetTraitsRequestMode::SameOrigin { return Err(Error::Type( @@ -265,44 +264,46 @@ impl Request { } } - // Step 24 + // Step 22 if let Some(init_redirect) = init.redirect.as_ref() { let redirect = init_redirect.clone().into(); request.redirect_mode = redirect; } - // Step 25 + // Step 23 if let Some(init_integrity) = init.integrity.as_ref() { let integrity = init_integrity.clone().to_string(); request.integrity_metadata = integrity; } - // Step 26 TODO: "If init["keepalive"] exists..." + // Step 24 TODO: "If init["keepalive"] exists..." - // Step 27.1 + // Step 25.1 if let Some(init_method) = init.method.as_ref() { - // Step 27.2 if !is_method(&init_method) { return Err(Error::Type("Method is not a method".to_string())); } + // Step 25.2 if is_forbidden_method(&init_method) { return Err(Error::Type("Method is forbidden".to_string())); } - // Step 27.3 + // Step 25.3 let method = match init_method.as_str() { Some(s) => normalize_method(s) .map_err(|e| Error::Type(format!("Method is not valid: {:?}", e)))?, None => return Err(Error::Type("Method is not a valid UTF8".to_string())), }; - // Step 27.4 + // Step 25.4 request.method = method; } - // Step 28 TODO: "If init["signal"] exists..." + // Step 26 TODO: "If init["signal"] exists..." + // Step 27 TODO: "If init["priority"] exists..." - // Step 29 + // Step 28 let r = Request::from_net_request(global, request); + // Step 29 TODO: "Set this's signal to new AbortSignal object..." // Step 30 TODO: "If signal is not null..." // Step 31 @@ -310,7 +311,7 @@ impl Request { // hasn't had any other way to initialize its headers r.headers.or_init(|| Headers::for_request(&r.global())); - // Step 32 - but spec says this should only be when non-empty init? + // Step 33 - but spec says this should only be when non-empty init? let headers_copy = init .headers .as_ref() @@ -323,30 +324,30 @@ impl Request { }, }); - // Step 32.3 + // Step 33.3 // We cannot empty `r.Headers().header_list` because - // we would undo the Step 27 above. One alternative is to set + // we would undo the Step 25 above. One alternative is to set // `headers_copy` as a deep copy of `r.Headers()`. However, // `r.Headers()` is a `DomRoot<T>`, and therefore it is difficult // to obtain a mutable reference to `r.Headers()`. Without the // mutable reference, we cannot mutate `r.Headers()` to be the - // deep copied headers in Step 27. + // deep copied headers in Step 25. - // Step 32.4 + // Step 32 if r.request.borrow().mode == NetTraitsRequestMode::NoCors { let borrowed_request = r.request.borrow(); - // Step 32.4.1 + // Step 32.1 if !is_cors_safelisted_method(&borrowed_request.method) { return Err(Error::Type( "The mode is 'no-cors' but the method is not a cors-safelisted method" .to_string(), )); } - // Step 32.4.2 + // Step 32.2 r.Headers().set_guard(Guard::RequestNoCors); } - // Step 32.5 + // Step 33.5 match headers_copy { None => { // This is equivalent to the specification's concept of @@ -360,11 +361,11 @@ impl Request { Some(headers_copy) => r.Headers().fill(Some(headers_copy))?, } - // Step 32.5-6 depending on how we got here + // Step 33.5 depending on how we got here // Copy the headers list onto the headers of net_traits::Request r.request.borrow_mut().headers = r.Headers().get_headers_list(); - // Step 33 + // Step 34 let mut input_body = if let RequestInfo::Request(ref mut input_request) = input { let mut input_request_request = input_request.request.borrow_mut(); input_request_request.body.take() @@ -372,7 +373,7 @@ impl Request { None }; - // Step 34 + // Step 35 if let Some(init_body_option) = init.body.as_ref() { if init_body_option.is_some() || input_body.is_some() { let req = r.request.borrow(); @@ -393,14 +394,14 @@ impl Request { } } - // Step 35-36 + // Step 36-37 if let Some(Some(ref init_body)) = init.body { - // Step 36.2 TODO "If init["keepalive"] exists and is true..." + // Step 37.1 TODO "If init["keepalive"] exists and is true..." - // Step 36.3 + // Step 37.2 let mut extracted_body = init_body.extract(global)?; - // Step 36.4 + // Step 37.3 if let Some(contents) = extracted_body.content_type.take() { let ct_header_name = b"Content-Type"; if !r @@ -414,6 +415,7 @@ impl Request { ByteString::new(ct_header_val.to_vec()), )?; + // Step 37.4 // In Servo r.Headers's header list isn't a pointer to // the same actual list as r.request's, and so we need to // append to both lists to keep them in sync. @@ -431,21 +433,16 @@ impl Request { input_body = Some(net_body); } - // Step 37 "TODO if body is non-null and body's source is null..." - // This looks like where we need to set the use-preflight flag - // if the request has a body and nothing else has set the flag. - // Step 38 is done earlier - // Step 39 - // TODO: `ReadableStream` object is not implemented in Servo yet. + // Step 39 "TODO if body is non-null and body's source is null..." + // This looks like where we need to set the use-preflight flag + // if the request has a body and nothing else has set the flag. - // Step 40 - r.request.borrow_mut().body = input_body; + // Step 40 is done earlier // Step 41 - let extracted_mime_type = r.Headers().extract_mime_type(); - *r.mime_type.borrow_mut() = extracted_mime_type; + r.request.borrow_mut().body = input_body; // Step 42 Ok(r) @@ -462,7 +459,6 @@ impl Request { fn clone_from(r: &Request) -> Fallible<DomRoot<Request>> { let req = r.request.borrow(); let url = req.url(); - let mime_type = r.mime_type.borrow().clone(); let headers_guard = r.Headers().get_guard(); let r_clone = Request::new(&r.global(), url); r_clone.request.borrow_mut().pipeline_id = req.pipeline_id; @@ -471,7 +467,6 @@ impl Request { borrowed_r_request.origin = req.origin.clone(); } *r_clone.request.borrow_mut() = req.clone(); - *r_clone.mime_type.borrow_mut() = mime_type; r_clone.Headers().copy_from_headers(r.Headers())?; r_clone.Headers().set_guard(headers_guard); Ok(r_clone) @@ -682,7 +677,8 @@ impl BodyMixin for Request { } fn get_mime_type(&self) -> Vec<u8> { - self.mime_type.borrow().clone() + let headers = self.Headers(); + headers.extract_mime_type() } } diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs index ef183340a97..11f51b75414 100644 --- a/components/script/dom/response.rs +++ b/components/script/dom/response.rs @@ -37,7 +37,6 @@ use url::Position; pub struct Response { reflector_: Reflector, headers_reflector: MutNullableDom<Headers>, - mime_type: DomRefCell<Vec<u8>>, /// `None` can be considered a StatusCode of `0`. #[ignore_malloc_size_of = "Defined in hyper"] status: DomRefCell<Option<StatusCode>>, @@ -62,7 +61,6 @@ impl Response { Response { reflector_: Reflector::new(), headers_reflector: Default::default(), - mime_type: DomRefCell::new("".to_string().into_bytes()), status: DomRefCell::new(Some(StatusCode::OK)), raw_status: DomRefCell::new(Some((200, b"".to_vec()))), response_type: DomRefCell::new(DOMResponseType::Default), @@ -79,6 +77,7 @@ impl Response { reflect_dom_object(Box::new(Response::new_inherited(global)), global) } + // https://fetch.spec.whatwg.org/#initialize-a-response pub fn Constructor( global: &GlobalScope, body: Option<BodyInit>, @@ -100,34 +99,29 @@ impl Response { )); } - // Step 3 let r = Response::new(global); - // Step 4 + // Step 3 *r.status.borrow_mut() = Some(StatusCode::from_u16(init.status).unwrap()); - // Step 5 + // Step 4 *r.raw_status.borrow_mut() = Some((init.status, init.statusText.clone().into())); - // Step 6 + // Step 5 if let Some(ref headers_member) = init.headers { - // Step 6.1 - r.Headers().empty_header_list(); - - // Step 6.2 r.Headers().fill(Some(headers_member.clone()))?; } - // Step 7 + // Step 6 if let Some(ref body) = body { - // Step 7.1 + // Step 6.1 if is_null_body_status(init.status) { return Err(Error::Type( "Body is non-null but init's status member is a null body status".to_string(), )); }; - // Step 7.3 + // Step 6.2 let ExtractedBody { stream, total_bytes: _, @@ -137,7 +131,7 @@ impl Response { r.body_stream.set(Some(&*stream)); - // Step 7.4 + // Step 6.3 if let Some(content_type_contents) = content_type { if !r .Headers() @@ -152,16 +146,6 @@ impl Response { }; } - // Step 8 - *r.mime_type.borrow_mut() = r.Headers().extract_mime_type(); - - // Step 9 - // TODO: `entry settings object` is not implemented in Servo yet. - - // Step 10 - // TODO: Write this step once Promises are merged in - - // Step 11 Ok(r) } @@ -242,7 +226,8 @@ impl BodyMixin for Response { } fn get_mime_type(&self) -> Vec<u8> { - self.mime_type.borrow().clone() + let headers = self.Headers(); + headers.extract_mime_type() } } @@ -404,7 +389,6 @@ impl Response { Some(hyper_headers) => hyper_headers.into_inner(), None => HyperHeaders::new(), }); - *self.mime_type.borrow_mut() = self.Headers().extract_mime_type(); } pub fn set_raw_status(&self, status: Option<(u16, Vec<u8>)>) { diff --git a/etc/ci/upstream-wpt-changes/test.py b/etc/ci/upstream-wpt-changes/test.py index c56831360ba..3ecf3afbb3c 100644 --- a/etc/ci/upstream-wpt-changes/test.py +++ b/etc/ci/upstream-wpt-changes/test.py @@ -229,7 +229,7 @@ class TestApplyCommitsToWPT(unittest.TestCase): def run_test(self, pr_number: int, commit_data: dict): def make_commit(data): - with open(os.path.join(TESTS_DIR, data[2]), encoding="utf-8") as file: + with open(os.path.join(TESTS_DIR, data[2]), "rb") as file: return {"author": data[0], "message": data[1], "diff": file.read()} commits = [make_commit(data) for data in commit_data] @@ -272,6 +272,15 @@ class TestApplyCommitsToWPT(unittest.TestCase): [ ["test author <test@author>", "test commit message", "18746.diff"], ["another person <two@author>", "a different message", "wpt.diff"], + ["another person <two@author>", "adding some non-utf8 chaos", "add-non-utf8-file.diff"], + ], + ) + + def test_non_utf8_commit(self): + self.run_test( + 100, + [ + ["test author <nonutf8@author>", "adding some non-utf8 chaos", "add-non-utf8-file.diff"], ], ) @@ -455,6 +464,17 @@ class TestFullSyncRun(unittest.TestCase): ] ) + def test_opened_upstreamable_pr_with_non_utf8_file_contents(self): + self.assertListEqual( + self.run_test("opened.json", ["add-non-utf8-file.diff"]), + [ + "CreateOrUpdateBranchForPRStep:1:servo-wpt-sync/wpt/servo_export_18746", + "OpenPRStep:servo-wpt-sync/wpt/servo_export_18746→wpt/wpt#1", + "CommentStep:servo/servo#18746:🤖 Opened new upstream WPT pull request " + "(wpt/wpt#1) with upstreamable changes.", + ], + ) + def test_open_new_upstreamable_pr_with_preexisting_upstream_pr_not_apply_cleanly_to_upstream( self, ): diff --git a/etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff b/etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff new file mode 100644 index 00000000000..bd3b755d87d --- /dev/null +++ b/etc/ci/upstream-wpt-changes/tests/add-non-utf8-file.diff @@ -0,0 +1,7 @@ +diff --git a/tests/wpt/web-platform-tests/non-utf8-file.txt b/tests/wpt/web-platform-tests/non-utf8-file.txt +new file mode 100644 +index 0000000..5a992e0 +--- /dev/null ++++ b/tests/wpt/web-platform-tests/non-utf8-file.txt +@@ -0,0 +1 @@ ++foo bér ÿ " diff --git a/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py b/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py index 156bb108c5a..1ca65c56321 100644 --- a/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py +++ b/etc/ci/upstream-wpt-changes/wptupstreamer/__init__.py @@ -50,7 +50,7 @@ class LocalGitRepo: self.path = path self.sync = sync - def run(self, *args, env: dict = {}): + def run_without_encoding(self, *args, env: dict = {}): command_line = ["git"] + list(args) logging.info(" → Execution (cwd='%s'): %s", self.path, " ".join(command_line)) @@ -63,12 +63,19 @@ class LocalGitRepo: try: return subprocess.check_output( command_line, cwd=self.path, env=env, stderr=subprocess.STDOUT - ).decode("utf-8") + ) except subprocess.CalledProcessError as exception: logging.warning("Process execution failed with output:\n%s", - exception.output.decode("utf-8")) + exception.output.decode("utf-8", errors="surrogateescape")) raise exception + def run(self, *args, env: dict = {}): + return ( + self + .run_without_encoding(*args, env=env) + .decode("utf-8", errors="surrogateescape") + ) + @dataclasses.dataclass() class SyncRun: diff --git a/etc/ci/upstream-wpt-changes/wptupstreamer/step.py b/etc/ci/upstream-wpt-changes/wptupstreamer/step.py index 8c9d5c9a93b..9781353ce15 100644 --- a/etc/ci/upstream-wpt-changes/wptupstreamer/step.py +++ b/etc/ci/upstream-wpt-changes/wptupstreamer/step.py @@ -114,7 +114,9 @@ class CreateOrUpdateBranchForPRStep(Step): # TODO: If we could cleverly parse and manipulate the full commit diff # we could avoid cloning the servo repository altogether and only # have to fetch the commit diffs from GitHub. - diff = local_servo_repo.run( + # NB: The output of git show might include binary files or non-UTF8 text, + # so store the content of the diff as a `bytes`. + diff = local_servo_repo.run_without_encoding( "show", "--binary", "--format=%b", sha, "--", UPSTREAMABLE_PATH ) @@ -140,7 +142,7 @@ class CreateOrUpdateBranchForPRStep(Step): strip_count = UPSTREAMABLE_PATH.count("/") + 1 try: - with open(patch_path, "w", encoding="utf-8") as file: + with open(patch_path, "wb") as file: file.write(commit["diff"]) run.sync.local_wpt_repo.run( "apply", PATCH_FILE_NAME, "-p", str(strip_count) diff --git a/etc/ci/wpt-nightly-update.sh b/etc/ci/wpt-scheduled-update.sh index 2b75869f5c1..2b75869f5c1 100755 --- a/etc/ci/wpt-nightly-update.sh +++ b/etc/ci/wpt-scheduled-update.sh diff --git a/python/requirements.txt b/python/requirements.txt index b58140060e3..7df9b1978db 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -23,6 +23,7 @@ colorama == 0.3.7 # For package uploading boto3 == 1.17.27 +PyGithub == 1.58.1 # Default root CAs on Windows CI do not trust CloudFront certificates, # connecting to https://static.rust-lang.org would fail: @@ -32,4 +33,7 @@ certifi # For Python3 compatibility six == 1.15 +# For sending build notifications. +notify-py == 0.3.42 + -e python/tidy diff --git a/python/servo/build_commands.py b/python/servo/build_commands.py index 1a9ee339b1a..2b0624d3a1d 100644 --- a/python/servo/build_commands.py +++ b/python/servo/build_commands.py @@ -23,6 +23,8 @@ import zipfile from time import time +import notifypy + from mach.decorators import ( CommandArgument, CommandProvider, @@ -36,113 +38,6 @@ from servo.gstreamer import windows_dlls, windows_plugins, macos_dylibs, macos_p from servo.util import host_triple -def format_duration(seconds): - return str(datetime.timedelta(seconds=int(seconds))) - - -def notify_linux(title, text): - try: - import dbus - bus = dbus.SessionBus() - notify_obj = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications") - method = notify_obj.get_dbus_method("Notify", "org.freedesktop.Notifications") - method(title, 0, "", text, "", [], {"transient": True}, -1) - except ImportError: - raise Exception("Optional Python module 'dbus' is not installed.") - - -def notify_win(title, text): - try: - from servo.win32_toast import WindowsToast - w = WindowsToast() - w.balloon_tip(title, text) - except WindowsError: - from ctypes import Structure, windll, POINTER, sizeof - from ctypes.wintypes import DWORD, HANDLE, WINFUNCTYPE, BOOL, UINT - - class FLASHWINDOW(Structure): - _fields_ = [("cbSize", UINT), - ("hwnd", HANDLE), - ("dwFlags", DWORD), - ("uCount", UINT), - ("dwTimeout", DWORD)] - - FlashWindowExProto = WINFUNCTYPE(BOOL, POINTER(FLASHWINDOW)) - FlashWindowEx = FlashWindowExProto(("FlashWindowEx", windll.user32)) - FLASHW_CAPTION = 0x01 - FLASHW_TRAY = 0x02 - FLASHW_TIMERNOFG = 0x0C - - params = FLASHWINDOW(sizeof(FLASHWINDOW), - windll.kernel32.GetConsoleWindow(), - FLASHW_CAPTION | FLASHW_TRAY | FLASHW_TIMERNOFG, 3, 0) - FlashWindowEx(params) - - -def notify_darwin(title, text): - try: - import Foundation - - bundleDict = Foundation.NSBundle.mainBundle().infoDictionary() - bundleIdentifier = 'CFBundleIdentifier' - if bundleIdentifier not in bundleDict: - bundleDict[bundleIdentifier] = 'mach' - - note = Foundation.NSUserNotification.alloc().init() - note.setTitle_(title) - note.setInformativeText_(text) - - now = Foundation.NSDate.dateWithTimeInterval_sinceDate_(0, Foundation.NSDate.date()) - note.setDeliveryDate_(now) - - centre = Foundation.NSUserNotificationCenter.defaultUserNotificationCenter() - centre.scheduleNotification_(note) - except ImportError: - raise Exception("Optional Python module 'pyobjc' is not installed.") - - -def notify_with_command(command): - def notify(title, text): - if call([command, title, text]) != 0: - raise Exception("Could not run '%s'." % command) - return notify - - -def notify_build_done(config, elapsed, success=True): - """Generate desktop notification when build is complete and the - elapsed build time was longer than 30 seconds.""" - if elapsed > 30: - notify(config, "Servo build", - "%s in %s" % ("Completed" if success else "FAILED", format_duration(elapsed))) - - -def notify(config, title, text): - """Generate a desktop notification using appropriate means on - supported platforms Linux, Windows, and Mac OS. On unsupported - platforms, this function acts as a no-op. - - If notify-command is set in the [tools] section of the configuration, - that is used instead.""" - notify_command = config["tools"].get("notify-command") - if notify_command: - func = notify_with_command(notify_command) - else: - platforms = { - "linux": notify_linux, - "linux2": notify_linux, - "win32": notify_win, - "darwin": notify_darwin - } - func = platforms.get(sys.platform) - - if func is not None: - try: - func(title, text) - except Exception as e: - extra = getattr(e, "message", "") - print("[Warning] Could not generate notification! %s" % extra, file=sys.stderr) - - @CommandProvider class MachCommands(CommandBase): @Command('build', @@ -752,9 +647,12 @@ class MachCommands(CommandBase): pass # Generate Desktop Notification if elapsed-time > some threshold value - notify_build_done(self.config, elapsed, status == 0) - print("Build %s in %s" % ("Completed" if status == 0 else "FAILED", format_duration(elapsed))) + elapsed_delta = datetime.timedelta(seconds=int(elapsed)) + build_message = f"{'Succeeded' if status == 0 else 'Failed'} in {elapsed_delta}" + self.notify("Servo build", build_message) + print(build_message) + return status @Command('clean', @@ -814,6 +712,55 @@ class MachCommands(CommandBase): else: os.remove(artifact) + def notify(self, title: str, message: str): + """Generate desktop notification when build is complete and the + elapsed build time was longer than 30 seconds. + + If notify-command is set in the [tools] section of the configuration, + that is used instead.""" + notify_command = self.config["tools"].get("notify-command") + + # notifypy does not know how to send transient notifications, so we use a custom + # notifier on Linux. If transient notifications are not used, then notifications + # pile up in the notification center and must be cleared manually. + class LinuxNotifier(notifypy.BaseNotifier): + def __init__(self, **kwargs): + pass + + def send_notification(self, **kwargs): + try: + import dbus + bus = dbus.SessionBus() + notify_obj = bus.get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications") + method = notify_obj.get_dbus_method("Notify", "org.freedesktop.Notifications") + method( + kwargs.get("application_name"), + 0, # Don't replace previous notification. + kwargs.get("notification_icon", ""), + kwargs.get("notification_title"), + kwargs.get("notification_subtitle"), + [], # actions + {"transient": True}, # hints + -1 # timeout + ) + except ImportError: + print("[Warning] Could not generate notification: " + "Optional Python module 'dbus' is not installed.", + file=sys.stderr) + return True + + if notify_command: + if call([notify_command, title, message]) != 0: + print("[Warning] Could not generate notification: " + f"Could not run '{notify_command}'.", file=sys.stderr) + else: + notifier = LinuxNotifier if sys.platform.startswith("linux") else None + notification = notifypy.Notify(use_custom_notifier=notifier) + notification.title = title + notification.message = message + notification.icon = path.join(self.get_top_dir(), "resources", "servo_64.png") + notification.send(block=False) + def angle_root(target, nuget_env): arch = { diff --git a/python/servo/devenv_commands.py b/python/servo/devenv_commands.py index 5570aae50b7..47df6599b92 100644 --- a/python/servo/devenv_commands.py +++ b/python/servo/devenv_commands.py @@ -9,7 +9,6 @@ from __future__ import print_function, unicode_literals from os import path, listdir, getcwd -from time import time import json import signal @@ -25,7 +24,6 @@ from mach.decorators import ( ) from servo.command_base import CommandBase, cd, call -from servo.build_commands import notify_build_done from servo.util import get_static_rust_lang_org_dist, get_urlopen_kwargs @@ -53,12 +51,7 @@ class MachCommands(CommandBase): self.ensure_clobbered() env = self.build_env() - build_start = time() status = self.run_cargo_build_like_command("check", params, env=env, features=features, **kwargs) - elapsed = time() - build_start - - notify_build_done(self.config, elapsed, status == 0) - if status == 0: print('Finished checking, binary NOT updated. Consider ./mach build before ./mach run') diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py index 53910dcd644..c5b9fb69726 100644 --- a/python/servo/package_commands.py +++ b/python/servo/package_commands.py @@ -10,6 +10,8 @@ from __future__ import absolute_import, print_function, unicode_literals from datetime import datetime +from github import Github + import base64 import hashlib import io @@ -594,7 +596,11 @@ class PackageCommands(CommandBase): @CommandArgument('--secret-from-environment', action='store_true', help='Retrieve the appropriate secrets from the environment.') - def upload_nightly(self, platform, secret_from_environment): + @CommandArgument('--github-release-id', + default=None, + type=int, + help='The github release to upload the nightly builds.') + def upload_nightly(self, platform, secret_from_environment, github_release_id): import boto3 def get_s3_secret(): @@ -612,7 +618,28 @@ class PackageCommands(CommandBase): path.basename(package) ) - def upload_to_s3(platform, package, timestamp): + def upload_to_github_release(platform, package, package_hash): + if not github_release_id: + return + + extension = path.basename(package).partition('.')[2] + g = Github(os.environ['NIGHTLY_REPO_TOKEN']) + nightly_repo = g.get_repo(os.environ['NIGHTLY_REPO']) + release = nightly_repo.get_release(github_release_id) + package_hash_fileobj = io.BytesIO(package_hash.encode('utf-8')) + + if '2020' in platform: + asset_name = f'servo-latest-layout-2020.{extension}' + else: + asset_name = f'servo-latest.{extension}' + + release.upload_asset(package, name=asset_name) + release.upload_asset_from_memory( + package_hash_fileobj, + package_hash_fileobj.getbuffer().nbytes, + name=f'{asset_name}.sha256') + + def upload_to_s3(platform, package, package_hash, timestamp): (aws_access_key, aws_secret_access_key) = get_s3_secret() s3 = boto3.client( 's3', @@ -635,16 +662,6 @@ class PackageCommands(CommandBase): extension = path.basename(package).partition('.')[2] latest_upload_key = '{}/servo-latest.{}'.format(nightly_dir, extension) - # Compute the hash - SHA_BUF_SIZE = 1048576 # read in 1 MiB chunks - sha256_digest = hashlib.sha256() - with open(package, 'rb') as package_file: - while True: - data = package_file.read(SHA_BUF_SIZE) - if not data: - break - sha256_digest.update(data) - package_hash = sha256_digest.hexdigest() package_hash_fileobj = io.BytesIO(package_hash.encode('utf-8')) latest_hash_upload_key = f'{latest_upload_key}.sha256' @@ -763,7 +780,20 @@ class PackageCommands(CommandBase): package ), file=sys.stderr) return 1 - upload_to_s3(platform, package, timestamp) + + # Compute the hash + SHA_BUF_SIZE = 1048576 # read in 1 MiB chunks + sha256_digest = hashlib.sha256() + with open(package, 'rb') as package_file: + while True: + data = package_file.read(SHA_BUF_SIZE) + if not data: + break + sha256_digest.update(data) + package_hash = sha256_digest.hexdigest() + + upload_to_s3(platform, package, package_hash, timestamp) + upload_to_github_release(platform, package, package_hash) if platform == 'maven': for package in PACKAGES[platform]: diff --git a/python/servo/win32_toast.py b/python/servo/win32_toast.py deleted file mode 100644 index 22a7ccd917f..00000000000 --- a/python/servo/win32_toast.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2013 The Servo Project Developers. See the COPYRIGHT -# file at the top-level directory of this distribution. -# -# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your -# option. This file may not be copied, modified, or distributed -# except according to those terms. - -from win32api import GetModuleHandle -from win32gui import WNDCLASS, RegisterClass, CreateWindow, UpdateWindow -from win32gui import DestroyWindow, LoadIcon, NIF_ICON, NIF_MESSAGE, NIF_TIP -from win32gui import Shell_NotifyIcon, NIM_ADD, NIM_MODIFY, NIF_INFO, NIIF_INFO -import win32con - - -class WindowsToast: - def __init__(self): - # Register window class; it's okay to do this multiple times - wc = WNDCLASS() - wc.lpszClassName = 'ServoTaskbarNotification' - wc.lpfnWndProc = {win32con.WM_DESTROY: self.OnDestroy, } - self.classAtom = RegisterClass(wc) - self.hinst = wc.hInstance = GetModuleHandle(None) - - def OnDestroy(self, hwnd, msg, wparam, lparam): - # We don't have to Shell_NotifyIcon to delete it, since - # we destroyed - pass - - def balloon_tip(self, title, msg): - style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU - hwnd = CreateWindow(self.classAtom, "Taskbar", style, 0, 0, - win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, - 0, 0, self.hinst, None) - UpdateWindow(hwnd) - - hicon = LoadIcon(0, win32con.IDI_APPLICATION) - - nid = (hwnd, 0, NIF_ICON | NIF_MESSAGE | NIF_TIP, win32con.WM_USER + 20, hicon, 'Tooltip') - Shell_NotifyIcon(NIM_ADD, nid) - nid = (hwnd, 0, NIF_INFO, win32con.WM_USER + 20, hicon, 'Balloon Tooltip', msg, 200, title, NIIF_INFO) - Shell_NotifyIcon(NIM_MODIFY, nid) - - DestroyWindow(hwnd) diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini deleted file mode 100644 index 1b384364eb1..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/backgrounds/background-position-152.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[background-position-152.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini deleted file mode 100644 index 030729ac98f..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/normal-flow/height-percentage-003.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[height-percentage-003.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini new file mode 100644 index 00000000000..a7c02218dae --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-003.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-height-003.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini new file mode 100644 index 00000000000..d5edb75b0ee --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-004.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-height-004.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini new file mode 100644 index 00000000000..acbe4a16f4d --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-005.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-height-005.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini new file mode 100644 index 00000000000..ffa0aa5f51d --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-010.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-height-010.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini new file mode 100644 index 00000000000..ff562b47bae --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-011.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-height-011.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini new file mode 100644 index 00000000000..5cd0779a01b --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-height-012.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-height-012.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini new file mode 100644 index 00000000000..520f8f51740 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-max-height-004.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini new file mode 100644 index 00000000000..f0a70485254 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-max-height-005.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini new file mode 100644 index 00000000000..b49a7b20e06 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-max-height-006.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini new file mode 100644 index 00000000000..26bf546864a --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-max-height-010.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini new file mode 100644 index 00000000000..bbeee78f08a --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht.ini @@ -0,0 +1,2 @@ +[absolute-non-replaced-max-height-012.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini deleted file mode 100644 index 4f0220cbfd5..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/bottom-offset-percentage-001.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[bottom-offset-percentage-001.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini deleted file mode 100644 index 1da7d09df26..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/left-offset-percentage-002.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[left-offset-percentage-002.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini deleted file mode 100644 index c9007fc8873..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-001.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[top-offset-percentage-001.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini deleted file mode 100644 index a3cf8681178..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/positioning/top-offset-percentage-002.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[top-offset-percentage-002.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini deleted file mode 100644 index 2a0ad5f976c..00000000000 --- a/tests/wpt/metadata-layout-2020/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-absolute-percentage-inherit-001.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini b/tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini new file mode 100644 index 00000000000..0ac75b5ef27 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-animations/display-none-dont-cancel.tentative.html.ini @@ -0,0 +1,15 @@ +[display-none-dont-cancel.tentative.html] + [display:none animating to display:inline should be inline for the whole animation.] + expected: FAIL + + [A CSS variable of display:none animating to display:inline should be inline for the whole animation.] + expected: FAIL + + [Animating from display:none to display:none should not cancel the animation.] + expected: FAIL + + [Animating from display:none to display:none with an intermediate variable should not cancel the animation.] + expected: FAIL + + [Animating a variable of "none" which gets set to display elsewhere should not cancel the animation.] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini new file mode 100644 index 00000000000..2789084260c --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini @@ -0,0 +1,2 @@ +[background-attachment-fixed-inline-scrolled.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini index d4f9786638e..0c429395c15 100644 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/abspos/position-absolute-013.html.ini @@ -964,159 +964,3 @@ [.flexbox 129] expected: FAIL - - [.flexbox 10] - expected: FAIL - - [.flexbox 12] - expected: FAIL - - [.flexbox 20] - expected: FAIL - - [.flexbox 31] - expected: FAIL - - [.flexbox 33] - expected: FAIL - - [.flexbox 47] - expected: FAIL - - [.flexbox 58] - expected: FAIL - - [.flexbox 60] - expected: FAIL - - [.flexbox 68] - expected: FAIL - - [.flexbox 79] - expected: FAIL - - [.flexbox 81] - expected: FAIL - - [.flexbox 95] - expected: FAIL - - [.flexbox 107] - expected: FAIL - - [.flexbox 115] - expected: FAIL - - [.flexbox 117] - expected: FAIL - - [.flexbox 128] - expected: FAIL - - [.flexbox 142] - expected: FAIL - - [.flexbox 144] - expected: FAIL - - [.flexbox 155] - expected: FAIL - - [.flexbox 167] - expected: FAIL - - [.flexbox 176] - expected: FAIL - - [.flexbox 188] - expected: FAIL - - [.flexbox 203] - expected: FAIL - - [.flexbox 215] - expected: FAIL - - [.flexbox 224] - expected: FAIL - - [.flexbox 236] - expected: FAIL - - [.flexbox 250] - expected: FAIL - - [.flexbox 252] - expected: FAIL - - [.flexbox 262] - expected: FAIL - - [.flexbox 264] - expected: FAIL - - [.flexbox 271] - expected: FAIL - - [.flexbox 273] - expected: FAIL - - [.flexbox 283] - expected: FAIL - - [.flexbox 285] - expected: FAIL - - [.flexbox 298] - expected: FAIL - - [.flexbox 300] - expected: FAIL - - [.flexbox 308] - expected: FAIL - - [.flexbox 319] - expected: FAIL - - [.flexbox 321] - expected: FAIL - - [.flexbox 335] - expected: FAIL - - [.flexbox 346] - expected: FAIL - - [.flexbox 348] - expected: FAIL - - [.flexbox 356] - expected: FAIL - - [.flexbox 367] - expected: FAIL - - [.flexbox 369] - expected: FAIL - - [.flexbox 383] - expected: FAIL - - [.flexbox 395] - expected: FAIL - - [.flexbox 403] - expected: FAIL - - [.flexbox 405] - expected: FAIL - - [.flexbox 416] - expected: FAIL - - [.flexbox 430] - expected: FAIL - - [.flexbox 432] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini new file mode 100644 index 00000000000..ea29b95ecec --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/justify-content-007.html.ini @@ -0,0 +1,3 @@ +[justify-content-007.html] + [.flexitem + .flexitem 1] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini new file mode 100644 index 00000000000..0757e0f9b55 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-flex-item-max-content.html.ini @@ -0,0 +1,2 @@ +[table-as-flex-item-max-content.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini b/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini index 5aa97a62ffc..2aa858c8719 100644 --- a/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-fonts/variations/font-weight-matching.html.ini @@ -40,4 +40,3 @@ [Test @font-face matching for weight 420] expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini new file mode 100644 index 00000000000..cc0692d0132 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-computed.html.ini @@ -0,0 +1,18 @@ +[overlay-computed.html] + [Property overlay value 'none'] + expected: FAIL + + [Property overlay value 'auto'] + expected: FAIL + + [Property overlay value 'inherit'] + expected: FAIL + + [Property overlay value 'initial'] + expected: FAIL + + [Property overlay value 'revert'] + expected: FAIL + + [Property overlay value 'unset'] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini new file mode 100644 index 00000000000..aacfbd3b035 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-transition-property.html.ini @@ -0,0 +1,3 @@ +[overlay-transition-property.html] + [Property transition value 'overlay 1s'] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini new file mode 100644 index 00000000000..5c27614af3c --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/overlay/overlay-valid.html.ini @@ -0,0 +1,18 @@ +[overlay-valid.html] + [e.style['overlay'\] = "none" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "auto" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "inherit" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "initial" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "revert" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "unset" should set the property value] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini index b70e581ff49..f5ed122006b 100644 --- a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-containing-block.html.ini @@ -1,16 +1,4 @@ [position-absolute-dynamic-containing-block.html] - [abs containing block moves from outer to intermediate] - expected: FAIL - - [abs containing block moves from intermediate to outer] - expected: FAIL - - [target is no longer absolute] - expected: FAIL - - [target becomes absolute] - expected: FAIL - [fixed containing block moves from outer to intermediate] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini new file mode 100644 index 00000000000..c8b541f3150 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-fit-content.html.ini @@ -0,0 +1,2 @@ +[position-absolute-fit-content.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini index 56b0fa56d4b..17c3b71eca7 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-002.html.ini @@ -4,3 +4,27 @@ [vertical-align vertical(keyword) / events] expected: FAIL + + [margin-bottom percentage(%) / values] + expected: FAIL + + [margin-left percentage(%) / values] + expected: FAIL + + [margin-right percentage(%) / values] + expected: FAIL + + [margin-top percentage(%) / values] + expected: FAIL + + [padding-bottom percentage(%) / values] + expected: FAIL + + [padding-left percentage(%) / values] + expected: FAIL + + [padding-right percentage(%) / values] + expected: FAIL + + [padding-top percentage(%) / values] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini index 1f5e357c51f..719b9b6ff15 100644 --- a/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-transitions/properties-value-inherit-001.html.ini @@ -544,153 +544,3 @@ [margin-right length(mm) / events] expected: FAIL - - [margin-right length(cm) / events] - expected: FAIL - - [margin-right length(in) / events] - expected: FAIL - - [margin-top length(pt) / events] - expected: FAIL - - [margin-top length(pc) / events] - expected: FAIL - - [margin-top length(px) / events] - expected: FAIL - - [margin-top length(em) / events] - expected: FAIL - - [margin-top length(ex) / events] - expected: FAIL - - [margin-top length(mm) / events] - expected: FAIL - - [margin-top length(cm) / events] - expected: FAIL - - [margin-top length(in) / events] - expected: FAIL - - [height length(pt) / events] - expected: FAIL - - [height length(pc) / events] - expected: FAIL - - [height length(px) / events] - expected: FAIL - - [height length(em) / events] - expected: FAIL - - [height length(ex) / events] - expected: FAIL - - [height length(mm) / events] - expected: FAIL - - [height length(cm) / events] - expected: FAIL - - [height length(in) / events] - expected: FAIL - - [height percentage(%) / events] - expected: FAIL - - [width length(pt) / events] - expected: FAIL - - [width length(pc) / events] - expected: FAIL - - [width length(px) / events] - expected: FAIL - - [width length(em) / events] - expected: FAIL - - [width length(ex) / events] - expected: FAIL - - [width length(mm) / events] - expected: FAIL - - [width length(cm) / events] - expected: FAIL - - [width length(in) / events] - expected: FAIL - - [width percentage(%) / events] - expected: FAIL - - [min-height length(pt) / events] - expected: FAIL - - [min-height length(pc) / events] - expected: FAIL - - [min-height length(px) / events] - expected: FAIL - - [min-height length(em) / events] - expected: FAIL - - [min-height length(ex) / events] - expected: FAIL - - [min-height length(mm) / events] - expected: FAIL - - [min-height length(cm) / events] - expected: FAIL - - [min-height length(in) / events] - expected: FAIL - - [min-height percentage(%) / events] - expected: FAIL - - [min-width length(pt) / events] - expected: FAIL - - [min-width length(pc) / events] - expected: FAIL - - [min-width length(px) / events] - expected: FAIL - - [min-width length(em) / events] - expected: FAIL - - [min-width length(ex) / events] - expected: FAIL - - [min-width length(mm) / events] - expected: FAIL - - [min-width length(cm) / events] - expected: FAIL - - [min-width length(in) / events] - expected: FAIL - - [min-width percentage(%) / events] - expected: FAIL - - [max-height length(pt) / events] - expected: FAIL - - [max-height length(pc) / events] - expected: FAIL - - [max-height length(px) / events] - expected: FAIL - - [max-height length(em) / events] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini index cf67b5d03dd..80ed711305d 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPoint-dynamic-anon-box.html.ini @@ -1,3 +1,4 @@ [elementFromPoint-dynamic-anon-box.html] + expected: CRASH [Link should be clickable after hiding a scrollbox with an anonymous table inside] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini index fef9ce7fc04..1a06450c5c1 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementFromPosition.html.ini @@ -16,3 +16,6 @@ [test some point of the element: top left corner] expected: FAIL + + [test the top of layer] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini index 314c2710dc9..78f6aab8d85 100644 --- a/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini +++ b/tests/wpt/metadata-layout-2020/css/cssom-view/elementsFromPoint-iframes.html.ini @@ -1,3 +1,6 @@ [elementsFromPoint-iframes.html] [elementsFromPoint on the root document for points in iframe elements] expected: FAIL + + [elementsFromPoint on inner documents] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini new file mode 100644 index 00000000000..b168bf5cd3a --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-011.html.ini @@ -0,0 +1,2 @@ +[lang-011.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini new file mode 100644 index 00000000000..cdc6bafba43 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/selectors/selectors-4/lang-012.html.ini @@ -0,0 +1,2 @@ +[lang-012.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini index 8edde75f4d0..df1b6f0e51b 100644 --- a/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata-layout-2020/fetch/content-type/response.window.js.ini @@ -186,9 +186,6 @@ [fetch(): separate response Content-Type: text/plain;charset=gbk text/plain] expected: NOTRUN - [Request: combined response Content-Type: text/plain] - expected: FAIL - [<iframe>: combined response Content-Type: text/plain ] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini b/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini index 3b66eaffa45..3ec67be350a 100644 --- a/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini +++ b/tests/wpt/metadata-layout-2020/fetch/metadata/generated/element-img-environment-change.sub.html.ini @@ -4,10 +4,10 @@ expected: FAIL [sec-fetch-site - Not sent to non-trustworthy same-site destination, no attributes] - expected: FAIL + expected: TIMEOUT [sec-fetch-site - Not sent to non-trustworthy cross-site destination, no attributes] - expected: TIMEOUT + expected: NOTRUN [sec-fetch-mode - Not sent to non-trustworthy same-origin destination, no attributes] expected: NOTRUN diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini index 33efcdbcf48..f7ee5361549 100644 --- a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini +++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/005.html.ini @@ -1,3 +1,4 @@ [005.html] + expected: TIMEOUT [Link with onclick navigation and href navigation ] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini index 856bb1c9901..dc1144214ef 100644 --- a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini +++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html.ini @@ -1,10 +1,9 @@ [iframe-src-aboutblank-navigate-immediately.html] - expected: TIMEOUT [Navigating to a different document with window.open] expected: FAIL [Navigating to a different document with form submission] - expected: TIMEOUT + expected: FAIL [Navigating to a different document with link click] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini index 78240a2f463..8ae58f9f1e2 100644 --- a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini +++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini @@ -16,3 +16,6 @@ [D83D DE0D set in href="" targeting a frame and clicked] expected: FAIL + + [DE0D 0041 set in href="" targeting a frame and clicked] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini new file mode 100644 index 00000000000..60a4fa51f8a --- /dev/null +++ b/tests/wpt/metadata-layout-2020/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini @@ -0,0 +1,3 @@ +[a-click.html] + [aElement.click() before the load event must NOT replace] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini b/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini index 9df06805f99..613bed9352d 100644 --- a/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini +++ b/tests/wpt/metadata-layout-2020/html/browsers/windows/embedded-opener-remove-frame.html.ini @@ -1,5 +1,5 @@ [embedded-opener-remove-frame.html] - expected: TIMEOUT + expected: CRASH [opener of discarded nested browsing context] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini b/tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini deleted file mode 100644 index 5ff0d0fdbbc..00000000000 --- a/tests/wpt/metadata-layout-2020/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[2d.filter.canvasFilterObject.dropShadow.tentative.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini index 53443fb1a84..a96b906711a 100644 --- a/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata-layout-2020/html/dom/idlharness.https.html.ini @@ -1463,6 +1463,45 @@ [SVGElement interface: attribute onscrollend] expected: FAIL + [ToggleEvent interface: existence and properties of interface object] + expected: FAIL + + [ToggleEvent interface object length] + expected: FAIL + + [ToggleEvent interface object name] + expected: FAIL + + [ToggleEvent interface: existence and properties of interface prototype object] + expected: FAIL + + [ToggleEvent interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ToggleEvent interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ToggleEvent interface: attribute oldState] + expected: FAIL + + [ToggleEvent interface: attribute newState] + expected: FAIL + + [ToggleEvent must be primary interface of new ToggleEvent("beforetoggle")] + expected: FAIL + + [Stringification of new ToggleEvent("beforetoggle")] + expected: FAIL + + [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "oldState" with the proper type] + expected: FAIL + + [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "newState" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onbeforetoggle] + expected: FAIL + [idlharness.https.html?include=(Document|Window)] [Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type] @@ -1567,9 +1606,6 @@ [Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type] expected: FAIL - [Window interface: existence and properties of interface prototype object] - expected: FAIL - [Window interface: operation focus()] expected: FAIL @@ -2047,6 +2083,24 @@ [Window interface: window must inherit property "onpaste" with the proper type] expected: FAIL + [Window interface: attribute onbeforetoggle] + expected: FAIL + + [Window interface: window must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [Document interface: attribute onbeforetoggle] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + [idlharness.https.html?include=HTML.*] [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type] @@ -4025,3 +4079,213 @@ [HTMLScriptElement interface: document.createElement("script") must inherit property "blocking" with the proper type] expected: FAIL + + [HTMLElement interface: operation showPopover()] + expected: FAIL + + [HTMLElement interface: operation hidePopover()] + expected: FAIL + + [HTMLElement interface: operation togglePopover(optional boolean)] + expected: FAIL + + [HTMLElement interface: attribute popover] + expected: FAIL + + [HTMLElement interface: attribute onbeforetoggle] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "showPopover()" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "hidePopover()" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "togglePopover(optional boolean)" with the proper type] + expected: FAIL + + [HTMLElement interface: calling togglePopover(optional boolean) on document.createElement("noscript") with too few arguments must throw TypeError] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "popover" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: attribute fetchPriority] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "fetchPriority" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute fetchPriority] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "fetchPriority" with the proper type] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "fetchPriority" with the proper type] + expected: FAIL + + [HTMLInputElement interface: attribute popoverTargetElement] + expected: FAIL + + [HTMLInputElement interface: attribute popoverTargetAction] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLButtonElement interface: attribute popoverTargetElement] + expected: FAIL + + [HTMLButtonElement interface: attribute popoverTargetAction] + expected: FAIL + + [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLScriptElement interface: attribute fetchPriority] + expected: FAIL + + [HTMLScriptElement interface: document.createElement("script") must inherit property "fetchPriority" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini index 59e7bc11784..a10be12e8cc 100644 --- a/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini +++ b/tests/wpt/metadata-layout-2020/html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html.ini @@ -1,7 +1,7 @@ [document-with-fragment-nonexistent.html] + expected: TIMEOUT [Autofocus elements in iframed documents with non-existent fragments should work.] expected: FAIL [Autofocus elements in top-level browsing context's documents with non-existent fragments should work.] - expected: FAIL - + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini new file mode 100644 index 00000000000..27c12573f11 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini @@ -0,0 +1,3 @@ +[http-equiv-and-name-1.html] + [<meta> set the color-scheme to dark] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini new file mode 100644 index 00000000000..def16bc1f29 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini @@ -0,0 +1,3 @@ +[http-equiv-and-name-2.html] + [<meta> set the content-language to de-DE] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini new file mode 100644 index 00000000000..09c049e4b58 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/media-elements/media_fragment_seek.html.ini @@ -0,0 +1,3 @@ +[media_fragment_seek.html] + [Video should seek to time specified in media fragment syntax] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini index 7d28d586f51..24903b5f66f 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_escaping-1.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 26704422bbe..841bafc6eca 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_escaping-2.html] - expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini index 6a420504feb..7da2bc5ac80 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini @@ -1,3 +1,4 @@ [iframe_sandbox_popups_escaping-3.html] + expected: TIMEOUT [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini index d5fd800f09d..ff6467094b8 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_nonescaping-3.html] - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini deleted file mode 100644 index 79c296a8aef..00000000000 --- a/tests/wpt/metadata-layout-2020/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode.html.ini +++ /dev/null @@ -1,24 +0,0 @@ -[parse-a-sizes-attribute-quirks-mode.html] - [<img srcset="/images/green-1x1.png?e38 50w, /images/green-16x16.png?e38 51w" sizes="(min-width:calc(0)) 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (quirks mode)] - expected: FAIL - - [<img srcset="/images/green-1x1.png?e45 50w, /images/green-16x16.png?e45 51w" sizes="(min-width:-1px) 1px, 100vw"> ref sizes="1px" (quirks mode)] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini index b4b7cecba9e..7682a4830bf 100644 --- a/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini +++ b/tests/wpt/metadata-layout-2020/html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html.ini @@ -1,4 +1,4 @@ [reparent-form-during-planned-navigation-task.html] + expected: TIMEOUT [reparent-form-during-planned-navigation-task] - expected: FAIL - + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini b/tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini deleted file mode 100644 index 2212b9d731f..00000000000 --- a/tests/wpt/metadata-layout-2020/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[async-script.html?reload] - expected: ERROR - -[async-script.html] diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini index 3a164593266..bcba06a84cf 100644 --- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini +++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-all-global-events.html.ini @@ -484,3 +484,12 @@ [onpaste: the default value must be null] expected: FAIL + + [onbeforetoggle: must be on the appropriate locations for GlobalEventHandlers] + expected: FAIL + + [onbeforetoggle: the default value must be null] + expected: FAIL + + [onbeforetoggle: the content attribute must be compiled into a function as the corresponding property] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini index 7092165e1a6..e1909af3d2f 100644 --- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini +++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini @@ -124,3 +124,12 @@ [not shadowed scrollend (window)] expected: FAIL + + [not shadowed beforetoggle (document.body)] + expected: FAIL + + [not shadowed beforetoggle (document.createElement("body"))] + expected: FAIL + + [not shadowed beforetoggle (window)] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini index e25a998db27..4bb3869ad9d 100644 --- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini +++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini @@ -124,3 +124,12 @@ [not shadowed scrollend (window)] expected: FAIL + + [not shadowed beforetoggle (document.body)] + expected: FAIL + + [not shadowed beforetoggle (document.createElement("frameset"))] + expected: FAIL + + [not shadowed beforetoggle (window)] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini index 3fa6f190d8f..04f99b6b367 100644 --- a/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini +++ b/tests/wpt/metadata-layout-2020/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini @@ -70,3 +70,9 @@ [scrollend is unaffected on a windowless frameset] expected: FAIL + + [beforetoggle is unaffected on a windowless body] + expected: FAIL + + [beforetoggle is unaffected on a windowless frameset] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini index 410876e8c47..080c16f6755 100644 --- a/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini +++ b/tests/wpt/metadata-layout-2020/resource-timing/idlharness.any.js.ini @@ -20,6 +20,12 @@ [PerformanceResourceTiming interface: default toJSON operation on resource] expected: FAIL + [PerformanceResourceTiming interface: attribute deliveryType] + expected: FAIL + + [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type] + expected: FAIL + [idlharness.any.worker.html] [PerformanceResourceTiming interface: attribute workerStart] @@ -42,3 +48,9 @@ [PerformanceResourceTiming interface: default toJSON operation on resource] expected: FAIL + + [PerformanceResourceTiming interface: attribute deliveryType] + expected: FAIL + + [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini b/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini index 7890db33546..adc033c4f6d 100644 --- a/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini +++ b/tests/wpt/metadata-layout-2020/selection/idlharness.window.js.ini @@ -16,3 +16,18 @@ [Selection interface: calling getComposedRange(ShadowRoot...) on getSelection() with too few arguments must throw TypeError] expected: FAIL + + [Selection interface: attribute direction] + expected: FAIL + + [Selection interface: operation getComposedRanges(ShadowRoot...)] + expected: FAIL + + [Selection interface: getSelection() must inherit property "direction" with the proper type] + expected: FAIL + + [Selection interface: getSelection() must inherit property "getComposedRanges(ShadowRoot...)" with the proper type] + expected: FAIL + + [Selection interface: calling getComposedRanges(ShadowRoot...) on getSelection() with too few arguments must throw TypeError] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini b/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini index 4bec6189b7a..b79ea99423a 100644 --- a/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini +++ b/tests/wpt/metadata-layout-2020/webxr/anchors/idlharness.https.window.js.ini @@ -61,3 +61,6 @@ [XRSession interface: operation deletePersistentAnchor(DOMString)] expected: FAIL + + [XRSession interface: attribute persistentAnchors] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini index bf65c4fbaee..042608beeba 100644 --- a/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata-layout-2020/webxr/idlharness.https.window.js.ini @@ -328,3 +328,9 @@ [XRSession interface: xrSession must inherit property "enabledFeatures" with the proper type] expected: FAIL + + [XRSession interface: attribute isSystemKeyboardSupported] + expected: FAIL + + [XRSession interface: xrSession must inherit property "isSystemKeyboardSupported" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini new file mode 100644 index 00000000000..08ab7bd35cd --- /dev/null +++ b/tests/wpt/metadata/FileAPI/url/url-charset.window.js.ini @@ -0,0 +1,4 @@ +[url-charset.window.html] + expected: TIMEOUT + [Blob charset should override any auto-detected charset.] + expected: TIMEOUT diff --git a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini index 282ab0b2525..cdeaf7f7080 100644 --- a/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini +++ b/tests/wpt/metadata/FileAPI/url/url-in-tags-revoke.window.js.ini @@ -7,7 +7,7 @@ expected: FAIL [Opening a blob URL in a new window immediately before revoking it works.] - expected: FAIL + expected: TIMEOUT [Opening a blob URL in a noopener about:blank window immediately before revoking it works.] expected: TIMEOUT diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 5ccc20c18d0..267e26130f0 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -3891,6 +3891,13 @@ {} ] ], + "root-element-cv-hidden-crash.html": [ + "890194b7c171ea7a42fd083567637aacee4fd877", + [ + null, + {} + ] + ], "root-element-display-none-crash.html": [ "fc55719c7e87bccb9d2862464b19e19112e02711", [ @@ -30168,7 +30175,7 @@ ] ], "scroll-timeline-specified-scroller-print.html": [ - "7e5b6607b6e9e99705022e10310816f2862732d8", + "05fab3e46ad22d01d26d5fe5ba90edb4dab798f3", [ null, [ @@ -128120,6 +128127,19 @@ {} ] ], + "anchor-scroll-composited-scrolling-006.html": [ + "6b5f268f5548b3e6db472d4939f7076bed09a64d", + [ + null, + [ + [ + "/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html", + "==" + ] + ], + {} + ] + ], "anchor-scroll-fixedpos.tentative.html": [ "ee7d22608b65570fe075e02542dbd877cd38cd82", [ @@ -129031,6 +129051,19 @@ {} ] ], + "background-attachment-fixed-inline-scrolled.html": [ + "746997d6057ba1d2c109dafdfe7730ef149cd21e", + [ + null, + [ + [ + "/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html", + "==" + ] + ], + {} + ] + ], "background-attachment-fixed-inside-transform-1.html": [ "9dae31aaccd1d281d05e43c3160000a53914d279", [ @@ -145645,6 +145678,58 @@ {} ] ], + "overflow-clip-014.html": [ + "4edf112e43265cd13465b6e86e9e1c2f288cf78c", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "overflow-clip-015.html": [ + "1eb114458c1bf5a1a69620a6ea3a1f746248d610", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "overflow-clip-016.html": [ + "4314c0135e26e6afe8659ce74fe24c14cf46281a", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "overflow-clip-017.html": [ + "1ab3cdd194f21f90699fe7f27c34a5614228ebb7", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "overflowed-block-with-no-room-after-000.html": [ "084e16fb38de072fb83f92ba01302a2e404cdd97", [ @@ -148122,7 +148207,7 @@ ] ], "import-conditional-001.html": [ - "9bdbbcb5a32b638d2275cd86f0b9f2bbd026ebdc", + "a841f265457a3f7bba741143d586e98f8e0354ef", [ null, [ @@ -165458,6 +165543,19 @@ {} ] ], + "dynamic-align-self-001.html": [ + "208c006d2d056888dba662ea593410970e848ca9", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "flex-abspos-staticpos-align-self-safe-001.html": [ "b7302cb962dbff9bfc99592ac7a2d2f2aae52b21", [ @@ -167592,6 +167690,19 @@ {} ] ], + "flex-aspect-ratio-img-row-017.html": [ + "b2408159b5af0c445333b4a3e6ab0d9d4353d78f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "flex-basis-001.html": [ "85e3bc69c435da542f520bc0e5b9b0afe911f0ad", [ @@ -175026,6 +175137,19 @@ {} ] ], + "grandchild-span-height.html": [ + "c087edb68d48036f5b3a45114a62d9db03a5a86e", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "grid-flex-item-001.html": [ "67ee0fb001d7b136f026190bfee0940aeb4ff849", [ @@ -175104,6 +175228,19 @@ {} ] ], + "grid-flex-item-007.html": [ + "bdea17d0692981c4742448f1c429e90236418858", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "image-items-flake-001.html": [ "90319f1ad83d26d414d8ddcd4a9ab59042a4bd62", [ @@ -176410,6 +176547,19 @@ {} ] ], + "table-as-flex-item-max-content.html": [ + "c7316aab950ddb1ceb6f05933ae9f1cec481f191", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "table-as-item-auto-min-width.html": [ "66a77327f0f25e07db87e342ebb590358d045f7a", [ @@ -188918,7 +189068,7 @@ ] ], "auto-track-sizing-001.html": [ - "0fdb9b0b7e2ed8855b02dcfb9baceeb61b7d05d3", + "4a946e6feb4dbf4c9c348896ad69a2c81232c17c", [ null, [ @@ -189152,7 +189302,7 @@ ] ], "independent-formatting-context.html": [ - "888b23c2f621e1abfa027a4f42cbebb00db89656", + "5a76ac2d6dea91a0d13de29d9192aaf8df3ae350", [ null, [ @@ -191552,7 +191702,7 @@ ] ], "image-orientation-none-cross-origin.html": [ - "e36c1295d31d43e48a6745021be3346838431158", + "ec139d4e229224de8c9953ecf748af2cf28cb197", [ null, [ @@ -300261,6 +300411,32 @@ {} ] ], + "scripting-print-noscript.html": [ + "1d1af708fd7e746ef991d2067a5a32b150672893", + [ + null, + [ + [ + "/css/mediaqueries/scripting-print-noscript-ref.html", + "==" + ] + ], + {} + ] + ], + "scripting-print-script.html": [ + "e80dba4d83f586df8ba48fde04356a0361861b69", + [ + null, + [ + [ + "/css/mediaqueries/scripting-print-script-ref.html", + "==" + ] + ], + {} + ] + ], "viewport-script-dynamic.html": [ "7433877972b09b3a03cd9f8a11dcd3efd1aa01d6", [ @@ -304188,6 +304364,216 @@ {} ] ], + "selectors-4": { + "lang-000.html": [ + "1d66bebbc6b53706ae782eec7b6a70cbaba3ec7f", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-001.html": [ + "908643fca81d533e76869c6af874fb3797991bfc", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-002.html": [ + "0be426c66e7d4e1e12de1778db3256752a7a560a", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-003.html": [ + "a3e5340b6e915d32963261669991d4040df7f096", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-004.html": [ + "d592997270746bb0cbfa286dad65d3539e519ecb", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-005.html": [ + "816dfc9b5034e8d9787be254660012e70b60c55d", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-006.html": [ + "d249a4c8c06a5e9a10b40df6a9bab68f367a69d2", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-007.html": [ + "a21506d94c1125da970792b3e2da5a542f96e332", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-008.html": [ + "77f77a884ac5088c360c34971eec637e48c42cff", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-009.html": [ + "bf2e9883916ea0e219a968b7dd6b0457e312d794", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-010.html": [ + "081c9207add489896a7db13d946658d249bd893b", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-011.html": [ + "5620317a14be99de361c456dbea873bdd294562f", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-012.html": [ + "f299e22eaecd2bde8351b01fca62ed8eaf2eab49", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-013.html": [ + "34303d97805386d7ca1ece6a61ebcdf1977f748d", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-014.html": [ + "2d064c8d29b60fbb0d3351c6c019cbc3aca85521", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ], + "lang-015.html": [ + "4d90b080f39607f09a63fe28756a6a51542094af", + [ + null, + [ + [ + "/css/selectors/selectors-4/lang-000-ref.html", + "==" + ] + ], + {} + ] + ] + }, "selectors-attr-many.html": [ "b38b8f52cfa7ef4290ecaa271b5bec95f676011d", [ @@ -305541,7 +305927,7 @@ }, "filters": { "2d.filter.canvasFilterObject.dropShadow.tentative.html": [ - "22c6a6547f23650f1f2f3d8a0cd57816386066a5", + "712716d9f01e8384c8a616d8d832c4fcbc94b7f0", [ null, [ @@ -306813,7 +307199,7 @@ "offscreen": { "filters": { "2d.filter.canvasFilterObject.dropShadow.tentative.html": [ - "04cf86d204ce8e143c6056eaf6499a3f768a4dec", + "043265279054d6d6852626700f6692a8b2413a6c", [ null, [ @@ -306826,7 +307212,7 @@ ] ], "2d.filter.canvasFilterObject.dropShadow.tentative.w.html": [ - "8d5e2da1586a56943588f9d343e96e7c32233386", + "de72f5fe3d9fa07c4a12906fc0fef2ac909ba6ed", [ null, [ @@ -312628,7 +313014,7 @@ ] ], "selectmenu-option-arbitrary-content-displayed.tentative.html": [ - "0fad1a1918f45b8144ec5aa50a7479aa45c0351e", + "05bc651cb7cb3468e4c8e8e5fdda7e47aaaed874", [ null, [ @@ -321679,6 +322065,19 @@ {} ] ], + "opacity.svg": [ + "949de0cbf0c8aeaf779a94aa01c2688698e756f6", + [ + null, + [ + [ + "/svg/text/reftests/opacity-ref.svg", + "==" + ] + ], + {} + ] + ], "text-clipped-offscreen-move-onscreen.html": [ "c29f790326537395d40f251d3a0be746014fbb5e", [ @@ -325544,7 +325943,7 @@ [] ], "interfaces.yml": [ - "91aecaa12f15429858e3f94c57accf3472d99baf", + "2e55ab28e1804b8800c0e4a1adbf43b5be014afa", [] ], "manifest.yml": [ @@ -325552,7 +325951,7 @@ [] ], "regen_certs.yml": [ - "4e29171ff27357f4fbbffc1be02a47aec5145f2f", + "e1691b779ff300b742310068e6bfe14eb547f0e0", [] ] } @@ -328278,7 +328677,7 @@ [] ], "reports.py": [ - "432f5c61d5e9c452a24e8985b846da0ce7079c0c", + "4d4c3fd5ec739e23d8a136070050e8d31733c969", [] ] } @@ -329823,20 +330222,12 @@ "90ed0a78576edc041caaa2ae70c319837152b726", [] ], - "observer-in-dedicated-worker.js": [ - "a30edd0a33ede1a1f628c356c92b768ed31e3e2f", - [] - ], - "observer-in-shared-worker.js": [ - "f69eadaacee6324edd021f1f20a245e5dd720cbc", - [] - ], "pressure-helpers.js": [ "5234cf2d78c90d559d3cfd8ee1b86d9b3fa97861", [] ], "support-iframe.html": [ - "57e18b77f62dbae3425e9f8b59b4d43c439ea709", + "6b2b3097926b192df23c3e21dd19742bb19e69d4", [] ] } @@ -369194,6 +369585,10 @@ [] ], "reference": { + "anchor-scroll-composited-scrolling-006-ref.html": [ + "92fe187117ed3f55379797da7987e5272bd71301", + [] + ], "anchor-scroll-fixedpos-ref.html": [ "e73354df72dac33f7a94eaef445e80ec61e3976a", [] @@ -369439,6 +369834,10 @@ [] ] }, + "background-attachment-fixed-inline-scrolled-ref.html": [ + "1767c84a5f011cbe120cf1b46af2d5639ea00e28", + [] + ], "background-attachment-fixed-inside-transform-1-ref.html": [ "8d4c3f785c8e84ffa121128cda96269574e27e73", [] @@ -385787,7 +386186,7 @@ [] ], "auto-track-sizing-001-ref.html": [ - "800f87e5d00a767f1cb5e5816ffd46110fbd4e80", + "81c6d184021cac8e7a0df0402a42a082c675e62a", [] ], "auto-track-sizing-002-ref.html": [ @@ -385859,7 +386258,7 @@ [] ], "independent-formatting-context-ref.html": [ - "79b90c340d844568014a3062ea35b2c087044ead", + "fe842b2823832e9feaae3534eab8220dd65cf129", [] ], "item-percentage-height-001-ref.html": [ @@ -386282,7 +386681,7 @@ [] ], "image-orientation-none-cross-origin-ref.html": [ - "c4d72fc823f3e98d7184c0536805b6f6e8be6f7c", + "a54aa3870f669108afcd535766331cf4e43dbbe0", [] ], "image-orientation-none-cross-origin-svg-ref.html": [ @@ -406273,6 +406672,14 @@ [] ] }, + "scripting-print-noscript-ref.html": [ + "2dd7aff83136a14dd9559249615438183d3b0d88", + [] + ], + "scripting-print-script-ref.html": [ + "d2da3f840586d803c83dc6bba11080e7b27d88ad", + [] + ], "support": { "media_queries_iframe.html": [ "890eb6c46113afbaf1dc88188c52a791623590a8", @@ -407061,6 +407468,12 @@ "6523fd3b64fbf10693c9d6c9a05b2da6328d6684", [] ], + "selectors-4": { + "lang-000-ref.html": [ + "466e9f464b906a114094b87249130bc8ff585a3b", + [] + ] + }, "selectors-attr-many-ref.html": [ "7d8a9f6d89d103373f81fa2f09c478b12e49ee7b", [] @@ -413528,7 +413941,7 @@ }, "script-tests": { "FileSystemBaseHandle-IndexedDB.js": [ - "15a0c2a3b579b308dfef01b0e1f9fa542641aaee", + "9e114619bf2caad6bbf53d25035c880818910dfa", [] ], "FileSystemBaseHandle-buckets.js": [ @@ -416476,7 +416889,7 @@ }, "filters": { "2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [ - "90f406fed9fd8545a352f2c213ace27b9556d3d7", + "8327b5cad483fd95393b8bf347452899992686d7", [] ] }, @@ -417274,7 +417687,7 @@ ], "filters": { "2d.filter.canvasFilterObject.dropShadow.tentative-expected.html": [ - "90f406fed9fd8545a352f2c213ace27b9556d3d7", + "8327b5cad483fd95393b8bf347452899992686d7", [] ] }, @@ -417552,7 +417965,7 @@ [] ], "filters.yaml": [ - "bdf3dcfe9fc47be1e8f8f562a619640fc05cc3b0", + "246b73e7f1a91863d9c2e05938c0d931cd1b1489", [] ], "layers.yaml": [ @@ -425010,7 +425423,7 @@ [] ], "selectmenu-option-arbitrary-content-displayed-ref.tentative.html": [ - "3933b93894b33762bbaa9e0dd722da6c3d6c7499", + "171829d90f3f28a5ee5e5229086d18fd50b61289", [] ], "selectmenu-option-arbitrary-content-not-displayed-ref.tentative.html": [ @@ -425039,7 +425452,7 @@ [] ], "fake-selectmenu.js": [ - "cf3864a29409699fd338ec722e3b05f3cd533dac", + "84fe52856177fe6092e9fc69ae8128c3ba2a37d6", [] ], "selectmenu_button_icon.svg": [ @@ -429614,7 +430027,7 @@ [] ], "webtransport-h3.https.sub.any.js.ini": [ - "f0041b0aa29c9047902a00c4a59f4d7802d3eb69", + "60d2e38ecadd696a05d0f675381a9bf7f367c044", [] ], "wpt-server-http.sub.html.ini": [ @@ -429681,7 +430094,7 @@ [] ], "wheelScroll.html.ini": [ - "647b875e5b0b4c1c41db490a3a877f262baa0146", + "5632dcf11290d53739edbcc47191658719e80cd4", [] ] }, @@ -429906,10 +430319,6 @@ "fd7d26e7fb7970a9dfc0d50990f63d0d5771498c", [] ], - "EXT_clip_cull_distance.idl": [ - "18d1c02a11abdfc2bf6bf35e8bd0cd34cdaccd0a", - [] - ], "EXT_color_buffer_float.idl": [ "09bd397d01fb32a425b403ff5dcf2e666b6c455a", [] @@ -429959,7 +430368,7 @@ [] ], "FedCM.idl": [ - "b3ddb54e0c646ce5cf6e6aee53e46a4938e56967", + "8de87e88b05fff5ff871b0c8c877adb759933870", [] ], "FileAPI.idl": [ @@ -430030,6 +430439,10 @@ "2208329ded177bf5ad3d8f598ca98a9c743a353d", [] ], + "WEBGL_clip_cull_distance.idl": [ + "46fa921fd5392807558518742eff3436702030fc", + [] + ], "WEBGL_color_buffer_float.idl": [ "b73f63153dadbe4face460f3fdfd7750a5b960ab", [] @@ -430090,6 +430503,10 @@ "2258fa9a10cf9f05e80ab1b220452070c0fbd87b", [] ], + "WEBGL_provoking_vertex.idl": [ + "035e1d233d6f5646768b78e878c9db43b84a0068", + [] + ], "WebCryptoAPI.idl": [ "0e68ea82f594430fdccff7db045a978905367419", [] @@ -430103,7 +430520,7 @@ [] ], "anchors.idl": [ - "5aa9395f09f395a14b6cc6c35113a72aecc16a24", + "d8c5aa69a87293e6f40d5e471ff29f990d285c4c", [] ], "attribution-reporting-api.idl": [ @@ -430127,7 +430544,7 @@ [] ], "badging.idl": [ - "f34dfa7e04af9caedd85eecaed8acf68e65d1546", + "8b401e057ade5ce17ced40139a270b27779296b1", [] ], "battery-status.idl": [ @@ -430155,11 +430572,11 @@ [] ], "compression.idl": [ - "88be302a4a6c9a5074f744fba768d9a4984219b7", + "7525d7c9847b74a8e382e55ad9627b64dd4af161", [] ], "compute-pressure.idl": [ - "42ff4f207ab5349c541f042c2a21f317d23ff401", + "3e35dc4ee2d04928c00477c14b8589fb67538433", [] ], "console.idl": [ @@ -430167,7 +430584,7 @@ [] ], "contact-picker.idl": [ - "aece81664e4fdd3c4beec5e4d36da109f8dc5ba6", + "0119d0e2ce658f02df30120083f7d1b6b203bdad", [] ], "content-index.idl": [ @@ -430175,7 +430592,7 @@ [] ], "cookie-store.idl": [ - "72ef3f8c8242dfd608b400a3de10aa6d49361210", + "f44b4c63546605590005c7b05edd387445a088f1", [] ], "crash-reporting.idl": [ @@ -430206,6 +430623,10 @@ "6620e0156dc85c040da7997d9d2e351147a47354", [] ], + "css-cascade-6.idl": [ + "37cdfb8293097e4297691f92ad291fc0433269f3", + [] + ], "css-cascade.idl": [ "9011dc7fd9e2a3f835e6d6ff565d9854db82e96f", [] @@ -430223,7 +430644,7 @@ [] ], "css-contain.idl": [ - "6b29119617a67b8e3ce18bc3aa943496ef5f6e75", + "be2137a4a6afe309fde67f6e75847f3831cc2926", [] ], "css-counter-styles.idl": [ @@ -430299,11 +430720,11 @@ [] ], "css-typed-om.idl": [ - "595a424e01461e6cad1f364eb5c233dbbcf1e02a", + "0df6a0327a24658a75379572334ea040c1476e25", [] ], "css-view-transitions.idl": [ - "cf9cb8927e42c5d24c7c6fd0ae6e5d4c001ce806", + "745eb1d96913389a24b933152c674abb086e3c28", [] ], "cssom-view.idl": [ @@ -430331,7 +430752,7 @@ [] ], "device-posture.idl": [ - "ba8f9f51f025d9ac1924d220fc17dfa11678abf2", + "0f1dded631329a05bc16f9105ce92c6dcb7d19af", [] ], "digital-goods.idl": [ @@ -430339,11 +430760,11 @@ [] ], "dom.idl": [ - "96acfc6a717fb29e9fed64ba3dab1635ee9c78f7", + "c5b5c94dbccac17f1e2ee51a20cabaded63e34b6", [] ], "edit-context.idl": [ - "f5e60bd0d02c45ca8f3145c729edcfd0b240b61e", + "91d8af2ea689ef45c925fbcf4a2e0a222a152c49", [] ], "element-timing.idl": [ @@ -430370,8 +430791,12 @@ "62c8c4aea6adcb0979edcdbc0f054403341d2653", [] ], + "fenced-frame.idl": [ + "2869b95e6bb3c5968a3ced65cefd5b4509dbff9d", + [] + ], "fetch.idl": [ - "866d09d31bd9b9916dfcadefb17a9ec56a99cdf1", + "81a5e69aee57f8edf7425423caa87222b141c29f", [] ], "fido.idl": [ @@ -430391,7 +430816,7 @@ [] ], "fs.idl": [ - "e341ab387d9c4767c52ad661286ddbf75d7770bf", + "e2474132abfb4c7ffe2e6ebcca7158d4eadbee75", [] ], "fullscreen.idl": [ @@ -430399,7 +430824,7 @@ [] ], "gamepad-extensions.idl": [ - "ddfc0d9c06ac9f4a2bff1737913097bb7ab21fcc", + "d7d750654fd9da6d0344face719975e4fe993889", [] ], "gamepad.idl": [ @@ -430426,6 +430851,10 @@ "e096044c2bcf966a72324af6157d59b62d862338", [] ], + "gpc-spec.idl": [ + "0e9a063c54cb5525d466c95df06130d63635d76e", + [] + ], "gyroscope.idl": [ "00fb0efcace7c388743e615ff301e8279e0532b4", [] @@ -430439,7 +430868,7 @@ [] ], "html.idl": [ - "e4752f079ceb2ef81e822a4997b942527577bc3e", + "33d4de0db976e1ee3008fa743772202f9207b14a", [] ], "idle-detection.idl": [ @@ -430547,7 +430976,7 @@ [] ], "mediacapture-streams.idl": [ - "5b41f3fa6538e211d350af3f2e819054aa3e72b6", + "3197ff73689b4cfc3ed2facdcd41bca50c680370", [] ], "mediacapture-transform.idl": [ @@ -430574,10 +431003,6 @@ "a41abb55eaeef0abc0695384477f1cd63ddf78ad", [] ], - "navigation-api.idl": [ - "111785182926a0bad63cb8016dd2bdcaf9238072", - [] - ], "navigation-timing.idl": [ "5a33964f07eafd01e45bcc6c103d34d8df63af4c", [] @@ -430587,11 +431012,11 @@ [] ], "notifications.idl": [ - "2be22213d789fc9a1a7b3df796b36763ee450e37", + "bfcfa2e66afb96f4d356067b1ceb750387418f59", [] ], "orientation-event.idl": [ - "f6ff96f0e013fe34104a9b6714104454c722cffa", + "a93d4658830c6164b00efd2abaac13bb3273fb33", [] ], "orientation-sensor.idl": [ @@ -430631,7 +431056,7 @@ [] ], "permissions-policy.idl": [ - "16945e3a9b7cded5610d9d2e2cb53acbb8d6b831", + "a789d41738c157a92ee96d9b56269f5e6f1fd657", [] ], "permissions-request.idl": [ @@ -430674,10 +431099,6 @@ "4f1e4bee835a23c5b7bcf54b5b05f4ded2b08023", [] ], - "priority-hints.idl": [ - "cbff6a5222d0a911dd2ba041031e3027451d0609", - [] - ], "private-click-measurement.idl": [ "3bed7ccf991f6b8cd4e9a5a237275c4ff5fc6f1f", [] @@ -430706,6 +431127,10 @@ "c0a400a999e98f904345f94bf4b6ae0e377b18ec", [] ], + "requestStorageAccessFor.idl": [ + "adca77a2b0395500571dd6efb2513dd390f3f832", + [] + ], "requestidlecallback.idl": [ "9c49aa1854f57b16bddb0144e027ceb7e3e8f85d", [] @@ -430715,7 +431140,7 @@ [] ], "resource-timing.idl": [ - "242df0bd804af4cfa790b0f421d62beba58761b3", + "151e5d46d842742cf7f7a6328bedcc40e4cf7456", [] ], "sanitizer-api.idl": [ @@ -430747,19 +431172,19 @@ [] ], "scroll-animations.idl": [ - "1fd52dece191c65f8480168206a35cdd93a5d5f0", + "14215509c9fec9db69602ed1f91c0ee1ee7052d0", [] ], "scroll-to-text-fragment.idl": [ - "ce571ddd694d4ecbb1024fcaf7f11dc805504bf2", + "be7bf73968ea202d0630fbb71d82fc758e7fe026", [] ], "secure-payment-confirmation.idl": [ - "6b6083b165e77441751c56b30f2e831ec7903b2b", + "9061b243477b4aaecc4ce756d5e0aae654342fe5", [] ], "selection-api.idl": [ - "c1eed2a9cf243d27ba24a385fb15cfd691e37065", + "a84536ab0f58bbb45a210870a6b9873c37df20e1", [] ], "serial.idl": [ @@ -430818,12 +431243,20 @@ "9844f08538194e673fb9e2a972aece97ad4559b3", [] ], + "trust-token-api.idl": [ + "ee339590827e0f678d9dc1dfe592d4ab33ba697c", + [] + ], "trusted-types.idl": [ "23562381294e59493880857584f6ac9200254ee2", [] ], + "turtledove.idl": [ + "cd81a3d87ef8cb476ee303eafe58fb3b9d4fbca2", + [] + ], "ua-client-hints.idl": [ - "f5070a0e0904f78531fece6f08ad19d591b39a55", + "c69714b9734ade32207ba1b2ff9a6cd5c2f46924", [] ], "uievents.idl": [ @@ -430831,7 +431264,7 @@ [] ], "url.idl": [ - "360c9adcfa1104ec5fd591869d7cc3ecdaf4395f", + "6549e45f419cd89e9e5e5f28889da8ff18cf2d79", [] ], "urlpattern.idl": [ @@ -430863,7 +431296,7 @@ [] ], "wasm-js-api.idl": [ - "141af90fd2d9d9432747277fc7d38ab6f53ea1f5", + "0d4384251df458a13e0c923c5412848039903da4", [] ], "wasm-web-api.idl": [ @@ -430871,11 +431304,11 @@ [] ], "web-animations-2.idl": [ - "61df2cd1518319c1ca949952bb58b20749b07473", + "f9f68a0d49a5ba71ade7e4a62546020d3adc22c5", [] ], "web-animations.idl": [ - "ed612302a47f5a9118f90288c86d1e69ab51463e", + "956d700f49b703400559851d05508e861d495fce", [] ], "web-app-launch.idl": [ @@ -430883,7 +431316,7 @@ [] ], "web-bluetooth.idl": [ - "21c237040ebbb939a58a9d2c7c67a3bcaf27ca91", + "5d461194a833e19b89a72adeb78e411c5ac07b32", [] ], "web-locks.idl": [ @@ -430907,13 +431340,17 @@ [] ], "webauthn.idl": [ - "ef27322312f1cb8e9e7282a7369c0b673c113b5f", + "58a9e285232184b99caed6434b1a66f8a8ecee4a", [] ], "webcodecs-aac-codec-registration.idl": [ "124a0b0febdd304a3bffccf94fd464a9067a2752", [] ], + "webcodecs-av1-codec-registration.idl": [ + "00e4493d3c0a957fefbaeeeb95efeaa26afd871c", + [] + ], "webcodecs-avc-codec-registration.idl": [ "d4074f647dab2b1af158a4f544ccd4737164b32c", [] @@ -430930,8 +431367,12 @@ "0d198a6bcdeabf63117166098cdabbbbf7772fa5", [] ], + "webcodecs-vp9-codec-registration.idl": [ + "aca64a789614930b9d9e7c36db2957de58335c6f", + [] + ], "webcodecs.idl": [ - "68df48584bd327b5a6aaea513dcd5445647d8ad3", + "77649029db69dd81b77f4178f9325537d50e4198", [] ], "webcrypto-secure-curves.idl": [ @@ -430951,7 +431392,7 @@ [] ], "webgpu.idl": [ - "b00e2374e586a63df1e09e36b5cbc008e3539772", + "284327a578999a7a068952526ab457389e40729f", [] ], "webhid.idl": [ @@ -430959,7 +431400,7 @@ [] ], "webidl.idl": [ - "9993673361aad662b83e96b491ddf6c6864f9100", + "7271f19dfa65f689b6e36d4df255f8c70517a5c0", [] ], "webmidi.idl": [ @@ -430967,11 +431408,11 @@ [] ], "webnn.idl": [ - "820c79e96666f812c0ce46d2e298859f93497149", + "2c2ab35e909712ad4ab89fe0f16358b4e92b353c", [] ], "webrtc-encoded-transform.idl": [ - "13f3999db1222c4d8c901111ccd90cb8128ec115", + "e48f1080c41209bd83d90e002aa00d52f4c2425f", [] ], "webrtc-ice.idl": [ @@ -430987,7 +431428,7 @@ [] ], "webrtc-stats.idl": [ - "f1dca4a923d46517a8a5e943aa3ac7a0cab78778", + "7e820a26df4844bcd094e16089a86ebca235a612", [] ], "webrtc-svc.idl": [ @@ -430995,7 +431436,7 @@ [] ], "webrtc.idl": [ - "d631169f46f47aab936c6fce1e86ec3b64a65931", + "578cbe92974fd711f1d96154ed6b6f3bef5c6cdb", [] ], "websockets.idl": [ @@ -431003,7 +431444,7 @@ [] ], "webtransport.idl": [ - "ba705807f1298de1185c7f10231070b96fd8a3da", + "2bea483e1b91f78569d80c706c20f95bd44978ac", [] ], "webusb.idl": [ @@ -431047,7 +431488,7 @@ [] ], "webxr.idl": [ - "939da53364deef0b436cb8f0757d33e775eb5ca8", + "de2b04691b32f60d68f5c5155134adba4a9bbe17", [] ], "webxrlayers.idl": [ @@ -431058,12 +431499,12 @@ "051978d693e3aa5213096e571be66d10cc8d8199", [] ], - "window-placement.idl": [ - "ac86c1d502aa816ecd87fa205133910a67f28537", + "window-management.idl": [ + "527c41deb6cda2de79780899d15bc43f02b281db", [] ], "xhr.idl": [ - "3abd09ce5ed7fa651466f7a242b573c3bc2d109f", + "b4c27c8aca9ab3b44abbf39002fba9c687519257", [] ] }, @@ -433254,7 +433695,7 @@ }, "utils": { "peerconnection.js": [ - "26a925abf077827136f6f4755fee7e3f3ff9c800", + "8b0f266facae0296d4ca0f58da31cd5b87c1b260", [] ], "sources.js": [ @@ -434194,7 +434635,7 @@ [] ], "window_state_context.js": [ - "40f10a564484c97e33706f6a6df71f7984b72df4", + "fa96bf3b760ea95d2eb04a322a9ee15680a2caa0", [] ] } @@ -437782,7 +438223,7 @@ [] ], "mock-pressure-service.js": [ - "91efe529f2af9951f4f21c1c74038291152dbc93", + "21811ed52da2cd4f6782b390d848d0085d0849cc", [] ], "mock-pressure-service.js.headers": [ @@ -437790,7 +438231,7 @@ [] ], "mock-subapps.js": [ - "b63e97b8c4dccf7726671d7f372f24bc431ba2f1", + "b81936713b17db941ef380d4019cecfbe563caf6", [] ], "mock-textdetection.js": [ @@ -438481,7 +438922,7 @@ [] ], "scroll-timeline-specified-scroller-ref.html": [ - "9074f2454b1a81c7bd51b6af9167680e11496798", + "d2f2d8f73d71f84c0c1111e6f923929acdb22a3a", [] ] }, @@ -442476,7 +442917,7 @@ "subapps": { "resources": { "subapps-helpers.js": [ - "9158d15c6c89b7cb328ca9a378a7753deb4d5e91", + "38b8d1146603147667df405ef012358ae423fde4", [] ] } @@ -443434,6 +443875,10 @@ "18c6ed4f1bd5905652d209007322dc394769665b", [] ], + "opacity-ref.svg": [ + "18c00ab332c73f5c033e37d4429872d07210ade4", + [] + ], "text-clipped-offscreen-move-onscreen-ref.html": [ "b03ac22aaa3155323ea1574e49241368ec1ad66c", [] @@ -443772,15 +444217,15 @@ [] ], "requirements_build.txt": [ - "03fe7d73efa81721a18fbda828ec09ab7cf5f8aa", + "c2137af3156ae426e8bd7a1e117e9c67bbfc203a", [] ], "requirements_tc.txt": [ - "53b10f8dcaaa40e8dd1bbc4cdd49fc9f62940d49", + "64b51841b0cf17f2ff9e59d8a89950d6a46bed81", [] ], "run_tc.py": [ - "46e3d613a99225e24db3e05a2fdeeb734ca0b55f", + "a5a6256ad542e1601988c5ad408804ec671d7298", [] ], "taskcluster-run.py": [ @@ -443962,7 +444407,7 @@ [] ], "lint.py": [ - "89ecee8035c71eebe1d7d5713a01185af53bec71", + "f255c024952cd1f8b102f3226cae84a923ef1a3d", [] ], "rules.py": [ @@ -444182,7 +444627,7 @@ ], "manifest": { "XMLParser.py": [ - "689533421d77e723882e6a8a12ab6f5e4e46fd65", + "21be8a26cd3f7748c8e86505083b31531ed17347", [] ], "__init__.py": [ @@ -444204,7 +444649,7 @@ [] ], "item.py": [ - "02a72eeb292d1819a5bf5285fccef4c973f3edf2", + "f798ec2ae8d7fed1f39b1dee478e7645f0fdb4bf", [] ], "jsonlib.py": [ @@ -444275,7 +444720,7 @@ ] }, "mypy.ini": [ - "fb9b5c81c2cbdeaa623eff7f8fa25218f5a1abb3", + "def40c0bd0614c297bd1b1213f2182a2dba07a2a", [] ], "pytest.ini": [ @@ -444287,15 +444732,15 @@ [] ], "requirements_mypy.txt": [ - "ff878deb613a5bf5515ae3228277e223def0a90c", + "c95a836e6ab10d67a374401357127634e831d354", [] ], "requirements_pytest.txt": [ - "0bb151cb644ca0bdd7e5e28de955f5da95ca8be3", + "78e1ae4d613dc00a01da9cbfba4a3d06d906808c", [] ], "requirements_tests.txt": [ - "26bf23a7f5e4ef2bf2ecd544e1f8572062594823", + "9ccaaa0d02a751320a34fcc91d360593277b4834", [] ], "runner": { @@ -451539,7 +451984,7 @@ } }, "tox.ini": [ - "6a3001e25a048192804d5d859cd73413433000fe", + "5efbe9b37abc88e6467bef877e646ce865ee49b0", [] ], "wave": { @@ -452276,11 +452721,11 @@ [] ], "client.py": [ - "56fa274cdc4c282478c441a792ba743f164db473", + "9bb03b34f96343bff885d89be37ddc2c3130b41a", [] ], "error.py": [ - "81910a63eb2bf3d062cc8a6985002826bb25fa59", + "d9ea28c78fd6e6786576ba6355386c1e1d5fefdc", [] ], "modules": { @@ -452289,7 +452734,7 @@ [] ], "_module.py": [ - "c2034033c79be44b8982164b7ac2863c9e7f4599", + "e28a83584a8ac4de6747a4c3894c9728d5682acb", [] ], "browsing_context.py": [ @@ -452297,7 +452742,7 @@ [] ], "input.py": [ - "d2ee17e36e249970ec777a32b99451336b8b32b0", + "be0d745a0ca3a31da4453ee6750e612ca08e615b", [] ], "script.py": [ @@ -452310,12 +452755,12 @@ ] }, "transport.py": [ - "a28c484b83c7fed557418c3f170ee43f7843f5be", + "2d5d8ee9224ff549cb9256741be79cf3e4b076ed", [] ] }, "client.py": [ - "851c6722fc27c199956e90f4d08a4d2b10ed7976", + "f33fc34dac9ee53135239ef906b1e88b6f4c6114", [] ], "error.py": [ @@ -452363,7 +452808,7 @@ [] ], "webtransport_h3_server.py": [ - "6384a5aefb2bacabeffeede8f6679dfa3295af01", + "141bd9f7dc9fa2c24707dce87b3250e909179c83", [] ] }, @@ -452382,7 +452827,7 @@ [] ], "browser.py": [ - "d6c238a1f2722f2af34bc64ea045dabad25b5895", + "7a046e8f07c5d5afc020011b1baa9bcf8a7229b4", [] ], "commands.json": [ @@ -452394,7 +452839,7 @@ [] ], "install.py": [ - "821ce86f97f4e883ccc1a9c9c28a4cf84a714fc8", + "5bcbb7a7c339e79dfe71579c5db1f88e5e0bfeb4", [] ], "markdown.py": [ @@ -452418,7 +452863,7 @@ [] ], "run.py": [ - "0b7d73b204247f9b2d8481591983bd31c5ccc3b8", + "72ceab08b9794e45a14db05e90794e608a6785d7", [] ], "testfiles.py": [ @@ -452509,7 +452954,7 @@ [] ], "test_update_expectations.py": [ - "1635dce7ec67809e7824ba39806cf16e2f40b31a", + "184cd7247b39e8a033cfca5008522962aefffade", [] ], "test_wpt.py": [ @@ -452574,7 +453019,7 @@ ] }, "requirements.txt": [ - "ccf09be728d5aefd44c3b2a484d636b3ad358bdf", + "bfd21934d99bfbba9abe6f404a9125efcabe7f5c", [] ], "requirements_chromium.txt": [ @@ -452586,7 +453031,7 @@ [] ], "requirements_firefox.txt": [ - "64546d55314b92f20324914a7b9152a2c9671d05", + "0b51ee8f463047bbc5ba446ae67c302af7441642", [] ], "requirements_ie.txt": [ @@ -452844,7 +453289,7 @@ [] ], "chromium.py": [ - "eca63d136bb683327713af60d8def6fa9cafd228", + "95f53011bfc32de47a93e0bb7d2ac99f84be4e40", [] ], "tests": { @@ -452998,7 +453443,7 @@ [] ], "test_update.py": [ - "35c75758f534d3f8a4ac53f7a69998926c46baaf", + "6cbe335cfe7dcb1400aceca5fb45947828c634d3", [] ], "test_wpttest.py": [ @@ -453198,7 +453643,7 @@ [] ], "base.py": [ - "be5dc0d102c95cd74793bf5595e9f2efc1c60fb5", + "f47308d88df27d21469f0e80f92fd98681a1dd70", [] ], "docroot": { @@ -456190,6 +456635,28 @@ [] ] }, + "input": { + "__init__.py": [ + "3aa0c3a19d1da10d8d7ae04db4ec6cea394ec75e", + [] + ], + "conftest.py": [ + "0ec3174163f76779da87173bc75039491b0f4303", + [] + ], + "perform_actions": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + }, + "release_actions": { + "__init__.py": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ] + } + }, "log": { "__init__.py": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -456220,7 +456687,7 @@ ] }, "conftest.py": [ - "e6ca1f999b06a2dd9930c3603314630aea1b3286", + "21a037a0f77b6255773d7f432a98988fce3ddffe", [] ], "response_completed": { @@ -456655,7 +457122,7 @@ [] ], "conftest.py": [ - "f28fb06ce2999518b6071df8d8931a9410a709b3", + "30069a02386566c6c707c83bc5281d49e82ce08f", [] ], "support": { @@ -456709,7 +457176,7 @@ [] ], "conftest.py": [ - "34c8e5de183e54415e6285359f744129ee91de92", + "8275efc23b70de3f06eb9d081d4fa2d3c13d7fc5", [] ], "support": { @@ -456718,11 +457185,7 @@ [] ], "refine.py": [ - "90f722587c3be0e4066fbb6a604668a6d40f359f", - [] - ], - "test_actions_wdspec.html": [ - "6f844cd255a075d31caf1c19957af3d6ac833778", + "d40520974938b1dd226021be40a79e1661860249", [] ] } @@ -456773,7 +457236,7 @@ [] ], "fixtures_bidi.py": [ - "9407dc160704524e589dadd07a686d1d6dc40f4d", + "612718b89e57e6867b85e8d818fe30810859a1aa", [] ], "fixtures_http.py": [ @@ -456781,7 +457244,7 @@ [] ], "helpers.py": [ - "b0c065dca1189b711c44d23454760fde0181244c", + "45f4f4d23922dc3bf28d4d3117208f70ef90ca7f", [] ], "html": { @@ -457203,7 +457666,7 @@ [] ], "prelu.json": [ - "f3855b0f4e19b4e8b70b8fafb0a5f32b733ee7bd", + "e1bf67826195d27c62115d0806493fe5db97c04b", [] ], "reduce_max.json": [ @@ -457250,6 +457713,10 @@ "52ea57c7632d0d27b1745ddd4e983c37becf9832", [] ], + "softsign.json": [ + "e3208b18ad49a64dbbeb6a939dc69d2ea5ab3c43", + [] + ], "split.json": [ "e4216003c02f7fa8174d2d2734217477ca975407", [] @@ -457276,7 +457743,7 @@ ] }, "utils.js": [ - "a91dfa04c6e7b38cb1d461edef7cbb72edaa65ba", + "427b47e28cc2f9aeae42e9ed6fbf6b36128c9a0b", [] ] } @@ -457842,26 +458309,6 @@ "543d876e01d2b1612538825082ef0650401bc6e3", [] ], - "close.https.any.js.ini": [ - "6f118ff5f2745d7423609590efcacce426ae323e", - [] - ], - "connect.https.any.js.ini": [ - "d53cd702ccda18d457b9c6f68abd1989518ef4d7", - [] - ], - "csp-fail.https.window.js.ini": [ - "adbd3c1359242839d7f84afd56a73784bb68a8d4", - [] - ], - "csp-pass.https.window.js.ini": [ - "28d68410bbe856c21e3d83a50d599093fc553e84", - [] - ], - "datagrams.https.any.js.ini": [ - "49ad1548df3c672fa749f43e9225cf9001c1e7eb", - [] - ], "handlers": { "abort-stream-from-server.py": [ "1d92b705e6de05e2cf56476698560511410df3c7", @@ -457898,18 +458345,10 @@ }, "resources": { "webtransport-test-helpers.sub.js": [ - "733153e12027d1e47fd823fa4fa8b47b1717b91f", + "9f9127b22f96da1c8dc84465d33e5c5e476f4262", [] ] - }, - "streams-close.https.any.js.ini": [ - "0d60f7e54dbe086d5ab3a6b0f6290d27e1cdc52d", - [] - ], - "streams-echo.https.any.js.ini": [ - "eb11ca786f1c81594fa3f1af6bcfaae7cff9efe3", - [] - ] + } }, "webusb": { "META.yml": [ @@ -485757,17 +486196,58 @@ ] }, "compute-pressure": { - "compute_pressure_basic.tentative.https.window.js": [ - "e2d9a0f05bc99a7e798c6ca71a152f72481f5c49", + "compute_pressure_basic.tentative.https.any.js": [ + "18b8985cf51c2c9874af273ceeb38eb697df3345", [ - "compute-pressure/compute_pressure_basic.tentative.https.window.html", - {} - ] - ], - "compute_pressure_basic_async.tentative.https.window.js": [ - "3a9a32dedc0ea819c7eea013a5b22925960fba72", + "compute-pressure/compute_pressure_basic.tentative.https.any.html", + { + "script_metadata": [ + [ + "timeout", + "long" + ], + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ], + "timeout": "long" + } + ], + [ + "compute-pressure/compute_pressure_basic.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "timeout", + "long" + ], + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ], + "timeout": "long" + } + ], [ - "compute-pressure/compute_pressure_basic_async.tentative.https.window.html", + "compute-pressure/compute_pressure_basic.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -485781,6 +486261,10 @@ [ "script", "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" ] ], "timeout": "long" @@ -485788,7 +486272,7 @@ ] ], "compute_pressure_cross_origin_focus_control.tentative.https.window.js": [ - "f88c9fdf64e3afdae60b06fd658256841e9a5283", + "950334d6fc57f324b61cede416920534ccce76aa", [ "compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.html", { @@ -485800,6 +486284,14 @@ [ "script", "/common/get-host-info.sub.js" + ], + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" ] ], "timeout": "long" @@ -485807,37 +486299,174 @@ ] ], "compute_pressure_detached_iframe.tentative.https.html": [ - "3b0a5504e536acf9426476122f59b7c8ed24b150", + "5511a147048d610125a0d0d485367b88e4e5a70e", [ null, {} ] ], - "compute_pressure_disconnect.tentative.https.window.js": [ - "c9950f2dc84d2ad7001df440b598d0730fe3cfb9", + "compute_pressure_disconnect.tentative.https.any.js": [ + "1d188fad8b8e1cd2123e320d99943c408be55fcd", [ - "compute-pressure/compute_pressure_disconnect.tentative.https.window.html", - {} - ] - ], - "compute_pressure_disconnect_idempotent.tentative.https.window.js": [ - "72021fd2708b6aab870e133f744cf53ebd61f194", + "compute-pressure/compute_pressure_disconnect.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], [ - "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_disconnect.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_disconnect.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_disconnect_immediately.tentative.https.window.js": [ - "1abe84d57202ba568d4c1fa459b355e591582a77", + "compute_pressure_disconnect_idempotent.tentative.https.any.js": [ + "2f6421ee11711f8d1768cc19d233346440f16f7f", [ - "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_duplicate_updates.tentative.https.window.js": [ - "3c312ca5b1fb6bc0693e6626063075bcb0e6e8ae", + "compute_pressure_disconnect_immediately.tentative.https.any.js": [ + "b96ebd802e666bcd0230406da3435d8969484037", + [ + "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], [ - "compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.html", + "compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -485847,15 +486476,57 @@ [ "script", "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" ] ] } ] ], - "compute_pressure_factors.tentative.https.window.js": [ - "6d8d2208887007e429269b26cfd2891dfc497a29", + "compute_pressure_duplicate_updates.tentative.https.any.js": [ + "b5d7690d18295b82bf052faa3a7c93cc5ecc024a", + [ + "compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], [ - "compute-pressure/compute_pressure_factors.tentative.https.window.html", + "compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -485865,48 +486536,269 @@ [ "script", "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" ] ] } ] ], - "compute_pressure_multiple.tentative.https.window.js": [ - "6015ae1f81bc495e642a7482757934fa1c1a1924", + "compute_pressure_factors.tentative.https.any.js": [ + "7486a70f91170c180ea12f8a0acee46a2626b640", [ - "compute-pressure/compute_pressure_multiple.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_factors.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_factors.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_factors.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_multiple_across_iframes.tentative.https.window.js": [ - "838b9a17a00f2bf14f8443673fac1fbc4560e6fe", + "compute_pressure_multiple.tentative.https.any.js": [ + "c8cef5beca0cba5b26ba897d16f90b08caa1c40d", [ - "compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_multiple.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_multiple.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_multiple.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_observe_idempotent.tentative.https.window.js": [ - "e60115fee87c15cb25c55382e418e7611514c892", + "compute_pressure_observe_idempotent.tentative.https.any.js": [ + "5dc3804b2f7ea21f5e189351ea0194f30d6f536d", [ - "compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_observe_unobserve_failure.tentative.https.window.js": [ - "c32649da5c3dde260d74c0ab6bbeb275143d385d", + "compute_pressure_observe_unobserve_failure.tentative.https.any.js": [ + "8eafeb356d815728719b61aee9e9ee704b79bdad", [ - "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_options.tentative.https.window.js": [ - "d142ecc088187e60bcdbbd5a94b81c1d37c89331", + "compute_pressure_options.tentative.https.any.js": [ + "69999819d962fbf1841d87a817aed1ac23767f17", [ - "compute-pressure/compute_pressure_options.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_options.tentative.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_options.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_options.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], "compute_pressure_privacy_test.tentative.https.window.js": [ - "d33f6ef09ad1681a2803fc0fda8315dcd80e39f9", + "113f4bdf79be9325df22f859c819558ab37429f5", [ "compute-pressure/compute_pressure_privacy_test.tentative.https.window.html", { @@ -485938,6 +486830,14 @@ [ "script", "/resources/testdriver-vendor.js" + ], + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" ] ], "timeout": "long" @@ -485945,23 +486845,106 @@ ] ], "compute_pressure_same_origin_focus_control.tentative.https.window.js": [ - "746f119f249c8c1a7d6451a5672823d011adf22e", + "7df0be5c47d161fe4cadcba937f875a0a0cba320", [ "compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.html", - {} + { + "script_metadata": [ + [ + "timeout", + "long" + ], + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ] + ], + "timeout": "long" + } ] ], - "compute_pressure_supported_sources.tentative.https.window.js": [ - "2a69e731e7f9f7c5c0b54ea3b7bc9202bda57f16", + "compute_pressure_supported_sources.tentative.https.any.js": [ + "63f2666cca69c9ed69b1449fb5c336854d11967d", [ - "compute-pressure/compute_pressure_supported_sources.tentative.https.window.html", - {} + "compute-pressure/compute_pressure_supported_sources.tentative.https.any.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_supported_sources.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_supported_sources.tentative.https.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } ] ], - "compute_pressure_take_records.tentative.https.window.js": [ - "d294a7e80fd7e4cfcf4bbf5962f9014e1826e331", + "compute_pressure_take_records.tentative.https.any.js": [ + "d93c9b5c886f9d57def646c052f5ea1cce627ea5", + [ + "compute-pressure/compute_pressure_take_records.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_take_records.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], [ - "compute-pressure/compute_pressure_take_records.tentative.https.window.html", + "compute-pressure/compute_pressure_take_records.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -485971,15 +486954,57 @@ [ "script", "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" ] ] } ] ], - "compute_pressure_timestamp.tentative.https.window.js": [ - "b9b932e64fcfedb03e7038ce5a963df2a1610336", + "compute_pressure_timestamp.tentative.https.any.js": [ + "f283caa6baebbe531b1fdddb2add2b761b7ad083", + [ + "compute-pressure/compute_pressure_timestamp.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_timestamp.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], [ - "compute-pressure/compute_pressure_timestamp.tentative.https.window.html", + "compute-pressure/compute_pressure_timestamp.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -485989,15 +487014,57 @@ [ "script", "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" ] ] } ] ], - "compute_pressure_update_toJSON.tentative.https.window.js": [ - "7f3acf3e07fb0f537b057ac3d9181559dafd1c2f", + "compute_pressure_update_toJSON.tentative.https.any.js": [ + "c1cd240a3bc52b4b9dc79cb594d48ebdd7f64ec7", + [ + "compute-pressure/compute_pressure_update_toJSON.tentative.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], + [ + "compute-pressure/compute_pressure_update_toJSON.tentative.https.any.sharedworker.html", + { + "script_metadata": [ + [ + "script", + "/resources/test-only-api.js" + ], + [ + "script", + "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" + ] + ] + } + ], [ - "compute-pressure/compute_pressure_update_toJSON.tentative.https.window.html", + "compute-pressure/compute_pressure_update_toJSON.tentative.https.any.worker.html", { "script_metadata": [ [ @@ -486007,6 +487074,10 @@ [ "script", "resources/pressure-helpers.js" + ], + [ + "global", + "window,dedicatedworker,sharedworker" ] ] } @@ -496508,6 +497579,13 @@ {} ] ], + "anchor-non-oof-inherit.html": [ + "75f98a1ebfe0e6b61008e2152bea88228829af08", + [ + null, + {} + ] + ], "anchor-parse-invalid.html": [ "de4b0ffac45ec09914bac7bbfd43fabf8b083989", [ @@ -497277,6 +498355,13 @@ {} ] ], + "display-none-dont-cancel.tentative.html": [ + "6ae115803b820ffdb51169c38769ee51f5062652", + [ + null, + {} + ] + ], "event-dispatch.tentative.html": [ "3e577d6ea6c67269766ed9ec38d13bd4cbda435c", [ @@ -499402,7 +500487,7 @@ ] ], "import-conditions.html": [ - "0bb09754702ce2c4f2655f2ec1c01ec8f78a661d", + "e5e1c685a9e214af6f0cd4a9eefa4f67056665e8", [ null, {} @@ -499562,6 +500647,13 @@ null, {} ] + ], + "supports-import-parsing.html": [ + "58e1f7cd165381d7ab53a6eb6feb03bbc976ef97", + [ + null, + {} + ] ] }, "presentational-hints-cascade.html": [ @@ -502400,6 +503492,13 @@ {} ] ], + "fieldset-as-container-justify-center.tentative.html": [ + "a1d7564e8a766d34e566df937ef2d6fd6def627b", + [ + null, + {} + ] + ], "flex-aspect-ratio-img-column-011.html": [ "f716d5ad6c896624577b253ea37e66954c08c358", [ @@ -503426,6 +504525,13 @@ {} ] ], + "justify-content-007.html": [ + "2ce9177a76639f1bbfaedb736d4ed620d6e1b3d1", + [ + null, + {} + ] + ], "justify-content_space-between-002.html": [ "fde1a7312408d02fe3843452585de2ee660ae6f7", [ @@ -509122,7 +510228,7 @@ }, "text-box-trim": { "text-box-trim-valid.html": [ - "1ce4ceb107409896d3f9e1d000f226c3afb5fcb2", + "61622774f6f33054ad97e74dde0b020619eb1d02", [ null, {} @@ -511488,6 +512594,36 @@ {} ] ], + "overlay": { + "overlay-computed.html": [ + "f1a0a315de6eeb08863d9fd4dbad2588b3492d89", + [ + null, + {} + ] + ], + "overlay-invalid.html": [ + "e84d0c8a6b0c36f815301dcfe6683f80661121b3", + [ + null, + {} + ] + ], + "overlay-transition-property.html": [ + "a667f26ea6a42a2dde565d4eeb7f28cb98aacbc1", + [ + null, + {} + ] + ], + "overlay-valid.html": [ + "8d808ac6dcf582628f782b2e228b261a654ba212", + [ + null, + {} + ] + ] + }, "parsing": { "bottom-computed.html": [ "baeef5daa5df496d9f62e4bde9b409965cdcb768", @@ -528635,6 +529771,13 @@ {} ] ], + "scripting.html": [ + "de047cb463cff5c1d8af268f1e08908c9684fe8c", + [ + null, + {} + ] + ], "test_media_queries.html": [ "20fca4affd24e5a3d1335b9d39420f653c7cd9fb", [ @@ -529586,7 +530729,7 @@ ] ], "css3-selectors-lang-014.html": [ - "5e68d50d5a07211dcc1cb70235da5efa96e38759", + "411d50d35e50f46609fa98a6c60b3ef1065aa5a1", [ null, {} @@ -533203,7 +534346,7 @@ ] ], "scrollend-event-fired-to-element-with-overscroll-behavior.html": [ - "acad168e56c995dea4e70f4124b4ec97f8b90c15", + "edda88e7cb2064757cb4b34c2bf7dcdab97e8f65", [ null, { @@ -566210,7 +567353,7 @@ ] ], "join-leave-ad-interest-group.https.sub.window.js": [ - "32924a8d8724c203b21bbd52b26a40d15b901f1d", + "973c586ca4f1b3d35bd6c0814dc5fe3a012bbdda", [ "fledge/tentative/join-leave-ad-interest-group.https.sub.window.html", { @@ -568337,6 +569480,15 @@ } ] ], + "element-request-fullscreen-screen-size.https.html": [ + "1c2bc9e3d119edb9ebeb88aabe33aeee7b7a334a", + [ + null, + { + "testdriver": true + } + ] + ], "element-request-fullscreen-svg-rect.html": [ "44adfa68986566e63ad788eeb2f8595076c1c413", [ @@ -579551,56 +580703,56 @@ }, "filters": { "2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [ - "d64b81026ad5f60494b2df0db50b11fb01bfb255", + "77818444c87c90312000dc6a601eb5985be1f070", [ null, {} ] ], "2d.filter.canvasFilterObject.colorMatrix.tentative.html": [ - "678a722520a98bb0039c3c0fb846c320fd943800", + "a56840e60739638fbf54e1363d119fab56dca3e3", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [ - "0ecd132c8efa286b90f5a2777e1351c3204316d0", + "c54299ff2a5a45f66bf67ff31d1945c201ed4f82", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [ - "4ef30c9249bb01fa1780f8ab07d677b087073ff2", + "110cd2396ea893dd9586098e9810399f63a179f2", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [ - "25eda36d96b08779e73cb385ae5496e623976461", + "96a3e4936ee2640f792b971ff4b9f702e7e3b79f", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [ - "c45f5586009150b862acd6b3398ca53350456baa", + "10f9931cc6430ef84b2314add5581c09136122b7", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [ - "b561cb6fd3f0a8d293941bffada44c70416d266a", + "7e743bf34f008d0b4579183d8f28ad2aa0624a81", [ null, {} ] ], "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [ - "b85b742b3ebb2c26ed9b17b6683b6b510268ee84", + "b994a91842c031f05cd1650ee8078a62a0825416", [ null, {} @@ -579614,14 +580766,14 @@ ] ], "2d.filter.canvasFilterObject.tentative.html": [ - "3a32eb6a55a2487449b982cb0dda11815e782218", + "a4625db01977fe277d3b0543dd80146b7ce47f55", [ null, {} ] ], "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [ - "1f9d978ac8c29f8e51075cd119240d3921411b6b", + "64f909a7fdb25ee209ba4aeb6fd3830b5b6a7e48", [ null, {} @@ -588697,112 +589849,112 @@ }, "filters": { "2d.filter.canvasFilterObject.blur.exceptions.tentative.html": [ - "6ce6fb633f8c08e0b168a810350d862b14838b8f", + "f5332780c82b41dab06cb18d1d78990724426a50", [ null, {} ] ], "2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js": [ - "a44868f585c67ccee883b06bc6681b4c88bb4f7f", + "61f10308801caa7e3c276aa4db4b7cf6158e4d84", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.colorMatrix.tentative.html": [ - "3eda41776c0ef289c23991bc9e88219a974829fd", + "f3dd3037bb7ab7b9e82fbab0590d8bfe508f8f46", [ null, {} ] ], "2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js": [ - "105f312b9ceae0243b27234934477568493861df", + "19d57b61e53242a4c0144b87c060dfad708bfada", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html": [ - "7cb8b0dd143602bb2fb6893b63b6bebaf23a3bf0", + "dd6fc9ee5ff1694e6a19b87a83c24ef2d32e2dbd", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js": [ - "f1274f14253c559ccfe9939abbc87c62884ff7c0", + "79a5cd2475ca911c061b898881d2474ee556531d", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html": [ - "388fdca6f9d8db49680b506c918a163935d25908", + "f2a9fcfd49a4a66f0a1283f41a8a5346e0a4e769", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js": [ - "14bf50f89dde725304dbcbdb9f8ea65447c373ca", + "a36fa19a5efad6948108a3cfd7c337daca1f5f76", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html": [ - "44eb7184956bd4b535d8c097237a90e358d8e1b2", + "33aae01eb056f9c37f4254b1aa4ad16c49aa267a", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js": [ - "ae749673f4362ea4aade37ffdc55986e77735a6c", + "7236c7087a174372a271e9c043d149faefbf6d42", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html": [ - "d24a9e8608d1b2c2d404579b9e122522c7965e2e", + "23731a1286ce723473b2268dc1d1530d6af028dc", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js": [ - "5117d4a1b3b0d683146a9ee39eb1b30966cb72b7", + "9a4499d4d6b70114fd9225172a04cf5ac9ef8c4e", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.componentTransfer.table.tentative.html": [ - "a704557cc54551a70dc8087130ae270ba79ad558", + "c11e6adb9109972b1c0d2a6da7e847e2aeecc047", [ null, {} ] ], "2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js": [ - "e2463eb9e7663b0409b6ea661d333d500e08a9e1", + "8ff791d3bb986733308320a158c3a8f3d17b9f08", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html": [ - "0a6bddc56d7b339dad16db40531d8832d08c3624", + "c4b6df8e0db0bec1dcff080436c0daba92ccdadc", [ null, {} ] ], "2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js": [ - "bce4c0be158aafce773333805f2e8b0ce7644873", + "f7e616e7a63fc32dc6da14acec08c4255f24ee3c", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.html", {} @@ -588823,28 +589975,28 @@ ] ], "2d.filter.canvasFilterObject.tentative.html": [ - "75d369cad2f9e0c3a7674537badd49fdfa79c74e", + "4d80dddf0071467eabde32c85d0dd5b30da2dcbb", [ null, {} ] ], "2d.filter.canvasFilterObject.tentative.worker.js": [ - "30772a39d102169cc5d04b79fe83c037f66085a4", + "48c4a0448d95e596c7d46e5c38a05f33ab29efd9", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.html", {} ] ], "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html": [ - "610dca9feaf59afd413aec78f291ba14607a53d6", + "2ed61e66d0335be76c33a71a30cfb18d5304bf03", [ null, {} ] ], "2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js": [ - "76673fab9a7e6a16c4340021961c8180c6253ca4", + "1bed65ad156a78121ad52d6448dc7107995986e1", [ "html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.html", {} @@ -604001,8 +605153,15 @@ ] ] }, - "http-equiv-and-name.html": [ - "144217df3848851445f78d4e1b725dc1d479584e", + "http-equiv-and-name-1.html": [ + "ac82e3396d6258e2fea86dbac65a12b12304b751", + [ + null, + {} + ] + ], + "http-equiv-and-name-2.html": [ + "b73013a341b9774dc3ad1f3154df47e365a816be", [ null, {} @@ -627225,6 +628384,13 @@ } ] ], + "loaf-blocking-duration.html": [ + "3514d413e9eb763eb12563180437b0a9d8211cee", + [ + null, + {} + ] + ], "loaf-buffered.html": [ "1a07036b157a93f1f4c099a8cd5c0917d71424e0", [ @@ -627345,7 +628511,7 @@ ] ], "loaf-toJSON.html": [ - "f78e95da6d11e25d355d71d26bbc56bf2c967b1f", + "5b249e697245c5b9002c1a5fcbd6f456ab220005", [ null, {} @@ -632923,7 +634089,7 @@ ], "cross-window": { "click-crossdocument-crossorigin-sameorigindomain.sub.html": [ - "676672a230f15030eee9b10a0380ed3b3006b840", + "004e1a75e3d8ca38c5634424a4816c577e705479", [ null, {} @@ -632937,35 +634103,35 @@ ] ], "click-crossdocument-sameorigin.html": [ - "41c3ca71eef1d5eaafb1eff0bbe5eb70799a1ce2", + "683875d0062e3b0d56428c0827822bf75b10e68e", [ null, {} ] ], "click-samedocument-crossorigin-sameorigindomain.sub.html": [ - "a467ecf9d73d88af6537a234125e4ef15dd05d00", + "60d1653a3ab17aa5a392e97bdc91734024c16a51", [ null, {} ] ], "click-samedocument-crossorigin.html": [ - "b9fa97f6d526ae395402dac8b8d6c59988a404b0", + "ee01e7f1f2d8d31f2596fcf3ecb77c22004c7201", [ null, {} ] ], "click-samedocument-sameorigin.html": [ - "566bea3dc7e9b58baff552e219f85be75a6fdb08", + "eaa7b52345722801885f1d5ef8f9f51002375d2d", [ null, {} ] ], "location-crossdocument-crossorigin-sameorigindomain.sub.html": [ - "77a5873c0838f8452dafc4bdca785944dbd92ef0", + "cee7d95b9ecf678982eba240d96e6787647beaaf", [ null, {} @@ -632979,35 +634145,35 @@ ] ], "location-crossdocument-sameorigin.html": [ - "41ac1b037506f12a86dec1ab10df1d917bc1ba72", + "d0dad46b72ab9476c15860b8d0249bdd23c5421a", [ null, {} ] ], "location-samedocument-crossorigin-sameorigindomain.sub.html": [ - "1eda74e982831088f7b70d0175fb954583044db8", + "156d1cb3cfd1f3f469c68de21b0aebc9e9b94615", [ null, {} ] ], "location-samedocument-crossorigin.html": [ - "5679236a7ddca9b6ac7e3627652ba4faaa29fee4", + "6d73262dea0153a61a7f146105cbbcbbc4a4280f", [ null, {} ] ], "location-samedocument-sameorigin.html": [ - "a7e4181c3a19f0449e0fce7457c664d94edcd932", + "6516a602395065f6447be7e4e0c52c99559473d8", [ null, {} ] ], "open-crossdocument-crossorigin-sameorigindomain.sub.html": [ - "ea9ea479c34733c46f8312a72dd6ca2900c5680c", + "1c411d986682ed7aeb06aa79f481815795677fa6", [ null, {} @@ -633021,35 +634187,35 @@ ] ], "open-crossdocument-sameorigin.html": [ - "478483e238d7271e65af53c4a29b861b11d44efd", + "c91689341e85e8a1053c311580e622449ab77be4", [ null, {} ] ], "open-samedocument-crossorigin-sameorigindomain.sub.html": [ - "324adb32a45922d605ad2df350188ee05200171c", + "74a6cae2461835429a0181538e529ae05a12f0e9", [ null, {} ] ], "open-samedocument-crossorigin.html": [ - "23dceb04204841a66b28bc55001742f091e1117a", + "9b31744ba384e12cd031c0ccba68e13936dab5b6", [ null, {} ] ], "open-samedocument-sameorigin.html": [ - "9ca853180343f69cee1896837f77c21b485fa08b", + "c357072e09d1d00832616fba9886b4f8eac63c02", [ null, {} ] ], "submit-crossdocument-crossorigin-sameorigindomain.sub.html": [ - "f611034617401e8497567c825d27ef245d75bf01", + "ffdaac7ccdd6428ba03fb00600a79bd3e15a9e86", [ null, {} @@ -633063,28 +634229,28 @@ ] ], "submit-crossdocument-sameorigin.html": [ - "05347335a192a65306b652ff7c680dc7279e15d8", + "b54a5a440b05cbd54c2a9dce2bcd73bc2a635e29", [ null, {} ] ], "submit-samedocument-crossorigin-sameorigindomain.sub.html": [ - "9e64a0124daf5f549daf12f5c13a5793da254584", + "e9ab17243e5836f25542669b5973639f7787c09d", [ null, {} ] ], "submit-samedocument-crossorigin.html": [ - "e53a1f93e7a7a063c050c1419760d9a1fed8f1e8", + "69b12f279594387134c9082258b94a82d6b5dba3", [ null, {} ] ], "submit-samedocument-sameorigin.html": [ - "43aa3226fcd6fc99d86eab400fbdea75d2d2a6c0", + "8a0e1f1fb69635ba8595c4ed5f4ec3c85d2e642e", [ null, {} @@ -633253,14 +634419,14 @@ ] ], "navigate-anchor-cross-origin.html": [ - "d8f2e383124be56d493d6d67b47d9664f62f2a94", + "ee0992485078fd85d1c2099e7c74440407c111b4", [ null, {} ] ], "navigate-anchor-download-userInitiated.html": [ - "90a612b75886963b2bf706fcfb934637d9a903ec", + "b9506984dad8d8cd65b6d80c084922c59ed319ac", [ null, { @@ -633269,28 +634435,28 @@ ] ], "navigate-anchor-download.html": [ - "c5ca306b7908d518a7e105d5dcf39e312a07a6bc", + "05fb0ecf2fe6f60577fed75e2ca6fc57677cac0f", [ null, {} ] ], "navigate-anchor-fragment.html": [ - "b7706b7debea3cdf5cc943f96ec4a099c4c02acb", + "51221ebcad381b04600835bbc765e82dafa9d4b2", [ null, {} ] ], "navigate-anchor-same-origin-cross-document.html": [ - "b8e925a4dbacd54399f2ad96eb21f8b6481caf8c", + "68f5bf0627c123f1fe954d109924c2c1a5ab7170", [ null, {} ] ], "navigate-anchor-userInitiated.html": [ - "b746bbe3f028c25c4038d9e1b4f748f7b93289d7", + "39192c915132485a512a353d7f6e2c5693cf4cdf", [ null, { @@ -633299,35 +634465,49 @@ ] ], "navigate-anchor-with-target.html": [ - "c2053a37b09a45610dbbb43fdd0780a24614b4e8", + "6407b963beb7cd8a321574faab8b942e887959ae", + [ + null, + {} + ] + ], + "navigate-destination-after-detach.html": [ + "1dcb6cac4377ab79551ec51382308d6d669b5670", + [ + null, + {} + ] + ], + "navigate-destination-dynamic-index.html": [ + "2e0f1ea49730fcdcf07f483188b01d5350540069", [ null, {} ] ], "navigate-destination-getState-back-forward.html": [ - "c118aa7a1f3867990beed09786cc6778858f5a2f", + "c8b1043aba6f5ee4605ee461b4f0ab1bc4136077", [ null, {} ] ], "navigate-destination-getState-navigate.html": [ - "9c34c5753a1197631cd1770284dfb012bb0192f6", + "5dac40de566e9e42a5e2f08ec0a7a2882f318b51", [ null, {} ] ], "navigate-destination-getState-reload.html": [ - "b3afb72482c8fd545a044e4923c8b0820c7a9bf9", + "a180e086a94b084bb8df4a6a315444551ea57158", [ null, {} ] ], "navigate-form-get.html": [ - "69a49eb08a67711178dd8ef1a9f35c3c807d55d4", + "87a102ddc0598f9903c630c5c1add3075dbbdcdb", [ null, {} @@ -633348,7 +634528,7 @@ ] ], "navigate-form-userInitiated.html": [ - "454f0773962f326f1ae66ee4d5a470fc1abf50ff", + "40c5905447c59fc0ed1d873d3248c39a49163db0", [ null, { @@ -633357,14 +634537,14 @@ ] ], "navigate-form-with-target.html": [ - "b23ab3a70ccb2bb724cde932bbd3fc91f711177a", + "f6fe05c938f2fb88289c3a95bfab2f809d11177b", [ null, {} ] ], "navigate-form.html": [ - "b537a9b58f090c8f7ce76bb06433ae5a9c8b93a6", + "c57d72c3deb0f7714bf78630afe6a39d87569f01", [ null, {} @@ -633399,42 +634579,42 @@ ] ], "navigate-history-go-0.html": [ - "96d98cf44c8261a777d37b31785137897f3429c8", + "b1f41425b62f833474b85dd3049d1c33ea3095d9", [ null, {} ] ], "navigate-history-pushState.html": [ - "2f8c81c7090cb9441210936f1d63a016cca29ccc", + "266309a79e13a4e5239853316089c19a729a5ba2", [ null, {} ] ], "navigate-history-replaceState.html": [ - "d8417fbfd308ae9a7120b6a8040d401b5384084a", + "ea6d3df455dc74fb27e964a4f41eabdf611ab5f5", [ null, {} ] ], "navigate-iframe-location.html": [ - "059b995011836619c46a0d8c95bef56c82cceaec", + "25d51476f3ffeea34583254a9e8162c507915408", [ null, {} ] ], "navigate-location.html": [ - "c5aa0be97a47be497f019c8a9cd6fc03db022bd3", + "a4d0c60776dc0eb21996ffa8abb92e884995b9dd", [ null, {} ] ], "navigate-meta-refresh.html": [ - "1f8ed306851fd469e7ebbdeac3695b16ab47421e", + "9fa59b29f240014e86e7a379cfd3b56a490dc853", [ null, {} @@ -633462,7 +634642,7 @@ ] ], "navigate-navigation-navigate.html": [ - "76f98c72361060fa5fbc842fecdfa00c737cd56c", + "ffc8ea867f71f3c23290813a1e90065341f68c81", [ null, {} @@ -633476,21 +634656,21 @@ ] ], "navigate-to-srcdoc.html": [ - "26ad135b6ad0b7718c97f2914d60dfc2bbb9dea0", + "8bbb66a31fdfee846444dc2c2e338fb7669bfff7", [ null, {} ] ], "navigate-window-open-self.html": [ - "274c8bc4d5762fd47314b4534a79145da31b5f8a", + "a6e443fd5a115edd7dea6f5cd40abfb3386c937c", [ null, {} ] ], "navigate-window-open.html": [ - "afc998271f6e96f206ecea45368a275f44400b79", + "1fe2402bc91e524371cb0f998e6477000ad96357", [ null, {} @@ -636638,7 +637818,7 @@ ] ], "visibility-state-entry.tentative.html": [ - "c62b6c583f42ca97c812480a0842c15d26543a6f", + "0dbe634d25bef37fb2293cbbcd113fa33a8ddceb", [ null, { @@ -657954,7 +659134,7 @@ ] ], "orientation-reading.html": [ - "0bebb6723a384fc112358418d783e72a762940e2", + "90bbb8071dacf704c5a66b564268af4ee4f92354", [ null, { @@ -658163,7 +659343,7 @@ "scroll-animations": { "css": { "animation-duration-auto.tentative.html": [ - "f44a682890d8e25fa5f92e06591b7e22b00a26a3", + "375489c26a4f49aa3f8bb1f3b4f24d19654ab549", [ null, {} @@ -658282,7 +659462,7 @@ ] ], "progress-based-animation-timeline.html": [ - "2e910cbe51efbf4bdcd73eca85c9bed1c39d09e6", + "3f1aeed0ae9bdd6f19550cab37f92f1437619634", [ null, {} @@ -658302,6 +659482,13 @@ {} ] ], + "scroll-timeline-attachment.html": [ + "78ca257437322a5b24281f9bd45cffabf728cad2", + [ + null, + {} + ] + ], "scroll-timeline-axis-computed.html": [ "b971aba6c0f8a5bd5a6e18ddbef1cc296263c305", [ @@ -658317,7 +659504,7 @@ ] ], "scroll-timeline-axis-writing-mode.html": [ - "37b4dfdf549e52943c5e8a35683cc6a998442db4", + "958ce4964e844bcf8d94699b4a8bbc5e29df8e2f", [ null, {} @@ -658443,7 +659630,7 @@ ] ], "timeline-offset-keyframes-hidden-subject.html": [ - "047acfed33f36adb3afca0655c99e75a707f3976", + "389c8baca3ad035df1de6767ac9abc6265756808", [ null, {} @@ -658457,7 +659644,7 @@ ] ], "timeline-range-name-offset-in-keyframes.tentative.html": [ - "a0d1bd92f0907f26b98843cac21d306a0848949c", + "7bae49c2e97dcc8c22b3f071256fdfd9cca699c2", [ null, {} @@ -658471,7 +659658,7 @@ ] ], "view-timeline-animation.html": [ - "b816bb689732b3be59df48c0653ed892dc70cdd4", + "73189b85917314e497cf0cb70d2e22986c230997", [ null, {} @@ -658491,6 +659678,13 @@ {} ] ], + "view-timeline-attachment.html": [ + "47f4444b0dcad286f9a9d538e0e85d05623c3ea3", + [ + null, + {} + ] + ], "view-timeline-axis-computed.html": [ "f4649dab0404a49be5014e2df7475fd151c44342", [ @@ -658513,7 +659707,7 @@ ] ], "view-timeline-inset-animation.html": [ - "a95086b62bf338ea338345990a11735f7f594e23", + "a7e807c2e819dd0678178171816af5569b3aadff", [ null, {} @@ -658534,14 +659728,14 @@ ] ], "view-timeline-keyframe-boundary-interpolation.html": [ - "1dc766d961c5dd513e3d0912d01468279044648e", + "04eb648949057b6452d96b2f4ba55a1cb9f467e2", [ null, {} ] ], "view-timeline-lookup.html": [ - "c1797c7ba1c37177f413ed1396ddb3e8b61660dc", + "b8a5b0008be1a0b9285fd52b3ecd666f39ab6a3e", [ null, {} @@ -659130,6 +660324,15 @@ } ] ], + "authentication-disallowed-when-hidden.https.html": [ + "1c01fa0e89c133122952479e2e3b1a0632ce0007", + [ + null, + { + "testdriver": true + } + ] + ], "authentication-icon-data-url.https.html": [ "cd820d84c32116a400f76f059af97a0241cfcc37", [ @@ -664978,7 +666181,7 @@ ] ], "html-collection.html": [ - "2f3d49ec267b83c64d37641ce50b22c9b26aa0df", + "1ce2cf34401dff1bb63b1955d93b3c79ab7886ea", [ null, {} @@ -665752,6 +666955,13 @@ ] }, "shared-storage": { + "insecure-context.tentative.http.html": [ + "7ddf02f861aaba92db75ac47c85dfcab4a7c8861", + [ + null, + {} + ] + ], "select-url-permissions-policy-default.tentative.https.sub.html": [ "67911388ec0f41790d8c7c678256f153765a6294", [ @@ -666510,6 +667720,13 @@ } ] ], + "different-initiators-2.https.html": [ + "69e84333aa4dec9f5602f299bd224c58ee13a66a", + [ + null, + {} + ] + ], "different-initiators.sub.https.html": [ "74e79323d9413da5196d7b1b57b340b205bc2099", [ @@ -673054,14 +674271,14 @@ ] ], "remove-error.tentative.https.html": [ - "e85ffd74a78d52a156f1fba88bba61a384a20cc7", + "917c3b4d022d446488ac14c45fff114e34a95c5d", [ null, {} ] ], "remove-success.tentative.https.html": [ - "ca73cbea8886aa5eb93249b97264df0c4ac1e875", + "6fd4305b4340a036ddba6084d9f6c5b929254f2e", [ null, {} @@ -676524,14 +677741,14 @@ ] }, "trust-token-parameter-validation-xhr.tentative.https.html": [ - "73af4634b6d0326711275293e70e9b28ce618ec0", + "883c438fa93be67e44c2da172fca00a45a8d3ddc", [ null, {} ] ], "trust-token-parameter-validation.tentative.https.html": [ - "e2ab079434bd6e6eda9274ba9e0064683056367a", + "cf24b232e834383655e3d54b0a81fad3810454fc", [ null, {} @@ -692518,7 +693735,7 @@ ] ], "video-encoder.https.any.js": [ - "b5c511d4062cc5bf473dfbb670491d02c1daa19e", + "229ae32edd44307d8683ad8793641d16d9d28c1c", [ "webcodecs/video-encoder.https.any.html", { @@ -693246,7 +694463,7 @@ ] ], "videoFrame-serialization.crossAgentCluster.https.html": [ - "cb02ad4bcc3a23c33e091b887bc069fcfe6ed170", + "8fe7cf44cc686e041fc1fdc677c060905e7d76d0", [ null, {} @@ -696276,6 +697493,57 @@ } ] ], + "softsign.https.any.js": [ + "61a7d5365fabca290eaeb400c961a107558e17ed", + [ + "webnn/softsign.https.any.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API softsign operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "./resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "webnn/softsign.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "test WebNN API softsign operation" + ], + [ + "global", + "window,dedicatedworker" + ], + [ + "script", + "./resources/utils.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], "split.https.any.js": [ "bb1c99565879ccb922bb3f492803138767f6deff", [ @@ -698082,7 +699350,7 @@ ] ], "RTCRtpTransceiver-headerExtensionControl.html": [ - "b6dc7da5d4076d113419888e814e445e9dd2c40a", + "79eba02727bb35b745cee0a3b6246e37fb216e06", [ null, {} @@ -710842,7 +712110,7 @@ ] ], "datagrams.https.any.js": [ - "b96b36fc369f1dbb929ce0f44dcf7ae18ffc8e22", + "dc7133bb867e203ee651d887b64e48782dc3c58b", [ "webtransport/datagrams.https.any.html", { @@ -711188,7 +712456,7 @@ ] ], "streams-echo.https.any.js": [ - "32781419ebf7bd83d376419ca07e2829196ed4db", + "3b402d00e08aa0b7b746248835faed37b9b99578", [ "webtransport/streams-echo.https.any.html", { @@ -742294,7 +743562,7 @@ }, "dom_content_loaded": { "dom_content_loaded.py": [ - "486414aa3cd97bfd8d979445070c204dda44c2d9", + "9723ee4a4edfef0dd5bb51414d32d8cac2b39e82", [ null, {} @@ -742333,7 +743601,7 @@ }, "load": { "load.py": [ - "878d26eaad82d5bb1a9be437e072031b001ad06a", + "b4b174818cf20f52cb4f1c864ef6a34682f4e03c", [ null, {} @@ -742444,7 +743712,7 @@ ] ], "page.py": [ - "dd1fbcb9ae7359ff65d1bff425e179e5ccb6cbce", + "b66fb9881e5c8bbe530d2056e959d76a0add6e44", [ null, {} @@ -742486,6 +743754,13 @@ }, "input": { "perform_actions": { + "invalid.py": [ + "4dee9e33654651a288d7ea8a00d73f3529acd3d9", + [ + null, + {} + ] + ], "key.py": [ "bed2182f34cfd7f31b3c06ee85be8936c35fa8fe", [ @@ -742494,7 +743769,37 @@ ] ], "key_events.py": [ - "65f54ed7b3846f7805e34771aeac0392b83937ba", + "e222776d1f9b828aac6070f79a5c624bcdb54707", + [ + null, + {} + ] + ] + }, + "release_actions": { + "context.py": [ + "0cb407606d4819a56879610dbed5c560c28d0b4b", + [ + null, + {} + ] + ], + "invalid.py": [ + "2adc0aa95388915829e833280c0d3398801ad470", + [ + null, + {} + ] + ], + "release.py": [ + "c4990b702aefa0490b285143d0cf39bd13a909ca", + [ + null, + {} + ] + ], + "sequence.py": [ + "bd1d77523037f7294491682501b2185b91870327", [ null, {} @@ -742661,7 +743966,7 @@ ] ], "invalid.py": [ - "d73705c672470e1fe1986b61808b29eae4aea4d6", + "015fd40cf90ba3f1f07730d5feb39c547f3bfe13", [ null, {} @@ -742735,7 +744040,7 @@ }, "disown": { "handles.py": [ - "d4a514576624cd9fce98cf244b00ca39008ba0ee", + "e1226463a5cb82b1cd4a3facda15f4af93040557", [ null, {} @@ -742756,7 +744061,7 @@ ] ], "target.py": [ - "d8439c2be3d5345a9fecb4d3205642baeba752b9", + "67d857a04141ea441085f92ab5bc39f57088ff5c", [ null, {} @@ -744073,7 +745378,7 @@ ] ], "key_events.py": [ - "8dbe024d18396f010b2dcac7281b8436b5b69c65", + "9f912684c76f4e6b7347c8a08a8b9e9559d6d6bd", [ null, { @@ -744281,7 +745586,7 @@ ] ], "sequence.py": [ - "75143d85ca600b3e3a2d7d5ac3679a26b7d7bf5a", + "24ca16c86043ac091b5173fcc3e8571a50107eca", [ null, { diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini new file mode 100644 index 00000000000..0842d0b5727 --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-001.html.ini @@ -0,0 +1,3 @@ +[hit-test-floats-001.html] + [hit-test-floats-001] + expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini deleted file mode 100644 index 968f62a2553..00000000000 --- a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[hit-test-floats-002.html] - [Hit test float] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini new file mode 100644 index 00000000000..665ec4646cb --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-003.html.ini @@ -0,0 +1,3 @@ +[hit-test-floats-003.html] + [Miss float below something else] + expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini new file mode 100644 index 00000000000..147f062e548 --- /dev/null +++ b/tests/wpt/metadata/css/CSS2/floats/hit-test-floats-005.html.ini @@ -0,0 +1,3 @@ +[hit-test-floats-005.html] + [Miss clipped float] + expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini index ee34bc91078..51432362d66 100644 --- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini +++ b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-002.html.ini @@ -1,6 +1,3 @@ [block-in-inline-hittest-002.html] [elementsFromPoint] expected: FAIL - - [elementFromPoint] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini index f9e216a8cfc..cdd8b55f192 100644 --- a/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini +++ b/tests/wpt/metadata/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html.ini @@ -1,6 +1,3 @@ [block-in-inline-hittest-relpos-zindex.html] [position: relative; z-index: -1;] expected: FAIL - - [block-in-inline-hittest-relpos-zindex] - expected: FAIL diff --git a/tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini b/tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini deleted file mode 100644 index 7c07b71d77c..00000000000 --- a/tests/wpt/metadata/css/CSS2/normal-flow/hit-test-anonymous-block.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[hit-test-anonymous-block.html] - [Hit test beside line of text inside anonymous block] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini b/tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini new file mode 100644 index 00000000000..0ac75b5ef27 --- /dev/null +++ b/tests/wpt/metadata/css/css-animations/display-none-dont-cancel.tentative.html.ini @@ -0,0 +1,15 @@ +[display-none-dont-cancel.tentative.html] + [display:none animating to display:inline should be inline for the whole animation.] + expected: FAIL + + [A CSS variable of display:none animating to display:inline should be inline for the whole animation.] + expected: FAIL + + [Animating from display:none to display:none should not cancel the animation.] + expected: FAIL + + [Animating from display:none to display:none with an intermediate variable should not cancel the animation.] + expected: FAIL + + [Animating a variable of "none" which gets set to display elsewhere should not cancel the animation.] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini b/tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini new file mode 100644 index 00000000000..2789084260c --- /dev/null +++ b/tests/wpt/metadata/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html.ini @@ -0,0 +1,2 @@ +[background-attachment-fixed-inline-scrolled.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini b/tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini deleted file mode 100644 index b8f8d45a31f..00000000000 --- a/tests/wpt/metadata/css/css-flexbox/hittest-anonymous-box.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[hittest-anonymous-box.html] - [Hit-testing within an anonymous flex-item should return the flexbox as the hittest result.] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini b/tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini deleted file mode 100644 index 5b685485f3c..00000000000 --- a/tests/wpt/metadata/css/css-flexbox/hittest-before-pseudo.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[hittest-before-pseudo.html] - [Hit-testing text within a pseudo-element flex-item should return the flexbox as the hittest result.] - expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini b/tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini new file mode 100644 index 00000000000..ea29b95ecec --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/justify-content-007.html.ini @@ -0,0 +1,3 @@ +[justify-content-007.html] + [.flexitem + .flexitem 1] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini b/tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini new file mode 100644 index 00000000000..0757e0f9b55 --- /dev/null +++ b/tests/wpt/metadata/css/css-flexbox/table-as-flex-item-max-content.html.ini @@ -0,0 +1,2 @@ +[table-as-flex-item-max-content.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini b/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini index 1781ee56d0b..c8501a56905 100644 --- a/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini +++ b/tests/wpt/metadata/css/css-fonts/variations/font-weight-matching.html.ini @@ -34,3 +34,9 @@ [Test @font-face matching for weight 250] expected: FAIL + + [Test @font-face matching for weight 400] + expected: FAIL + + [Test @font-face matching for weight 420] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini b/tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini new file mode 100644 index 00000000000..cc0692d0132 --- /dev/null +++ b/tests/wpt/metadata/css/css-position/overlay/overlay-computed.html.ini @@ -0,0 +1,18 @@ +[overlay-computed.html] + [Property overlay value 'none'] + expected: FAIL + + [Property overlay value 'auto'] + expected: FAIL + + [Property overlay value 'inherit'] + expected: FAIL + + [Property overlay value 'initial'] + expected: FAIL + + [Property overlay value 'revert'] + expected: FAIL + + [Property overlay value 'unset'] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini b/tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini new file mode 100644 index 00000000000..aacfbd3b035 --- /dev/null +++ b/tests/wpt/metadata/css/css-position/overlay/overlay-transition-property.html.ini @@ -0,0 +1,3 @@ +[overlay-transition-property.html] + [Property transition value 'overlay 1s'] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini b/tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini new file mode 100644 index 00000000000..5c27614af3c --- /dev/null +++ b/tests/wpt/metadata/css/css-position/overlay/overlay-valid.html.ini @@ -0,0 +1,18 @@ +[overlay-valid.html] + [e.style['overlay'\] = "none" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "auto" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "inherit" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "initial" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "revert" should set the property value] + expected: FAIL + + [e.style['overlay'\] = "unset" should set the property value] + expected: FAIL diff --git a/tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini b/tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini deleted file mode 100644 index ae4a71ae9b3..00000000000 --- a/tests/wpt/metadata/css/css-transforms/inline-with-filter-and-hidden-backface.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-with-filter-and-hidden-backface.html] - [Hit test] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini new file mode 100644 index 00000000000..72b09371038 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-001.html.ini @@ -0,0 +1,3 @@ +[elementFromPoint-001.html] + [CSSOM View - 5 - extensions to the Document interface] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini deleted file mode 100644 index db065588308..00000000000 --- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-float-in-table.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[elementFromPoint-float-in-table.html] - [float-in-div] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini index 390e170437a..8ae9bae3500 100644 --- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-list-001.html.ini @@ -13,15 +13,3 @@ [<li>Outside 3</li>] expected: FAIL - - [<li>Inside 2</li>] - expected: FAIL - - [<li>Inside 3</li>] - expected: FAIL - - [<li>Image Inside 1</li>] - expected: FAIL - - [<li>Image Inside 2</li>] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini new file mode 100644 index 00000000000..8f6f663ba61 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/elementFromPoint-subpixel.html.ini @@ -0,0 +1,3 @@ +[elementFromPoint-subpixel.html] + [Hit test top left corner of box] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini deleted file mode 100644 index a6bca7ac372..00000000000 --- a/tests/wpt/metadata/css/cssom-view/elementFromPoint-visibility-hidden-resizer.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[elementFromPoint-visibility-hidden-resizer.html] - [elementFromPoint on resizer area of an element with visibility:hidden] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini b/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini index ceb43099040..3615da5f3a2 100644 --- a/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini +++ b/tests/wpt/metadata/css/cssom-view/elementFromPosition.html.ini @@ -17,3 +17,9 @@ [test some point of the element: bottom right corner] expected: FAIL + + [test some point of the element: top left corner] + expected: FAIL + + [test the top of layer] + expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini deleted file mode 100644 index a3496a40d07..00000000000 --- a/tests/wpt/metadata/css/cssom-view/elementsFromPoint-invalid-cases.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[elementsFromPoint-invalid-cases.html] - [The root element is the last element returned for otherwise empty queries within the viewport] - expected: FAIL diff --git a/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini new file mode 100644 index 00000000000..a3e30250229 --- /dev/null +++ b/tests/wpt/metadata/css/cssom-view/scroll-behavior-smooth-navigation.html.ini @@ -0,0 +1,6 @@ +[scroll-behavior-smooth-navigation.html] + [Instant scrolling while doing history navigation.] + expected: FAIL + + [Smooth scrolling while doing history navigation.] + expected: FAIL diff --git a/tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini b/tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini new file mode 100644 index 00000000000..f8256a35717 --- /dev/null +++ b/tests/wpt/metadata/css/mediaqueries/scripting-print-noscript.html.ini @@ -0,0 +1,2 @@ +[scripting-print-noscript.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini b/tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini new file mode 100644 index 00000000000..2143b97f4b4 --- /dev/null +++ b/tests/wpt/metadata/css/mediaqueries/scripting-print-script.html.ini @@ -0,0 +1,2 @@ +[scripting-print-script.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/mediaqueries/scripting.html.ini b/tests/wpt/metadata/css/mediaqueries/scripting.html.ini new file mode 100644 index 00000000000..afffc87ac19 --- /dev/null +++ b/tests/wpt/metadata/css/mediaqueries/scripting.html.ini @@ -0,0 +1,27 @@ +[scripting.html] + [Should be known: '(scripting)'] + expected: FAIL + + [Should be known: '(scripting: enabled)'] + expected: FAIL + + [Should be known: '(scripting: initial-only)'] + expected: FAIL + + [Should be known: '(scripting: none)'] + expected: FAIL + + [Should be parseable: '(scripting: 0)'] + expected: FAIL + + [Should be parseable: '(scripting: 10px)'] + expected: FAIL + + [Should be parseable: '(scripting: invalid)'] + expected: FAIL + + [Check that scripting currently matches 'enabled'] + expected: FAIL + + [Check that scripting currently evaluates to true in the boolean context] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini b/tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini new file mode 100644 index 00000000000..b168bf5cd3a --- /dev/null +++ b/tests/wpt/metadata/css/selectors/selectors-4/lang-011.html.ini @@ -0,0 +1,2 @@ +[lang-011.html] + expected: FAIL diff --git a/tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini b/tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini new file mode 100644 index 00000000000..cdc6bafba43 --- /dev/null +++ b/tests/wpt/metadata/css/selectors/selectors-4/lang-012.html.ini @@ -0,0 +1,2 @@ +[lang-012.html] + expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini b/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini index e9ab91fc80e..4c1c78640bb 100644 --- a/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini +++ b/tests/wpt/metadata/fetch/api/basic/keepalive.any.js.ini @@ -1,3 +1,4 @@ [keepalive.any.html] + expected: TIMEOUT [keepalive in onunload in nested frame in another window] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini b/tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini deleted file mode 100644 index 9df4327e18f..00000000000 --- a/tests/wpt/metadata/fetch/api/body/mime-type.any.js.ini +++ /dev/null @@ -1,39 +0,0 @@ -[mime-type.any.html] - [Request: overriding explicit Content-Type] - expected: FAIL - - [Response: setting missing Content-Type] - expected: FAIL - - [Response: overriding explicit Content-Type] - expected: FAIL - - [Request: setting missing Content-Type] - expected: FAIL - - [Response: removing implicit Content-Type] - expected: FAIL - - [Request: removing implicit Content-Type] - expected: FAIL - - -[mime-type.any.worker.html] - [Request: overriding explicit Content-Type] - expected: FAIL - - [Response: setting missing Content-Type] - expected: FAIL - - [Response: overriding explicit Content-Type] - expected: FAIL - - [Request: setting missing Content-Type] - expected: FAIL - - [Response: removing implicit Content-Type] - expected: FAIL - - [Request: removing implicit Content-Type] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini deleted file mode 100644 index c57e48f2078..00000000000 --- a/tests/wpt/metadata/fetch/api/redirect/redirect-keepalive.any.js.ini +++ /dev/null @@ -1,2 +0,0 @@ -[redirect-keepalive.any.html] - expected: TIMEOUT diff --git a/tests/wpt/metadata/fetch/content-type/response.window.js.ini b/tests/wpt/metadata/fetch/content-type/response.window.js.ini index f5ba8274138..4807d68ba4d 100644 --- a/tests/wpt/metadata/fetch/content-type/response.window.js.ini +++ b/tests/wpt/metadata/fetch/content-type/response.window.js.ini @@ -174,9 +174,6 @@ [fetch(): separate response Content-Type: text/plain;charset=gbk text/plain] expected: NOTRUN - [Request: combined response Content-Type: text/plain] - expected: FAIL - [<iframe>: combined response Content-Type: text/plain ] expected: FAIL diff --git a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini index f9de5391ad6..36a410bfecb 100644 --- a/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini +++ b/tests/wpt/metadata/fetch/metadata/generated/css-images.sub.tentative.html.ini @@ -146,3 +146,6 @@ [list-style-image sec-fetch-site - HTTPS downgrade-upgrade] expected: FAIL + + [border-image sec-fetch-site - HTTPS downgrade (header not sent)] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini deleted file mode 100644 index 3e07e6b7d1f..00000000000 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[empty-iframe-load-event.html] - [Check execution order from nested timeout] - expected: FAIL - - [Check execution order on load handler] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini index ab9ac6e835e..1d68034a37d 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/failure-check-sequence.https.html.ini @@ -1,13 +1,12 @@ [failure-check-sequence.https.html] - expected: TIMEOUT [CSP check precedes COEP check - CSP header first] - expected: NOTRUN + expected: FAIL [COEP check precedes X-Frame-Options check] - expected: NOTRUN + expected: FAIL [CSP check precedes COEP check - COEP header first] - expected: NOTRUN + expected: FAIL [CSP check precedes X-Frame-Options check] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini index 78240a2f463..8ae58f9f1e2 100644 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html.ini @@ -16,3 +16,6 @@ [D83D DE0D set in href="" targeting a frame and clicked] expected: FAIL + + [DE0D 0041 set in href="" targeting a frame and clicked] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini new file mode 100644 index 00000000000..4ecd6d9f753 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-cross-origin.sub.window.js.ini @@ -0,0 +1,3 @@ +[navigation-unload-cross-origin.sub.window.html] + [Cross-origin navigation started from unload handler must be ignored] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini new file mode 100644 index 00000000000..7dc346632a4 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.js.ini @@ -0,0 +1,3 @@ +[navigation-unload-same-origin.window.html] + [Same-origin navigation started from unload handler must be ignored] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini new file mode 100644 index 00000000000..60a4fa51f8a --- /dev/null +++ b/tests/wpt/metadata/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html.ini @@ -0,0 +1,3 @@ +[a-click.html] + [aElement.click() before the load event must NOT replace] + expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini deleted file mode 100644 index d993e8dcc42..00000000000 --- a/tests/wpt/metadata/html/browsers/browsing-the-web/read-media/pageload-image-in-popup.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pageload-image-in-popup.html] - [The document for a standalone media file should have one child in the body.] - expected: FAIL diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini new file mode 100644 index 00000000000..7a5fcb79165 --- /dev/null +++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/traverse_the_history_5.html.ini @@ -0,0 +1,3 @@ +[traverse_the_history_5.html] + [Multiple history traversals, last would be aborted] + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini index 2a54f2f8814..5cdcce07c65 100644 --- a/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini +++ b/tests/wpt/metadata/html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected.html.ini @@ -1,2 +1,2 @@ [canvas.2d.disconnected.html] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini b/tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini deleted file mode 100644 index 5ff0d0fdbbc..00000000000 --- a/tests/wpt/metadata/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[2d.filter.canvasFilterObject.dropShadow.tentative.html] - expected: FAIL diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index 396feea2e32..50e9a6ac04a 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -1601,6 +1601,45 @@ [SVGElement interface: attribute onscrollend] expected: FAIL + [ToggleEvent interface: existence and properties of interface object] + expected: FAIL + + [ToggleEvent interface object length] + expected: FAIL + + [ToggleEvent interface object name] + expected: FAIL + + [ToggleEvent interface: existence and properties of interface prototype object] + expected: FAIL + + [ToggleEvent interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + + [ToggleEvent interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + + [ToggleEvent interface: attribute oldState] + expected: FAIL + + [ToggleEvent interface: attribute newState] + expected: FAIL + + [ToggleEvent must be primary interface of new ToggleEvent("beforetoggle")] + expected: FAIL + + [Stringification of new ToggleEvent("beforetoggle")] + expected: FAIL + + [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "oldState" with the proper type] + expected: FAIL + + [ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "newState" with the proper type] + expected: FAIL + + [SVGElement interface: attribute onbeforetoggle] + expected: FAIL + [idlharness.https.html?include=(Document|Window)] [Document interface: documentWithHandlers must inherit property "queryCommandEnabled(DOMString)" with the proper type] @@ -2221,6 +2260,24 @@ [Window interface: window must inherit property "onpaste" with the proper type] expected: FAIL + [Window interface: attribute onbeforetoggle] + expected: FAIL + + [Window interface: window must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [Document interface: attribute onbeforetoggle] + expected: FAIL + + [Document interface: iframe.contentDocument must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [Document interface: new Document() must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [Document interface: documentWithHandlers must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + [idlharness.https.html?include=HTML.*] [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type] @@ -4334,3 +4391,213 @@ [HTMLScriptElement interface: document.createElement("script") must inherit property "blocking" with the proper type] expected: FAIL + + [HTMLElement interface: operation showPopover()] + expected: FAIL + + [HTMLElement interface: operation hidePopover()] + expected: FAIL + + [HTMLElement interface: operation togglePopover(optional boolean)] + expected: FAIL + + [HTMLElement interface: attribute popover] + expected: FAIL + + [HTMLElement interface: attribute onbeforetoggle] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "showPopover()" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "hidePopover()" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "togglePopover(optional boolean)" with the proper type] + expected: FAIL + + [HTMLElement interface: calling togglePopover(optional boolean) on document.createElement("noscript") with too few arguments must throw TypeError] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "popover" with the proper type] + expected: FAIL + + [HTMLElement interface: document.createElement("noscript") must inherit property "onbeforetoggle" with the proper type] + expected: FAIL + + [HTMLLinkElement interface: attribute fetchPriority] + expected: FAIL + + [HTMLLinkElement interface: document.createElement("link") must inherit property "fetchPriority" with the proper type] + expected: FAIL + + [HTMLImageElement interface: attribute fetchPriority] + expected: FAIL + + [HTMLImageElement interface: document.createElement("img") must inherit property "fetchPriority" with the proper type] + expected: FAIL + + [HTMLImageElement interface: new Image() must inherit property "fetchPriority" with the proper type] + expected: FAIL + + [HTMLInputElement interface: attribute popoverTargetElement] + expected: FAIL + + [HTMLInputElement interface: attribute popoverTargetAction] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: document.createElement("input") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("text") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("hidden") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("search") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("tel") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("url") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("email") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("password") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("date") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("month") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("week") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("time") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("datetime-local") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("number") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("range") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("color") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("checkbox") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("radio") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("file") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("submit") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("image") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("reset") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLInputElement interface: createInput("button") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLButtonElement interface: attribute popoverTargetElement] + expected: FAIL + + [HTMLButtonElement interface: attribute popoverTargetAction] + expected: FAIL + + [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetElement" with the proper type] + expected: FAIL + + [HTMLButtonElement interface: document.createElement("button") must inherit property "popoverTargetAction" with the proper type] + expected: FAIL + + [HTMLScriptElement interface: attribute fetchPriority] + expected: FAIL + + [HTMLScriptElement interface: document.createElement("script") must inherit property "fetchPriority" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini new file mode 100644 index 00000000000..27c12573f11 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html.ini @@ -0,0 +1,3 @@ +[http-equiv-and-name-1.html] + [<meta> set the color-scheme to dark] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini new file mode 100644 index 00000000000..def16bc1f29 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html.ini @@ -0,0 +1,3 @@ +[http-equiv-and-name-2.html] + [<meta> set the content-language to de-DE] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini deleted file mode 100644 index 99f2e083da9..00000000000 --- a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[http-equiv-and-name.html] - [<meta> set the color-scheme to dark] - expected: FAIL - - [<meta> set the content-language to dark] - expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini index 7df8f9458e9..841bafc6eca 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini @@ -1,4 +1,3 @@ [iframe_sandbox_popups_escaping-2.html] - expected: CRASH [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini index f9138fb999a..6f7461b9472 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini @@ -1,5 +1,4 @@ [iframe_sandbox_popups_nonescaping-1.html] type: testharness - expected: TIMEOUT [Check that popups from a sandboxed iframe do not escape the sandbox] - expected: NOTRUN + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini index 3cdeb8ebcbc..47b45e65a1c 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini @@ -1,3 +1,9 @@ [non-active-document.html] [DOMParser] expected: FAIL + + [createHTMLDocument] + expected: FAIL + + [<template>] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini new file mode 100644 index 00000000000..d44f3ccff52 --- /dev/null +++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html.ini @@ -0,0 +1,3 @@ +[form-submit-iframe-then-location-navigate.html] + [Verifies that location navigations take precedence when following form submissions.] + expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini index cc18f512574..071b4378add 100644 --- a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini +++ b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini @@ -11,6 +11,3 @@ [Check that rel=noopener with target=_parent does a normal load] expected: FAIL - - [Check that rel=noopener with target=_self does a normal load] - expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini deleted file mode 100644 index 2212b9d731f..00000000000 --- a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/defer-script/async-script.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[async-script.html?reload] - expected: ERROR - -[async-script.html] diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini index 8845054116d..e55f8f2ce3c 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/compile-event-handler-settings-objects.html.ini @@ -3,3 +3,6 @@ expected: TIMEOUT [The incumbent settings object while executing the compiled callback via Web IDL's invoke must be that of the node document] expected: TIMEOUT + + [The entry settings object while executing the compiled callback via Web IDL's invoke must be that of the node document] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini index 5ff7875ce72..7649a7eff8c 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-all-global-events.html.ini @@ -503,3 +503,12 @@ [onpaste: the default value must be null] expected: FAIL + + [onbeforetoggle: must be on the appropriate locations for GlobalEventHandlers] + expected: FAIL + + [onbeforetoggle: the default value must be null] + expected: FAIL + + [onbeforetoggle: the content attribute must be compiled into a function as the corresponding property] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini index ca681bfa984..8652a34d6c2 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini @@ -137,3 +137,12 @@ [not shadowed scrollend (window)] expected: FAIL + + [not shadowed beforetoggle (document.body)] + expected: FAIL + + [not shadowed beforetoggle (document.createElement("body"))] + expected: FAIL + + [not shadowed beforetoggle (window)] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini index 7ff89c04b44..c00f9f0a377 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini @@ -133,3 +133,12 @@ [not shadowed scrollend (window)] expected: FAIL + + [not shadowed beforetoggle (document.body)] + expected: FAIL + + [not shadowed beforetoggle (document.createElement("frameset"))] + expected: FAIL + + [not shadowed beforetoggle (window)] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini index e1638db8b78..fe670236729 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini @@ -79,3 +79,9 @@ [scrollend is unaffected on a windowless frameset] expected: FAIL + + [beforetoggle is unaffected on a windowless body] + expected: FAIL + + [beforetoggle is unaffected on a windowless frameset] + expected: FAIL diff --git a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini index dbe1def99e3..7237f5792de 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-job-queue/promise-job-entry-different-function-realm.html.ini @@ -1,9 +1,10 @@ [promise-job-entry-different-function-realm.html] + expected: TIMEOUT [Fulfillment handler on fulfilled promise] expected: FAIL [Rejection handler on pending-then-rejected promise] - expected: FAIL + expected: TIMEOUT [Thenable resolution] expected: FAIL @@ -12,4 +13,4 @@ expected: FAIL [Fulfillment handler on pending-then-fulfilled promise] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini b/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini index 71ca4ed5411..49b17a921b5 100644 --- a/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini +++ b/tests/wpt/metadata/resource-timing/content-type-parsing.html.ini @@ -94,10 +94,10 @@ expected: FAIL [mime-type 16 : text/html;charset=\x0bgbk] - expected: FAIL + expected: TIMEOUT [mime-type 17 : text/html;charset=\x0cgbk] - expected: TIMEOUT + expected: NOTRUN [mime-type 18 : text/html;\x0bcharset=gbk] expected: NOTRUN diff --git a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini index a763160c0e0..a96df921c04 100644 --- a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini +++ b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini @@ -20,6 +20,12 @@ [PerformanceResourceTiming interface: resource must inherit property "renderBlockingStatus" with the proper type] expected: FAIL + [PerformanceResourceTiming interface: attribute deliveryType] + expected: FAIL + + [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type] + expected: FAIL + [idlharness.any.worker.html] [PerformanceResourceTiming interface: resource must inherit property "workerStart" with the proper type] @@ -42,3 +48,9 @@ [PerformanceResourceTiming interface: resource must inherit property "renderBlockingStatus" with the proper type] expected: FAIL + + [PerformanceResourceTiming interface: attribute deliveryType] + expected: FAIL + + [PerformanceResourceTiming interface: resource must inherit property "deliveryType" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/selection/idlharness.window.js.ini b/tests/wpt/metadata/selection/idlharness.window.js.ini index 7890db33546..adc033c4f6d 100644 --- a/tests/wpt/metadata/selection/idlharness.window.js.ini +++ b/tests/wpt/metadata/selection/idlharness.window.js.ini @@ -16,3 +16,18 @@ [Selection interface: calling getComposedRange(ShadowRoot...) on getSelection() with too few arguments must throw TypeError] expected: FAIL + + [Selection interface: attribute direction] + expected: FAIL + + [Selection interface: operation getComposedRanges(ShadowRoot...)] + expected: FAIL + + [Selection interface: getSelection() must inherit property "direction" with the proper type] + expected: FAIL + + [Selection interface: getSelection() must inherit property "getComposedRanges(ShadowRoot...)" with the proper type] + expected: FAIL + + [Selection interface: calling getComposedRanges(ShadowRoot...) on getSelection() with too few arguments must throw TypeError] + expected: FAIL diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini index 20a8f9a4320..1f70062991c 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-analysernode-interface/realtimeanalyser-fft-scaling.html.ini @@ -1,5 +1,4 @@ [realtimeanalyser-fft-scaling.html] - expected: TIMEOUT [X 2048-point FFT peak position is not equal to 64. Got 0.] expected: FAIL diff --git a/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini b/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini index b7537329068..eed03df37f3 100644 --- a/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini +++ b/tests/wpt/metadata/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-not-fully-active.html.ini @@ -1,5 +1,4 @@ [audiocontext-not-fully-active.html] - expected: TIMEOUT [frame in navigated remote-site frame] expected: FAIL diff --git a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini b/tests/wpt/metadata/webmessaging/with-ports/017.html.ini deleted file mode 100644 index c7946fc91b4..00000000000 --- a/tests/wpt/metadata/webmessaging/with-ports/017.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[017.html] - expected: TIMEOUT - [origin of the script that invoked the method, about:blank] - expected: TIMEOUT diff --git a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini b/tests/wpt/metadata/webmessaging/without-ports/018.html.ini deleted file mode 100644 index b7b36c1d3a4..00000000000 --- a/tests/wpt/metadata/webmessaging/without-ports/018.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[018.html] - expected: TIMEOUT - [origin of the script that invoked the method, javascript:] - expected: TIMEOUT diff --git a/tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini b/tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini new file mode 100644 index 00000000000..aa6c9e5b826 --- /dev/null +++ b/tests/wpt/metadata/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html.ini @@ -0,0 +1,4 @@ +[localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html] + expected: TIMEOUT + [StorageKey: test 3P about:blank window opened from a 3P iframe] + expected: TIMEOUT diff --git a/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini index 4bec6189b7a..b79ea99423a 100644 --- a/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini +++ b/tests/wpt/metadata/webxr/anchors/idlharness.https.window.js.ini @@ -61,3 +61,6 @@ [XRSession interface: operation deletePersistentAnchor(DOMString)] expected: FAIL + + [XRSession interface: attribute persistentAnchors] + expected: FAIL diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini index c904025859f..f24aec48da2 100644 --- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini @@ -385,3 +385,9 @@ [XRSession interface: xrSession must inherit property "enabledFeatures" with the proper type] expected: FAIL + + [XRSession interface: attribute isSystemKeyboardSupported] + expected: FAIL + + [XRSession interface: xrSession must inherit property "isSystemKeyboardSupported" with the proper type] + expected: FAIL diff --git a/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini new file mode 100644 index 00000000000..80f9a4f15b8 --- /dev/null +++ b/tests/wpt/metadata/workers/constructors/Worker/Worker-constructor.html.ini @@ -0,0 +1,2 @@ +[Worker-constructor.html] + expected: ERROR diff --git a/tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini b/tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini new file mode 100644 index 00000000000..f78f699f620 --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/scrollBy.html.ini @@ -0,0 +1,3 @@ +[scrollBy.html] + [Ensure that the window.scrollBy function affects scroll position as expected] + expected: FAIL diff --git a/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml b/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml index 91aecaa12f1..2e55ab28e18 100644 --- a/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml +++ b/tests/wpt/web-platform-tests/.github/workflows/interfaces.yml @@ -15,7 +15,7 @@ jobs: - name: Create pull request # Use a conditional step instead of a conditional job to work around #20700. if: github.repository == 'web-platform-tests/wpt' - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 with: token: ${{ secrets.GITHUB_TOKEN }} author: wpt-pr-bot <wpt-pr-bot@users.noreply.github.com> diff --git a/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml b/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml index 4e29171ff27..e1691b779ff 100644 --- a/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml +++ b/tests/wpt/web-platform-tests/.github/workflows/regen_certs.yml @@ -24,7 +24,7 @@ jobs: - name: Commit and create pull request # Use a conditional step instead of a conditional job to work around #20700. if: github.repository == 'web-platform-tests/wpt' - uses: peter-evans/create-pull-request@v4 + uses: peter-evans/create-pull-request@v5 with: token: ${{ secrets.GITHUB_TOKEN }} author: wpt-pr-bot <wpt-pr-bot@users.noreply.github.com> diff --git a/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py b/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py index 432f5c61d5e..4d4c3fd5ec7 100644 --- a/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py +++ b/tests/wpt/web-platform-tests/attribution-reporting/resources/reports.py @@ -13,8 +13,6 @@ Header = Tuple[str, str] Status = Tuple[int, str] Response = Tuple[Status, List[Header], str] -CLEAR_STASH = isomorphic_encode("clear_stash") - def decode_headers(headers: dict) -> dict: """Decodes the headers from wptserve. @@ -40,14 +38,8 @@ def handle_post_report(request: Request, headers: List[Header]) -> Response: """Handles POST request for reports. Retrieves the report from the request body and stores the report in the - stash. If clear_stash is specified in the query params, clears the stash. + stash. """ - if request.GET.get(CLEAR_STASH): - clear_stash(request.server.stash) - return (200, "OK"), headers, json.dumps({ - "code": 200, - "message": "Stash successfully cleared.", - }) store_report( request.server.stash, get_request_origin(request), { "body": request.body.decode("utf-8"), @@ -97,12 +89,6 @@ def take_reports(stash: Stash, origin: str) -> List[str]: return reports -def clear_stash(stash: Stash) -> None: - "Clears the stash." - stash.take(REPORTS) - return None - - def handle_reports(request: Request) -> Response: """Handles request to get or store reports.""" headers = [("Content-Type", "application/json")] diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic_async.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.any.js index 3a9a32dedc0..18b8985cf51 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic_async.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.any.js @@ -1,6 +1,7 @@ // META: timeout=long // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker 'use strict'; @@ -17,9 +18,10 @@ pressure_test((t, mockPressureService) => { pressure_test(async (t, mockPressureService) => { const changes = await new Promise(resolve => { const observer = new PressureObserver(resolve); + t.add_cleanup(() => observer.disconnect()); observer.observe('cpu'); - mockPressureService.setPressureUpdate('critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_true(changes.length === 1); assert_equals(changes[0].state, 'critical'); @@ -34,8 +36,8 @@ pressure_test((t, mockPressureService) => { const promise = observer.observe('cpu'); observer.unobserve('cpu'); - mockPressureService.setPressureUpdate('critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); return promise_rejects_dom(t, 'NotSupportedError', promise); }, 'Removing observer before observe() resolves works'); @@ -47,14 +49,15 @@ pressure_test(async (t, mockPressureService) => { for (let i = 0; i < 2; i++) { callbackPromises.push(new Promise(resolve => { const observer = new PressureObserver(resolve); + t.add_cleanup(() => observer.disconnect()); observePromises.push(observer.observe('cpu')); })); } await Promise.all(observePromises); - mockPressureService.setPressureUpdate('critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); return Promise.all(callbackPromises); }, 'Calling observe() multiple times works'); @@ -68,10 +71,11 @@ pressure_test(async (t, mockPressureService) => { }); t.add_cleanup(() => observer1.disconnect()); observer1.observe('cpu'); - mockPressureService.setPressureUpdate('critical'); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_true(observer1_changes.length === 1); + assert_equals(observer1_changes[0][0].source, 'cpu'); assert_equals(observer1_changes[0][0].state, 'critical'); const observer2_changes = []; @@ -84,5 +88,6 @@ pressure_test(async (t, mockPressureService) => { observer2.observe('cpu'); }); assert_true(observer2_changes.length === 1); + assert_equals(observer2_changes[0][0].source, 'cpu'); assert_equals(observer2_changes[0][0].state, 'critical'); }, 'Starting a new observer after an observer has started works'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js deleted file mode 100644 index e2d9a0f05bc..00000000000 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_basic.tentative.https.window.js +++ /dev/null @@ -1,35 +0,0 @@ -'use strict'; - -promise_test(async t => { - await new Promise((resolve, reject) => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); - t.add_cleanup(() => observer.disconnect()); - observer.observe('cpu').catch(reject); - }); -}, 'An active PressureObserver calls its callback at least once'); - -promise_test(async t => { - await new Promise(resolve => { - const myDedicatedWorker = new Worker( - '/compute-pressure/resources/observer-in-dedicated-worker.js'); - myDedicatedWorker.onmessage = event => { - assert_equals(typeof event.data.time, 'number'); - assert_equals('cpu', event.data.source); - resolve(); - }; - }); -}, 'Test receives updates from dedicated worker'); - -promise_test(async t => { - await new Promise(resolve => { - const mySharedWorker = new SharedWorker( - '/compute-pressure/resources/observer-in-shared-worker.js'); - mySharedWorker.port.start(); - mySharedWorker.port.postMessage('observe'); - mySharedWorker.port.onmessage = event => { - assert_equals(typeof event.data.time, 'number'); - assert_equals('cpu', event.data.source); - resolve(); - }; - }); -}, 'Test receives updates from shared worker'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js index f88c9fdf64e..950334d6fc5 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_cross_origin_focus_control.tentative.https.window.js @@ -1,9 +1,11 @@ // META: timeout=long // META: script=/common/get-host-info.sub.js +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js 'use strict'; -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const iframe = document.createElement('iframe'); iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + '/compute-pressure/resources/support-iframe.html'; @@ -20,11 +22,13 @@ promise_test(async t => { iframe.remove(); }); await observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); - return new Promise(resolve => t.step_timeout(resolve, 2000)); + return new Promise(resolve => t.step_timeout(resolve, 1000)); }, 'Observer in main frame should not receive PressureRecord when focused on cross-origin iframe'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const iframe = document.createElement('iframe'); iframe.src = get_host_info().HTTPS_REMOTE_ORIGIN + '/compute-pressure/resources/support-iframe.html'; @@ -49,5 +53,7 @@ promise_test(async t => { } }, {once: true}); iframe.contentWindow.postMessage({command: 'start'}, '*'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); }, 'Observer in iframe should not receive PressureRecord when focused on cross-origin main frame'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html index 3b0a5504e53..5511a147048 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_detached_iframe.tentative.https.html @@ -3,6 +3,8 @@ <title>PressureObserver on DOMWindow of detached iframe</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<script src="/resources/test-only-api.js"></script> +<script src="resources/pressure-helpers.js"></script> <body> <script> 'use strict'; @@ -21,9 +23,7 @@ promise_test(async t => { document.body.appendChild(iframe); const frame_window = iframe.contentWindow; - const observer = new frame_window.PressureObserver( - () => {}, - {sampleRate: 1}); + const observer = new frame_window.PressureObserver(() => {}); const iframe_DOMException = frame_window.DOMException; iframe.remove(); @@ -38,9 +38,7 @@ promise_test(async t => { document.body.appendChild(iframe); const frame_window = iframe.contentWindow; - const observer = new frame_window.PressureObserver( - () => {}, - {sampleRate: 1}); + const observer = new frame_window.PressureObserver(() => {}); await observer.observe('cpu'); @@ -50,43 +48,43 @@ promise_test(async t => { observer.disconnect(); }, 'PressureObserver.disconnect() on detached frame returns'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const iframe = document.createElement('iframe'); document.body.appendChild(iframe); const frame_window = iframe.contentWindow; - const observer = new frame_window.PressureObserver( - () => {}, - {sampleRate: 1}); + const observer = new frame_window.PressureObserver(() => {}); const iframe_DOMException = frame_window.DOMException; // await is intentionally not used here. We want to remove the iframe while // the returned Promise settles. - const observe_promise = observer.observe('cpu'); + observer.observe('cpu'); iframe.remove(); // Establish an observer and wait for changes in the main frame. This should // keep the test running long enough to catch any crash from the observe() // call in the removed iframe's PressureObserver. const changes = await new Promise((resolve, reject) => { - const observer = new PressureObserver( - resolve, {sampleRate: 1}); + const observer = new PressureObserver(resolve); t.add_cleanup(() => observer.disconnect()); observer.observe('cpu').catch(reject); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); - assert_in_array(changes[0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); + assert_equals(changes[0].state, 'critical'); }, 'Detaching frame while PressureObserver.observe() settles'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const iframe = document.createElement('iframe'); document.body.appendChild(iframe); const frame_window = iframe.contentWindow; const observer = new frame_window.PressureObserver(() => { assert_unreached('The observer callback should not be called'); - }, {sampleRate: 1}); + }); await observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); iframe.remove(); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.any.js index c9950f2dc84..1d188fad8b8 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect.tentative.https.any.js @@ -1,3 +1,7 @@ +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker + 'use strict'; test(t => { @@ -8,11 +12,11 @@ test(t => { observer.disconnect(); }, 'Call disconnect() directly should not crash'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const observer1_changes = []; const observer1 = new PressureObserver(change => { observer1_changes.push(change); - }, {sampleRate: 1.0}); + }); t.add_cleanup(() => observer1.disconnect()); // Ensure that observer1's schema gets registered before observer2 starts. await observer1.observe('cpu'); @@ -23,9 +27,11 @@ promise_test(async t => { const observer2 = new PressureObserver(change => { observer2_changes.push(change); resolve(); - }, {sampleRate: 1.0}); + }); t.add_cleanup(() => observer2.disconnect()); observer2.observe('cpu').catch(reject); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_equals( @@ -34,7 +40,5 @@ promise_test(async t => { assert_equals(observer2_changes.length, 1); assert_equals(observer2_changes[0].length, 1); - assert_in_array( - observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); + assert_equals(observer2_changes[0][0].state, 'critical'); }, 'Stopped PressureObserver do not receive changes'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.js index 72021fd2708..2f6421ee117 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_idempotent.tentative.https.any.js @@ -1,10 +1,14 @@ +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker + 'use strict'; -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const observer1_changes = []; const observer1 = new PressureObserver(changes => { observer1_changes.push(changes); - }, {sampleRate: 1}); + }); t.add_cleanup(() => observer1.disconnect()); // Ensure that observer1's schema gets registered before observer2 starts. const promise = observer1.observe('cpu'); @@ -17,9 +21,11 @@ promise_test(async t => { const observer2 = new PressureObserver(changes => { observer2_changes.push(changes); resolve(); - }, {sampleRate: 1}); + }); t.add_cleanup(() => observer2.disconnect()); observer2.observe('cpu').catch(reject); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_equals( @@ -27,7 +33,5 @@ promise_test(async t => { 'stopped observers should not receive callbacks'); assert_equals(observer2_changes.length, 1); - assert_in_array( - observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); + assert_equals(observer2_changes[0][0].state, 'critical'); }, 'Stopped PressureObserver do not receive changes'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.js index 1abe84d5720..b96ebd802e6 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_disconnect_immediately.tentative.https.any.js @@ -1,10 +1,14 @@ +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker + 'use strict'; -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const observer1_changes = []; const observer1 = new PressureObserver(changes => { observer1_changes.push(changes); - }, {sampleRate: 1.0}); + }); t.add_cleanup(() => observer1.disconnect()); // Ensure that observer1's schema gets registered before observer2 starts. const promise = observer1.observe('cpu'); @@ -16,9 +20,11 @@ promise_test(async t => { const observer2 = new PressureObserver(changes => { observer2_changes.push(changes); resolve(); - }, {sampleRate: 1.0}); + }); t.add_cleanup(() => observer2.disconnect()); observer2.observe('cpu').catch(reject); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_equals( @@ -27,16 +33,14 @@ promise_test(async t => { assert_equals(observer2_changes.length, 1); assert_equals(observer2_changes[0].length, 1); - assert_in_array( - observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); + assert_equals(observer2_changes[0][0].state, 'critical'); }, 'Stopped PressureObserver do not receive changes'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const observer1_changes = []; const observer1 = new PressureObserver(changes => { observer1_changes.push(changes); - }, {sampleRate: 1}); + }); t.add_cleanup(() => observer1.disconnect()); const observer2_changes = []; @@ -44,12 +48,14 @@ promise_test(async t => { const observer2 = new PressureObserver(changes => { observer2_changes.push(changes); resolve(); - }, {sampleRate: 1}); + }); t.add_cleanup(() => observer2.disconnect()); const promise = observer1.observe('cpu'); observer2.observe('cpu'); observer1.disconnect(); await promise_rejects_dom(t, 'NotSupportedError', promise); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_equals( @@ -57,7 +63,5 @@ promise_test(async t => { 'stopped observers should not receive callbacks'); assert_equals(observer2_changes.length, 1); - assert_in_array( - observer2_changes[0][0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); + assert_equals(observer2_changes[0][0].state, 'critical'); }, 'Removing observer before observe() resolves does not affect other observers'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.js index 3c312ca5b1f..b5d7690d182 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_duplicate_updates.tentative.https.any.js @@ -1,5 +1,6 @@ // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker 'use strict'; @@ -14,13 +15,13 @@ pressure_test(async (t, mockPressureService) => { }, {sampleRate: 5.0}); observer.observe('cpu'); const updatesDelivered = mockPressureService.updatesDelivered(); - mockPressureService.setPressureUpdate('critical'); + mockPressureService.setPressureUpdate('cpu', 'critical'); mockPressureService.startPlatformCollector(/*sampleRate*/ 5.0); // Deliver 2 updates. await t.step_wait( () => mockPressureService.updatesDelivered() >= (updatesDelivered + 2), 'Wait for more than one update to be delivered to the observer'); - mockPressureService.setPressureUpdate('nominal'); + mockPressureService.setPressureUpdate('cpu', 'nominal'); // Deliver more updates, |resolve()| will be called when the new pressure // state reaches PressureObserver and its callback is invoked // for the second time. @@ -41,14 +42,14 @@ pressure_test(async (t, mockPressureService) => { }, {sampleRate: 5.0}); observer.observe('cpu'); const updatesDelivered = mockPressureService.updatesDelivered(); - mockPressureService.setPressureUpdate('critical', ['thermal']); + mockPressureService.setPressureUpdate('cpu', 'critical', ['thermal']); mockPressureService.startPlatformCollector(/*sampleRate*/ 5.0); // Deliver 2 updates. await t.step_wait( () => mockPressureService.updatesDelivered() >= (updatesDelivered + 2), 'Wait for more than one update to be delivered to the observer'); - mockPressureService.setPressureUpdate('critical', ['power-supply']); + mockPressureService.setPressureUpdate('cpu', 'critical', ['power-supply']); // Deliver more updates, |resolve()| will be called when the new pressure // state reaches PressureObserver and its callback is invoked // for the second time. diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.any.js index 6d8d2208887..7486a70f911 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_factors.tentative.https.any.js @@ -1,14 +1,16 @@ // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker 'use strict'; pressure_test(async (t, mockPressureService) => { const changes = await new Promise(resolve => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); + const observer = new PressureObserver(resolve); + t.add_cleanup(() => observer.disconnect()); observer.observe('cpu'); - mockPressureService.setPressureUpdate('critical', ['thermal']); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0); + mockPressureService.setPressureUpdate('cpu', 'critical', ['thermal']); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_true(changes.length === 1); assert_equals(changes[0].state, 'critical'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.any.js index 6015ae1f81b..c8cef5beca0 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple.tentative.https.any.js @@ -1,30 +1,35 @@ +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker + 'use strict'; -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const changes1_promise = new Promise((resolve, reject) => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); + const observer = new PressureObserver(resolve); t.add_cleanup(() => observer.disconnect()); observer.observe('cpu').catch(reject); }); const changes2_promise = new Promise((resolve, reject) => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); + const observer = new PressureObserver(resolve); t.add_cleanup(() => observer.disconnect()); observer.observe('cpu').catch(reject); }); const changes3_promise = new Promise((resolve, reject) => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); + const observer = new PressureObserver(resolve); t.add_cleanup(() => observer.disconnect()); observer.observe('cpu').catch(reject); }); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); + const [changes1, changes2, changes3] = await Promise.all([changes1_promise, changes2_promise, changes3_promise]); for (const changes of [changes1, changes2, changes3]) { - assert_in_array( - changes[0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); + assert_equals(changes[0].state, 'critical'); } }, 'Three PressureObserver instances receive changes'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js deleted file mode 100644 index 838b9a17a00..00000000000 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_multiple_across_iframes.tentative.https.window.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -promise_test(async t => { - const changes1_promise = new Promise((resolve, reject) => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); - t.add_cleanup(() => observer.disconnect()); - observer.observe('cpu').catch(reject); - }); - - // iframe numbers are aligned with observer numbers. The first observer is - // in the main frame, so there is no iframe1. - const iframe2 = document.createElement('iframe'); - document.body.appendChild(iframe2); - - const changes2_promise = new Promise((resolve, reject) => { - const observer = - new iframe2.contentWindow.PressureObserver(resolve, {sampleRate: 1.0}); - t.add_cleanup(() => observer.disconnect()); - observer.observe('cpu').catch(reject); - }); - - const iframe3 = document.createElement('iframe'); - document.body.appendChild(iframe3); - - const changes3_promise = new Promise((resolve, reject) => { - const observer = - new iframe3.contentWindow.PressureObserver(resolve, {sampleRate: 1.0}); - t.add_cleanup(() => observer.disconnect()); - observer.observe('cpu').catch(reject); - }); - - const [changes1, changes2, changes3] = - await Promise.all([changes1_promise, changes2_promise, changes3_promise]); - - for (const changes of [changes1, changes2, changes3]) { - assert_in_array( - changes[0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); - } -}, 'Three PressureObserver instances, in different iframes, receive changes'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js new file mode 100644 index 00000000000..5dc3804b2f7 --- /dev/null +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.any.js @@ -0,0 +1,19 @@ +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker + +'use strict'; + +pressure_test(async (t, mockPressureService) => { + const update = await new Promise((resolve, reject) => { + const observer = new PressureObserver(resolve); + t.add_cleanup(() => observer.disconnect()); + observer.observe('cpu').catch(reject); + observer.observe('cpu').catch(reject); + observer.observe('cpu').catch(reject); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); + }); + + assert_equals(update[0].state, 'critical'); +}, 'PressureObserver.observe() is idempotent'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js deleted file mode 100644 index e60115fee87..00000000000 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_idempotent.tentative.https.window.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -promise_test(async t => { - const update = await new Promise((resolve, reject) => { - const observer = new PressureObserver(resolve, {sampleRate: 1.0}); - t.add_cleanup(() => observer.disconnect()); - observer.observe('cpu').catch(reject); - observer.observe('cpu').catch(reject); - observer.observe('cpu').catch(reject); - }); - - assert_equals(typeof update[0].state, 'string'); - assert_in_array( - update[0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu pressure state'); -}, 'PressureObserver.observe() is idempotent'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.js index c32649da5c3..8eafeb356d8 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_observe_unobserve_failure.tentative.https.any.js @@ -1,15 +1,17 @@ +// META: global=window,dedicatedworker,sharedworker + 'use strict'; promise_test(async t => { - const observer = new PressureObserver( - t.unreached_func('oops should not end up here'), {sampleRate: 1.0}); + const observer = + new PressureObserver(t.unreached_func('oops should not end up here')); t.add_cleanup(() => observer.disconnect()); await promise_rejects_js(t, TypeError, observer.observe('random')); }, 'PressureObserver.observe() requires a valid source'); test(t => { - const observer = new PressureObserver( - t.unreached_func('oops should not end up here'), {sampleRate: 1.0}); + const observer = + new PressureObserver(t.unreached_func('oops should not end up here')); t.add_cleanup(() => observer.disconnect()); assert_throws_js(TypeError, () => { observer.unobserve('random'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.any.js index d142ecc0881..69999819d96 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_options.tentative.https.any.js @@ -1,3 +1,5 @@ +// META: global=window,dedicatedworker,sharedworker + 'use strict'; test(t => { diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js index d33f6ef09ad..113f4bdf79b 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_privacy_test.tentative.https.window.js @@ -5,10 +5,12 @@ // META: script=/picture-in-picture/resources/picture-in-picture-helpers.js // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js 'use strict'; -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const video = await loadVideo(); document.body.appendChild(video); const pipWindow = await requestPictureInPictureWithTrustedClick(video); @@ -38,10 +40,12 @@ promise_test(async t => { video.remove(); }); observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); }, 'Observer should receive PressureRecord if associated document is the initiator of active Picture-in-Picture session'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { await setMediaPermission(); const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true}); @@ -67,5 +71,7 @@ promise_test(async t => { stream.getTracks().forEach(track => track.stop()); }); observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); }, 'Observer should receive PressureRecord if browsing context is capturing'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js index 746f119f249..7df0be5c47d 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_same_origin_focus_control.tentative.https.window.js @@ -1,21 +1,27 @@ +// META: timeout=long +// META: script=/resources/test-only-api.js +// META: script=resources/pressure-helpers.js + 'use strict'; -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const iframe = document.createElement('iframe'); document.body.appendChild(iframe); iframe.contentWindow.focus(); await new Promise(resolve => { const observer = new PressureObserver(resolve); - t.add_cleanup(async () => { + t.add_cleanup(() => { observer.disconnect(); iframe.remove(); }); observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); }, 'Observer in main frame should receive PressureRecord when focused on same-origin iframe'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { const iframe = document.createElement('iframe'); document.body.appendChild(iframe); // Focus on the main frame to make the iframe lose focus, so that @@ -31,5 +37,7 @@ promise_test(async t => { iframe.remove(); }); observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); }, 'Observer in iframe should receive PressureRecord when focused on same-origin main frame'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.any.js index 2a69e731e7f..63f2666cca6 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_supported_sources.tentative.https.any.js @@ -1,3 +1,5 @@ +// META: global=window,dedicatedworker,sharedworker + 'use strict'; test(() => { diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.any.js index d294a7e80fd..d93c9b5c886 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_take_records.tentative.https.any.js @@ -1,28 +1,28 @@ // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker 'use strict'; test(t => { const observer = new PressureObserver( - t.unreached_func('This callback should not have been called.'), - {sampleRate: 1.0}); + t.unreached_func('This callback should not have been called.')); const records = observer.takeRecords(); assert_equals(records.length, 0, 'No record before observe'); }, 'Calling takeRecords() before observe()'); -promise_test(async t => { +pressure_test(async (t, mockPressureService) => { let observer; const changes = await new Promise(resolve => { - observer = new PressureObserver(resolve, {sampleRate: 1.0}); + observer = new PressureObserver(resolve); t.add_cleanup(() => observer.disconnect()); observer.observe('cpu'); + mockPressureService.setPressureUpdate('cpu', 'critical'); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); - assert_in_array( - changes[0].state, ['nominal', 'fair', 'serious', 'critical'], - 'cpu presure state'); + assert_equals(changes[0].state, 'critical'); const records = observer.takeRecords(); assert_equals(records.length, 0, 'No record available'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.any.js index b9b932e64fc..f283caa6bae 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_timestamp.tentative.https.any.js @@ -1,5 +1,6 @@ // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker 'use strict'; @@ -21,7 +22,8 @@ pressure_test(async (t, mockPressureService) => { // cause the actual timer used by mockPressureService to deliver readings // to be a bit slower or faster than requested. while (observerChanges.length < 4) { - mockPressureService.setPressureUpdate(readings[i++ % readings.length]); + mockPressureService.setPressureUpdate( + 'cpu', readings[i++ % readings.length]); await t.step_wait( () => mockPressureService.updatesDelivered() >= i, `At least ${i} readings have been delivered`); @@ -51,7 +53,7 @@ pressure_test(async (t, mockPressureService) => { await new Promise(async resolve => { observer.observe('cpu'); - mockPressureService.setPressureUpdate('critical'); + mockPressureService.setPressureUpdate('cpu', 'critical'); mockPressureService.startPlatformCollector(sampleRate); await t.step_wait(() => pressureChanges.length == 1); observer.disconnect(); @@ -60,7 +62,7 @@ pressure_test(async (t, mockPressureService) => { await new Promise(async resolve => { observer.observe('cpu'); - mockPressureService.setPressureUpdate('serious'); + mockPressureService.setPressureUpdate('cpu', 'serious'); mockPressureService.startPlatformCollector(sampleRate * 4); await t.step_wait(() => pressureChanges.length == 2); observer.disconnect(); diff --git a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.window.js b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.any.js index 7f3acf3e07f..c1cd240a3bc 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.window.js +++ b/tests/wpt/web-platform-tests/compute-pressure/compute_pressure_update_toJSON.tentative.https.any.js @@ -1,12 +1,13 @@ // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js +// META: global=window,dedicatedworker,sharedworker pressure_test(async (t, mockPressureService) => { const changes = await new Promise(resolve => { const observer = new PressureObserver(resolve); observer.observe('cpu'); - mockPressureService.setPressureUpdate('critical', ['thermal']); - mockPressureService.startPlatformCollector(/*sampleRate=*/ 1.0); + mockPressureService.setPressureUpdate('cpu', 'critical', ['thermal']); + mockPressureService.startPlatformCollector(/*sampleRate=*/ 5.0); }); assert_true(changes.length === 1); const json = changes[0].toJSON(); @@ -15,4 +16,3 @@ pressure_test(async (t, mockPressureService) => { assert_equals(json.factors[0], 'thermal'); assert_equals(typeof json.time, 'number'); }, 'Basic functionality test'); - diff --git a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js b/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js deleted file mode 100644 index a30edd0a33e..00000000000 --- a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-dedicated-worker.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -function pressureCallback(update) { - postMessage(update[0].toJSON()); -}; - -const observerWorker = - new PressureObserver(pressureCallback, {sampleRate: 0.5}); - -observerWorker.observe('cpu'); diff --git a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js b/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js deleted file mode 100644 index f69eadaacee..00000000000 --- a/tests/wpt/web-platform-tests/compute-pressure/resources/observer-in-shared-worker.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -onconnect = function(e) { - const port = e.ports[0]; // get the port - let started = false; - - port.start(); // Open the port connection to enable two-way communication - - let observerWorker = - new PressureObserver(pressureCallback, {sampleRate: 0.5}); - - port.onmessage = function(e) { - if (started === false) - observerWorker.observe('cpu'); - started = true; - }; - - function pressureCallback(update) { - port.postMessage(update[0].toJSON()); - }; -} diff --git a/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html b/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html index 57e18b77f62..6b2b3097926 100644 --- a/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html +++ b/tests/wpt/web-platform-tests/compute-pressure/resources/support-iframe.html @@ -11,7 +11,7 @@ async function messageHandler(e) { resolve('success'); }); observer.observe('cpu'); - window.setTimeout(() => { reject('timeout'); }, 2000); + window.setTimeout(() => { reject('timeout'); }, 1000); }); } else { return Promise.reject(`unknown command "${e.data.command}"`); diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html new file mode 100644 index 00000000000..75f98a1ebfe --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-non-oof-inherit.html @@ -0,0 +1,117 @@ +<!DOCTYPE html> +<title>Tests that anchor functions can be inherited from in-flow elements</title> +<link rel="help" href="https://drafts4.csswg.org/css-anchor-position-1/"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1382151"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script src="support/test-common.js"></script> + +<style> +.cb { + width: 200px; + height: 200px; + transform: scale(1); +} + +.anchor { + width: 100px; + height: 100px; + top: 50px; + left: 50px; + position: relative; + background: red; + anchor-name: --a; +} + +.target { + position: absolute; + background: green; + top: inherit; + bottom: inherit; + left: inherit; + right: inherit; + width: inherit; + min-width: inherit; + max-width: inherit; + height: inherit; + min-height: inherit; + max-height: inherit; +} + +.inset-parent { + top: anchor(--a top); + bottom: anchor(--a bottom); + left: anchor(--a left); + right: anchor(--a right); +} + +.size-parent { + width: anchor-size(--a width); + height: anchor-size(--a height); + top: 50px; + left: 50px; +} + +.min-size-parent { + min-width: anchor-size(--a width); + min-height: anchor-size(--a height); + top: 50px; + left: 50px; + bottom: 200px; + right: 200px; +} + +.max-size-parent { + max-width: anchor-size(--a width); + max-height: anchor-size(--a height); + top: 50px; + left: 50px; + bottom: 0px; + right: 0px; +} + +</style> + +<body onload="checkLayoutForAnchorPos('.target')"> + +<p>In each test case, we should see a filled green square with no red.</p> + +<div class=cb> + <div class="anchor"></div> + <div class="inset-parent"> + <div class="target" + data-offset-x=50 data-offset-y=50 + data-expected-width=100 data-expected-height=100></div> + </div> +</div> + +<div class=cb> + <div class="anchor"></div> + <div class="size-parent"> + <div class="target" + data-offset-x=50 data-offset-y=50 + data-expected-width=100 data-expected-height=100></div> + </div> +</div> + +<div class=cb> + <div class="anchor"></div> + <div class="min-size-parent"> + <div class="target" + data-offset-x=50 data-offset-y=50 + data-expected-width=100 data-expected-height=100></div> + </div> +</div> + +<div class=cb> + <div class="anchor"></div> + <div class="max-size-parent"> + <div class="target" + data-offset-x=50 data-offset-y=50 + data-expected-width=100 data-expected-height=100></div> + </div> +</div> + +</body> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html new file mode 100644 index 00000000000..6b5f268f554 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/anchor-scroll-composited-scrolling-006.html @@ -0,0 +1,61 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>Tests anchor-scroll element paint order in composited scrolling</title> +<link rel="help" href="https://drafts4.csswg.org/css-anchor-position-1/#scroll"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<link rel="match" href="reference/anchor-scroll-composited-scrolling-006-ref.html"> +<style> +body { + margin: 0; +} +#scroller { + width: 200px; + height: 100px; + overflow: scroll; + will-change: scroll-position; +} +#spacer { + height: 400px; +} +#anchor { + width: 100px; + height: 100px; + anchor-name: --a; +} +#target { + position: absolute; + width: 100px; + height: 100px; + background: red; + left: 0; + bottom: anchor(--a top); + anchor-scroll: --a; +} +#overlap { + position: absolute; + width: 100px; + height: 100px; + top: 150px; + left: 0; + z-index: 100; + background: green; +} +</style> + +<div id="overlap"></div> +<div id="scroller"> + <div id="spacer"></div> + <div id="anchor"></div> +</div> +<div id="target"></div> + +<script type="module"> +function raf() { return new Promise(resolve => requestAnimationFrame(resolve)); } + +await raf(); +await raf(); +scroller.scrollTop = 150; + +document.documentElement.classList.remove('reftest-wait'); +</script> +</html> diff --git a/tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html b/tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html new file mode 100644 index 00000000000..92fe187117e --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-anchor-position/reference/anchor-scroll-composited-scrolling-006-ref.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<style> +body { + margin: 0; +} +#scroller { + width: 200px; + height: 100px; + overflow: scroll; + will-change: scroll-position; +} +#spacer { + height: 400px; +} +#anchor { + width: 100px; + height: 100px; + anchor-name: --a; +} +#overlap { + position: absolute; + width: 100px; + height: 100px; + top: 150px; + left: 0; + z-index: 100; + background: green; +} +</style> + +<div id="overlap"></div> +<div id="scroller"> + <div id="spacer"></div> + <div id="anchor"></div> +</div> + +<script> +scroller.scrollTop = 150; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html b/tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html new file mode 100644 index 00000000000..6ae115803b8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-animations/display-none-dont-cancel.tentative.html @@ -0,0 +1,146 @@ +<!DOCTYPE html> +<link rel=author href="mailto:jarhar@chromium.org"> +<link rel=help href="https://drafts.csswg.org/css-display-4/#display-animation"> +<link rel=help href="https://github.com/w3c/csswg-drafts/issues/6429"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/css-animations/support/testcommon.js"></script> + +<div id=target1>hello</div> +<style> +@keyframes display1 { + 0% { display: none; } + 100% { display: inline; } +} +.animate1 { + animation: display1 1s infinite; +} +</style> +<script> +promise_test(async () => { + let numAnimationstartFired = 0; + target1.addEventListener('animationstart', () => numAnimationstartFired++); + + await waitForAnimationFrames(1); + target1.classList.add('animate1'); + await waitForAnimationFrames(2); + + assert_equals(getComputedStyle(target1).display, 'inline', + 'The display should be inline during the animation.'); + assert_equals(numAnimationstartFired, 1, + 'Only one animation should start.'); +}, 'display:none animating to display:inline should be inline for the whole animation.'); +</script> + +<div id=target2>hello</div> +<style> +@keyframes display2 { + 0% { display: var(--none-value); } + 100% { display: inline; } +} +.animate2 { + animation: display2 1s infinite; +} +#target2 { + --none-value: none; +} +</style> +<script> +promise_test(async () => { + let numAnimationstartFired = 0; + target2.addEventListener('animationstart', () => numAnimationstartFired++); + + await waitForAnimationFrames(1); + target2.classList.add('animate2'); + await waitForAnimationFrames(2); + + assert_equals(getComputedStyle(target2).display, 'inline', + 'The display should be inline during the animation.'); + assert_equals(numAnimationstartFired, 1, + 'Only one animation should start.'); +}, 'A CSS variable of display:none animating to display:inline should be inline for the whole animation.'); +</script> + +<div id=target3>hello</div> +<style> +@keyframes display3 { + 0% { display: none; } + 100% { display: none; } +} +.animate3 { + animation: display3 1s infinite; +} +</style> +<script> +promise_test(async () => { + let numAnimationstartFired = 0; + target3.addEventListener('animationstart', () => numAnimationstartFired++); + + await waitForAnimationFrames(1); + target3.classList.add('animate3'); + await waitForAnimationFrames(2); + + assert_equals(getComputedStyle(target3).display, 'none', + 'The display should be none and the animation should keep running.'); + assert_equals(numAnimationstartFired, 1, + 'Only one animation should start.'); +}, 'Animating from display:none to display:none should not cancel the animation.'); +</script> + +<div id=target4>hello</div> +<style> +@keyframes display4 { + 0% { display: var(--none-value); } + 100% { display: var(--none-value); } +} +.animate4 { + animation: display4 1s infinite; +} +#target4 { + --none-value: none; +} +</style> +<script> +promise_test(async () => { + let numAnimationstartFired = 0; + target4.addEventListener('animationstart', () => numAnimationstartFired++); + + await waitForAnimationFrames(1); + target4.classList.add('animate4'); + await waitForAnimationFrames(2); + + assert_equals(getComputedStyle(target4).display, 'none', + 'The display should be none and the animation should keep running.'); + assert_equals(numAnimationstartFired, 1, + 'Only one animation should start.'); +}, 'Animating from display:none to display:none with an intermediate variable should not cancel the animation.'); +</script> + +<div id=target5>hello</div> +<style> +@keyframes display5 { + 0% { --display: none; } + 100% { --display: none; } +} +.animate5 { + animation: display5 1s infinite; +} +#target5 { + display: var(--display, block); +} +</style> +<script> +promise_test(async () => { + let numAnimationstartFired = 0; + target5.addEventListener('animationstart', () => numAnimationstartFired++); + + await waitForAnimationFrames(1); + target5.classList.add('animate5'); + await waitForAnimationFrames(2); + + assert_equals(getComputedStyle(target5).display, 'none', + 'The display should be none and the animation should keep running.'); + assert_equals(numAnimationstartFired, 1, + 'Only one animation should start.'); +}, 'Animating a variable of "none" which gets set to display elsewhere should not cancel the animation.'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html new file mode 100644 index 00000000000..1767c84a5f0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled-ref.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<style> +body { + /* suppress scrollbars */ + overflow: hidden; +} +#target { + background-attachment: fixed; + background-image: linear-gradient(green 50%, yellow 50%); + font-size: 130px; + line-height: 100px; +} +</style> +<span id="target"> + <br> + <br> + <br> + <br> + <br> + <br> + <br> + <br> +</span> diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html new file mode 100644 index 00000000000..746997d6057 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-backgrounds/background-attachment-fixed-inline-scrolled.html @@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://www.w3.org/TR/css-backgrounds-3/#background-attachment"> +<link rel="match" href="background-attachment-fixed-inline-scrolled-ref.html"> +<meta name="assert" content="Background with background-attachment-fixed on an inline element should be fixed to the viewport"> +<style> +body { + /* suppress scrollbars */ + overflow: hidden; +} +#target { + background-attachment: fixed; + background-image: linear-gradient(green 50%, yellow 50%); + font-size: 130px; + line-height: 100px; +} +</style> +<span id="target"> + <br> + <br> + <br> + <br> + <br> + <br> + <br> + <br> +</span> +<script> +requestAnimationFrame(() => { + requestAnimationFrame(() => { + scrollTo(0, 300); + document.documentElement.classList.remove("reftest-wait"); + }); +}); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html new file mode 100644 index 00000000000..4edf112e432 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-014.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="columns:2; gap:0; width:100px; height:100px; column-fill:auto; background:red;"> + <div style="position:relative; overflow-y:clip; height:200px;"> + <div style="position:absolute; width:100%; height:300px;"> + <div style="height:200px; background:green;"></div> + <div style="height:200px; background:red;"></div> + </div> + <div style="height:1000px; background:red;"></div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html new file mode 100644 index 00000000000..1eb114458c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-015.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="columns:2; gap:0; width:100px; height:100px; column-fill:auto; background:red;"> + <div style="position:relative; overflow-y:clip; height:200px;"> + <div style="height:150px;"></div> + <div style="position:absolute; top:0; width:100%; height:300px;"> + <div style="height:200px; background:green;"></div> + <div style="height:200px; background:red;"></div> + </div> + <div style="height:1000px; background:red;"></div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html new file mode 100644 index 00000000000..4314c0135e2 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-016.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="columns:2; gap:0; width:100px; height:100px; column-fill:auto; background:red;"> + <div style="position:relative; overflow-y:clip; height:200px;"> + <div style="height:150px;"></div> + <div style="position:absolute; top:-100px; width:100%; height:300px;"> + <div style="height:100px; background:red;"></div> + <div style="height:200px; background:green;"></div> + <div style="height:200px; background:red;"></div> + </div> + <div style="height:1000px; background:red;"></div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html new file mode 100644 index 00000000000..1ab3cdd194f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-break/overflow-clip-017.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1432946"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="columns:2; gap:0; column-fill:auto; width:100px; height:100px; background:red;"> + <div style="height:70px; background:green;"></div> + <div style="float:left; break-inside:avoid; width:100%; height:40px; background:green;"></div> + <div style="position:relative; display:flow-root; overflow-y:clip; width:100%; height:90px; background:red;"> + <div style="height:30px; background:green;"></div> + <div style="height:10px;"></div> + <div style="position:absolute; margin-top:-30px; width:100%;"> + <div style="height:20px; background:red;"></div> + <div style="height:60px; background:green;"></div> + <div style="height:20px; background:red;"></div> + </div> + <div style="height:1000px;"></div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html b/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html index 9bdbbcb5a32..a841f265457 100644 --- a/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html +++ b/tests/wpt/web-platform-tests/css/css-cascade/import-conditional-001.html @@ -16,8 +16,10 @@ @import "support/test-red.css" (max-width: 1px), nonsense; div { + box-sizing: border-box; width: 100px; height: 100px; + padding: 5px; /* Avoids text antialiasing issues */ background: red; } </style> diff --git a/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html b/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html index 0bb09754702..e5e1c685a9e 100644 --- a/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html +++ b/tests/wpt/web-platform-tests/css/css-cascade/import-conditions.html @@ -14,6 +14,34 @@ matches: true }, { + importCondition: "supports((display:flex))", + matches: true + }, + { + importCondition: "supports((display:block) and (display:flex))", + matches: true + }, + { + importCondition: "supports((display:block) and (foo:bar))", + matches: false + }, + { + importCondition: "supports((display:block) or (display:flex))", + matches: true + }, + { + importCondition: "supports((display:block) or (foo:bar))", + matches: true + }, + { + importCondition: "supports(not (display: flex))", + matches: false + }, + { + importCondition: "supports(display: block !important)", + matches: true + }, + { importCondition: "supports(foo:bar)", matches: false }, @@ -28,7 +56,49 @@ { importCondition: "(width >= 0px) supports(display:block)", matches: false - } + }, + + // selector() + { + importCondition: "supports(selector(a))", + matches: true + }, + { + importCondition: "supports(selector(p a))", + matches: true + }, + { + importCondition: "supports(selector(p > a))", + matches: true + }, + { + importCondition: "supports(selector(p + a))", + matches: true + }, + + // font-tech() + { + importCondition: "supports(font-tech(color-COLRv1))", + matches: true + }, + { + importCondition: "supports(font-tech(invalid))", + matches: false + }, + + // font-format() + { + importCondition: "supports(font-format(opentype))", + matches: true + }, + { + importCondition: "supports(font-format(woff))", + matches: true + }, + { + importCondition: "supports(font-format(invalid))", + matches: false + }, ]; let target = document.getElementById("target"); for (let testCase of testCases) { diff --git a/tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html b/tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html new file mode 100644 index 00000000000..58e1f7cd165 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-cascade/parsing/supports-import-parsing.html @@ -0,0 +1,74 @@ +<!doctype html> +<meta charset="utf-8"> +<title>@import rule with supports parsing / serialization</title> +<link rel="author" href="mailto:oj@oojmed.com"> +<link rel="help" href="https://drafts.csswg.org/css-cascade-4/#at-import"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + function setupSheet(rule) { + const style = document.createElement("style"); + document.head.append(style); + const {sheet} = style; + const {cssRules} = sheet; + + assert_equals(cssRules.length, 0, "Sheet should have no rules"); + sheet.insertRule(rule); + assert_equals(cssRules.length, 1, "Sheet should have 1 rule"); + + return {sheet, cssRules}; + } + + function test_valid_supports_import(rule, serialized) { + if (serialized === undefined) + serialized = rule; + + test(function() { + const {sheet, cssRules} = setupSheet(rule); + + const serialization = cssRules[0].cssText; + assert_equals(serialization, serialized, 'serialization should be canonical'); + + sheet.deleteRule(0); + assert_equals(cssRules.length, 0, 'Sheet should have no rule'); + sheet.insertRule(serialization); + assert_equals(cssRules.length, 1, 'Sheet should have 1 rule'); + + assert_equals(cssRules[0].cssText, serialization, 'serialization should round-trip'); + }, rule + ' should be a valid supports() import rule'); + } + + function test_invalid_supports_import(rule) { + test(function() { + const {sheet, cssRules} = setupSheet(rule); + + sheet.deleteRule(0); + assert_equals(cssRules.length, 0, 'Sheet should have no rule'); + }, rule + ' should still be a valid import rule with an invalid supports() declaration'); + } + + test_valid_supports_import('@import url("nonexist.css") supports();'); + test_valid_supports_import('@import url("nonexist.css") supports(display:block);'); + test_valid_supports_import('@import url("nonexist.css") supports((display:flex));'); + test_valid_supports_import('@import url("nonexist.css") supports(not (display: flex));'); + test_valid_supports_import('@import url("nonexist.css") supports((display: flex) and (display: block));'); + test_valid_supports_import('@import url("nonexist.css") supports((display: flex) or (display: block));'); + test_valid_supports_import('@import url("nonexist.css") supports((display: flex) or (foo: bar));'); + test_valid_supports_import('@import url("nonexist.css") supports(display: block !important);'); + + test_valid_supports_import('@import url("nonexist.css") supports(selector(a));'); + test_valid_supports_import('@import url("nonexist.css") supports(selector(p a));'); + test_valid_supports_import('@import url("nonexist.css") supports(selector(p > a));'); + test_valid_supports_import('@import url("nonexist.css") supports(selector(p + a));'); + + test_valid_supports_import('@import url("nonexist.css") supports(font-tech(color-colrv1));'); + test_valid_supports_import('@import url("nonexist.css") supports(font-format(opentype));'); + + test_valid_supports_import('@import url(nonexist.css) supports(display:block);', + '@import url("nonexist.css") supports(display:block);'); + + test_valid_supports_import('@import "nonexist.css" supports(display:block);', + '@import url("nonexist.css") supports(display:block);'); + + test_invalid_supports_import('@import url("nonexist.css") supports;'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html b/tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html new file mode 100644 index 00000000000..208c006d2d0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/abspos/dynamic-align-self-001.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://crbug.com/1306037"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" + content="Abspos child of a flexbox moves after script changes its alignment."> +<style> + #reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; + } + + #parent { + position: relative; + display: flex; + width: 200px; + height: 200px; + } + + #child { + display: flex; + position: absolute; + width: 100px; + height: 100px; + background-color: green; + align-self: end; + } + +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>. +</p> + +<div id=reference-overlapped-red></div> + +<div id="parent"> + <div id="child"></div> +</div> + +<script> + document.body.offsetTop; + child.style.alignSelf = 'start'; +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html b/tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html new file mode 100644 index 00000000000..a1d7564e8a7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/fieldset-as-container-justify-center.tentative.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://crbug.com/1229458"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/8690"> +<link rel="help" href="https://github.com/whatwg/html/issues/9123"> +<link rel="help" + href="https://html.spec.whatwg.org/multipage/rendering.html#anonymous-fieldset-content-box"> +<meta name="assert" + content="justify-content: center is ignored in a column flexbox fieldset when the anonymous fieldset content box has no height or min-height."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<style> + fieldset { + display: flex; + flex-flow: column; + justify-content: center; + align-items: center; + width: 200px; + min-height: 200px; + padding: 0px; + border: 1px solid; + position: relative; + } + + .item { + height: 100px; + width: 100px; + background: orange; + } + +</style> +<p>Pass Condition: orange square is at top of black square.<br> + Safari 16.4 and Firefox 111 fail -- orange box is vertically centered as if + the anonymous fieldset content box and the fieldset were the same box. +</p> + +<fieldset> + <div class="item" data-offset-y="0"></div> +</fieldset> + +<script> + checkLayout('.item'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html b/tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html new file mode 100644 index 00000000000..b2408159b5a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/flex-aspect-ratio-img-row-017.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1700474"> +<link rel="help" href="https://crbug.com/1337056"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht" /> +<meta name="assert" + content="specified size suggestion obeys item's resolvable % main size"> + +<style> + #reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; + } + +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>. +</p> + +<div id="reference-overlapped-red"></div> + +<div style="display: flex; width: 100px;"> + <img src="support/100x100-green.png" style="width: 100%; flex: 0 0 10px;"> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html b/tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html new file mode 100644 index 00000000000..c087edb68d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/grandchild-span-height.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<meta name="flags" content="asis" /> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1601626"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> + +<style> + #reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; + } + +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>. +</p> + +<div id=reference-overlapped-red></div> + +<!-- Firefox 111 gives the green square too much height. 111px on my system. --> + +<div style="display: flex;"> + <div style="background-color: green; line-height: 10px;"> + <span style="margin-left: 1px"> + <div style="display:inline-block; width: 99px; height: 100px"></div> + <!-- the html comments are necessary to trigger the bug --> + <!-- --> + </span> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html b/tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html new file mode 100644 index 00000000000..bdea17d0692 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/grid-flex-item-007.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" + href="https://drafts.csswg.org/css-flexbox-1/#valdef-flex-direction-column"> +<link rel="help" href="https://webkit.org/b/226522"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" + content="Column flexboxes with indefinite heights don't mess up positioning of descendant grid items."> + +<style> + #reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; + } + +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>. +</p> +<div id=reference-overlapped-red></div> + +<body style="height: 400px;"> + <div style="display: flex; flex-direction: column;"> + <div style="display: grid; align-items: center; height: 100%;"> + <div style="width:100px; height: 100px; background: green;"></div> + </div> + </div> +</body> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html b/tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html new file mode 100644 index 00000000000..2ce9177a766 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/justify-content-007.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" + href="https://drafts.csswg.org/css-flexbox/#justify-content-property"> +<link rel="help" href="https://crbug.com/1228023"> +<meta name="assert" + content="Wrapped item obeys justify-content:center when the item wraps because the container has max-height."> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<style> + .flexitem { + width: 100px; + } + +</style> + +Pass condition: orange square is vertically centered in the black box.<br> +Chrome 112 and Safari 16.4 fail. Firefox 111 passes. +<div + style="display: flex; flex-flow: column wrap; max-height: 200px; justify-content: center; align-content: start; border: 2px solid; position: relative;"> + <div class=flexitem style="background: blue; height: 200px;"></div> + <div class=flexitem style="background: orange; height: 100px;" + data-offset-y=50></div> +</div> + +<script> + checkLayout('.flexitem + .flexitem'); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html b/tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html new file mode 100644 index 00000000000..c7316aab950 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-flexbox/table-as-flex-item-max-content.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" + href="https://drafts.csswg.org/css-flexbox/#intrinsic-cross-sizes"> +<link rel="help" href="https://webkit.org/b/253922"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht"> +<meta name="assert" + content="A table's max-content width is used for its parent flexbox's max-content calculation. Safari 16.4 uses min-content width."> + +<style> + #reference-overlapped-red { + position: absolute; + background-color: red; + width: 100px; + height: 100px; + z-index: -1; + } + + .inline-block { + float: left; + width: 50px; + } + +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>. +</p> + +<div id=reference-overlapped-red></div> +<div + style="display: flex; flex-direction: column; height: 100px; width: max-content; background-color: green;"> + <div style="display: table"> + <div style="display: table-cell"> + <div class="inline-block"></div> + <div class="inline-block"></div> + </div> + </div> +</div> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html index 800f87e5d00..81c6d184021 100644 --- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001-ref.html @@ -50,13 +50,13 @@ html,body { </article> <article class="grid" style="grid-template-columns: auto 100px auto"> - <div class="subgrid" style="grid-column:2 span 2"> + <div class="subgrid" style="grid-column:2 / span 2"> The cat can not be separated from milk </div> </article> <article class="grid" style="grid-template-columns: auto 100px auto"> - <div class="subgrid" style="grid-column:1 span 3"> + <div class="subgrid" style="grid-column:1 / span 3"> The cat can not be separated from milk </div> </article> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html index 0fdb9b0b7e2..4a946e6feb4 100644 --- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html @@ -53,13 +53,13 @@ html,body { </article> <article class="grid" style="grid-template-columns: auto 100px auto"> - <div class="subgrid" style="grid-column:2 span 2"> + <div class="subgrid" style="grid-column:2 / span 2"> The cat can not be separated from milk </div> </article> <article class="grid" style="grid-template-columns: auto 100px auto"> - <div class="subgrid" style="grid-column:1 span 3"> + <div class="subgrid" style="grid-column:1 / span 3"> The cat can not be separated from milk </div> </article> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html index 79b90c340d8..fe842b28238 100644 --- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context-ref.html @@ -5,12 +5,13 @@ --> <html><head> <meta charset="utf-8"> - <title>Test: subgrid disabled if grid item establishes independent formatting context</title> + <title>Reference: subgrid disabled if grid item establishes independent formatting context</title> <link rel="author" title="Matt Woodrow" href="https://bugs.webkit.org/show_bug.cgi?id=237692"> <link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-listing"> <style> + html,body { - color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; + font:16px/1 monospace; padding:0; margin:0; line-height: 0; } .grid { @@ -31,5 +32,22 @@ html,body { <div class="grid"> </div> +<div class="grid"> +</div> + +<div class="grid"> +</div> + +<div class="grid"> +</div> + +<div class="grid"> +</div> + +<div class="grid"> +</div> + +<div class="grid"> +</div> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html index 888b23c2f62..5a76ac2d6de 100644 --- a/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html +++ b/tests/wpt/web-platform-tests/css/css-grid/subgrid/independent-formatting-context.html @@ -10,8 +10,9 @@ <link rel="help" href="https://drafts.csswg.org/css-grid-2/#subgrid-listing"> <link rel="match" href="independent-formatting-context-ref.html"> <style> + html,body { - color:black; background-color:white; font:16px/1 monospace; padding:0; margin:0; + font:16px/1 monospace; padding:0; margin:0; line-height: 0; } .grid { @@ -32,19 +33,20 @@ html,body { } .first { - background-color: green; grid-row: 1; + background-color: green; } .second { - background-color: red; grid-row: 2; + background-color: green; } </style> </head> <body> - +<!-- The subgrid's style attribute establishes an independent formatting context + and makes them no longer eligible as subgrids.--> <div class="grid"> <div class="subgrid" style="position:absolute"> <div class="first"></div> @@ -57,5 +59,43 @@ html,body { </div> </div> +<div class="grid"> + <div class="subgrid" style="contain: paint"> + <div class="first"></div> + </div> +</div> + +<div class="grid"> + <div class="subgrid" style="contain: strict"> + <div class="first"></div> + </div> +</div> + +<div class="grid"> + <div class="subgrid" style="contain: content"> + <div class="first"></div> + </div> +</div> + +<!-- Only layout and paint containment establish an independent formatting + context. These tests validate that other types of containment maintain + subgrid layout.--> +<div class="grid"> + <div class="subgrid" style="contain: none"> + <div class="second"></div> + </div> +</div> + +<div class="grid"> + <div class="subgrid" style="contain: size"> + <div class="second"></div> + </div> +</div> + +<div class="grid"> + <div class="subgrid" style="contain: style"> + <div class="second"></div> + </div> +</div> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html index e36c1295d31..ec139d4e229 100644 --- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/image-orientation-none-cross-origin.html @@ -22,7 +22,7 @@ <body> <p>The following images should not be identical.</p> <p>The image should not rotate respecting their EXIF orientation because - image-orientation: none is specified.</p> + image-orientation: none is specified and the request is same origin.</p> <div><img src="support/exif-orientation-3-lr.jpg"/></div> <p>This image should rotate respecting their EXIF orientation because @@ -30,16 +30,25 @@ <div><img id="corsImage" src="support/exif-orientation-3-lr.jpg"/></div> <p>The image should not rotate respecting their EXIF orientation because - image-orientation: none is specified.</p> + image-orientation: none is specified and the request is CORS anonymous.</p> + <div><img id="corsAnonymousImg" crossorigin="anonymous" src="support/exif-orientation-3-lr.jpg"/></div> + + <p>The image should not rotate respecting their EXIF orientation because + image-orientation: none is specified and the request is CORS + use-credentials.</p> + <div><img id="corsUseCredsImg" crossorigin="use-credentials" src="support/exif-orientation-3-lr.jpg"/></div> + + <p>The image should not rotate respecting their EXIF orientation because + image-orientation: none is specified and the image source is a blob.</p> <div><img id="blobImage"/></div> <p>The image should not rotate respecting their EXIF orientation because - image-orientation: none is specified.</p> + image-orientation: none is specified and the image source is a data url.</p> <div><img id="dataImage"/></div> </body> <script> const testImage = 'support/exif-orientation-3-lr.jpg'; - let sPendingImagesToLoad = 3; + let sPendingImagesToLoad = 5; function pendingImageLoaded() { if (!--sPendingImagesToLoad) { @@ -51,6 +60,19 @@ img.onload = pendingImageLoaded; img.src = img.src.replace(new URL(img.src).origin, get_host_info().HTTP_REMOTE_ORIGIN) + const corsAnonImg = document.getElementById('corsAnonymousImg') + corsAnonImg.onload = pendingImageLoaded; + corsAnonImg.src = corsAnonImg.src.replace(new URL(corsAnonImg.src).origin, + get_host_info().HTTP_REMOTE_ORIGIN) + + "?pipe=header(Access-Control-Allow-Origin,*)"; + + const corsUseCredsImg = document.getElementById('corsUseCredsImg') + corsUseCredsImg.onload = pendingImageLoaded; + corsUseCredsImg.src = corsUseCredsImg.src.replace(new URL(corsUseCredsImg.src).origin, + get_host_info().HTTP_REMOTE_ORIGIN) + + "?pipe=header(Access-Control-Allow-Credentials,true)" + + "|header(Access-Control-Allow-Origin," + location.origin + ")"; + const blobImg = document.getElementById('blobImage'); fetch(testImage).then((resp) => { return resp.blob(); diff --git a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html index c4d72fc823f..a54aa3870f6 100644 --- a/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html +++ b/tests/wpt/web-platform-tests/css/css-images/image-orientation/reference/image-orientation-none-cross-origin-ref.html @@ -19,7 +19,7 @@ <body> <p>The following images should not be identical.</p> <p>The image should not rotate respecting their EXIF orientation because - image-orientation: none is specified.</p> + image-orientation: none is specified and the request is same origin.</p> <div><img src="../support/exif-orientation-3-lr.jpg"/></div> <p>This image should rotate respecting their EXIF orientation because @@ -27,11 +27,20 @@ <div><img src="../support/exif-orientation-3-lr.jpg" style="image-orientation: from-image" /></div> <p>The image should not rotate respecting their EXIF orientation because - image-orientation: none is specified.</p> + image-orientation: none is specified and the request is CORS anonymous.</p> <div><img src="../support/exif-orientation-3-lr.jpg"/></div> <p>The image should not rotate respecting their EXIF orientation because - image-orientation: none is specified.</p> + image-orientation: none is specified and the request is CORS + use-credentials.</p> + <div><img src="../support/exif-orientation-3-lr.jpg"/></div> + + <p>The image should not rotate respecting their EXIF orientation because + image-orientation: none is specified and the image source is a blob.</p> + <div><img src="../support/exif-orientation-3-lr.jpg"/></div> + + <p>The image should not rotate respecting their EXIF orientation because + image-orientation: none is specified and the image source is a data url.</p> <div><img src="../support/exif-orientation-3-lr.jpg"/></div> </body> </html> diff --git a/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html b/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html index 1ce4ceb1074..61622774f6f 100644 --- a/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html +++ b/tests/wpt/web-platform-tests/css/css-inline/text-box-trim/text-box-trim-valid.html @@ -5,7 +5,7 @@ <script src="/css/support/parsing-testcommon.js"></script> <script> -test_valid_value('text-box-trim', 'normal'); +test_valid_value('text-box-trim', 'none'); test_valid_value('text-box-trim', 'start'); test_valid_value('text-box-trim', 'end'); test_valid_value('text-box-trim', 'both'); diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html new file mode 100644 index 00000000000..f1a0a315de6 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-computed.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>CSS Positioned Layout Module Test: getComputedStyle().overlay</title> +<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<div id="target"></div> +<script> + test_computed_value("overlay", "none", "none"); + // 'auto' also computes to 'none' due to this UA style while the element is + // not in the top layer: + // + // * { overlay: none !important } + test_computed_value("overlay", "auto", "none"); + test_computed_value("overlay", "inherit", "none"); + test_computed_value("overlay", "initial", "none"); + test_computed_value("overlay", "revert", "none"); + test_computed_value("overlay", "unset", "none"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html new file mode 100644 index 00000000000..e84d0c8a6b0 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-invalid.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>CSS Positioned Layout Module Test: parsing overlay with invalid values</title> +<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script> + // overlay: none | auto + test_invalid_value("overlay", "browser"); + test_invalid_value("overlay", "normal"); + test_invalid_value("overlay", "none auto"); + test_invalid_value("overlay", "none, auto"); + test_invalid_value("overlay", "\'auto\'"); + test_invalid_value("overlay", "\'none\'"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html new file mode 100644 index 00000000000..a667f26ea6a --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-transition-property.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>CSS Positioned Layout Module Test: 'overlay' is a valid transition-property value</title> +<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script src="/css/support/computed-testcommon.js"></script> +<div id="target"></div> +<script> + test_valid_value("transition-property", "overlay"); + test_valid_value("transition", "overlay 2s", "overlay 2s ease 0s"); + + test_computed_value("transition-property", "overlay"); + test_computed_value("transition", "overlay 1s", "overlay 1s ease 0s"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html new file mode 100644 index 00000000000..8d808ac6dcf --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-position/overlay/overlay-valid.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<title>CSS Positioned Layout Module Test: parsing overlay with valid values</title> +<link rel="help" href="https://drafts.csswg.org/css-position-4/#overlay"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script> + // overlay: none | auto + test_valid_value("overlay", "none"); + test_valid_value("overlay", "auto"); + test_valid_value("overlay", "inherit"); + test_valid_value("overlay", "initial"); + test_valid_value("overlay", "revert"); + test_valid_value("overlay", "unset"); +</script> diff --git a/tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html b/tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html new file mode 100644 index 00000000000..890194b7c17 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/css-view-transitions/root-element-cv-hidden-crash.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<title>View transitions: content-visibility:hidden on root element crash</title> +<link rel="help" href="https://crbug.com/1429947"> +<style> + html { + content-visibility: hidden; + } +</style> +<script> + document.startViewTransition(); +</script> diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html new file mode 100644 index 00000000000..2dd7aff8313 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript-ref.html @@ -0,0 +1,4 @@ +<!DOCTYPE html> +<noscript> + Script is disabled +</noscript> diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html new file mode 100644 index 00000000000..1d1af708fd7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-noscript.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/mediaqueries/#scripting"> +<link rel="match" href="scripting-print-noscript-ref.html"> +<style> + @media (scripting) { + #noscript { + display: none; + } + } +</style> +<div id="noscript"> + Script is disabled +</div> diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html new file mode 100644 index 00000000000..d2da3f84058 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script-ref.html @@ -0,0 +1,4 @@ +<!DOCTYPE html> +<div> + Script is enabled +</div> diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html new file mode 100644 index 00000000000..e80dba4d83f --- /dev/null +++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting-print-script.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/mediaqueries/#scripting"> +<link rel="match" href="scripting-print-script-ref.html"> +<style> + #script { + display: none; + } + + @media (scripting) { + #script { + display: block; + } + } +</style> +<div id="script"> + Script is enabled +</div> diff --git a/tests/wpt/web-platform-tests/css/mediaqueries/scripting.html b/tests/wpt/web-platform-tests/css/mediaqueries/scripting.html new file mode 100644 index 00000000000..de047cb463c --- /dev/null +++ b/tests/wpt/web-platform-tests/css/mediaqueries/scripting.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/mediaqueries-5/#scripting"> +<script type="text/javascript" src="/resources/testharness.js"></script> +<script type="text/javascript" src="/resources/testharnessreport.js"></script> +<script type="text/javascript" src="resources/matchmedia-utils.js"></script> + +<script> +query_should_be_known("(scripting)"); +query_should_be_known("(scripting: enabled)"); +query_should_be_known("(scripting: initial-only)"); +query_should_be_known("(scripting: none)"); + +query_should_be_unknown("(scripting: 0)"); +query_should_be_unknown("(scripting: 10px)"); +query_should_be_unknown("(scripting: invalid)"); + +test(() => { + let match_enabled = window.matchMedia("(scripting: enabled)"); + assert_true(match_enabled.matches); +}, "Check that scripting currently matches 'enabled'"); + +test(() => { + let booleanContext = window.matchMedia("(scripting)"); + assert_true(booleanContext.matches); +}, "Check that scripting currently evaluates to true in the boolean context"); +</script> diff --git a/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html b/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html index 5e68d50d5a0..411d50d35e5 100644 --- a/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html +++ b/tests/wpt/web-platform-tests/css/selectors/i18n/css3-selectors-lang-014.html @@ -28,8 +28,8 @@ This tests a detail related to :lang support. If :lang is not supported, a messa <script> test(function() { assert_equals(document.getElementById('colonlangcontroltest').offsetWidth, 0) -assert_equals(document.getElementById('box').offsetWidth, 50); -}, "A :lang value with language and region subtags will NOT match a lang attribute value with language, script and region subtags."); +assert_in_array(document.getElementById('box').offsetWidth, [50, 100]); +}, "A :lang value with language and region subtags will match a lang attribute value with language, script and region subtags under CSS Selectors 4, but not Selectors 3."); </script> <div id='log'></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html new file mode 100644 index 00000000000..466e9f464b9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000-ref.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching reference</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> + +<style> +div.test { color: green; } +</style> + +<div class="test">This should be green</div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html new file mode 100644 index 00000000000..1d66bebbc6b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-000.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +:lang(en-US) { color: green; } +</style> + +<div class="test">This should be green</div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html new file mode 100644 index 00000000000..908643fca81 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-001.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang(fr) { color: green; } +</style> + +<div class="test"><span lang="fr">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html new file mode 100644 index 00000000000..0be426c66e7 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-002.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("FR") { color: green; } +</style> + +<div class="test"><span lang="fr">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html new file mode 100644 index 00000000000..a3e5340b6e9 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-003.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("Fr") { color: green; } +</style> + +<div class="test"><span lang="fR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html new file mode 100644 index 00000000000..d5929972707 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-004.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("fr") { color: green; } +</style> + +<div class="test"><span lang="fr-CH">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html new file mode 100644 index 00000000000..816dfc9b503 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-005.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: green; } +:lang("fr-CH") { color: red; } +</style> + +<div class="test"><span lang="fr">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html new file mode 100644 index 00000000000..d249a4c8c06 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-006.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: green; } +:lang("fr-CH") { color: red; } +</style> + +<div class="test"><span lang="fr-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html new file mode 100644 index 00000000000..a21506d94c1 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-007.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("*-CH") { color: green; } +</style> + +<div class="test"><span lang="fr-CH">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html new file mode 100644 index 00000000000..77f77a884ac --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-008.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("*-Latn") { color: green; } +</style> + +<div class="test"><span lang="fr-Latn-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html new file mode 100644 index 00000000000..bf2e9883916 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-009.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("fr-FR") { color: green; } +</style> + +<div class="test"><span lang="fr-Latn-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html new file mode 100644 index 00000000000..081c9207add --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-010.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("*-FR") { color: green; } +</style> + +<div class="test"><span lang="fr-Latn-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html new file mode 100644 index 00000000000..5620317a14b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-011.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang("fr", "nl", "de") { color: green; } +</style> + +<div class="test"><span lang="fr-Latn-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html new file mode 100644 index 00000000000..f299e22eaec --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-012.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang(de, nl, fr) { color: green; } +</style> + +<div class="test"><span lang="fr-Latn-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html new file mode 100644 index 00000000000..34303d97805 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-013.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: green; } +:lang(de, nl, 0, fr) { color: red; } +</style> + +<div class="test"><span lang="fr">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html new file mode 100644 index 00000000000..2d064c8d29b --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-014.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: green; } +:lang(0) { color: red; } +</style> + +<div class="test"><span lang="0">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html new file mode 100644 index 00000000000..4d90b080f39 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/selectors/selectors-4/lang-015.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html lang="en-US"> +<meta charset="utf-8"> +<title>CSS Selectors 4 - :lang matching</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-lang-pseudo"> +<link rel="match" href="lang-000-ref.html"> + +<style> +div.test { color: red; } +:lang(\*-FR) { color: green; } +</style> + +<div class="test"><span lang="fr-Latn-FR">This should be green</span></div> diff --git a/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html b/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html index acad168e56c..edda88e7cb2 100644 --- a/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html +++ b/tests/wpt/web-platform-tests/dom/events/scrolling/scrollend-event-fired-to-element-with-overscroll-behavior.html @@ -7,96 +7,167 @@ <script src="/resources/testdriver-vendor.js"></script> <script src="scroll_support.js"></script> <style> -#overscrollXDiv { - width: 600px; - height: 600px; - overflow: scroll; - overscroll-behavior-x: contain; -} -#overscrollYDiv { - width: 500px; - height: 500px; - overflow: scroll; - overscroll-behavior-y: none; -} -#targetDiv { - width: 400px; - height: 400px; - overflow: scroll; -} -.content { - width:800px; - height:800px; -} + #overscrollXDiv { + width: 200px; + height: 200px; + overflow: scroll; + overscroll-behavior-x: contain; + border: solid 1px black; + display: grid; + /* Places content and targetXDiv beside each other. */ + grid-template-columns: 500px 100px; + } + + #overscrollYDiv { + width: 200px; + height: 200px; + overflow: scroll; + overscroll-behavior-y: none; + border: solid 1px black; + } + + #targetXDiv { + width: 100px; + height: 100px; + overflow: scroll; + border: solid 1px black; + } + + #targetYDiv { + width: 100px; + height: 100px; + overflow: scroll; + border: solid 1px black; + } + + .content { + width: 500px; + height: 500px; + } + + #spacer { + height: 200vh; + width: 200vw; + border: solid 1px black; + } </style> <body style="margin:0" onload=runTest()> -<div id="overscrollXDiv"> - <div class=content> - <div id="overscrollYDiv"> - <div class=content> - <div id="targetDiv"> - <div class="content"> - </div> - </div> + <div id="overscrollXDiv"> + <div class="content"></div> + <div id="targetXDiv"> + <div class="content"> </div> </div> </div> -</div> + <div id="overscrollYDiv"> + <div class="content"></div> + <!-- Place targetYDiv below content so that is in view when + overscrollYDiv is scrolled all the way down --> + <div id="targetYDiv"> + <div class="content"> + </div> + </div> + </div> + <div id="spacer"></div> </body> <script> -var target_div = document.getElementById('targetDiv'); -var horizontal_scrollend_arrived = false; -var vertical_scrollend_arrived = false; -function onHorizontalScrollEnd(event) { - assert_false(event.cancelable); - assert_false(event.bubbles); - horizontal_scrollend_arrived = true; -} -function onVerticalScrollEnd(event) { - assert_false(event.cancelable); - assert_false(event.bubbles); - vertical_scrollend_arrived = true; -} -// Test that both "onscrollend" and addEventListener("scrollend"... work. -document.getElementById('overscrollXDiv').onscrollend = onHorizontalScrollEnd; -document.getElementById('overscrollYDiv'). + var horizontal_scrollend_arrived = false; + var vertical_scrollend_arrived = false; + let scrollers = [document.scrollingElement, targetXDiv, targetYDiv, + overscrollXDiv, overscrollYDiv]; + + async function resetScrollers(test) { + for (const scroller of scrollers) { + await resetTargetScrollState(test, scroller); + } + } + function onHorizontalScrollEnd(event) { + assert_false(event.cancelable); + assert_false(event.bubbles); + horizontal_scrollend_arrived = true; + } + function onVerticalScrollEnd(event) { + assert_false(event.cancelable); + assert_false(event.bubbles); + vertical_scrollend_arrived = true; + } + // Test that both "onscrollend" and addEventListener("scrollend"... work. + document.getElementById('overscrollXDiv').onscrollend = onHorizontalScrollEnd; + document.getElementById('overscrollYDiv'). addEventListener("scrollend", onVerticalScrollEnd); -function runTest() { - promise_test (async (t) => { - // Make sure that no scrollend event is sent to document or target_div. - document.addEventListener("scrollend", - t.unreached_func("Document got unexpected scrollend event.")); - target_div.addEventListener("scrollend", - t.unreached_func("target_div got unexpected scrollend event.")); - await waitForCompositorCommit(); - - // Scroll left on target div and wait for the element with overscroll-x to - // get scrollend event. - await touchScrollInTarget(300, target_div, 'left'); - await waitFor(() => { return horizontal_scrollend_arrived; }, - 'Expected element did not receive scrollend event after scroll left ' + - 'on target.'); - assert_equals(target_div.scrollLeft, 0); - - let touchEndPromise = new Promise((resolve) => { - target_div.addEventListener("touchend", resolve); - }); - await touchScrollInTarget(300, target_div, 'up'); - - // The scrollend event should never be fired before the gesture has completed. - await touchEndPromise; - - // Ensure we wait at least a tick after the touch end. - await waitForCompositorCommit(); - - // We should not trigger a scrollend event for a scroll that did not change - // the scroll position. - assert_equals(vertical_scrollend_arrived, false); - assert_equals(target_div.scrollTop, 0); - }, 'Tests that the last element in the cut scroll chain gets scrollend ' + - 'event when no element scrolls by touch.'); -} + function runTest() { + promise_test(async (t) => { + await resetScrollers(t); + await waitForCompositorCommit(); + + // Make sure that no scrollend event is sent to document. + document.addEventListener("scrollend", + t.unreached_func("Document got unexpected scrollend event.")); + let scrollend_promise; + + scrollend_promise = waitForScrollendEvent(t, targetXDiv, 2000); + targetXDiv.scrollLeft = targetXDiv.scrollWidth; + await scrollend_promise; + + scrollend_promise = waitForScrollendEvent(t, overscrollXDiv, 2000); + overscrollXDiv.scrollLeft = overscrollXDiv.scrollWidth; + await scrollend_promise; + horizontal_scrollend_arrived = false; + + assert_equals(targetXDiv.scrollLeft, + targetXDiv.scrollWidth - targetXDiv.clientWidth); + assert_equals(overscrollXDiv.scrollLeft, + overscrollXDiv.scrollWidth - overscrollXDiv.clientWidth); + // Attempt to scroll targetXDiv further to the right. + // targetXDiv and overscrollXDiv are already fully scrolled right but the + // scroll should not propagate to the document because of + // overscroll-behavior-x: contain on overscrollXDiv. + let touchEndPromise = new Promise((resolve) => { + targetXDiv.addEventListener("touchend", resolve); + }); + await touchScrollInTarget(100, targetXDiv, 'right'); + // The scrollend event should never be fired before the gesture has + // completed. + await touchEndPromise; + + scrollend_promise = waitForScrollendEvent(t, targetYDiv, 2000); + targetYDiv.scrollTop = targetXDiv.scrollHeight; + await scrollend_promise; + + scrollend_promise = waitForScrollendEvent(t, overscrollYDiv, 2000); + overscrollYDiv.scrollTop = overscrollYDiv.scrollHeight; + await scrollend_promise; + vertical_scrollend_arrived = false; + + assert_equals(targetYDiv.scrollTop, + targetYDiv.scrollHeight - targetYDiv.clientHeight); + assert_equals(overscrollYDiv.scrollTop, + overscrollYDiv.scrollHeight - overscrollYDiv.clientHeight); + // Attempt to scroll targetYDiv further down. + // targetYDiv and overscrollYDiv are already fully scrolled down but the + // scroll should not propagate to the document because of + // overscroll-behavior-y: none on overscrollYDiv. + touchEndPromise = new Promise((resolve) => { + targetYDiv.addEventListener("touchend", resolve); + }); + await touchScrollInTarget(50, targetYDiv, 'down'); + // The scrollend event should never be fired before the gesture has + // completed. + await touchEndPromise; + + // Ensure we wait at least a tick after the touch end. + await waitForCompositorCommit(); + + // We should not trigger a scrollend event for a scroll that did not + // change the scroll position. + assert_equals(horizontal_scrollend_arrived, false, + "overscrollXDiv should not receive scrollend"); + assert_equals(vertical_scrollend_arrived, false, + "overscrollYDiv should not receive scrollend"); + }, "Tests that the scroll is not propagated beyond div with non-auto " + + "overscroll-behavior."); + } </script> diff --git a/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js b/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js index 32924a8d872..973c586ca4f 100644 --- a/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js +++ b/tests/wpt/web-platform-tests/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js @@ -462,21 +462,21 @@ const SIMPLE_JOIN_LEAVE_TEST_CASES = [ all: [3,4,5] } }, - // Interest group dictionaries must be less than 50 KiB (51200 bytes), so test - // that here by using a large name on an otherwise valid interest group + // Interest group dictionaries must be less than 1 MB (1048576 bytes), so + // test that here by using a large name on an otherwise valid interest group // dictionary. The first case is the largest name value that still results in // a valid dictionary, whereas the second test case produces a dictionary // that's one byte too large. { expectJoinSucces: true, expectLeaveSucces: true, interestGroup: { ...BASE_INTEREST_GROUP, - name: 'a'.repeat(51152) }, + name: 'a'.repeat(1048528) }, testCaseName: "Largest possible interest group dictionary", }, { expectJoinSucces: false, expectLeaveSucces: true, interestGroup: { ...BASE_INTEREST_GROUP, - name: 'a'.repeat(51153) }, + name: 'a'.repeat(1048529) }, testCaseName: "Oversized interest group dictionary", }, ]; diff --git a/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js b/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js index 15a0c2a3b57..9e114619bf2 100644 --- a/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js +++ b/tests/wpt/web-platform-tests/fs/script-tests/FileSystemBaseHandle-IndexedDB.js @@ -119,3 +119,27 @@ directory_test(async (t, root_dir) => { assert_equals(result.value.length, value.length); await assert_equals_cloned_handles(result.value, value); }, 'Store handle in IndexedDB using inline keys.'); + +directory_test(async (t, root_dir) => { + const expected_root_name = ''; + assert_equals(root_dir.name, expected_root_name); + + const db = await createDatabase(t, db => { + const store = db.createObjectStore('store', {keyPath: 'key'}); + }); + + const value = [ root_dir ]; + let tx = db.transaction('store', 'readwrite'); + let store = tx.objectStore('store'); + await promiseForRequest(t, store.put({key: 'key', value})); + await promiseForTransaction(t, tx); + + tx = db.transaction('store', 'readonly'); + store = tx.objectStore('store'); + const result = await promiseForRequest(t, store.get('key')); + await promiseForTransaction(t, tx); + + const actual = result.value[ 0 ]; + assert_equals(actual.name, expected_root_name); + assert_true(await root_dir.isSameEntry(actual)); +}, 'Store and retrieve the root directory from IndexedDB.'); diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html new file mode 100644 index 00000000000..1c2bc9e3d11 --- /dev/null +++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-screen-size.https.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title> + Element#requestFullscreen() does not affect Screen sizes +</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="../trusted-click.js"></script> +<body></body> +<script> + promise_test(async (t) => { + const screenWidth = window.screen.width; + const screenHeight = window.screen.height; + + if ('onchange' in window.screen) { + window.screen.onchange = () => { + assert_equals(window.screen.width, screenWidth); + assert_equals(window.screen.height, screenHeight); + } + t.add_cleanup(() => { window.screen.onchange = null; }); + } + + // Await a test_driver or manual click, fullscreen promise, and change. + await Promise.all([trusted_request(), fullScreenChange()]); + t.add_cleanup(() => { document.exitFullscreen(); }); + assert_not_equals(document.fullscreenElement, null); + + // Ensure the screen size is unchanged during fullscreen. + assert_equals(window.screen.width, screenWidth); + assert_equals(window.screen.height, screenHeight); + }, "Screen size is unchanged during element fullscreen"); + + promise_test(async (t) => { + const screenWidth = window.screen.width; + const screenHeight = window.screen.height; + + if ('onchange' in window.screen) { + window.screen.onchange = () => { + assert_equals(window.screen.width, screenWidth); + assert_equals(window.screen.height, screenHeight); + } + t.add_cleanup(() => { window.screen.onchange = null; }); + } + + // Await a test_driver or manual click to start tab content capture. + await trusted_click(); + const stream = await navigator.mediaDevices.getDisplayMedia( + {video:{displaySurface:"browser"}, selfBrowserSurface:"include"}); + const capabilities = stream.getVideoTracks()[0].getCapabilities(); + assert_equals(capabilities.displaySurface, "browser"); + t.add_cleanup(() => { stream.getTracks().forEach(t => t.stop()) }); + + // Await a test_driver or manual click, fullscreen promise, and change. + await Promise.all([trusted_request(), fullScreenChange()]); + t.add_cleanup(() => { document.exitFullscreen(); }); + assert_not_equals(document.fullscreenElement, null); + + // Ensure the screen size is unchanged during tab-capture fullscreen. + assert_equals(window.screen.width, screenWidth); + assert_equals(window.screen.height, screenHeight); + }, "Screen size is unchanged during tab-capture element fullscreen"); +</script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html index d64b81026ad..77818444c87 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html @@ -19,12 +19,12 @@ var t = async_test("Test exceptions on CanvasFilter() blur.object"); _addTest(function(canvas, ctx) { -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); }); }); diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html index 678a722520a..a56840e6073 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html @@ -19,44 +19,44 @@ var t = async_test("Test the functionality of ColorMatrix filters in CanvasFilter objects"); _addTest(function(canvas, ctx) { -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: undefined}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: "foo"}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: null}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); }); -ctx.fillStyle = "#f00"; -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0}); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: undefined}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: null}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); }); +ctx.fillStyle = '#f00'; +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 255,0,0,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,91,0,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,109,109,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 109,18,255,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 155,27,27,255, 2); ctx.clearRect(0, 0, 100, 50); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,0,0,54, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [ +ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]}); ctx.fillRect(0, 0, 50, 25); -ctx.fillStyle = "#0f0"; +ctx.fillStyle = '#0f0'; ctx.fillRect(50, 0, 50, 25); -ctx.fillStyle = "#00f"; +ctx.fillStyle = '#00f'; ctx.fillRect(0, 25, 50, 25); -ctx.fillStyle = "#fff"; +ctx.fillStyle = '#fff'; ctx.fillRect(50, 25, 50, 25); _assertPixelApprox(canvas, 10,10, 0,255,0,255, 2); _assertPixelApprox(canvas, 60,10, 0,255,0,255, 2); diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html index 0ecd132c8ef..c54299ff2a5 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html @@ -40,10 +40,10 @@ function getColor(inputColor, tableValues) { tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "discrete", tableValues: tableValuesR}, - funcG: {type: "discrete", tableValues: tableValuesG}, - funcB: {type: "discrete", tableValues: tableValuesB}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'discrete', tableValues: tableValuesR}, + funcG: {type: 'discrete', tableValues: tableValuesG}, + funcB: {type: 'discrete', tableValues: tableValuesB}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html index 4ef30c9249b..110cd2396ea 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html @@ -31,10 +31,10 @@ function getColor(inputColor, amplitude, exponent, offset) { const amplitudes = [2, 1.1, 0.5]; const exponents = [5, 3, 1]; const offsets = [0.25, 0, 0.5]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, - funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, - funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, + funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, + funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html index 25eda36d96b..96a3e4936ee 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html @@ -19,10 +19,10 @@ var t = async_test("Test pixels on CanvasFilter() componentTransfer with identity type"); _addTest(function(canvas, ctx) { -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "identity"}, - funcG: {type: "identity"}, - funcB: {type: "identity"}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'identity'}, + funcG: {type: 'identity'}, + funcB: {type: 'identity'}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html index c45f5586009..10f9931cc64 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html @@ -30,10 +30,10 @@ function getColor(inputColor, slopes, intercepts) { const slopes = [0.5, 1.2, -0.2]; const intercepts = [0.25, 0, 0.5]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]}, - funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]}, - funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]}, + funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]}, + funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html index b561cb6fd3f..7e743bf34f0 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html @@ -40,10 +40,10 @@ function getColor(inputColor, tableValues) { tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "table", tableValues: tableValuesR}, - funcG: {type: "table", tableValues: tableValuesG}, - funcB: {type: "table", tableValues: tableValuesB}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'table', tableValues: tableValuesR}, + funcG: {type: 'table', tableValues: tableValuesG}, + funcB: {type: 'table', tableValues: tableValuesB}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html index b85b742b3eb..b994a91842c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html @@ -19,23 +19,23 @@ var t = async_test("Test exceptions on CanvasFilter() convolveMatrix"); _addTest(function(canvas, ctx) { -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix"}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", divisor: 2}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix'}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); }); // This should not throw an error -ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]}); -ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]}); +ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]}); +ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]}); }); diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html index 90f406fed9f..8327b5cad48 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html @@ -4,71 +4,33 @@ <h1>2d.filter.canvasFilterObject.dropShadow.tentative</h1> <p class="desc">Test CanvasFilter() dropShadow object.</p> -<style> - .background { - background-color: teal; - position: absolute; - left: 0px; - width: 620px; - height: 50px; - } +<svg width=620 height=320 xmlns="http://www.w3.org/2000/svg"> + <rect x=0 y=0 width=100% height=50 fill="teal" /> + <rect x=0 y=100 width=100% height=50 fill="teal" /> + <rect x=0 y=200 width=100% height=50 fill="teal" /> - .testcase { - position: absolute; - background-color: crimson; - width: 80px; - height: 80px; - } -</style> + <rect x=10 y=10 width=80 height=80 fill="crimson" + style="filter: drop-shadow(2px 2px 2px black)"/> + <rect x=110 y=10 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7))"/> -<div style="position: relative"> - <div class='background' style="top: 0px;"></div> - <div class='background' style="top: 100px;"></div> - <div class='background' style="top: 200px;"></div> + <rect x=10 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(10px 10px 3px purple)"/> + <rect x=110 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px LinkText)"/> + <rect x=210 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(10px 15px 0px purple)"/> + <rect x=310 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/> + <rect x=410 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"/> + <rect x=510 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"/> - <div class='testcase' - style="left: 10px; top: 10px; - filter: drop-shadow(2px 2px 2px black);"> - </div> - <div class='testcase' - style="left: 110px; top: 10px; - filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7));"> - </div> - <div class='testcase' - style="left: 10px; top: 110px; - filter: drop-shadow(10px 10px 3px purple)"> - </div> - <div class='testcase' - style="left: 110px; top: 110px; - filter: drop-shadow(15px 10px 3px LinkText)"> - </div> - <div class='testcase' - style="left: 210px; top: 110px; - filter: drop-shadow(10px 15px 0px purple)"> - </div> - <div class='testcase' - style="left: 310px; top: 110px; - filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"> - </div> - <div class='testcase' - style="left: 410px; top: 110px; - filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"> - </div> - <div class='testcase' - style="left: 510px; top: 110px; - filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"> - </div> - - <div class='testcase' - style="left: 10px; top: 210px; - filter: drop-shadow(-5px 0px 0px purple);"> - </div> - <div class='testcase' - style="left: 110px; top: 210px; - filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8));"> - </div> - <div class='testcase' - style="left: 210px; top: 210px; - filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4));"> - </div> -</div> + <rect x=10 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(-5px 0px 0px purple)"/> + <rect x=110 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8))"/> + <rect x=210 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/> +</svg> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html index 22c6a6547f2..712716d9f01 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html @@ -19,64 +19,64 @@ ctx.fillStyle = 'crimson'; // Parameter defaults. - ctx.filter = new CanvasFilter({filter: "dropShadow"}); + ctx.filter = new CanvasFilter({filter: 'dropShadow'}); ctx.fillRect(10, 10, 80, 80); // All parameters specified. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5, - floodColor: "purple", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5, + floodColor: 'purple', floodOpacity: 0.7}); ctx.fillRect(110, 10, 80, 80); // Named color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3, + floodColor: 'purple'}); ctx.fillRect(10, 110, 80, 80); // System color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "LinkText"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'LinkText'}); ctx.fillRect(110, 110, 80, 80); // No blur. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0, + floodColor: 'purple'}); ctx.fillRect(210, 110, 80, 80); // Numerical color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 1)"}); + {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 1)'}); ctx.fillRect(310, 110, 80, 80); // Transparent floodColor. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)'}); ctx.fillRect(410, 110, 80, 80); // Transparent floodColor and floodOpacity. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}); ctx.fillRect(510, 110, 80, 80); // Degenerate parameter values. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null, - floodColor: "purple", floodOpacity: [2]}); + {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null, + floodColor: 'purple', floodOpacity: [2]}); ctx.fillRect(10, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5, - floodColor: "purple", floodOpacity: '0.8'}); + {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5, + floodColor: 'purple', floodOpacity: '0.8'}); ctx.fillRect(110, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false, - floodColor: "purple", floodOpacity: ['0.4']}); + {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false, + floodColor: 'purple', floodOpacity: ['0.4']}); ctx.fillRect(210, 210, 80, 80); </script> diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html index 3a32eb6a55a..a4625db0197 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.tentative.html @@ -22,11 +22,11 @@ _addTest(function(canvas, ctx) { _assert(ctx.filter == 'none', "ctx.filter == 'none'"); ctx.filter = 'blur(5px)'; _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); -ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); +ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); ctx.filter = new CanvasFilter([ - {filter: "gaussianBlur", stdDeviation: 5}, - {filter: "gaussianBlur", stdDeviation: 10} + {filter: 'gaussianBlur', stdDeviation: 5}, + {filter: 'gaussianBlur', stdDeviation: 10} ]); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); var canvas2 = document.createElement('canvas'); @@ -37,8 +37,8 @@ ctx.filter = 'blur(5px)'; _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); ctx.filter = 'none'; _assert(ctx.filter == 'none', "ctx.filter == 'none'"); -ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); -ctx.filter = "this string is not a filter and should do nothing"; +ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); +ctx.filter = 'this string is not a filter and should do nothing'; _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); diff --git a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html index 1f9d978ac8c..64f909a7fdb 100644 --- a/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/element/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html @@ -27,7 +27,7 @@ const errorTestCases = [ {baseFrequency: Infinity}, {baseFrequency: undefined}, {baseFrequency: -Infinity}, - {baseFrequency: "test"}, + {baseFrequency: 'test'}, {numOctaves: {}}, {numOctaves: -1}, @@ -36,7 +36,7 @@ const errorTestCases = [ {numOctaves: undefined}, {numOctaves: -Infinity}, {numOctaves: [1, 1]}, - {numOctaves: "test"}, + {numOctaves: 'test'}, {seed: {}}, {seed: NaN}, @@ -44,7 +44,7 @@ const errorTestCases = [ {seed: undefined}, {seed: -Infinity}, {seed: [1, 1]}, - {seed: "test"}, + {seed: 'test'}, {stitchTiles: {}}, {stitchTiles: NaN}, @@ -52,14 +52,14 @@ const errorTestCases = [ {stitchTiles: undefined}, {stitchTiles: -Infinity}, {stitchTiles: [1, 1]}, - {stitchTiles: "test"}, + {stitchTiles: 'test'}, {stitchTiles: null}, {stitchTiles: []}, {stitchTiles: [10]}, {stitchTiles: 30}, {stitchTiles: false}, {stitchTiles: true}, - {stitchTiles: "10"}, + {stitchTiles: '10'}, {stitchTiles: -1}, {type: {}}, @@ -68,14 +68,14 @@ const errorTestCases = [ {type: undefined}, {type: -Infinity}, {type: [1, 1]}, - {type: "test"}, + {type: 'test'}, {type: null}, {type: []}, {type: [10]}, {type: 30}, {type: false}, {type: true}, - {type: "10"}, + {type: '10'}, {type: -1}, ] @@ -88,7 +88,7 @@ const workingTestCases = [ {baseFrequency: 30}, {baseFrequency: false}, {baseFrequency: true}, - {baseFrequency: "10"}, + {baseFrequency: '10'}, {numOctaves: null}, {numOctaves: []}, @@ -96,7 +96,7 @@ const workingTestCases = [ {numOctaves: 30}, {numOctaves: false}, {numOctaves: true}, - {numOctaves: "10"}, + {numOctaves: '10'}, {seed: null}, {seed: []}, @@ -104,23 +104,23 @@ const workingTestCases = [ {seed: 30}, {seed: false}, {seed: true}, - {seed: "10"}, + {seed: '10'}, {seed: -1}, - {stitchTiles: "stitch"}, - {stitchTiles: "noStitch"}, + {stitchTiles: 'stitch'}, + {stitchTiles: 'noStitch'}, - {type: "fractalNoise"}, - {type: "turbulence"}, + {type: 'fractalNoise'}, + {type: 'turbulence'}, ] for (testCase of errorTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); }); } for (testCase of workingTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; _assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null"); } diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html index 6ce6fb633f8..f5332780c82 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.html @@ -21,12 +21,12 @@ var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); await (function(canvas, ctx) { -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); }); })(canvas, ctx); t.done(); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js index a44868f585c..61f10308801 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.blur.exceptions.tentative.worker.js @@ -16,12 +16,12 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); }); -assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); }); +assert_throws_js(TypeError, function() { ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); }); t.done(); }); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html index 3eda41776c0..f3dd3037bb7 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.html @@ -21,44 +21,44 @@ var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); await (function(canvas, ctx) { -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: undefined}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: "foo"}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: null}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); }); -ctx.fillStyle = "#f00"; -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0}); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: undefined}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: null}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); }); +ctx.fillStyle = '#f00'; +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 255,0,0,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,91,0,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,109,109,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 109,18,255,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 155,27,27,255, 2); ctx.clearRect(0, 0, 100, 50); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,0,0,54, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [ +ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]}); ctx.fillRect(0, 0, 50, 25); -ctx.fillStyle = "#0f0"; +ctx.fillStyle = '#0f0'; ctx.fillRect(50, 0, 50, 25); -ctx.fillStyle = "#00f"; +ctx.fillStyle = '#00f'; ctx.fillRect(0, 25, 50, 25); -ctx.fillStyle = "#fff"; +ctx.fillStyle = '#fff'; ctx.fillRect(50, 25, 50, 25); _assertPixelApprox(canvas, 10,10, 0,255,0,255, 2); _assertPixelApprox(canvas, 60,10, 0,255,0,255, 2); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js index 105f312b9ce..19d57b61e53 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.colorMatrix.tentative.worker.js @@ -16,44 +16,44 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: undefined}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: "foo"}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: null}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); }); -ctx.fillStyle = "#f00"; -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0}); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: undefined}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: null}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); }); +ctx.fillStyle = '#f00'; +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 255,0,0,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,91,0,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,109,109,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 109,18,255,255, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 155,27,27,255, 2); ctx.clearRect(0, 0, 100, 50); -ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"}); +ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'}); ctx.fillRect(0, 0, 100, 50); _assertPixelApprox(canvas, 10,10, 0,0,0,54, 2); -ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [ +ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]}); ctx.fillRect(0, 0, 50, 25); -ctx.fillStyle = "#0f0"; +ctx.fillStyle = '#0f0'; ctx.fillRect(50, 0, 50, 25); -ctx.fillStyle = "#00f"; +ctx.fillStyle = '#00f'; ctx.fillRect(0, 25, 50, 25); -ctx.fillStyle = "#fff"; +ctx.fillStyle = '#fff'; ctx.fillRect(50, 25, 50, 25); _assertPixelApprox(canvas, 10,10, 0,255,0,255, 2); _assertPixelApprox(canvas, 60,10, 0,255,0,255, 2); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html index 7cb8b0dd143..dd6fc9ee5ff 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.html @@ -42,10 +42,10 @@ function getColor(inputColor, tableValues) { tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "discrete", tableValues: tableValuesR}, - funcG: {type: "discrete", tableValues: tableValuesG}, - funcB: {type: "discrete", tableValues: tableValuesB}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'discrete', tableValues: tableValuesR}, + funcG: {type: 'discrete', tableValues: tableValuesG}, + funcB: {type: 'discrete', tableValues: tableValuesB}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js index f1274f14253..79a5cd2475c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.discrete.tentative.worker.js @@ -37,10 +37,10 @@ function getColor(inputColor, tableValues) { tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "discrete", tableValues: tableValuesR}, - funcG: {type: "discrete", tableValues: tableValuesG}, - funcB: {type: "discrete", tableValues: tableValuesB}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'discrete', tableValues: tableValuesR}, + funcG: {type: 'discrete', tableValues: tableValuesG}, + funcB: {type: 'discrete', tableValues: tableValuesB}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html index 388fdca6f9d..f2a9fcfd49a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.html @@ -33,10 +33,10 @@ function getColor(inputColor, amplitude, exponent, offset) { const amplitudes = [2, 1.1, 0.5]; const exponents = [5, 3, 1]; const offsets = [0.25, 0, 0.5]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, - funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, - funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, + funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, + funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js index 14bf50f89dd..a36fa19a5ef 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.gamma.tentative.worker.js @@ -28,10 +28,10 @@ function getColor(inputColor, amplitude, exponent, offset) { const amplitudes = [2, 1.1, 0.5]; const exponents = [5, 3, 1]; const offsets = [0.25, 0, 0.5]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, - funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, - funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, + funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, + funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html index 44eb7184956..33aae01eb05 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.html @@ -21,10 +21,10 @@ var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); await (function(canvas, ctx) { -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "identity"}, - funcG: {type: "identity"}, - funcB: {type: "identity"}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'identity'}, + funcG: {type: 'identity'}, + funcB: {type: 'identity'}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js index ae749673f43..7236c7087a1 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.identity.tentative.worker.js @@ -16,10 +16,10 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "identity"}, - funcG: {type: "identity"}, - funcB: {type: "identity"}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'identity'}, + funcG: {type: 'identity'}, + funcB: {type: 'identity'}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html index d24a9e8608d..23731a1286c 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.html @@ -32,10 +32,10 @@ function getColor(inputColor, slopes, intercepts) { const slopes = [0.5, 1.2, -0.2]; const intercepts = [0.25, 0, 0.5]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]}, - funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]}, - funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]}, + funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]}, + funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js index 5117d4a1b3b..9a4499d4d6b 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.linear.tentative.worker.js @@ -27,10 +27,10 @@ function getColor(inputColor, slopes, intercepts) { const slopes = [0.5, 1.2, -0.2]; const intercepts = [0.25, 0, 0.5]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]}, - funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]}, - funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]}, + funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]}, + funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html index a704557cc54..c11e6adb910 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.html @@ -42,10 +42,10 @@ function getColor(inputColor, tableValues) { tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "table", tableValues: tableValuesR}, - funcG: {type: "table", tableValues: tableValuesG}, - funcB: {type: "table", tableValues: tableValuesB}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'table', tableValues: tableValuesR}, + funcG: {type: 'table', tableValues: tableValuesG}, + funcB: {type: 'table', tableValues: tableValuesB}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js index e2463eb9e76..8ff791d3bb9 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.componentTransfer.table.tentative.worker.js @@ -37,10 +37,10 @@ function getColor(inputColor, tableValues) { tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; -ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "table", tableValues: tableValuesR}, - funcG: {type: "table", tableValues: tableValuesG}, - funcB: {type: "table", tableValues: tableValuesB}, +ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'table', tableValues: tableValuesR}, + funcG: {type: 'table', tableValues: tableValuesG}, + funcB: {type: 'table', tableValues: tableValuesB}, }); const inputColors = [ diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html index 0a6bddc56d7..c4b6df8e0db 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.html @@ -21,23 +21,23 @@ var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); await (function(canvas, ctx) { -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix"}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", divisor: 2}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix'}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); }); // This should not throw an error -ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]}); -ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]}); +ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]}); +ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]}); })(canvas, ctx); t.done(); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js index bce4c0be158..f7e616e7a63 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative.worker.js @@ -16,23 +16,23 @@ t.step(function() { var canvas = new OffscreenCanvas(100, 50); var ctx = canvas.getContext('2d'); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix"}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", divisor: 2}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); }); -assert_throws_js(TypeError, function() { new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix'}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); }); +assert_throws_js(TypeError, function() { new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); }); // This should not throw an error -ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]}); -ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]}); +ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]}); +ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]}); t.done(); }); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html index 90f406fed9f..8327b5cad48 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative-expected.html @@ -4,71 +4,33 @@ <h1>2d.filter.canvasFilterObject.dropShadow.tentative</h1> <p class="desc">Test CanvasFilter() dropShadow object.</p> -<style> - .background { - background-color: teal; - position: absolute; - left: 0px; - width: 620px; - height: 50px; - } +<svg width=620 height=320 xmlns="http://www.w3.org/2000/svg"> + <rect x=0 y=0 width=100% height=50 fill="teal" /> + <rect x=0 y=100 width=100% height=50 fill="teal" /> + <rect x=0 y=200 width=100% height=50 fill="teal" /> - .testcase { - position: absolute; - background-color: crimson; - width: 80px; - height: 80px; - } -</style> + <rect x=10 y=10 width=80 height=80 fill="crimson" + style="filter: drop-shadow(2px 2px 2px black)"/> + <rect x=110 y=10 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7))"/> -<div style="position: relative"> - <div class='background' style="top: 0px;"></div> - <div class='background' style="top: 100px;"></div> - <div class='background' style="top: 200px;"></div> + <rect x=10 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(10px 10px 3px purple)"/> + <rect x=110 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px LinkText)"/> + <rect x=210 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(10px 15px 0px purple)"/> + <rect x=310 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/> + <rect x=410 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"/> + <rect x=510 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"/> - <div class='testcase' - style="left: 10px; top: 10px; - filter: drop-shadow(2px 2px 2px black);"> - </div> - <div class='testcase' - style="left: 110px; top: 10px; - filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7));"> - </div> - <div class='testcase' - style="left: 10px; top: 110px; - filter: drop-shadow(10px 10px 3px purple)"> - </div> - <div class='testcase' - style="left: 110px; top: 110px; - filter: drop-shadow(15px 10px 3px LinkText)"> - </div> - <div class='testcase' - style="left: 210px; top: 110px; - filter: drop-shadow(10px 15px 0px purple)"> - </div> - <div class='testcase' - style="left: 310px; top: 110px; - filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"> - </div> - <div class='testcase' - style="left: 410px; top: 110px; - filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"> - </div> - <div class='testcase' - style="left: 510px; top: 110px; - filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"> - </div> - - <div class='testcase' - style="left: 10px; top: 210px; - filter: drop-shadow(-5px 0px 0px purple);"> - </div> - <div class='testcase' - style="left: 110px; top: 210px; - filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8));"> - </div> - <div class='testcase' - style="left: 210px; top: 210px; - filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4));"> - </div> -</div> + <rect x=10 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(-5px 0px 0px purple)"/> + <rect x=110 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8))"/> + <rect x=210 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/> +</svg> diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html index 04cf86d204c..04326527905 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html @@ -19,65 +19,65 @@ ctx.fillStyle = 'crimson'; // Parameter defaults. - ctx.filter = new CanvasFilter({filter: "dropShadow"}); + ctx.filter = new CanvasFilter({filter: 'dropShadow'}); ctx.fillRect(10, 10, 80, 80); // All parameters specified. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5, - floodColor: "purple", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5, + floodColor: 'purple', floodOpacity: 0.7}); ctx.fillRect(110, 10, 80, 80); // Named color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3, + floodColor: 'purple'}); ctx.fillRect(10, 110, 80, 80); // System color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "LinkText"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'LinkText'}); ctx.fillRect(110, 110, 80, 80); // No blur. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0, + floodColor: 'purple'}); ctx.fillRect(210, 110, 80, 80); // Numerical color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 1)"}); + {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 1)'}); ctx.fillRect(310, 110, 80, 80); // Transparent floodColor. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)'}); ctx.fillRect(410, 110, 80, 80); // Transparent floodColor and floodOpacity. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}); ctx.fillRect(510, 110, 80, 80); // Degenerate parameter values. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null, - floodColor: "purple", floodOpacity: [2]}); + {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null, + floodColor: 'purple', floodOpacity: [2]}); ctx.fillRect(10, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5, - floodColor: "purple", floodOpacity: '0.8'}); + {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5, + floodColor: 'purple', floodOpacity: '0.8'}); ctx.fillRect(110, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false, - floodColor: "purple", floodOpacity: ['0.4']}); + {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false, + floodColor: 'purple', floodOpacity: ['0.4']}); ctx.fillRect(210, 210, 80, 80); const canvas = document.getElementById("canvas"); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html index 8d5e2da1586..de72f5fe3d9 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.w.html @@ -21,65 +21,65 @@ ctx.fillStyle = 'crimson'; // Parameter defaults. - ctx.filter = new CanvasFilter({filter: "dropShadow"}); + ctx.filter = new CanvasFilter({filter: 'dropShadow'}); ctx.fillRect(10, 10, 80, 80); // All parameters specified. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5, - floodColor: "purple", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5, + floodColor: 'purple', floodOpacity: 0.7}); ctx.fillRect(110, 10, 80, 80); // Named color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3, + floodColor: 'purple'}); ctx.fillRect(10, 110, 80, 80); // System color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "LinkText"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'LinkText'}); ctx.fillRect(110, 110, 80, 80); // No blur. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0, + floodColor: 'purple'}); ctx.fillRect(210, 110, 80, 80); // Numerical color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 1)"}); + {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 1)'}); ctx.fillRect(310, 110, 80, 80); // Transparent floodColor. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)'}); ctx.fillRect(410, 110, 80, 80); // Transparent floodColor and floodOpacity. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}); ctx.fillRect(510, 110, 80, 80); // Degenerate parameter values. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null, - floodColor: "purple", floodOpacity: [2]}); + {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null, + floodColor: 'purple', floodOpacity: [2]}); ctx.fillRect(10, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5, - floodColor: "purple", floodOpacity: '0.8'}); + {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5, + floodColor: 'purple', floodOpacity: '0.8'}); ctx.fillRect(110, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false, - floodColor: "purple", floodOpacity: ['0.4']}); + {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false, + floodColor: 'purple', floodOpacity: ['0.4']}); ctx.fillRect(210, 210, 80, 80); const bitmap = oc.transferToImageBitmap(); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html index 75d369cad2f..4d80dddf007 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.html @@ -24,11 +24,11 @@ await (function(canvas, ctx) { _assert(ctx.filter == 'none', "ctx.filter == 'none'"); ctx.filter = 'blur(5px)'; _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); -ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); +ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); ctx.filter = new CanvasFilter([ - {filter: "gaussianBlur", stdDeviation: 5}, - {filter: "gaussianBlur", stdDeviation: 10} + {filter: 'gaussianBlur', stdDeviation: 5}, + {filter: 'gaussianBlur', stdDeviation: 10} ]); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); var canvas2 = new OffscreenCanvas(100, 50); @@ -39,8 +39,8 @@ ctx.filter = 'blur(5px)'; _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); ctx.filter = 'none'; _assert(ctx.filter == 'none', "ctx.filter == 'none'"); -ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); -ctx.filter = "this string is not a filter and should do nothing"; +ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); +ctx.filter = 'this string is not a filter and should do nothing'; _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); })(canvas, ctx); t.done(); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js index 30772a39d10..48c4a0448d9 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.tentative.worker.js @@ -19,11 +19,11 @@ var ctx = canvas.getContext('2d'); _assert(ctx.filter == 'none', "ctx.filter == 'none'"); ctx.filter = 'blur(5px)'; _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); -ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); +ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); ctx.filter = new CanvasFilter([ - {filter: "gaussianBlur", stdDeviation: 5}, - {filter: "gaussianBlur", stdDeviation: 10} + {filter: 'gaussianBlur', stdDeviation: 5}, + {filter: 'gaussianBlur', stdDeviation: 10} ]); _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); var canvas2 = new OffscreenCanvas(100, 50); @@ -34,8 +34,8 @@ ctx.filter = 'blur(5px)'; _assert(ctx.filter == 'blur(5px)', "ctx.filter == 'blur(5px)'"); ctx.filter = 'none'; _assert(ctx.filter == 'none', "ctx.filter == 'none'"); -ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); -ctx.filter = "this string is not a filter and should do nothing"; +ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); +ctx.filter = 'this string is not a filter and should do nothing'; _assert(ctx.filter.toString() == '[object CanvasFilter]', "ctx.filter.toString() == '[object CanvasFilter]'"); t.done(); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html index 610dca9feaf..2ed61e66d03 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.html @@ -29,7 +29,7 @@ const errorTestCases = [ {baseFrequency: Infinity}, {baseFrequency: undefined}, {baseFrequency: -Infinity}, - {baseFrequency: "test"}, + {baseFrequency: 'test'}, {numOctaves: {}}, {numOctaves: -1}, @@ -38,7 +38,7 @@ const errorTestCases = [ {numOctaves: undefined}, {numOctaves: -Infinity}, {numOctaves: [1, 1]}, - {numOctaves: "test"}, + {numOctaves: 'test'}, {seed: {}}, {seed: NaN}, @@ -46,7 +46,7 @@ const errorTestCases = [ {seed: undefined}, {seed: -Infinity}, {seed: [1, 1]}, - {seed: "test"}, + {seed: 'test'}, {stitchTiles: {}}, {stitchTiles: NaN}, @@ -54,14 +54,14 @@ const errorTestCases = [ {stitchTiles: undefined}, {stitchTiles: -Infinity}, {stitchTiles: [1, 1]}, - {stitchTiles: "test"}, + {stitchTiles: 'test'}, {stitchTiles: null}, {stitchTiles: []}, {stitchTiles: [10]}, {stitchTiles: 30}, {stitchTiles: false}, {stitchTiles: true}, - {stitchTiles: "10"}, + {stitchTiles: '10'}, {stitchTiles: -1}, {type: {}}, @@ -70,14 +70,14 @@ const errorTestCases = [ {type: undefined}, {type: -Infinity}, {type: [1, 1]}, - {type: "test"}, + {type: 'test'}, {type: null}, {type: []}, {type: [10]}, {type: 30}, {type: false}, {type: true}, - {type: "10"}, + {type: '10'}, {type: -1}, ] @@ -90,7 +90,7 @@ const workingTestCases = [ {baseFrequency: 30}, {baseFrequency: false}, {baseFrequency: true}, - {baseFrequency: "10"}, + {baseFrequency: '10'}, {numOctaves: null}, {numOctaves: []}, @@ -98,7 +98,7 @@ const workingTestCases = [ {numOctaves: 30}, {numOctaves: false}, {numOctaves: true}, - {numOctaves: "10"}, + {numOctaves: '10'}, {seed: null}, {seed: []}, @@ -106,23 +106,23 @@ const workingTestCases = [ {seed: 30}, {seed: false}, {seed: true}, - {seed: "10"}, + {seed: '10'}, {seed: -1}, - {stitchTiles: "stitch"}, - {stitchTiles: "noStitch"}, + {stitchTiles: 'stitch'}, + {stitchTiles: 'noStitch'}, - {type: "fractalNoise"}, - {type: "turbulence"}, + {type: 'fractalNoise'}, + {type: 'turbulence'}, ] for (testCase of errorTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); }); } for (testCase of workingTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; _assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null"); } })(canvas, ctx); diff --git a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js index 76673fab9a7..1bed65ad156 100644 --- a/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js +++ b/tests/wpt/web-platform-tests/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.turbulence.inputTypes.tentative.worker.js @@ -24,7 +24,7 @@ const errorTestCases = [ {baseFrequency: Infinity}, {baseFrequency: undefined}, {baseFrequency: -Infinity}, - {baseFrequency: "test"}, + {baseFrequency: 'test'}, {numOctaves: {}}, {numOctaves: -1}, @@ -33,7 +33,7 @@ const errorTestCases = [ {numOctaves: undefined}, {numOctaves: -Infinity}, {numOctaves: [1, 1]}, - {numOctaves: "test"}, + {numOctaves: 'test'}, {seed: {}}, {seed: NaN}, @@ -41,7 +41,7 @@ const errorTestCases = [ {seed: undefined}, {seed: -Infinity}, {seed: [1, 1]}, - {seed: "test"}, + {seed: 'test'}, {stitchTiles: {}}, {stitchTiles: NaN}, @@ -49,14 +49,14 @@ const errorTestCases = [ {stitchTiles: undefined}, {stitchTiles: -Infinity}, {stitchTiles: [1, 1]}, - {stitchTiles: "test"}, + {stitchTiles: 'test'}, {stitchTiles: null}, {stitchTiles: []}, {stitchTiles: [10]}, {stitchTiles: 30}, {stitchTiles: false}, {stitchTiles: true}, - {stitchTiles: "10"}, + {stitchTiles: '10'}, {stitchTiles: -1}, {type: {}}, @@ -65,14 +65,14 @@ const errorTestCases = [ {type: undefined}, {type: -Infinity}, {type: [1, 1]}, - {type: "test"}, + {type: 'test'}, {type: null}, {type: []}, {type: [10]}, {type: 30}, {type: false}, {type: true}, - {type: "10"}, + {type: '10'}, {type: -1}, ] @@ -85,7 +85,7 @@ const workingTestCases = [ {baseFrequency: 30}, {baseFrequency: false}, {baseFrequency: true}, - {baseFrequency: "10"}, + {baseFrequency: '10'}, {numOctaves: null}, {numOctaves: []}, @@ -93,7 +93,7 @@ const workingTestCases = [ {numOctaves: 30}, {numOctaves: false}, {numOctaves: true}, - {numOctaves: "10"}, + {numOctaves: '10'}, {seed: null}, {seed: []}, @@ -101,23 +101,23 @@ const workingTestCases = [ {seed: 30}, {seed: false}, {seed: true}, - {seed: "10"}, + {seed: '10'}, {seed: -1}, - {stitchTiles: "stitch"}, - {stitchTiles: "noStitch"}, + {stitchTiles: 'stitch'}, + {stitchTiles: 'noStitch'}, - {type: "fractalNoise"}, - {type: "turbulence"}, + {type: 'fractalNoise'}, + {type: 'turbulence'}, ] for (testCase of errorTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; assert_throws_js(TypeError, function() { new CanvasFilter(filterOptions); }); } for (testCase of workingTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; _assert(new CanvasFilter(filterOptions) != null, "new CanvasFilter(filterOptions) != null"); } t.done(); diff --git a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml index bdf3dcfe9fc..246b73e7f1a 100644 --- a/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml +++ b/tests/wpt/web-platform-tests/html/canvas/tools/yaml-new/filters.yaml @@ -40,11 +40,11 @@ @assert ctx.filter == 'none'; ctx.filter = 'blur(5px)'; @assert ctx.filter == 'blur(5px)'; - ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); + ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); @assert ctx.filter.toString() == '[object CanvasFilter]'; ctx.filter = new CanvasFilter([ - {filter: "gaussianBlur", stdDeviation: 5}, - {filter: "gaussianBlur", stdDeviation: 10} + {filter: 'gaussianBlur', stdDeviation: 5}, + {filter: 'gaussianBlur', stdDeviation: 10} ]); @assert ctx.filter.toString() == '[object CanvasFilter]'; var canvas2 = document.createElement('canvas'); @@ -55,8 +55,8 @@ @assert ctx.filter == 'blur(5px)'; ctx.filter = 'none'; @assert ctx.filter == 'none'; - ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); - ctx.filter = "this string is not a filter and should do nothing"; + ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); + ctx.filter = 'this string is not a filter and should do nothing'; @assert ctx.filter.toString() == '[object CanvasFilter]'; - name: 2d.filter.canvasFilterObject.tentative @@ -66,11 +66,11 @@ @assert ctx.filter == 'none'; ctx.filter = 'blur(5px)'; @assert ctx.filter == 'blur(5px)'; - ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); + ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); @assert ctx.filter.toString() == '[object CanvasFilter]'; ctx.filter = new CanvasFilter([ - {filter: "gaussianBlur", stdDeviation: 5}, - {filter: "gaussianBlur", stdDeviation: 10} + {filter: 'gaussianBlur', stdDeviation: 5}, + {filter: 'gaussianBlur', stdDeviation: 10} ]); @assert ctx.filter.toString() == '[object CanvasFilter]'; var canvas2 = new OffscreenCanvas(100, 50); @@ -81,61 +81,61 @@ @assert ctx.filter == 'blur(5px)'; ctx.filter = 'none'; @assert ctx.filter == 'none'; - ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: 5}); - ctx.filter = "this string is not a filter and should do nothing"; + ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 5}); + ctx.filter = 'this string is not a filter and should do nothing'; @assert ctx.filter.toString() == '[object CanvasFilter]'; - name: 2d.filter.canvasFilterObject.blur.exceptions.tentative desc: Test exceptions on CanvasFilter() blur.object code: | - @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur"}); - @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: undefined}); - @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: "foo"}); - @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: [1,2]}); - @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: NaN}); - @assert throws TypeError ctx.filter = new CanvasFilter({filter: "gaussianBlur", stdDeviation: {}}); + @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur'}); + @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: undefined}); + @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: 'foo'}); + @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: [1,2]}); + @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: NaN}); + @assert throws TypeError ctx.filter = new CanvasFilter({filter: 'gaussianBlur', stdDeviation: {}}); - name: 2d.filter.canvasFilterObject.colorMatrix.tentative desc: Test the functionality of ColorMatrix filters in CanvasFilter objects code: | - @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: undefined}); - @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: "foo"}); - @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: null}); - @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3]}); - @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, "a"]}); - @assert throws TypeError new CanvasFilter({filter: "colorMatrix", values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); - ctx.fillStyle = "#f00"; - ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 0}); + @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: undefined}); + @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: 'foo'}); + @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: null}); + @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3]}); + @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 'a']}); + @assert throws TypeError new CanvasFilter({filter: 'colorMatrix', values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, Infinity]}); + ctx.fillStyle = '#f00'; + ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 0}); ctx.fillRect(0, 0, 100, 50); @assert pixel 10,10 ==~ 255,0,0,255; - ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 90}); + ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 90}); ctx.fillRect(0, 0, 100, 50); @assert pixel 10,10 ==~ 0,91,0,255; - ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 180}); + ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 180}); ctx.fillRect(0, 0, 100, 50); @assert pixel 10,10 ==~ 0,109,109,255; - ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "hueRotate", values: 270}); + ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'hueRotate', values: 270}); ctx.fillRect(0, 0, 100, 50); @assert pixel 10,10 ==~ 109,18,255,255; - ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "saturate", values: 0.5}); + ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'saturate', values: 0.5}); ctx.fillRect(0, 0, 100, 50); @assert pixel 10,10 ==~ 155,27,27,255; ctx.clearRect(0, 0, 100, 50); - ctx.filter = new CanvasFilter({filter: "colorMatrix", type: "luminanceToAlpha"}); + ctx.filter = new CanvasFilter({filter: 'colorMatrix', type: 'luminanceToAlpha'}); ctx.fillRect(0, 0, 100, 50); @assert pixel 10,10 ==~ 0,0,0,54; - ctx.filter = new CanvasFilter({filter: "colorMatrix", values: [ + ctx.filter = new CanvasFilter({filter: 'colorMatrix', values: [ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]}); ctx.fillRect(0, 0, 50, 25); - ctx.fillStyle = "#0f0"; + ctx.fillStyle = '#0f0'; ctx.fillRect(50, 0, 50, 25); - ctx.fillStyle = "#00f"; + ctx.fillStyle = '#00f'; ctx.fillRect(0, 25, 50, 25); - ctx.fillStyle = "#fff"; + ctx.fillStyle = '#fff'; ctx.fillRect(50, 25, 50, 25); @assert pixel 10,10 ==~ 0,255,0,255; @assert pixel 60,10 ==~ 0,255,0,255; @@ -145,23 +145,23 @@ - name: 2d.filter.canvasFilterObject.convolveMatrix.exceptions.tentative desc: Test exceptions on CanvasFilter() convolveMatrix code: | - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix"}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", divisor: 2}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: null}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: 1}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0]]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, "a"], [0]]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], 0]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 0], [0, Infinity]]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: []}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [1, 2, 3, 4]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], []]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1, 2], []]}); - @assert throws TypeError new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[], [1, 2]]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix'}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', divisor: 2}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: null}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: 1}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0]]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 'a'], [0]]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], 0]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 0], [0, Infinity]]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: []}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [1, 2, 3, 4]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], []]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1, 2], []]}); + @assert throws TypeError new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[], [1, 2]]}); // This should not throw an error - ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[]]}); - ctx.filter = new CanvasFilter({filter: "convolveMatrix", kernelMatrix: [[1]]}); + ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[]]}); + ctx.filter = new CanvasFilter({filter: 'convolveMatrix', kernelMatrix: [[1]]}); - name: 2d.filter.canvasFilterObject.componentTransfer.linear.tentative desc: Test pixels on CanvasFilter() componentTransfer with linear type @@ -177,10 +177,10 @@ const slopes = [0.5, 1.2, -0.2]; const intercepts = [0.25, 0, 0.5]; - ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "linear", slope: slopes[0], intercept: intercepts[0]}, - funcG: {type: "linear", slope: slopes[1], intercept: intercepts[1]}, - funcB: {type: "linear", slope: slopes[2], intercept: intercepts[2]}, + ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'linear', slope: slopes[0], intercept: intercepts[0]}, + funcG: {type: 'linear', slope: slopes[1], intercept: intercepts[1]}, + funcB: {type: 'linear', slope: slopes[2], intercept: intercepts[2]}, }); const inputColors = [ @@ -201,10 +201,10 @@ - name: 2d.filter.canvasFilterObject.componentTransfer.identity.tentative desc: Test pixels on CanvasFilter() componentTransfer with identity type code: | - ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "identity"}, - funcG: {type: "identity"}, - funcB: {type: "identity"}, + ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'identity'}, + funcG: {type: 'identity'}, + funcB: {type: 'identity'}, }); const inputColors = [ @@ -236,10 +236,10 @@ const amplitudes = [2, 1.1, 0.5]; const exponents = [5, 3, 1]; const offsets = [0.25, 0, 0.5]; - ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "gamma", amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, - funcG: {type: "gamma", amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, - funcB: {type: "gamma", amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, + ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'gamma', amplitude: amplitudes[0], exponent: exponents[0], offset: offsets[0]}, + funcG: {type: 'gamma', amplitude: amplitudes[1], exponent: exponents[1], offset: offsets[1]}, + funcB: {type: 'gamma', amplitude: amplitudes[2], exponent: exponents[2], offset: offsets[2]}, }); const inputColors = [ @@ -281,10 +281,10 @@ tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; - ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "table", tableValues: tableValuesR}, - funcG: {type: "table", tableValues: tableValuesG}, - funcB: {type: "table", tableValues: tableValuesB}, + ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'table', tableValues: tableValuesR}, + funcG: {type: 'table', tableValues: tableValuesG}, + funcB: {type: 'table', tableValues: tableValuesB}, }); const inputColors = [ @@ -326,10 +326,10 @@ tableValuesR = [0, 0, 1, 1]; tableValuesG = [2, 0, 0.5, 3]; tableValuesB = [1, -1, 5, 0]; - ctx.filter = new CanvasFilter({filter: "componentTransfer", - funcR: {type: "discrete", tableValues: tableValuesR}, - funcG: {type: "discrete", tableValues: tableValuesG}, - funcB: {type: "discrete", tableValues: tableValuesB}, + ctx.filter = new CanvasFilter({filter: 'componentTransfer', + funcR: {type: 'discrete', tableValues: tableValuesR}, + funcG: {type: 'discrete', tableValues: tableValuesG}, + funcB: {type: 'discrete', tableValues: tableValuesB}, }); const inputColors = [ @@ -359,135 +359,97 @@ ctx.fillStyle = 'crimson'; // Parameter defaults. - ctx.filter = new CanvasFilter({filter: "dropShadow"}); + ctx.filter = new CanvasFilter({filter: 'dropShadow'}); ctx.fillRect(10, 10, 80, 80); // All parameters specified. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 5, - floodColor: "purple", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 5, + floodColor: 'purple', floodOpacity: 0.7}); ctx.fillRect(110, 10, 80, 80); // Named color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 10, stdDeviation: 3, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 10, stdDeviation: 3, + floodColor: 'purple'}); ctx.fillRect(10, 110, 80, 80); // System color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "LinkText"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'LinkText'}); ctx.fillRect(110, 110, 80, 80); // No blur. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 10, dy: 15, stdDeviation: 0, - floodColor: "purple"}); + {filter: 'dropShadow', dx: 10, dy: 15, stdDeviation: 0, + floodColor: 'purple'}); ctx.fillRect(210, 110, 80, 80); // Numerical color. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 9, dy: 12, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 1)"}); + {filter: 'dropShadow', dx: 9, dy: 12, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 1)'}); ctx.fillRect(310, 110, 80, 80); // Transparent floodColor. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)"}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)'}); ctx.fillRect(410, 110, 80, 80); // Transparent floodColor and floodOpacity. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: 15, dy: 10, stdDeviation: 3, - floodColor: "rgba(20, 50, 130, 0.7)", floodOpacity: 0.7}); + {filter: 'dropShadow', dx: 15, dy: 10, stdDeviation: 3, + floodColor: 'rgba(20, 50, 130, 0.7)', floodOpacity: 0.7}); ctx.fillRect(510, 110, 80, 80); // Degenerate parameter values. ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: [-5], dy: [], stdDeviation: null, - floodColor: "purple", floodOpacity: [2]}); + {filter: 'dropShadow', dx: [-5], dy: [], stdDeviation: null, + floodColor: 'purple', floodOpacity: [2]}); ctx.fillRect(10, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: null, dy: '5', stdDeviation: -5, - floodColor: "purple", floodOpacity: '0.8'}); + {filter: 'dropShadow', dx: null, dy: '5', stdDeviation: -5, + floodColor: 'purple', floodOpacity: '0.8'}); ctx.fillRect(110, 210, 80, 80); ctx.filter = new CanvasFilter( - {filter: "dropShadow", dx: true, dy: ['10'], stdDeviation: false, - floodColor: "purple", floodOpacity: ['0.4']}); + {filter: 'dropShadow', dx: true, dy: ['10'], stdDeviation: false, + floodColor: 'purple', floodOpacity: ['0.4']}); ctx.fillRect(210, 210, 80, 80); html_reference: | - <style> - .background { - background-color: teal; - position: absolute; - left: 0px; - width: 620px; - height: 50px; - } - - .testcase { - position: absolute; - background-color: crimson; - width: 80px; - height: 80px; - } - </style> - - <div style="position: relative"> - <div class='background' style="top: 0px;"></div> - <div class='background' style="top: 100px;"></div> - <div class='background' style="top: 200px;"></div> - - <div class='testcase' - style="left: 10px; top: 10px; - filter: drop-shadow(2px 2px 2px black);"> - </div> - <div class='testcase' - style="left: 110px; top: 10px; - filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7));"> - </div> - <div class='testcase' - style="left: 10px; top: 110px; - filter: drop-shadow(10px 10px 3px purple)"> - </div> - <div class='testcase' - style="left: 110px; top: 110px; - filter: drop-shadow(15px 10px 3px LinkText)"> - </div> - <div class='testcase' - style="left: 210px; top: 110px; - filter: drop-shadow(10px 15px 0px purple)"> - </div> - <div class='testcase' - style="left: 310px; top: 110px; - filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"> - </div> - <div class='testcase' - style="left: 410px; top: 110px; - filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"> - </div> - <div class='testcase' - style="left: 510px; top: 110px; - filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"> - </div> - - <div class='testcase' - style="left: 10px; top: 210px; - filter: drop-shadow(-5px 0px 0px purple);"> - </div> - <div class='testcase' - style="left: 110px; top: 210px; - filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8));"> - </div> - <div class='testcase' - style="left: 210px; top: 210px; - filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4));"> - </div> - </div> + <svg width=620 height=320 xmlns="http://www.w3.org/2000/svg"> + <rect x=0 y=0 width=100% height=50 fill="teal" /> + <rect x=0 y=100 width=100% height=50 fill="teal" /> + <rect x=0 y=200 width=100% height=50 fill="teal" /> + + <rect x=10 y=10 width=80 height=80 fill="crimson" + style="filter: drop-shadow(2px 2px 2px black)"/> + <rect x=110 y=10 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 5px rgba(128, 0, 128, 0.7))"/> + + <rect x=10 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(10px 10px 3px purple)"/> + <rect x=110 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px LinkText)"/> + <rect x=210 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(10px 15px 0px purple)"/> + <rect x=310 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(9px 12px 3px rgba(20, 50, 130, 1))"/> + <rect x=410 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.7))"/> + <rect x=510 y=110 width=80 height=80 fill="crimson" + style="filter: drop-shadow(15px 10px 3px rgba(20, 50, 130, 0.49))"/> + + <rect x=10 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(-5px 0px 0px purple)"/> + <rect x=110 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(0px 5px 0px rgba(128, 0, 128, 0.8))"/> + <rect x=210 y=210 width=80 height=80 fill="crimson" + style="filter: drop-shadow(1px 10px 0px rgba(128, 0, 128, 0.4))"/> + </svg> - name: 2d.filter.canvasFilterObject.dropShadow.exceptions.tentative desc: Test exceptions on CanvasFilter() dropShadow object @@ -521,7 +483,7 @@ {baseFrequency: Infinity}, {baseFrequency: undefined}, {baseFrequency: -Infinity}, - {baseFrequency: "test"}, + {baseFrequency: 'test'}, {numOctaves: {}}, {numOctaves: -1}, @@ -530,7 +492,7 @@ {numOctaves: undefined}, {numOctaves: -Infinity}, {numOctaves: [1, 1]}, - {numOctaves: "test"}, + {numOctaves: 'test'}, {seed: {}}, {seed: NaN}, @@ -538,7 +500,7 @@ {seed: undefined}, {seed: -Infinity}, {seed: [1, 1]}, - {seed: "test"}, + {seed: 'test'}, {stitchTiles: {}}, {stitchTiles: NaN}, @@ -546,14 +508,14 @@ {stitchTiles: undefined}, {stitchTiles: -Infinity}, {stitchTiles: [1, 1]}, - {stitchTiles: "test"}, + {stitchTiles: 'test'}, {stitchTiles: null}, {stitchTiles: []}, {stitchTiles: [10]}, {stitchTiles: 30}, {stitchTiles: false}, {stitchTiles: true}, - {stitchTiles: "10"}, + {stitchTiles: '10'}, {stitchTiles: -1}, {type: {}}, @@ -562,14 +524,14 @@ {type: undefined}, {type: -Infinity}, {type: [1, 1]}, - {type: "test"}, + {type: 'test'}, {type: null}, {type: []}, {type: [10]}, {type: 30}, {type: false}, {type: true}, - {type: "10"}, + {type: '10'}, {type: -1}, ] @@ -582,7 +544,7 @@ {baseFrequency: 30}, {baseFrequency: false}, {baseFrequency: true}, - {baseFrequency: "10"}, + {baseFrequency: '10'}, {numOctaves: null}, {numOctaves: []}, @@ -590,7 +552,7 @@ {numOctaves: 30}, {numOctaves: false}, {numOctaves: true}, - {numOctaves: "10"}, + {numOctaves: '10'}, {seed: null}, {seed: []}, @@ -598,22 +560,22 @@ {seed: 30}, {seed: false}, {seed: true}, - {seed: "10"}, + {seed: '10'}, {seed: -1}, - {stitchTiles: "stitch"}, - {stitchTiles: "noStitch"}, + {stitchTiles: 'stitch'}, + {stitchTiles: 'noStitch'}, - {type: "fractalNoise"}, - {type: "turbulence"}, + {type: 'fractalNoise'}, + {type: 'turbulence'}, ] for (testCase of errorTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; @assert throws TypeError new CanvasFilter(filterOptions); } for (testCase of workingTestCases) { - const filterOptions = {...{filter: "turbulence"}, ...testCase}; + const filterOptions = {...{filter: 'turbulence'}, ...testCase}; @assert new CanvasFilter(filterOptions) != null; } diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html index 144217df384..ac82e3396d6 100644 --- a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name.html +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-1.html @@ -12,7 +12,12 @@ // This creates a test() assert_root_color_scheme("dark", "<meta> set the color-scheme to dark"); - test(() => { - assert_equals(document.querySelector(":root:lang(dark)"), document.documentElement); - }, "<meta> set the content-language to dark"); + // We can't test content-language against :lang(), because CSS Selectors 4 + // references BCP 47 syntax and RFC4647 "Matching of Language Tags", but + // "dark" is not a well-formed BCP 47 tag and therefore cannot be matched. + // Therefore, the test that content-language gets set is split off to a + // separate testcase using a well-formed lang tag as the content. + // test(() => { + // assert_equals(document.querySelector(":root:lang(dark)"), document.documentElement); + // }, "<meta> set the content-language to dark"); </script> diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html new file mode 100644 index 00000000000..b73013a341b --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/http-equiv-and-name-2.html @@ -0,0 +1,13 @@ +<!doctype html> +<title>Setting both http-equiv and name attributes on a meta element</title> +<meta http-equiv=content-language name=color-scheme content=de-DE> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + // We don't attempt to test the color-scheme here because "de-DE" is not a valid + // value for it. + + test(() => { + assert_equals(document.querySelector(":root:lang(de-DE)"), document.documentElement); + }, "<meta> set the content-language to de-DE"); +</script> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html index 3933b93894b..171829d90f3 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed-ref.tentative.html @@ -4,12 +4,7 @@ <link rel="stylesheet" href="/fonts/ahem.css"> <selectmenu id="selectMenu0"> - <div popover slot="listbox" behavior="listbox"> - <option> - option with image displayed - <img src="/images/green-256x256.png"> - </option> - </div> + <option>option with image displayed</option> </selectmenu> <div id=fakelistbox> option with image displayed @@ -17,15 +12,16 @@ </div> <style> - html { + html,selectmenu { font-family: Ahem; } #fakelistbox { /* Per spec: */ display: block; position: fixed; - top: 20px; + top: 30px; left: 0; + font-size: 0.765625em /* 0.875 * 0.875 */; /* Per settings in test file: */ width: fit-content; height: fit-content; @@ -43,6 +39,6 @@ position: absolute; top: 0px; left: 0px; - height: 20px; + height: 30px; } </style> diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html index 0fad1a1918f..05bc651cb7c 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/selectmenu-option-arbitrary-content-displayed.tentative.html @@ -9,14 +9,14 @@ <script src="/resources/testdriver-vendor.js"></script> <style> - html { + html,selectmenu { font-family: Ahem; } selectmenu { position: absolute; top: 0px; left: 0px; - height: 20px; + height: 30px; } [popover] { diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js index cf3864a2940..84fe5285617 100644 --- a/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-selectmenu-element/support/fake-selectmenu.js @@ -10,17 +10,21 @@ function createFakeSelectmenu(selectedValueText) { <style> .fake-selectmenu { display: inline-block; + user-select: none; + font-family: sans-serif; + font-size: .875em; } .fake-selectmenu-internal-selectmenu-button { display: inline-flex; align-items: center; - background-color: #ffffff; - padding: 0 0 0 3px; - border: 1px solid #767676; - border-radius: 2px; cursor: default; appearance: none; + background-color: Field; + color: ButtonText; + border: 1px solid ButtonBorder; + border-radius: 0.25em; + padding: 0.25em; } .fake-selectmenu-internal-selectmenu-button-icon { diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini index f0041b0aa29..60d2e38ecad 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/server/webtransport-h3.https.sub.any.js.ini @@ -1,31 +1,29 @@ [webtransport-h3.https.sub.any.html] - disabled: - if product == "firefox": times out [WebTransport server should be running and should handle a bidirectional stream] expected: - if product == "chrome": PASS + if product == "chrome" or product == "firefox": PASS + FAIL + +[webtransport-h3.https.sub.any.window.html] + [WebTransport server should be running and should handle a bidirectional stream] + expected: + if product == "chrome" or product == "firefox": PASS FAIL [webtransport-h3.https.sub.any.worker.html] - disabled: - if product == "firefox": times out [WebTransport server should be running and should handle a bidirectional stream] expected: - if product == "chrome": PASS + if product == "chrome" or product == "firefox": PASS FAIL [webtransport-h3.https.sub.any.sharedworker.html] - disabled: - if product == "firefox": times out [WebTransport server should be running and should handle a bidirectional stream] expected: - if product == "chrome": PASS + if product == "chrome" or product == "firefox": PASS FAIL [webtransport-h3.https.sub.any.serviceworker.html] - disabled: - if product == "firefox": times out [WebTransport server should be running and should handle a bidirectional stream] expected: - if product == "chrome": PASS + if product == "chrome" or product == "firefox": PASS FAIL diff --git a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini index 647b875e5b0..5632dcf1129 100644 --- a/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini +++ b/tests/wpt/web-platform-tests/infrastructure/metadata/infrastructure/testdriver/actions/wheelScroll.html.ini @@ -1,3 +1,3 @@ [wheelScroll.html] expected: - if product == "firefox" or product == "epiphany": ERROR + if product == "epiphany": ERROR diff --git a/tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl b/tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl deleted file mode 100644 index 18d1c02a11a..00000000000 --- a/tests/wpt/web-platform-tests/interfaces/EXT_clip_cull_distance.idl +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATED CONTENT - DO NOT EDIT -// Content was automatically extracted by Reffy into webref -// (https://github.com/w3c/webref) -// Source: WebGL EXT_clip_cull_distance Extension Draft Specification (https://registry.khronos.org/webgl/extensions/EXT_clip_cull_distance/) - -[Exposed=(Window,Worker), LegacyNoInterfaceObject] -interface EXT_clip_cull_distance { - const GLenum MAX_CLIP_DISTANCES_EXT = 0x0D32; - const GLenum MAX_CULL_DISTANCES_EXT = 0x82F9; - const GLenum MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT = 0x82FA; - - const GLenum CLIP_DISTANCE0_EXT = 0x3000; - const GLenum CLIP_DISTANCE1_EXT = 0x3001; - const GLenum CLIP_DISTANCE2_EXT = 0x3002; - const GLenum CLIP_DISTANCE3_EXT = 0x3003; - const GLenum CLIP_DISTANCE4_EXT = 0x3004; - const GLenum CLIP_DISTANCE5_EXT = 0x3005; - const GLenum CLIP_DISTANCE6_EXT = 0x3006; - const GLenum CLIP_DISTANCE7_EXT = 0x3007; -}; diff --git a/tests/wpt/web-platform-tests/interfaces/FedCM.idl b/tests/wpt/web-platform-tests/interfaces/FedCM.idl index b3ddb54e0c6..8de87e88b05 100644 --- a/tests/wpt/web-platform-tests/interfaces/FedCM.idl +++ b/tests/wpt/web-platform-tests/interfaces/FedCM.idl @@ -3,6 +3,25 @@ // (https://github.com/w3c/webref) // Source: Federated Credential Management API (https://fedidcg.github.io/FedCM/) +[Exposed=Window, SecureContext] +interface IdentityCredential : Credential { + readonly attribute USVString? token; +}; + +partial dictionary CredentialRequestOptions { + IdentityCredentialRequestOptions identity; +}; + +dictionary IdentityCredentialRequestOptions { + sequence<IdentityProviderConfig> providers; +}; + +dictionary IdentityProviderConfig { + required USVString configURL; + required USVString clientId; + USVString nonce; +}; + dictionary IdentityProviderWellKnown { required sequence<USVString> provider_urls; }; @@ -16,6 +35,7 @@ dictionary IdentityProviderBranding { USVString background_color; USVString color; sequence<IdentityProviderIcon> icons; + USVString name; }; dictionary IdentityProviderAPIConfig { @@ -30,52 +50,18 @@ dictionary IdentityProviderAccount { required USVString name; required USVString email; USVString given_name; + USVString picture; sequence<USVString> approved_clients; }; dictionary IdentityProviderAccountList { sequence<IdentityProviderAccount> accounts; }; -dictionary IdentityProviderClientMetadata { - USVString privacy_policy_url; - USVString terms_of_service_url; -}; - dictionary IdentityProviderToken { required USVString token; }; -[Exposed=Window, SecureContext] -interface IdentityCredential : Credential { - readonly attribute USVString? token; -}; - -partial dictionary CredentialRequestOptions { - IdentityCredentialRequestOptions identity; -}; - -dictionary IdentityCredentialRequestOptions { - sequence<IdentityProviderConfig> providers; -}; - -dictionary IdentityProviderConfig { - required USVString configURL; - required USVString clientId; - USVString nonce; -}; - -dictionary IdentityCredentialLogoutRPsRequest { - required USVString url; - required USVString accountId; -}; - -[Exposed=Window, SecureContext] -partial interface IdentityCredential { - static Promise<undefined> logoutRPs(sequence<IdentityCredentialLogoutRPsRequest> logoutRequests); -}; - -[Exposed=Window, SecureContext] -interface IdentityProvider { - static undefined login(); - static undefined logout(); +dictionary IdentityProviderClientMetadata { + USVString privacy_policy_url; + USVString terms_of_service_url; }; diff --git a/tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl b/tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl new file mode 100644 index 00000000000..46fa921fd53 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/WEBGL_clip_cull_distance.idl @@ -0,0 +1,20 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: WebGL WEBGL_clip_cull_distance Extension Draft Specification (https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/) + +[Exposed=(Window,Worker), LegacyNoInterfaceObject] +interface WEBGL_clip_cull_distance { + const GLenum MAX_CLIP_DISTANCES_WEBGL = 0x0D32; + const GLenum MAX_CULL_DISTANCES_WEBGL = 0x82F9; + const GLenum MAX_COMBINED_CLIP_AND_CULL_DISTANCES_WEBGL = 0x82FA; + + const GLenum CLIP_DISTANCE0_WEBGL = 0x3000; + const GLenum CLIP_DISTANCE1_WEBGL = 0x3001; + const GLenum CLIP_DISTANCE2_WEBGL = 0x3002; + const GLenum CLIP_DISTANCE3_WEBGL = 0x3003; + const GLenum CLIP_DISTANCE4_WEBGL = 0x3004; + const GLenum CLIP_DISTANCE5_WEBGL = 0x3005; + const GLenum CLIP_DISTANCE6_WEBGL = 0x3006; + const GLenum CLIP_DISTANCE7_WEBGL = 0x3007; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl b/tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl new file mode 100644 index 00000000000..035e1d233d6 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/WEBGL_provoking_vertex.idl @@ -0,0 +1,13 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: WebGL WEBGL_provoking_vertex Extension Specification (https://registry.khronos.org/webgl/extensions/WEBGL_provoking_vertex/) + +[Exposed=(Window,Worker), LegacyNoInterfaceObject] +interface WEBGL_provoking_vertex { + const GLenum FIRST_VERTEX_CONVENTION_WEBGL = 0x8E4D; + const GLenum LAST_VERTEX_CONVENTION_WEBGL = 0x8E4E; // default + const GLenum PROVOKING_VERTEX_WEBGL = 0x8E4F; + + undefined provokingVertexWEBGL(GLenum provokeMode); +}; diff --git a/tests/wpt/web-platform-tests/interfaces/anchors.idl b/tests/wpt/web-platform-tests/interfaces/anchors.idl index 5aa9395f09f..d8c5aa69a87 100644 --- a/tests/wpt/web-platform-tests/interfaces/anchors.idl +++ b/tests/wpt/web-platform-tests/interfaces/anchors.idl @@ -17,6 +17,8 @@ partial interface XRFrame { }; partial interface XRSession { + readonly attribute FrozenArray<DOMString> persistentAnchors; + Promise<XRAnchor> restorePersistentAnchor(DOMString uuid); Promise<undefined> deletePersistentAnchor(DOMString uuid); }; diff --git a/tests/wpt/web-platform-tests/interfaces/badging.idl b/tests/wpt/web-platform-tests/interfaces/badging.idl index f34dfa7e04a..8b401e057ad 100644 --- a/tests/wpt/web-platform-tests/interfaces/badging.idl +++ b/tests/wpt/web-platform-tests/interfaces/badging.idl @@ -4,14 +4,10 @@ // Source: Badging API (https://w3c.github.io/badging/) [SecureContext] -partial interface Navigator { - Promise<undefined> setClientBadge(optional [EnforceRange] unsigned long long contents); - Promise<undefined> clearClientBadge(); -}; - -[SecureContext] interface mixin NavigatorBadge { - Promise<undefined> setAppBadge(optional [EnforceRange] unsigned long long contents); + Promise<undefined> setAppBadge( + optional [EnforceRange] unsigned long long contents + ); Promise<undefined> clearAppBadge(); }; diff --git a/tests/wpt/web-platform-tests/interfaces/compression.idl b/tests/wpt/web-platform-tests/interfaces/compression.idl index 88be302a4a6..7525d7c9847 100644 --- a/tests/wpt/web-platform-tests/interfaces/compression.idl +++ b/tests/wpt/web-platform-tests/interfaces/compression.idl @@ -3,14 +3,20 @@ // (https://github.com/w3c/webref) // Source: Compression Streams (https://wicg.github.io/compression/) +enum CompressionFormat { + "deflate", + "deflate-raw", + "gzip", +}; + [Exposed=*] interface CompressionStream { - constructor(DOMString format); + constructor(CompressionFormat format); }; CompressionStream includes GenericTransformStream; [Exposed=*] interface DecompressionStream { - constructor(DOMString format); + constructor(CompressionFormat format); }; DecompressionStream includes GenericTransformStream; diff --git a/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl b/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl index 42ff4f207ab..3e35dc4ee2d 100644 --- a/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl +++ b/tests/wpt/web-platform-tests/interfaces/compute-pressure.idl @@ -3,17 +3,15 @@ // (https://github.com/w3c/webref) // Source: Compute Pressure Level 1 (https://w3c.github.io/compute-pressure/) -enum PressureState { "nominal", "fair", "serious", "critical" }; +enum PressureSource { "thermals", "cpu" }; -enum PressureFactor { "thermal", "power-supply" }; +enum PressureState { "nominal", "fair", "serious", "critical" }; callback PressureUpdateCallback = undefined ( sequence<PressureRecord> changes, PressureObserver observer ); -enum PressureSource { "cpu" }; - [Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext] interface PressureObserver { constructor(PressureUpdateCallback callback, optional PressureObserverOptions options = {}); @@ -30,7 +28,6 @@ interface PressureObserver { interface PressureRecord { readonly attribute PressureSource source; readonly attribute PressureState state; - readonly attribute FrozenArray<PressureFactor> factors; readonly attribute DOMHighResTimeStamp time; [Default] object toJSON(); }; diff --git a/tests/wpt/web-platform-tests/interfaces/contact-picker.idl b/tests/wpt/web-platform-tests/interfaces/contact-picker.idl index aece81664e4..0119d0e2ce6 100644 --- a/tests/wpt/web-platform-tests/interfaces/contact-picker.idl +++ b/tests/wpt/web-platform-tests/interfaces/contact-picker.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Contact Picker API (https://w3c.github.io/contact-picker/spec/) +// Source: Contact Picker API (https://w3c.github.io/contact-picker/) [Exposed=Window] partial interface Navigator { diff --git a/tests/wpt/web-platform-tests/interfaces/cookie-store.idl b/tests/wpt/web-platform-tests/interfaces/cookie-store.idl index 72ef3f8c824..f44b4c63546 100644 --- a/tests/wpt/web-platform-tests/interfaces/cookie-store.idl +++ b/tests/wpt/web-platform-tests/interfaces/cookie-store.idl @@ -36,7 +36,7 @@ enum CookieSameSite { dictionary CookieInit { required USVString name; required USVString value; - EpochTimeStamp? expires = null; + DOMHighResTimeStamp? expires = null; USVString? domain = null; USVString path = "/"; CookieSameSite sameSite = "strict"; @@ -53,7 +53,7 @@ dictionary CookieListItem { USVString value; USVString? domain; USVString path; - EpochTimeStamp? expires; + DOMHighResTimeStamp? expires; boolean secure; CookieSameSite sameSite; }; diff --git a/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl new file mode 100644 index 00000000000..37cdfb82930 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/css-cascade-6.idl @@ -0,0 +1,10 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: CSS Cascading and Inheritance Level 6 (https://drafts.csswg.org/css-cascade-6/) + +[Exposed=Window] +interface CSSScopeRule : CSSGroupingRule { + readonly attribute CSSOMString start; + readonly attribute CSSOMString end; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/css-contain.idl b/tests/wpt/web-platform-tests/interfaces/css-contain.idl index 6b29119617a..be2137a4a6a 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-contain.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-contain.idl @@ -4,10 +4,10 @@ // Source: CSS Containment Module Level 2 (https://drafts.csswg.org/css-contain-2/) [Exposed=Window] -interface ContentVisibilityAutoStateChangedEvent : Event { - constructor(DOMString type, optional ContentVisibilityAutoStateChangedEventInit eventInitDict = {}); +interface ContentVisibilityAutoStateChangeEvent : Event { + constructor(DOMString type, optional ContentVisibilityAutoStateChangeEventInit eventInitDict = {}); readonly attribute boolean skipped; }; -dictionary ContentVisibilityAutoStateChangedEventInit : EventInit { +dictionary ContentVisibilityAutoStateChangeEventInit : EventInit { boolean skipped = false; }; diff --git a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl index 595a424e014..0df6a0327a2 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-typed-om.idl @@ -13,9 +13,7 @@ interface CSSStyleValue { [Exposed=(Window, Worker, PaintWorklet, LayoutWorklet)] interface StylePropertyMapReadOnly { iterable<USVString, sequence<CSSStyleValue>>; - any get(USVString property); - /* 'any' means (undefined or CSSStyleValue) here, - see https://github.com/heycam/webidl/issues/60 */ + (undefined or CSSStyleValue) get(USVString property); sequence<CSSStyleValue> getAll(USVString property); boolean has(USVString property); readonly attribute unsigned long size; diff --git a/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl b/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl index cf9cb8927e4..745eb1d9691 100644 --- a/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl +++ b/tests/wpt/web-platform-tests/interfaces/css-view-transitions.idl @@ -4,15 +4,15 @@ // Source: CSS View Transitions Module Level 1 (https://drafts.csswg.org/css-view-transitions-1/) partial interface Document { - ViewTransition startViewTransition(optional UpdateCallback? callback = null); + ViewTransition startViewTransition(optional UpdateCallback? updateCallback = null); }; callback UpdateCallback = Promise<any> (); [Exposed=Window] interface ViewTransition { - undefined skipTransition(); - readonly attribute Promise<undefined> finished; - readonly attribute Promise<undefined> ready; readonly attribute Promise<undefined> updateCallbackDone; + readonly attribute Promise<undefined> ready; + readonly attribute Promise<undefined> finished; + undefined skipTransition(); }; diff --git a/tests/wpt/web-platform-tests/interfaces/device-posture.idl b/tests/wpt/web-platform-tests/interfaces/device-posture.idl index ba8f9f51f02..0f1dded6313 100644 --- a/tests/wpt/web-platform-tests/interfaces/device-posture.idl +++ b/tests/wpt/web-platform-tests/interfaces/device-posture.idl @@ -16,6 +16,5 @@ interface DevicePosture : EventTarget { enum DevicePostureType { "continuous", - "folded", - "folded-over" + "folded" }; diff --git a/tests/wpt/web-platform-tests/interfaces/dom.idl b/tests/wpt/web-platform-tests/interfaces/dom.idl index 96acfc6a717..c5b5c94dbcc 100644 --- a/tests/wpt/web-platform-tests/interfaces/dom.idl +++ b/tests/wpt/web-platform-tests/interfaces/dom.idl @@ -618,7 +618,7 @@ callback interface XPathNSResolver { interface mixin XPathEvaluatorBase { [NewObject] XPathExpression createExpression(DOMString expression, optional XPathNSResolver? resolver = null); - XPathNSResolver createNSResolver(Node nodeResolver); + Node createNSResolver(Node nodeResolver); // legacy // XPathResult.ANY_TYPE = 0 XPathResult evaluate(DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, optional unsigned short type = 0, optional XPathResult? result = null); }; diff --git a/tests/wpt/web-platform-tests/interfaces/edit-context.idl b/tests/wpt/web-platform-tests/interfaces/edit-context.idl index f5e60bd0d02..91d8af2ea68 100644 --- a/tests/wpt/web-platform-tests/interfaces/edit-context.idl +++ b/tests/wpt/web-platform-tests/interfaces/edit-context.idl @@ -3,7 +3,7 @@ // (https://github.com/w3c/webref) // Source: EditContext API (https://w3c.github.io/edit-context/) -partial interface Element { +partial interface HTMLElement { attribute EditContext? editContext; }; @@ -20,8 +20,8 @@ interface EditContext : EventTarget { undefined updateText(unsigned long rangeStart, unsigned long rangeEnd, DOMString text); undefined updateSelection(unsigned long start, unsigned long end); - undefined updateControlBound(DOMRect controlBound); - undefined updateSelectionBound(DOMRect selectionBound); + undefined updateControlBounds(DOMRect controlBounds); + undefined updateSelectionBounds(DOMRect selectionBounds); undefined updateCharacterBounds(unsigned long rangeStart, sequence<DOMRect> characterBounds); sequence<Element> attachedElements(); @@ -31,9 +31,9 @@ interface EditContext : EventTarget { readonly attribute unsigned long selectionEnd; readonly attribute unsigned long compositionRangeStart; readonly attribute unsigned long compositionRangeEnd; - readonly attribute boolean isInComposition; - readonly attribute DOMRect controlBound; - readonly attribute DOMRect selectionBound; + readonly attribute boolean isComposing; + readonly attribute DOMRect controlBounds; + readonly attribute DOMRect selectionBounds; readonly attribute unsigned long characterBoundsRangeStart; sequence<DOMRect> characterBounds(); @@ -44,7 +44,7 @@ interface EditContext : EventTarget { attribute EventHandler oncompositionend; }; -dictionary TextUpdateEventInit { +dictionary TextUpdateEventInit : EventInit { unsigned long updateRangeStart; unsigned long updateRangeEnd; DOMString text; @@ -56,7 +56,7 @@ dictionary TextUpdateEventInit { [Exposed=Window] interface TextUpdateEvent : Event { - constructor(optional TextUpdateEventInit options = {}); + constructor(DOMString type, optional TextUpdateEventInit options = {}); readonly attribute unsigned long updateRangeStart; readonly attribute unsigned long updateRangeEnd; readonly attribute DOMString text; @@ -79,35 +79,33 @@ dictionary TextFormatInit { [Exposed=Window] interface TextFormat { constructor(optional TextFormatInit options = {}); - attribute unsigned long rangeStart; - attribute unsigned long rangeEnd; - attribute DOMString textColor; - attribute DOMString backgroundColor; - attribute DOMString underlineStyle; - attribute DOMString underlineThickness; - attribute DOMString underlineColor; + readonly attribute unsigned long rangeStart; + readonly attribute unsigned long rangeEnd; + readonly attribute DOMString textColor; + readonly attribute DOMString backgroundColor; + readonly attribute DOMString underlineStyle; + readonly attribute DOMString underlineThickness; + readonly attribute DOMString underlineColor; }; -dictionary TextFormatUpdateEventInit { +dictionary TextFormatUpdateEventInit : EventInit { sequence<TextFormat> textFormats; }; [Exposed=Window] interface TextFormatUpdateEvent : Event { - constructor(optional TextFormatUpdateEventInit options = {}); - + constructor(DOMString type, optional TextFormatUpdateEventInit options = {}); sequence<TextFormat> getTextFormats(); }; -dictionary CharacterBoundsUpdateEventInit { +dictionary CharacterBoundsUpdateEventInit : EventInit { unsigned long rangeStart; unsigned long rangeEnd; }; [Exposed=Window] interface CharacterBoundsUpdateEvent : Event { - constructor(optional CharacterBoundsUpdateEventInit options = {}); - + constructor(DOMString type, optional CharacterBoundsUpdateEventInit options = {}); readonly attribute unsigned long rangeStart; readonly attribute unsigned long rangeEnd; }; diff --git a/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl new file mode 100644 index 00000000000..2869b95e6bb --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/fenced-frame.idl @@ -0,0 +1,54 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Fenced frame (https://wicg.github.io/fenced-frame/) + +[Exposed=Window] +interface HTMLFencedFrameElement : HTMLElement { + [HTMLConstructor] constructor(); + + [CEReactions] attribute FencedFrameConfig? config; + [CEReactions] attribute DOMString width; + [CEReactions] attribute DOMString height; +}; + +enum OpaqueProperty {"opaque"}; + +typedef (unsigned long or OpaqueProperty) FencedFrameConfigSize; +typedef (USVString or OpaqueProperty) FencedFrameConfigURL; + +[Exposed=Window] +interface FencedFrameConfig { + constructor(USVString url); + readonly attribute FencedFrameConfigURL? url; + readonly attribute FencedFrameConfigSize? width; + readonly attribute FencedFrameConfigSize? height; +}; + +enum FenceReportingDestination { + "buyer", + "seller", + "component-seller", + "direct-seller", + "shared-storage-select-url", +}; + +dictionary FenceEvent { + required DOMString eventType; + required DOMString eventData; + required sequence<FenceReportingDestination> destination; +}; + +typedef (FenceEvent or DOMString) ReportEventType; + +[Exposed=Window] +interface Fence { + undefined reportEvent(ReportEventType event); + undefined setReportEventDataForAutomaticBeacons(FenceEvent event); + sequence<FencedFrameConfig> getNestedConfigs(); +}; + +partial interface Window { + // Collection of fenced frame APIs + readonly attribute Fence? fence; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/fetch.idl b/tests/wpt/web-platform-tests/interfaces/fetch.idl index 866d09d31bd..81a5e69aee5 100644 --- a/tests/wpt/web-platform-tests/interfaces/fetch.idl +++ b/tests/wpt/web-platform-tests/interfaces/fetch.idl @@ -12,6 +12,7 @@ interface Headers { undefined append(ByteString name, ByteString value); undefined delete(ByteString name); ByteString? get(ByteString name); + sequence<ByteString> getSetCookie(); boolean has(ByteString name); undefined set(ByteString name, ByteString value); iterable<ByteString, ByteString>; diff --git a/tests/wpt/web-platform-tests/interfaces/fs.idl b/tests/wpt/web-platform-tests/interfaces/fs.idl index e341ab387d9..e2474132abf 100644 --- a/tests/wpt/web-platform-tests/interfaces/fs.idl +++ b/tests/wpt/web-platform-tests/interfaces/fs.idl @@ -15,7 +15,6 @@ interface FileSystemHandle { Promise<boolean> isSameEntry(FileSystemHandle other); }; - dictionary FileSystemCreateWritableOptions { boolean keepExistingData = false; }; @@ -27,7 +26,6 @@ interface FileSystemFileHandle : FileSystemHandle { [Exposed=DedicatedWorker] Promise<FileSystemSyncAccessHandle> createSyncAccessHandle(); }; - dictionary FileSystemGetFileOptions { boolean create = false; }; @@ -51,7 +49,6 @@ interface FileSystemDirectoryHandle : FileSystemHandle { Promise<sequence<USVString>?> resolve(FileSystemHandle possibleDescendant); }; - enum WriteCommandType { "write", "seek", @@ -73,7 +70,6 @@ interface FileSystemWritableFileStream : WritableStream { Promise<undefined> seek(unsigned long long position); Promise<undefined> truncate(unsigned long long size); }; - dictionary FileSystemReadWriteOptions { [EnforceRange] unsigned long long at; }; diff --git a/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl b/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl index ddfc0d9c06a..d7d750654fd 100644 --- a/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl +++ b/tests/wpt/web-platform-tests/interfaces/gamepad-extensions.idl @@ -67,5 +67,5 @@ partial interface Gamepad { readonly attribute FrozenArray<GamepadHapticActuator> hapticActuators; readonly attribute GamepadPose? pose; readonly attribute FrozenArray<GamepadTouch>? touchEvents; - [SameObject] readonly attribute GamepadHapticActuator vibrationActuator; + [SameObject] readonly attribute GamepadHapticActuator? vibrationActuator; }; diff --git a/tests/wpt/web-platform-tests/interfaces/gpc-spec.idl b/tests/wpt/web-platform-tests/interfaces/gpc-spec.idl new file mode 100644 index 00000000000..0e9a063c54c --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/gpc-spec.idl @@ -0,0 +1,10 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Global Privacy Control (GPC) (https://privacycg.github.io/gpc-spec/) + +interface mixin GlobalPrivacyControl { + readonly attribute boolean globalPrivacyControl; +}; +Navigator includes GlobalPrivacyControl; +WorkerNavigator includes GlobalPrivacyControl; diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl index e4752f079ce..33d4de0db97 100644 --- a/tests/wpt/web-platform-tests/interfaces/html.idl +++ b/tests/wpt/web-platform-tests/interfaces/html.idl @@ -127,6 +127,12 @@ interface HTMLElement : Element { [CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText; ElementInternals attachInternals(); + + // The popover API + undefined showPopover(); + undefined hidePopover(); + undefined togglePopover(optional boolean force); + [CEReactions] attribute DOMString? popover; }; HTMLElement includes GlobalEventHandlers; @@ -202,6 +208,7 @@ interface HTMLLinkElement : HTMLElement { [CEReactions] attribute DOMString referrerPolicy; [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; [CEReactions] attribute boolean disabled; + [CEReactions] attribute DOMString fetchPriority; // also has obsolete members }; @@ -430,6 +437,7 @@ interface HTMLImageElement : HTMLElement { [CEReactions] attribute DOMString referrerPolicy; [CEReactions] attribute DOMString decoding; [CEReactions] attribute DOMString loading; + [CEReactions] attribute DOMString fetchPriority; Promise<undefined> decode(); @@ -929,6 +937,7 @@ interface HTMLInputElement : HTMLElement { // also has obsolete members }; +HTMLInputElement includes PopoverInvokerElement; [Exposed=Window] interface HTMLButtonElement : HTMLElement { @@ -954,6 +963,7 @@ interface HTMLButtonElement : HTMLElement { readonly attribute NodeList labels; }; +HTMLButtonElement includes PopoverInvokerElement; [Exposed=Window] interface HTMLSelectElement : HTMLElement { @@ -1214,6 +1224,7 @@ interface HTMLScriptElement : HTMLElement { [CEReactions] attribute DOMString integrity; [CEReactions] attribute DOMString referrerPolicy; [SameObject, PutForwards=value] readonly attribute DOMTokenList blocking; + [CEReactions] attribute DOMString fetchPriority; static boolean supports(DOMString type); @@ -1704,6 +1715,23 @@ dictionary DragEventInit : MouseEventInit { DataTransfer? dataTransfer = null; }; +interface mixin PopoverInvokerElement { + [CEReactions] attribute Element? popoverTargetElement; + [CEReactions] attribute DOMString popoverTargetAction; +}; + +[Exposed=Window] +interface ToggleEvent : Event { + constructor(DOMString type, optional ToggleEventInit eventInitDict = {}); + readonly attribute DOMString oldState; + readonly attribute DOMString newState; +}; + +dictionary ToggleEventInit : EventInit { + DOMString oldState = ""; + DOMString newState = ""; +}; + [Global=Window, Exposed=Window, LegacyUnenumerableNamedProperties] @@ -1737,10 +1765,11 @@ interface Window : EventTarget { [Replaceable] readonly attribute WindowProxy? parent; readonly attribute Element? frameElement; WindowProxy? open(optional USVString url = "", optional DOMString target = "_blank", optional [LegacyNullToEmptyString] DOMString features = ""); - getter object (DOMString name); + // Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic // object on the prototype chain. Indeed, this does not make the global object an exotic object. // Indexed access is taken care of by the WindowProxy exotic object. + getter object (DOMString name); // the user agent readonly attribute Navigator navigator; @@ -1893,6 +1922,7 @@ interface mixin GlobalEventHandlers { attribute EventHandler onauxclick; attribute EventHandler onbeforeinput; attribute EventHandler onbeforematch; + attribute EventHandler onbeforetoggle; attribute EventHandler onblur; attribute EventHandler oncancel; attribute EventHandler oncanplay; diff --git a/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl b/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl index 5b41f3fa653..3197ff73689 100644 --- a/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl +++ b/tests/wpt/web-platform-tests/interfaces/mediacapture-streams.idl @@ -104,19 +104,19 @@ dictionary MediaTrackConstraintSet { }; dictionary MediaTrackSettings { - long width; - long height; + unsigned long width; + unsigned long height; double aspectRatio; double frameRate; DOMString facingMode; DOMString resizeMode; - long sampleRate; - long sampleSize; + unsigned long sampleRate; + unsigned long sampleSize; boolean echoCancellation; boolean autoGainControl; boolean noiseSuppression; double latency; - long channelCount; + unsigned long channelCount; DOMString deviceId; DOMString groupId; }; diff --git a/tests/wpt/web-platform-tests/interfaces/navigation-api.idl b/tests/wpt/web-platform-tests/interfaces/navigation-api.idl deleted file mode 100644 index 11178518292..00000000000 --- a/tests/wpt/web-platform-tests/interfaces/navigation-api.idl +++ /dev/null @@ -1,158 +0,0 @@ -// GENERATED CONTENT - DO NOT EDIT -// Content was automatically extracted by Reffy into webref -// (https://github.com/w3c/webref) -// Source: Navigation API (https://wicg.github.io/navigation-api/) - -partial interface Window { - [Replaceable] readonly attribute Navigation navigation; -}; - -[Exposed=Window] -interface Navigation : EventTarget { - sequence<NavigationHistoryEntry> entries(); - readonly attribute NavigationHistoryEntry? currentEntry; - undefined updateCurrentEntry(NavigationUpdateCurrentEntryOptions options); - readonly attribute NavigationTransition? transition; - - readonly attribute boolean canGoBack; - readonly attribute boolean canGoForward; - - NavigationResult navigate(USVString url, optional NavigationNavigateOptions options = {}); - NavigationResult reload(optional NavigationReloadOptions options = {}); - - NavigationResult traverseTo(DOMString key, optional NavigationOptions options = {}); - NavigationResult back(optional NavigationOptions options = {}); - NavigationResult forward(optional NavigationOptions options = {}); - - attribute EventHandler onnavigate; - attribute EventHandler onnavigatesuccess; - attribute EventHandler onnavigateerror; - attribute EventHandler oncurrententrychange; -}; - -dictionary NavigationUpdateCurrentEntryOptions { - required any state; -}; - -dictionary NavigationOptions { - any info; -}; - -dictionary NavigationNavigateOptions : NavigationOptions { - any state; - NavigationHistoryBehavior history = "auto"; -}; - -dictionary NavigationReloadOptions : NavigationOptions { - any state; -}; - -dictionary NavigationResult { - Promise<NavigationHistoryEntry> committed; - Promise<NavigationHistoryEntry> finished; -}; - -enum NavigationHistoryBehavior { - "auto", - "push", - "replace" -}; - -[Exposed=Window] -interface NavigationCurrentEntryChangeEvent : Event { - constructor(DOMString type, NavigationCurrentEntryChangeEventInit eventInit); - - readonly attribute NavigationType? navigationType; - readonly attribute NavigationHistoryEntry from; -}; - -dictionary NavigationCurrentEntryChangeEventInit : EventInit { - NavigationType? navigationType = null; - required NavigationHistoryEntry destination; -}; - -[Exposed=Window] -interface NavigationTransition { - readonly attribute NavigationType navigationType; - readonly attribute NavigationHistoryEntry from; - readonly attribute Promise<undefined> finished; -}; - -[Exposed=Window] -interface NavigateEvent : Event { - constructor(DOMString type, NavigateEventInit eventInit); - - readonly attribute NavigationType navigationType; - readonly attribute NavigationDestination destination; - readonly attribute boolean canIntercept; - readonly attribute boolean userInitiated; - readonly attribute boolean hashChange; - readonly attribute AbortSignal signal; - readonly attribute FormData? formData; - readonly attribute DOMString? downloadRequest; - readonly attribute any info; - - undefined intercept(optional NavigationInterceptOptions options = {}); - undefined scroll(); -}; - -dictionary NavigateEventInit : EventInit { - NavigationType navigationType = "push"; - required NavigationDestination destination; - boolean canIntercept = false; - boolean userInitiated = false; - boolean hashChange = false; - required AbortSignal signal; - FormData? formData = null; - DOMString? downloadRequest = null; - any info; -}; - -dictionary NavigationInterceptOptions { - NavigationInterceptHandler handler; - NavigationFocusReset focusReset; - NavigationScrollBehavior scroll; -}; - -enum NavigationFocusReset { - "after-transition", - "manual" -}; - -enum NavigationScrollBehavior { - "after-transition", - "manual" -}; - -callback NavigationInterceptHandler = Promise<undefined> (); - -enum NavigationType { - "reload", - "push", - "replace", - "traverse" -}; - -[Exposed=Window] -interface NavigationDestination { - readonly attribute USVString url; - readonly attribute DOMString? key; - readonly attribute DOMString? id; - readonly attribute long long index; - readonly attribute boolean sameDocument; - - any getState(); -}; - -[Exposed=Window] -interface NavigationHistoryEntry : EventTarget { - readonly attribute USVString? url; - readonly attribute DOMString key; - readonly attribute DOMString id; - readonly attribute long long index; - readonly attribute boolean sameDocument; - - any getState(); - - attribute EventHandler ondispose; -}; diff --git a/tests/wpt/web-platform-tests/interfaces/notifications.idl b/tests/wpt/web-platform-tests/interfaces/notifications.idl index 2be22213d78..bfcfa2e66af 100644 --- a/tests/wpt/web-platform-tests/interfaces/notifications.idl +++ b/tests/wpt/web-platform-tests/interfaces/notifications.idl @@ -72,7 +72,6 @@ dictionary NotificationAction { }; callback NotificationPermissionCallback = undefined (NotificationPermission permission); - dictionary GetNotificationOptions { DOMString tag = ""; }; diff --git a/tests/wpt/web-platform-tests/interfaces/orientation-event.idl b/tests/wpt/web-platform-tests/interfaces/orientation-event.idl index f6ff96f0e01..a93d4658830 100644 --- a/tests/wpt/web-platform-tests/interfaces/orientation-event.idl +++ b/tests/wpt/web-platform-tests/interfaces/orientation-event.idl @@ -30,10 +30,6 @@ partial interface Window { }; partial interface Window { - attribute EventHandler oncompassneedscalibration; -}; - -partial interface Window { [SecureContext] attribute EventHandler ondevicemotion; }; diff --git a/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl b/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl index 16945e3a9b7..a789d41738c 100644 --- a/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl +++ b/tests/wpt/web-platform-tests/interfaces/permissions-policy.idl @@ -18,7 +18,6 @@ partial interface Document { partial interface HTMLIFrameElement { [SameObject] readonly attribute PermissionsPolicy permissionsPolicy; }; - [Exposed=Window] interface PermissionsPolicyViolationReportBody : ReportBody { readonly attribute DOMString featureId; diff --git a/tests/wpt/web-platform-tests/interfaces/priority-hints.idl b/tests/wpt/web-platform-tests/interfaces/priority-hints.idl deleted file mode 100644 index cbff6a5222d..00000000000 --- a/tests/wpt/web-platform-tests/interfaces/priority-hints.idl +++ /dev/null @@ -1,20 +0,0 @@ -// GENERATED CONTENT - DO NOT EDIT -// Content was automatically extracted by Reffy into webref -// (https://github.com/w3c/webref) -// Source: Priority Hints (https://wicg.github.io/priority-hints/) - -partial interface HTMLImageElement { - [CEReactions] attribute DOMString fetchPriority; -}; - -partial interface HTMLLinkElement { - [CEReactions] attribute DOMString fetchPriority; -}; - -partial interface HTMLScriptElement { - [CEReactions] attribute DOMString fetchPriority; -}; - -partial interface HTMLIFrameElement { - [CEReactions] attribute DOMString fetchPriority; -}; diff --git a/tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl b/tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl new file mode 100644 index 00000000000..adca77a2b03 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/requestStorageAccessFor.idl @@ -0,0 +1,12 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: requestStorageAccessFor API (https://privacycg.github.io/requestStorageAccessFor/) + +partial interface Document { + Promise<undefined> requestStorageAccessFor(USVString requestedOrigin); +}; + +dictionary TopLevelStorageAccessPermissionDescriptor : PermissionDescriptor { + USVString requestedOrigin = ""; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl index 242df0bd804..151e5d46d84 100644 --- a/tests/wpt/web-platform-tests/interfaces/resource-timing.idl +++ b/tests/wpt/web-platform-tests/interfaces/resource-timing.idl @@ -6,6 +6,7 @@ [Exposed=(Window,Worker)] interface PerformanceResourceTiming : PerformanceEntry { readonly attribute DOMString initiatorType; + readonly attribute DOMString deliveryType; readonly attribute ByteString nextHopProtocol; readonly attribute DOMHighResTimeStamp workerStart; readonly attribute DOMHighResTimeStamp redirectStart; diff --git a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl index 1fd52dece19..14215509c9f 100644 --- a/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl +++ b/tests/wpt/web-platform-tests/interfaces/scroll-animations.idl @@ -25,6 +25,7 @@ interface ScrollTimeline : AnimationTimeline { dictionary ViewTimelineOptions { Element subject; ScrollAxis axis = "block"; + (DOMString or sequence<(CSSNumericValue or CSSKeywordValue)>) inset = "auto"; }; [Exposed=Window] diff --git a/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl b/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl index ce571ddd694..be7bf73968e 100644 --- a/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl +++ b/tests/wpt/web-platform-tests/interfaces/scroll-to-text-fragment.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Text Fragments (https://wicg.github.io/scroll-to-text-fragment/) +// Source: URL Fragment Text Directives (https://wicg.github.io/scroll-to-text-fragment/) [Exposed=Window] interface FragmentDirective { diff --git a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl index 6b6083b165e..9061b243477 100644 --- a/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl +++ b/tests/wpt/web-platform-tests/interfaces/secure-payment-confirmation.idl @@ -15,7 +15,6 @@ dictionary SecurePaymentConfirmationRequest { sequence<USVString> locale; boolean showOptOut; }; - partial dictionary AuthenticationExtensionsClientInputs { AuthenticationExtensionsPaymentInputs payment; }; @@ -31,11 +30,9 @@ dictionary AuthenticationExtensionsPaymentInputs { PaymentCurrencyAmount total; PaymentCredentialInstrument instrument; }; - dictionary CollectedClientPaymentData : CollectedClientData { required CollectedClientAdditionalPaymentData payment; }; - dictionary CollectedClientAdditionalPaymentData { required USVString rpId; required USVString topOrigin; @@ -44,16 +41,8 @@ dictionary CollectedClientAdditionalPaymentData { required PaymentCurrencyAmount total; required PaymentCredentialInstrument instrument; }; - dictionary PaymentCredentialInstrument { required USVString displayName; required USVString icon; boolean iconMustBeShown = true; }; - -enum TransactionAutomationMode { - "none", - "autoAccept", - "autoReject", - "autoOptOut" -}; diff --git a/tests/wpt/web-platform-tests/interfaces/selection-api.idl b/tests/wpt/web-platform-tests/interfaces/selection-api.idl index c1eed2a9cf2..a84536ab0f5 100644 --- a/tests/wpt/web-platform-tests/interfaces/selection-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/selection-api.idl @@ -12,12 +12,13 @@ interface Selection { readonly attribute boolean isCollapsed; readonly attribute unsigned long rangeCount; readonly attribute DOMString type; + readonly attribute DOMString direction; Range getRangeAt(unsigned long index); undefined addRange(Range range); undefined removeRange(Range range); undefined removeAllRanges(); undefined empty(); - StaticRange getComposedRange(ShadowRoot... shadowRoots); + sequence<StaticRange> getComposedRanges(ShadowRoot... shadowRoots); undefined collapse(Node? node, optional unsigned long offset = 0); undefined setPosition(Node? node, optional unsigned long offset = 0); undefined collapseToStart(); diff --git a/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl new file mode 100644 index 00000000000..ee339590827 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/trust-token-api.idl @@ -0,0 +1,29 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: Private State Token API (https://wicg.github.io/trust-token-api/) + +enum RefreshPolicy { "none", "refresh" }; + +enum TokenType { "private-state-token" }; + +enum TokenVersion { "1" }; + +enum OperationType { "token-request", "send-redemption-record", "token-redemption" }; + +dictionary PrivateToken { + required TokenType type; + required TokenVersion version; + required OperationType operation; + RefreshPolicy refreshPolicy = "none"; + sequence<USVString> issuers; +}; + +partial dictionary RequestInit { + PrivateToken privateToken; +}; + +partial interface Document { + Promise<boolean> hasPrivateTokens(USVString issuer, USVString type); + Promise<boolean> hasRedemptionRecord(USVString issuer, USVString type); +}; diff --git a/tests/wpt/web-platform-tests/interfaces/turtledove.idl b/tests/wpt/web-platform-tests/interfaces/turtledove.idl new file mode 100644 index 00000000000..cd81a3d87ef --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/turtledove.idl @@ -0,0 +1,109 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: FLEDGE (https://wicg.github.io/turtledove/) + +[SecureContext] +partial interface Navigator { + Promise<undefined> joinAdInterestGroup(AuctionAdInterestGroup group, double durationSeconds); +}; + +dictionary AuctionAd { + required USVString renderURL; + any metadata; +}; + +dictionary AuctionAdInterestGroup { + required USVString owner; + required USVString name; + + double priority = 0.0; + boolean enableBiddingSignalsPrioritization = false; + record<DOMString, double> priorityVector; + record<DOMString, double> prioritySignalsOverrides; + + DOMString executionMode = "compatibility"; + USVString biddingLogicURL; + USVString biddingWasmHelperURL; + USVString dailyUpdateURL; + USVString trustedBiddingSignalsURL; + sequence<USVString> trustedBiddingSignalsKeys; + any userBiddingSignals; + sequence<AuctionAd> ads; + sequence<AuctionAd> adComponents; +}; + +[SecureContext] +partial interface Navigator { + Promise<undefined> leaveAdInterestGroup(AuctionAdInterestGroupKey group); +}; + +dictionary AuctionAdInterestGroupKey { + required USVString owner; + required USVString name; +}; + +[SecureContext] +partial interface Navigator { + Promise<USVString?> runAdAuction(AuctionAdConfig config); +}; + +dictionary AuctionAdConfig { + required USVString seller; + required USVString decisionLogicURL; + USVString trustedScoringSignalsURL; + sequence<USVString> interestGroupBuyers; + any auctionSignals; + any sellerSignals; + USVString directFromSellerSignals; + unsigned long long sellerTimeout; + unsigned short sellerExperimentGroupId; + record<USVString, any> perBuyerSignals; + record<USVString, unsigned long long> perBuyerTimeouts; + record<USVString, unsigned short> perBuyerGroupLimits; + record<USVString, unsigned short> perBuyerExperimentGroupIds; + record<USVString, record<USVString, double>> perBuyerPrioritySignals; + sequence<AuctionAdConfig> componentAuctions = []; + AbortSignal? signal; +}; + +[Exposed=InterestGroupBiddingScriptRunnerGlobalScope, +Global=InterestGroupBiddingScriptRunnerGlobalScope] +interface InterestGroupBiddingScriptRunnerGlobalScope { + boolean setBid(); + boolean setBid(GenerateBidOutput generateBidOutput); + undefined setPriority(double priority); + undefined setPrioritySignalsOverride(DOMString key, double priority); +}; + +[Exposed=InterestGroupScoringScriptRunnerGlobalScope, +Global=InterestGroupScoringScriptRunnerGlobalScope] +interface InterestGroupScoringScriptRunnerGlobalScope { +}; + +[Exposed=InterestGroupReportingScriptRunnerGlobalScope, +Global=InterestGroupReportingScriptRunnerGlobalScope] +interface InterestGroupReportingScriptRunnerGlobalScope { + undefined sendReportTo(DOMString url); +}; + +dictionary AdRender { + required DOMString url; + required DOMString width; + required DOMString height; +}; + +dictionary GenerateBidOutput { + required double bid; + required (DOMString or AdRender) adRender; + DOMString ad; + sequence<(DOMString or AdRender)> adComponents; + double adCost; + double modelingSignals; + boolean allowComponentAuction = false; +}; + +[SecureContext] +partial interface Navigator { + undefined updateAdInterestGroups(); +}; diff --git a/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl b/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl index f5070a0e090..c69714b9734 100644 --- a/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl +++ b/tests/wpt/web-platform-tests/interfaces/ua-client-hints.idl @@ -9,16 +9,17 @@ dictionary NavigatorUABrandVersion { }; dictionary UADataValues { - sequence<NavigatorUABrandVersion> brands; - boolean mobile; DOMString architecture; DOMString bitness; + sequence<NavigatorUABrandVersion> brands; + DOMString formFactor; + sequence<NavigatorUABrandVersion> fullVersionList; DOMString model; + boolean mobile; DOMString platform; DOMString platformVersion; DOMString uaFullVersion; // deprecated in favor of fullVersionList boolean wow64; - sequence<NavigatorUABrandVersion> fullVersionList; }; dictionary UALowEntropyJSON { diff --git a/tests/wpt/web-platform-tests/interfaces/url.idl b/tests/wpt/web-platform-tests/interfaces/url.idl index 360c9adcfa1..6549e45f419 100644 --- a/tests/wpt/web-platform-tests/interfaces/url.idl +++ b/tests/wpt/web-platform-tests/interfaces/url.idl @@ -8,6 +8,8 @@ interface URL { constructor(USVString url, optional USVString base); + static boolean canParse(USVString url, optional USVString base); + stringifier attribute USVString href; readonly attribute USVString origin; attribute USVString protocol; @@ -28,6 +30,8 @@ interface URL { interface URLSearchParams { constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = ""); + readonly attribute unsigned long size; + undefined append(USVString name, USVString value); undefined delete(USVString name); USVString? get(USVString name); diff --git a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl index 141af90fd2d..0d4384251df 100644 --- a/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl +++ b/tests/wpt/web-platform-tests/interfaces/wasm-js-api.idl @@ -8,7 +8,7 @@ dictionary WebAssemblyInstantiatedSource { required Instance instance; }; -[Exposed=(Window,Worker,Worklet)] +[Exposed=*] namespace WebAssembly { boolean validate(BufferSource bytes); Promise<Module> compile(BufferSource bytes); @@ -39,7 +39,7 @@ dictionary ModuleImportDescriptor { required ImportExportKind kind; }; -[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=*] interface Module { constructor(BufferSource bytes); static sequence<ModuleExportDescriptor> exports(Module moduleObject); @@ -47,7 +47,7 @@ interface Module { static sequence<ArrayBuffer> customSections(Module moduleObject, DOMString sectionName); }; -[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=*] interface Instance { constructor(Module module, optional object importObject); readonly attribute object exports; @@ -58,7 +58,7 @@ dictionary MemoryDescriptor { [EnforceRange] unsigned long maximum; }; -[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=*] interface Memory { constructor(MemoryDescriptor descriptor); unsigned long grow([EnforceRange] unsigned long delta); @@ -78,7 +78,7 @@ dictionary TableDescriptor { [EnforceRange] unsigned long maximum; }; -[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=*] interface Table { constructor(TableDescriptor descriptor, optional any value); unsigned long grow([EnforceRange] unsigned long delta, optional any value); @@ -102,7 +102,7 @@ dictionary GlobalDescriptor { boolean mutable = false; }; -[LegacyNamespace=WebAssembly, Exposed=(Window,Worker,Worklet)] +[LegacyNamespace=WebAssembly, Exposed=*] interface Global { constructor(GlobalDescriptor descriptor, optional any v); any valueOf(); diff --git a/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl b/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl index 61df2cd1518..f9f68a0d49a 100644 --- a/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl +++ b/tests/wpt/web-platform-tests/interfaces/web-animations-2.idl @@ -5,6 +5,7 @@ [Exposed=Window] partial interface AnimationTimeline { + readonly attribute CSSNumberish? currentTime; readonly attribute CSSNumberish? duration; Animation play (optional AnimationEffect? effect = null); }; @@ -88,6 +89,16 @@ callback EffectCallback = undefined (double? progress, (Element or CSSPseudoElement) currentTarget, Animation animation); +dictionary TimelineRangeOffset { + CSSOMString? rangeName; + CSSNumericValue offset; +}; + +partial dictionary KeyframeAnimationOptions { + (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeStart = "normal"; + (TimelineRangeOffset or CSSNumericValue or CSSKeywordValue or DOMString) rangeEnd = "normal"; +}; + [Exposed=Window] interface AnimationPlaybackEvent : Event { constructor(DOMString type, optional AnimationPlaybackEventInit diff --git a/tests/wpt/web-platform-tests/interfaces/web-animations.idl b/tests/wpt/web-platform-tests/interfaces/web-animations.idl index ed612302a47..956d700f49b 100644 --- a/tests/wpt/web-platform-tests/interfaces/web-animations.idl +++ b/tests/wpt/web-platform-tests/interfaces/web-animations.idl @@ -5,7 +5,6 @@ [Exposed=Window] interface AnimationTimeline { - readonly attribute double? currentTime; }; dictionary DocumentTimelineOptions { diff --git a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl index 21c237040eb..5d461194a83 100644 --- a/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl +++ b/tests/wpt/web-platform-tests/interfaces/web-bluetooth.idl @@ -26,6 +26,7 @@ dictionary BluetoothLEScanFilterInit { dictionary RequestDeviceOptions { sequence<BluetoothLEScanFilterInit> filters; + sequence<BluetoothLEScanFilterInit> exclusionFilters; sequence<BluetoothServiceUUID> optionalServices = []; sequence<unsigned short> optionalManufacturerData = []; boolean acceptAllDevices = false; diff --git a/tests/wpt/web-platform-tests/interfaces/webauthn.idl b/tests/wpt/web-platform-tests/interfaces/webauthn.idl index ef27322312f..58a9e285232 100644 --- a/tests/wpt/web-platform-tests/interfaces/webauthn.idl +++ b/tests/wpt/web-platform-tests/interfaces/webauthn.idl @@ -12,7 +12,6 @@ interface PublicKeyCredential : Credential { static Promise<boolean> isConditionalMediationAvailable(); PublicKeyCredentialJSON toJSON(); }; - typedef DOMString Base64URLString; typedef (RegistrationResponseJSON or AuthenticationResponseJSON) PublicKeyCredentialJSON; @@ -49,19 +48,15 @@ dictionary AuthenticatorAssertionResponseJSON { dictionary AuthenticationExtensionsClientOutputsJSON { }; - partial dictionary CredentialCreationOptions { PublicKeyCredentialCreationOptions publicKey; }; - partial dictionary CredentialRequestOptions { PublicKeyCredentialRequestOptions publicKey; }; - partial interface PublicKeyCredential { static Promise<boolean> isUserVerifyingPlatformAuthenticatorAvailable(); }; - partial interface PublicKeyCredential { static PublicKeyCredentialCreationOptions parseCreationOptionsFromJSON(PublicKeyCredentialCreationOptionsJSON options); }; @@ -92,7 +87,6 @@ dictionary PublicKeyCredentialDescriptorJSON { dictionary AuthenticationExtensionsClientInputsJSON { }; - partial interface PublicKeyCredential { static PublicKeyCredentialRequestOptions parseRequestOptionsFromJSON(PublicKeyCredentialRequestOptionsJSON options); }; @@ -105,12 +99,10 @@ dictionary PublicKeyCredentialRequestOptionsJSON { DOMString userVerification = "preferred"; AuthenticationExtensionsClientInputsJSON extensions; }; - [SecureContext, Exposed=Window] interface AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer clientDataJSON; }; - [SecureContext, Exposed=Window] interface AuthenticatorAttestationResponse : AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer attestationObject; @@ -119,7 +111,6 @@ interface AuthenticatorAttestationResponse : AuthenticatorResponse { ArrayBuffer? getPublicKey(); COSEAlgorithmIdentifier getPublicKeyAlgorithm(); }; - [SecureContext, Exposed=Window] interface AuthenticatorAssertionResponse : AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer authenticatorData; @@ -127,12 +118,10 @@ interface AuthenticatorAssertionResponse : AuthenticatorResponse { [SameObject] readonly attribute ArrayBuffer? userHandle; [SameObject] readonly attribute ArrayBuffer? attestationObject; }; - dictionary PublicKeyCredentialParameters { required DOMString type; required COSEAlgorithmIdentifier alg; }; - dictionary PublicKeyCredentialCreationOptions { required PublicKeyCredentialRpEntity rp; required PublicKeyCredentialUserEntity user; @@ -147,45 +136,37 @@ dictionary PublicKeyCredentialCreationOptions { sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; }; - dictionary PublicKeyCredentialEntity { required DOMString name; }; - dictionary PublicKeyCredentialRpEntity : PublicKeyCredentialEntity { DOMString id; }; - dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity { required BufferSource id; required DOMString displayName; }; - dictionary AuthenticatorSelectionCriteria { DOMString authenticatorAttachment; DOMString residentKey; boolean requireResidentKey = false; DOMString userVerification = "preferred"; }; - enum AuthenticatorAttachment { "platform", "cross-platform" }; - enum ResidentKeyRequirement { "discouraged", "preferred", "required" }; - enum AttestationConveyancePreference { "none", "indirect", "direct", "enterprise" }; - dictionary PublicKeyCredentialRequestOptions { required BufferSource challenge; unsigned long timeout; @@ -196,17 +177,15 @@ dictionary PublicKeyCredentialRequestOptions { sequence<DOMString> attestationFormats = []; AuthenticationExtensionsClientInputs extensions; }; - dictionary AuthenticationExtensionsClientInputs { }; - dictionary AuthenticationExtensionsClientOutputs { }; - dictionary CollectedClientData { required DOMString type; required DOMString challenge; required DOMString origin; + DOMString topOrigin; boolean crossOrigin; }; @@ -216,17 +195,14 @@ dictionary TokenBinding { }; enum TokenBindingStatus { "present", "supported" }; - enum PublicKeyCredentialType { "public-key" }; - dictionary PublicKeyCredentialDescriptor { required DOMString type; required BufferSource id; sequence<DOMString> transports; }; - enum AuthenticatorTransport { "usb", "nfc", @@ -234,35 +210,27 @@ enum AuthenticatorTransport { "hybrid", "internal" }; - typedef long COSEAlgorithmIdentifier; - enum UserVerificationRequirement { "required", "preferred", "discouraged" }; - partial dictionary AuthenticationExtensionsClientInputs { USVString appid; }; - partial dictionary AuthenticationExtensionsClientOutputs { boolean appid; }; - partial dictionary AuthenticationExtensionsClientInputs { USVString appidExclude; }; - partial dictionary AuthenticationExtensionsClientOutputs { boolean appidExclude; }; - partial dictionary AuthenticationExtensionsClientInputs { boolean credProps; }; - dictionary CredentialPropertiesOutput { boolean rk; }; @@ -270,10 +238,9 @@ dictionary CredentialPropertiesOutput { partial dictionary AuthenticationExtensionsClientOutputs { CredentialPropertiesOutput credProps; }; - dictionary AuthenticationExtensionsPRFValues { - required ArrayBuffer first; - ArrayBuffer second; + required BufferSource first; + BufferSource second; }; dictionary AuthenticationExtensionsPRFInputs { @@ -322,14 +289,12 @@ dictionary AuthenticationExtensionsLargeBlobOutputs { partial dictionary AuthenticationExtensionsClientInputs { boolean uvm; }; - typedef sequence<unsigned long> UvmEntry; typedef sequence<UvmEntry> UvmEntries; partial dictionary AuthenticationExtensionsClientOutputs { UvmEntries uvm; }; - dictionary AuthenticationExtensionsDevicePublicKeyInputs { DOMString attestation = "none"; sequence<DOMString> attestationFormats = []; @@ -340,7 +305,6 @@ partial dictionary AuthenticationExtensionsClientInputs { }; dictionary AuthenticationExtensionsDevicePublicKeyOutputs { - ArrayBuffer authenticatorOutput; ArrayBuffer signature; }; diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl new file mode 100644 index 00000000000..00e4493d3c0 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-av1-codec-registration.idl @@ -0,0 +1,12 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: AV1 WebCodecs Registration (https://w3c.github.io/webcodecs/av1_codec_registration.html) + +partial dictionary VideoEncoderEncodeOptions { + VideoEncoderEncodeOptionsForAv1 av1; +}; + +dictionary VideoEncoderEncodeOptionsForAv1 { + unsigned short? quantizer; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl new file mode 100644 index 00000000000..aca64a78961 --- /dev/null +++ b/tests/wpt/web-platform-tests/interfaces/webcodecs-vp9-codec-registration.idl @@ -0,0 +1,12 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content was automatically extracted by Reffy into webref +// (https://github.com/w3c/webref) +// Source: VP9 WebCodecs Registration (https://w3c.github.io/webcodecs/vp9_codec_registration.html) + +partial dictionary VideoEncoderEncodeOptions { + VideoEncoderEncodeOptionsForVp9 vp9; +}; + +dictionary VideoEncoderEncodeOptionsForVp9 { + unsigned short? quantizer; +}; diff --git a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl index 68df48584bd..77649029db6 100644 --- a/tests/wpt/web-platform-tests/interfaces/webcodecs.idl +++ b/tests/wpt/web-platform-tests/interfaces/webcodecs.idl @@ -4,7 +4,7 @@ // Source: WebCodecs (https://w3c.github.io/webcodecs/) [Exposed=(Window,DedicatedWorker), SecureContext] -interface AudioDecoder { +interface AudioDecoder : EventTarget { constructor(AudioDecoderInit init); readonly attribute CodecState state; @@ -28,7 +28,7 @@ dictionary AudioDecoderInit { callback AudioDataOutputCallback = undefined(AudioData output); [Exposed=(Window,DedicatedWorker), SecureContext] -interface VideoDecoder { +interface VideoDecoder : EventTarget { constructor(VideoDecoderInit init); readonly attribute CodecState state; @@ -52,7 +52,7 @@ dictionary VideoDecoderInit { callback VideoFrameOutputCallback = undefined(VideoFrame output); [Exposed=(Window,DedicatedWorker), SecureContext] -interface AudioEncoder { +interface AudioEncoder : EventTarget { constructor(AudioEncoderInit init); readonly attribute CodecState state; @@ -82,7 +82,7 @@ dictionary EncodedAudioChunkMetadata { }; [Exposed=(Window,DedicatedWorker), SecureContext] -interface VideoEncoder { +interface VideoEncoder : EventTarget { constructor(VideoEncoderInit init); readonly attribute CodecState state; @@ -174,7 +174,7 @@ dictionary VideoEncoderConfig { HardwareAcceleration hardwareAcceleration = "no-preference"; AlphaOption alpha = "discard"; DOMString scalabilityMode; - BitrateMode bitrateMode = "variable"; + VideoEncoderBitrateMode bitrateMode = "variable"; LatencyMode latencyMode = "quality"; }; @@ -198,6 +198,12 @@ dictionary VideoEncoderEncodeOptions { boolean keyFrame = false; }; +enum VideoEncoderBitrateMode { + "constant", + "variable", + "quantizer" +}; + enum CodecState { "unconfigured", "configured", diff --git a/tests/wpt/web-platform-tests/interfaces/webgpu.idl b/tests/wpt/web-platform-tests/interfaces/webgpu.idl index b00e2374e58..284327a5789 100644 --- a/tests/wpt/web-platform-tests/interfaces/webgpu.idl +++ b/tests/wpt/web-platform-tests/interfaces/webgpu.idl @@ -26,6 +26,7 @@ interface GPUSupportedLimits { readonly attribute unsigned long maxStorageBuffersPerShaderStage; readonly attribute unsigned long maxStorageTexturesPerShaderStage; readonly attribute unsigned long maxUniformBuffersPerShaderStage; + readonly attribute unsigned long maxFragmentCombinedOutputResources; readonly attribute unsigned long long maxUniformBufferBindingSize; readonly attribute unsigned long long maxStorageBufferBindingSize; readonly attribute unsigned long minUniformBufferOffsetAlignment; @@ -52,6 +53,11 @@ interface GPUSupportedFeatures { }; [Exposed=(Window, DedicatedWorker), SecureContext] +interface WGSLLanguageFeatures { + readonly setlike<DOMString>; +}; + +[Exposed=(Window, DedicatedWorker), SecureContext] interface GPUAdapterInfo { readonly attribute DOMString vendor; readonly attribute DOMString architecture; @@ -69,6 +75,7 @@ WorkerNavigator includes NavigatorGPU; interface GPU { Promise<GPUAdapter?> requestAdapter(optional GPURequestAdapterOptions options = {}); GPUTextureFormat getPreferredCanvasFormat(); + [SameObject] readonly attribute WGSLLanguageFeatures wgslLanguageFeatures; }; dictionary GPURequestAdapterOptions { @@ -106,7 +113,9 @@ enum GPUFeatureName { "timestamp-query", "indirect-first-instance", "shader-f16", - "rg11b10ufloat-renderable" + "rg11b10ufloat-renderable", + "bgra8unorm-storage", + "float32-filterable" }; [Exposed=(Window, DedicatedWorker), SecureContext] @@ -168,7 +177,7 @@ dictionary GPUBufferDescriptor : GPUObjectDescriptorBase { }; typedef [EnforceRange] unsigned long GPUBufferUsageFlags; -[Exposed=(Window, DedicatedWorker)] +[Exposed=(Window, DedicatedWorker), SecureContext] namespace GPUBufferUsage { const GPUFlagsConstant MAP_READ = 0x0001; const GPUFlagsConstant MAP_WRITE = 0x0002; @@ -183,7 +192,7 @@ namespace GPUBufferUsage { }; typedef [EnforceRange] unsigned long GPUMapModeFlags; -[Exposed=(Window, DedicatedWorker)] +[Exposed=(Window, DedicatedWorker), SecureContext] namespace GPUMapMode { const GPUFlagsConstant READ = 0x0001; const GPUFlagsConstant WRITE = 0x0002; @@ -223,7 +232,7 @@ enum GPUTextureDimension { }; typedef [EnforceRange] unsigned long GPUTextureUsageFlags; -[Exposed=(Window, DedicatedWorker)] +[Exposed=(Window, DedicatedWorker), SecureContext] namespace GPUTextureUsage { const GPUFlagsConstant COPY_SRC = 0x01; const GPUFlagsConstant COPY_DST = 0x02; @@ -384,7 +393,6 @@ enum GPUTextureFormat { [Exposed=(Window, DedicatedWorker), SecureContext] interface GPUExternalTexture { - readonly attribute boolean expired; }; GPUExternalTexture includes GPUObjectBase; @@ -459,7 +467,7 @@ dictionary GPUBindGroupLayoutEntry { }; typedef [EnforceRange] unsigned long GPUShaderStageFlags; -[Exposed=(Window, DedicatedWorker)] +[Exposed=(Window, DedicatedWorker), SecureContext] namespace GPUShaderStage { const GPUFlagsConstant VERTEX = 0x1; const GPUFlagsConstant FRAGMENT = 0x2; @@ -549,7 +557,7 @@ dictionary GPUPipelineLayoutDescriptor : GPUObjectDescriptorBase { [Exposed=(Window, DedicatedWorker), SecureContext] interface GPUShaderModule { - Promise<GPUCompilationInfo> compilationInfo(); + Promise<GPUCompilationInfo> getCompilationInfo(); }; GPUShaderModule includes GPUObjectBase; @@ -586,7 +594,7 @@ interface GPUCompilationInfo { [Exposed=(Window, DedicatedWorker), SecureContext, Serializable] interface GPUPipelineError : DOMException { - constructor(DOMString message, GPUPipelineErrorInit options); + constructor((DOMString or undefined) message, GPUPipelineErrorInit options); readonly attribute GPUPipelineErrorReason reason; }; @@ -695,7 +703,7 @@ dictionary GPUBlendState { }; typedef [EnforceRange] unsigned long GPUColorWriteFlags; -[Exposed=(Window, DedicatedWorker)] +[Exposed=(Window, DedicatedWorker), SecureContext] namespace GPUColorWrite { const GPUFlagsConstant RED = 0x1; const GPUFlagsConstant GREEN = 0x2; @@ -737,8 +745,8 @@ enum GPUBlendOperation { dictionary GPUDepthStencilState { required GPUTextureFormat format; - boolean depthWriteEnabled = false; - GPUCompareFunction depthCompare = "always"; + required boolean depthWriteEnabled; + required GPUCompareFunction depthCompare; GPUStencilFaceState stencilFront = {}; GPUStencilFaceState stencilBack = {}; @@ -829,34 +837,11 @@ dictionary GPUVertexAttribute { required GPUIndex32 shaderLocation; }; -dictionary GPUImageDataLayout { - GPUSize64 offset = 0; - GPUSize32 bytesPerRow; - GPUSize32 rowsPerImage; -}; - -dictionary GPUImageCopyBuffer : GPUImageDataLayout { - required GPUBuffer buffer; -}; - -dictionary GPUImageCopyTexture { - required GPUTexture texture; - GPUIntegerCoordinate mipLevel = 0; - GPUOrigin3D origin = {}; - GPUTextureAspect aspect = "all"; -}; - -dictionary GPUImageCopyTextureTagged : GPUImageCopyTexture { - PredefinedColorSpace colorSpace = "srgb"; - boolean premultipliedAlpha = false; -}; - -dictionary GPUImageCopyExternalImage { - required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source; - GPUOrigin2D origin = {}; - boolean flipY = false; -}; - +dictionary GPUImageDataLayout { GPUSize64 offset = 0; GPUSize32 bytesPerRow; GPUSize32 rowsPerImage;}; +dictionary GPUImageCopyBuffer : GPUImageDataLayout { required GPUBuffer buffer;}; +dictionary GPUImageCopyTexture { required GPUTexture texture; GPUIntegerCoordinate mipLevel = 0; GPUOrigin3D origin = {}; GPUTextureAspect aspect = "all";}; +dictionary GPUImageCopyTextureTagged : GPUImageCopyTexture { PredefinedColorSpace colorSpace = "srgb"; boolean premultipliedAlpha = false;}; +dictionary GPUImageCopyExternalImage { required (ImageBitmap or HTMLVideoElement or HTMLCanvasElement or OffscreenCanvas) source; GPUOrigin2D origin = {}; boolean flipY = false;}; [Exposed=(Window, DedicatedWorker), SecureContext] interface GPUCommandBuffer { }; @@ -1021,7 +1006,7 @@ dictionary GPURenderPassColorAttachment { dictionary GPURenderPassDepthStencilAttachment { required GPUTextureView view; - float depthClearValue = 0; + float depthClearValue; GPULoadOp depthLoadOp; GPUStoreOp depthStoreOp; boolean depthReadOnly = false; @@ -1161,12 +1146,13 @@ dictionary GPUCanvasConfiguration { }; enum GPUDeviceLostReason { + "unknown", "destroyed" }; [Exposed=(Window, DedicatedWorker), SecureContext] interface GPUDeviceLostInfo { - readonly attribute (GPUDeviceLostReason or undefined) reason; + readonly attribute GPUDeviceLostReason reason; readonly attribute DOMString message; }; diff --git a/tests/wpt/web-platform-tests/interfaces/webidl.idl b/tests/wpt/web-platform-tests/interfaces/webidl.idl index 9993673361a..7271f19dfa6 100644 --- a/tests/wpt/web-platform-tests/interfaces/webidl.idl +++ b/tests/wpt/web-platform-tests/interfaces/webidl.idl @@ -46,5 +46,3 @@ interface DOMException { // but see below note about ECMAScript binding callback Function = any (any... arguments); callback VoidFunction = undefined (); - -typedef unsigned long long DOMTimeStamp; diff --git a/tests/wpt/web-platform-tests/interfaces/webnn.idl b/tests/wpt/web-platform-tests/interfaces/webnn.idl index 820c79e9666..2c2ab35e909 100644 --- a/tests/wpt/web-platform-tests/interfaces/webnn.idl +++ b/tests/wpt/web-platform-tests/interfaces/webnn.idl @@ -146,7 +146,7 @@ interface MLGraphBuilder { dictionary MLBatchNormalizationOptions { MLOperand scale; MLOperand bias; - long axis = 1; + unsigned long axis = 1; float epsilon = 1e-5; MLActivation activation; }; @@ -167,7 +167,7 @@ partial interface MLGraphBuilder { }; partial interface MLGraphBuilder { - MLOperand concat(sequence<MLOperand> inputs, long axis); + MLOperand concat(sequence<MLOperand> inputs, unsigned long axis); }; enum MLConv2dFilterOperandLayout { @@ -409,7 +409,10 @@ dictionary MLPadOptions { }; partial interface MLGraphBuilder { - MLOperand pad(MLOperand input, MLOperand padding, optional MLPadOptions options = {}); + MLOperand pad(MLOperand input, + sequence<unsigned long> beginningPadding, + sequence<unsigned long> endingPadding, + optional MLPadOptions options = {}); }; enum MLRoundingType { @@ -434,8 +437,12 @@ partial interface MLGraphBuilder { MLOperand maxPool2d(MLOperand input, optional MLPool2dOptions options = {}); }; +partial interface MLGraphBuilder { + MLOperand prelu(MLOperand x, MLOperand slope); +}; + dictionary MLReduceOptions { - sequence<long> axes = null; + sequence<unsigned long> axes = null; boolean keepDimensions = false; }; @@ -466,7 +473,7 @@ dictionary MLResample2dOptions { MLInterpolationMode mode = "nearest-neighbor"; sequence<float> scales; sequence<unsigned long> sizes; - sequence<long> axes; + sequence<unsigned long> axes; }; partial interface MLGraphBuilder { @@ -483,7 +490,7 @@ partial interface MLGraphBuilder { }; dictionary MLSliceOptions { - sequence<long> axes; + sequence<unsigned long> axes; }; partial interface MLGraphBuilder { @@ -511,7 +518,7 @@ partial interface MLGraphBuilder { }; dictionary MLSplitOptions { - long axis = 0; + unsigned long axis = 0; }; partial interface MLGraphBuilder { @@ -521,7 +528,7 @@ partial interface MLGraphBuilder { }; dictionary MLSqueezeOptions { - sequence<long> axes; + sequence<unsigned long> axes; }; partial interface MLGraphBuilder { @@ -534,7 +541,7 @@ partial interface MLGraphBuilder { }; dictionary MLTransposeOptions { - sequence<long> permutation; + sequence<unsigned long> permutation; }; partial interface MLGraphBuilder { diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl index 13f3999db12..e48f1080c41 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-encoded-transform.idl @@ -89,6 +89,7 @@ dictionary RTCEncodedAudioFrameMetadata { unsigned long synchronizationSource; octet payloadType; sequence<unsigned long> contributingSources; + short sequenceNumber; }; [Exposed=(Window,DedicatedWorker)] diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl index f1dca4a923d..7e820a26df4 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc-stats.idl @@ -105,7 +105,7 @@ dictionary RTCRemoteInboundRtpStreamStats : RTCReceivedRtpStreamStats { }; dictionary RTCSentRtpStreamStats : RTCRtpStreamStats { - unsigned long packetsSent; + unsigned long long packetsSent; unsigned long long bytesSent; }; diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc.idl index d631169f46f..578cbe92974 100644 --- a/tests/wpt/web-platform-tests/interfaces/webrtc.idl +++ b/tests/wpt/web-platform-tests/interfaces/webrtc.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: WebRTC 1.0: Real-Time Communication Between Browsers (https://w3c.github.io/webrtc-pc/) +// Source: WebRTC: Real-Time Communication in Browsers (https://w3c.github.io/webrtc-pc/) dictionary RTCConfiguration { sequence<RTCIceServer> iceServers = []; @@ -51,29 +51,29 @@ enum RTCSignalingState { }; enum RTCIceGatheringState { -"new", -"gathering", -"complete" - }; + "new", + "gathering", + "complete" +}; enum RTCPeerConnectionState { -"closed", -"failed", -"disconnected", -"new", -"connecting", -"connected" - }; + "closed", + "failed", + "disconnected", + "new", + "connecting", + "connected" +}; enum RTCIceConnectionState { -"closed", -"failed", -"disconnected", -"new", -"checking", -"completed", -"connected" - }; + "closed", + "failed", + "disconnected", + "new", + "checking", + "completed", + "connected" +}; [Exposed=Window] interface RTCPeerConnection : EventTarget { @@ -332,28 +332,27 @@ dictionary RTCRtpHeaderExtensionParameters { boolean encrypted = false; }; -dictionary RTCRtpCodecParameters { - required octet payloadType; +dictionary RTCRtpCodec { required DOMString mimeType; required unsigned long clockRate; unsigned short channels; DOMString sdpFmtpLine; }; +dictionary RTCRtpCodecParameters : RTCRtpCodec { + required octet payloadType; +}; + dictionary RTCRtpCapabilities { required sequence<RTCRtpCodecCapability> codecs; required sequence<RTCRtpHeaderExtensionCapability> headerExtensions; }; -dictionary RTCRtpCodecCapability { - required DOMString mimeType; - required unsigned long clockRate; - unsigned short channels; - DOMString sdpFmtpLine; +dictionary RTCRtpCodecCapability : RTCRtpCodec { }; dictionary RTCRtpHeaderExtensionCapability { - DOMString uri; + required DOMString uri; }; [Exposed=Window] diff --git a/tests/wpt/web-platform-tests/interfaces/webtransport.idl b/tests/wpt/web-platform-tests/interfaces/webtransport.idl index ba705807f12..2bea483e1b9 100644 --- a/tests/wpt/web-platform-tests/interfaces/webtransport.idl +++ b/tests/wpt/web-platform-tests/interfaces/webtransport.idl @@ -9,10 +9,10 @@ interface WebTransportDatagramDuplexStream { readonly attribute WritableStream writable; readonly attribute unsigned long maxDatagramSize; - attribute double? incomingMaxAge; - attribute double? outgoingMaxAge; - attribute long incomingHighWaterMark; - attribute long outgoingHighWaterMark; + attribute unrestricted double incomingMaxAge; + attribute unrestricted double outgoingMaxAge; + attribute unrestricted double incomingHighWaterMark; + attribute unrestricted double outgoingHighWaterMark; }; [Exposed=(Window,Worker), SecureContext] @@ -24,6 +24,7 @@ interface WebTransport { readonly attribute WebTransportReliabilityMode reliability; readonly attribute WebTransportCongestionControl congestionControl; readonly attribute Promise<WebTransportCloseInfo> closed; + readonly attribute Promise<undefined> draining; undefined close(optional WebTransportCloseInfo closeInfo = {}); readonly attribute WebTransportDatagramDuplexStream datagrams; @@ -85,6 +86,7 @@ dictionary WebTransportStats { DOMHighResTimeStamp rttVariation; DOMHighResTimeStamp minRtt; WebTransportDatagramStats datagrams; + unsigned long long? estimatedSendRate; }; dictionary WebTransportDatagramStats { @@ -123,17 +125,17 @@ interface WebTransportBidirectionalStream { readonly attribute WebTransportSendStream writable; }; -[Exposed=(Window,Worker), SecureContext] +[Exposed=(Window,Worker), Serializable, SecureContext] interface WebTransportError : DOMException { - constructor(optional WebTransportErrorInit init = {}); + constructor(optional DOMString message = "", optional WebTransportErrorOptions options = {}); readonly attribute WebTransportErrorSource source; readonly attribute octet? streamErrorCode; }; -dictionary WebTransportErrorInit { - [Clamp] octet streamErrorCode; - DOMString message; +dictionary WebTransportErrorOptions { + WebTransportErrorSource source = "stream"; + [Clamp] octet? streamErrorCode = null; }; enum WebTransportErrorSource { diff --git a/tests/wpt/web-platform-tests/interfaces/webxr.idl b/tests/wpt/web-platform-tests/interfaces/webxr.idl index 939da53364d..de2b04691b3 100644 --- a/tests/wpt/web-platform-tests/interfaces/webxr.idl +++ b/tests/wpt/web-platform-tests/interfaces/webxr.idl @@ -41,6 +41,7 @@ enum XRVisibilityState { [SameObject] readonly attribute XRRenderState renderState; [SameObject] readonly attribute XRInputSourceArray inputSources; readonly attribute FrozenArray<DOMString> enabledFeatures; + readonly attribute boolean isSystemKeyboardSupported; // Methods undefined updateRenderState(optional XRRenderStateInit state = {}); diff --git a/tests/wpt/web-platform-tests/interfaces/window-placement.idl b/tests/wpt/web-platform-tests/interfaces/window-management.idl index ac86c1d502a..527c41deb6c 100644 --- a/tests/wpt/web-platform-tests/interfaces/window-placement.idl +++ b/tests/wpt/web-platform-tests/interfaces/window-management.idl @@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into webref // (https://github.com/w3c/webref) -// Source: Multi-Screen Window Placement (https://w3c.github.io/window-placement/) +// Source: Window Management (https://w3c.github.io/window-management/) partial interface Screen /* : EventTarget */ { [SecureContext] diff --git a/tests/wpt/web-platform-tests/interfaces/xhr.idl b/tests/wpt/web-platform-tests/interfaces/xhr.idl index 3abd09ce5ed..b4c27c8aca9 100644 --- a/tests/wpt/web-platform-tests/interfaces/xhr.idl +++ b/tests/wpt/web-platform-tests/interfaces/xhr.idl @@ -70,7 +70,7 @@ typedef (File or USVString) FormDataEntryValue; [Exposed=(Window,Worker)] interface FormData { - constructor(optional HTMLFormElement form); + constructor(optional HTMLFormElement form, optional HTMLElement? submitter = null); undefined append(USVString name, USVString value); undefined append(USVString name, Blob blobValue, optional USVString filename); diff --git a/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html new file mode 100644 index 00000000000..3514d413e9e --- /dev/null +++ b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-blocking-duration.html @@ -0,0 +1,57 @@ +<!DOCTYPE HTML> +<meta charset=utf-8> +<title>Long Animation Frame Timing: basic</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> + +<body> +<h1>Long Animation Frame: blocking duration</h1> +<div id="log"></div> +<script> + +function loaf_blocking_duration_test(run, label) { + const OVERHEAD_EPSILON = 5; + const BLOCKING_THRESHOLD = 50; + promise_test(async t => { + const longtask_promise = new Promise(resolve => new PerformanceObserver( + (entries, observer) => { + resolve(entries.getEntries()); + observer.disconnect(); + }).observe({entryTypes: ["longtask"]})); + const [longtask_entries, loaf_entry] = await Promise.all( + [longtask_promise, expect_long_frame(run, t)]); + const overlapping = longtask_entries.filter(longtask => + (longtask.startTime >= loaf_entry.startTime && + longtask.startTime < (loaf_entry.startTime + loaf_entry.duration) && + (!loaf_entry.renderStart || + (longtask.startTime < loaf_entry.renderStart - OVERHEAD_EPSILON)))); + + const longest_index = overlapping.reduce( + (max, cur, i) => cur > overlapping[max] ? i : max, 0); + let expected_blocking_duration = 0; + overlapping.forEach(({duration}, i) => { + if (i === longest_index && loaf_entry.renderStart) + duration += loaf_entry.startTime + loaf_entry.duration - + loaf_entry.renderStart; + expected_blocking_duration += Math.max(0, duration - BLOCKING_THRESHOLD); + }); + + if (!overlapping.length && loaf_entry.renderStart) + expected_blocking_duration = + Math.max(0, + loaf_entry.startTime + loaf_entry.duration - loaf_entry.renderStart - + BLOCKING_THRESHOLD); + assert_approx_equals(loaf_entry.blockingDuration, + expected_blocking_duration, + OVERHEAD_EPSILON); + }, `LoAF blockingDuration should be equivalent to long tasks: ${label}`); +} + +loaf_blocking_duration_test(t => t.step_timeout(busy_wait), "Non-rendering"); +loaf_blocking_duration_test(t => t.step_timeout(() => { + busy_wait(); + requestAnimationFrame(busy_wait); +}), "Rendering"); +</script> +</body> diff --git a/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html index f78e95da6d1..5b249e69724 100644 --- a/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html +++ b/tests/wpt/web-platform-tests/long-animation-frame/tentative/loaf-toJSON.html @@ -31,7 +31,9 @@ 'startTime', 'duration', 'renderStart', - 'styleAndLayoutStart' + 'styleAndLayoutStart', + 'blockingTime', + 'firstUIEventTimestamp' ]; for (const key of performanceEntryKeys) { assert_equals(entryJSON[key], entry[key], diff --git a/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js b/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js index 26a925abf07..8b0f266faca 100644 --- a/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js +++ b/tests/wpt/web-platform-tests/mediacapture-record/utils/peerconnection.js @@ -13,9 +13,9 @@ * @param {!RTCPeerConnection} pc2 The second peer connection. */ async function exchangeOfferAnswer(pc1, pc2) { - await pc1.setLocalDescription(await pc1.createOffer()); + await pc1.setLocalDescription(); await pc2.setRemoteDescription(pc1.localDescription); - await pc2.setLocalDescription(await pc2.createAnswer()); + await pc2.setLocalDescription(); await pc1.setRemoteDescription(pc2.localDescription); } diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html index 676672a230f..004e1a75e3d 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html @@ -30,8 +30,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html index 41c3ca71eef..683875d0062 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html @@ -18,8 +18,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html index a467ecf9d73..60d1653a3ab 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html @@ -30,8 +30,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html index b9fa97f6d52..ee01e7f1f2d 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html @@ -28,8 +28,8 @@ async_test(t => { assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, link.href, "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html index 566bea3dc7e..eaa7b523457 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html @@ -16,8 +16,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html index 77a5873c083..cee7d95b9ec 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html @@ -23,8 +23,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, iframe.src + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html index 41ac1b03750..d0dad46b72a 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html index 1eda74e9828..156d1cb3cfd 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html @@ -23,8 +23,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, iframe.src + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html index 5679236a7dd..6d73262dea0 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html @@ -21,8 +21,8 @@ async_test(t => { assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, iframe.src + "#foo", "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html index a7e4181c3a1..6516a602395 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html index ea9ea479c34..1c411d98668 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html @@ -24,8 +24,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, url + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html index 478483e238d..c91689341e8 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html index 324adb32a45..74a6cae2461 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html @@ -24,8 +24,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, url + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html index 23dceb04204..9b31744ba38 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html @@ -22,8 +22,8 @@ async_test(t => { assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, iframe.src + "#foo", "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html index 9ca85318034..c357072e09d 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html index f6110346174..ffdaac7ccdd 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html @@ -30,8 +30,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html index 05347335a19..b54a5a440b0 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html @@ -16,8 +16,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html index 9e64a0124da..e9ab17243e5 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html @@ -30,8 +30,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html index e53a1f93e7a..69b12f27959 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html @@ -28,8 +28,8 @@ async_test(t => { assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, form.action, "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html index 43aa3226fcd..8a0e1f1fb69 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html @@ -16,8 +16,8 @@ async_test(t => { assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html index d8f2e383124..ee099248507 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-cross-origin.html @@ -14,8 +14,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, "https://does-not-exist/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html index 90a612b7588..b9506984dad 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html @@ -18,8 +18,8 @@ async_test(t => { assert_equals(e.formData, null); assert_equals(new URL(e.destination.url).search, "?1"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html index c5ca306b790..05fb0ecf2fe 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-download.html @@ -22,8 +22,8 @@ for (const [tag, download_attr] of tests) { assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html index b7706b7debe..51221ebcad3 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html @@ -14,8 +14,8 @@ async_test(t => { assert_equals(e.formData, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html index b8e925a4dba..68f5bf0627c 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html index b746bbe3f02..39192c91513 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html @@ -17,8 +17,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html index c2053a37b09..6407b963beb 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html @@ -20,8 +20,8 @@ async_test(t => { assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html new file mode 100644 index 00000000000..1dcb6cac437 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-after-detach.html @@ -0,0 +1,33 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<iframe id="i" src="/common/blank.html"></iframe> +<script> +promise_test(async t => { + // Wait for after the load event so that the navigation doesn't get converted + // into a replace navigation. + await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0)); + + let destination_key = i.contentWindow.navigation.currentEntry.key; + let destination_id = i.contentWindow.navigation.currentEntry.id; + let destination_index = i.contentWindow.navigation.currentEntry.index; + await i.contentWindow.navigation.navigate("#1").finished; + + let back_destination; + i.contentWindow.navigation.onnavigate = e => back_destination = e.destination; + await i.contentWindow.navigation.back().finished; + + // Before detach, key/id/index are valid. + assert_equals(back_destination.key, destination_key); + assert_equals(back_destination.id, destination_id); + assert_equals(back_destination.index, destination_index); + + i.remove(); + + // After detach, key/id/index are invalid, but the url is still valid. + assert_equals(back_destination.key, ""); + assert_equals(back_destination.id, ""); + assert_equals(new URL(back_destination.url).pathname, "/common/blank.html"); + assert_equals(back_destination.index, -1); +}, "navigate event destination after iframe detach"); +</script> diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html new file mode 100644 index 00000000000..2e0f1ea4973 --- /dev/null +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-dynamic-index.html @@ -0,0 +1,34 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../navigation-methods/return-value/resources/helpers.js"></script> +<script> +promise_test(async t => { + // Wait for after the load event so that the navigation doesn't get converted + // into a replace navigation. + await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0)); + await navigation.navigate("#1").finished; + + let back_destination; + navigation.addEventListener("navigate", t.step_func(e => { + back_destination = e.destination; + assert_equals(back_destination.index, 0); + }), { once: true }); + await navigation.back().finished; + + // Disposing the destination entry of back_destination should update + // back_destination.index, even though back_destination's navigation has + // completed. + await navigation.navigate("#clobber_back", { history: "replace" }).finished; + assert_equals(back_destination.index, -1); + + navigation.addEventListener("navigate", t.step_func(e => { + assert_equals(e.destination.index, 1); + + // Dispose the destination entry and destination.index should update. + navigation.navigate("#clobber_forward"); + assert_equals(e.destination.index, -1); + }), { once: true }); + await assertBothRejectDOM(t, navigation.forward(), "AbortError"); +}, "navigate event destination.index should be dynamic"); +</script> diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html index c118aa7a1f3..c8b1043aba6 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html @@ -16,8 +16,8 @@ async_test(t => { assert_not_equals(e.destination, null); assert_not_equals(e.destination.getState(), undefined); assert_not_equals(e.destination.getState(), e.destination.getState()); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); }); navigation.back(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html index 9c34c5753a1..5dac40de566 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-navigate.html @@ -13,8 +13,8 @@ async_test(t => { assert_not_equals(e.destination.getState(), undefined); assert_equals(e.destination.getState().statevar, "state"); assert_not_equals(e.destination.getState(), e.destination.getState()); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); }); navigation.navigate("#foo", { state: navState }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html index b3afb72482c..a180e086a94 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-reload.html @@ -13,8 +13,8 @@ async_test(t => { assert_not_equals(e.destination.getState(), undefined); assert_equals(e.destination.getState().statevar, "state"); assert_not_equals(e.destination.getState(), e.destination.getState()); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.intercept(); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html index 69a49eb08a6..87a102ddc05 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-get.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, location.href + "?"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); // Because it's a GET, not a POST diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html index 454f0773962..40c5905447c 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-userInitiated.html @@ -20,8 +20,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, location.href); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_not_equals(e.formData, null); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html index b23ab3a70cc..f6fe05c938f 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form-with-target.html @@ -18,8 +18,8 @@ async_test(t => { assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_not_equals(e.formData, null); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html index b537a9b58f0..c57d72c3deb 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-form.html @@ -15,8 +15,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, location.href); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_not_equals(e.formData, null); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html index 96d98cf44c8..b1f41425b62 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-go-0.html @@ -14,8 +14,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).pathname, "/common/blank.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html index 2f8c81c7090..266309a79e1 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-pushState.html @@ -13,8 +13,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html index d8417fbfd30..ea6d3df455d 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-history-replaceState.html @@ -13,8 +13,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html index 059b9950118..25d51476f3f 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-iframe-location.html @@ -17,8 +17,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html index c5aa0be97a4..a4d0c60776d 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-location.html @@ -13,8 +13,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html index 1f8ed306851..9fa59b29f24 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-meta-refresh.html @@ -16,8 +16,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, i.contentWindow.location.href); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html index 76f98c72361..ffc8ea867f7 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-navigation-navigate.html @@ -12,8 +12,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#foo"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); }); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html index 26ad135b6ad..8bbb66a31fd 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-to-srcdoc.html @@ -17,8 +17,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, "about:srcdoc"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html index 274c8bc4d57..a6e443fd5a1 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open-self.html @@ -12,8 +12,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html index afc998271f6..1fe2402bc91 100644 --- a/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html +++ b/tests/wpt/web-platform-tests/navigation-api/navigate-event/navigate-window-open.html @@ -17,8 +17,8 @@ async_test(t => { assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault(); diff --git a/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js b/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js index 40f10a56448..fa96bf3b760 100644 --- a/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js +++ b/tests/wpt/web-platform-tests/page-visibility/resources/window_state_context.js @@ -15,5 +15,23 @@ function window_state_context(t) { rect = await test_driver.minimize_window(); } - return {minimize, restore}; + function visibilityEventPromise() { + return new Promise(resolve => new PerformanceObserver( + (entries, observer) => { observer.disconnect(); resolve(); }).observe( + {type: "visibility-state"})) + } + + async function minimizeAndWait() { + const promise = visibilityEventPromise(); + await Promise.all([minimize(), promise]); + await new Promise(resolve => t.step_timeout(resolve, 0)); + } + + async function restoreAndWait() { + const promise = visibilityEventPromise(); + await Promise.all([restore(), promise]); + await new Promise(resolve => t.step_timeout(resolve, 0)); + } + + return {minimize, restore, minimizeAndWait, restoreAndWait}; } diff --git a/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html b/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html index c62b6c583f4..0dbe634d25b 100644 --- a/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html +++ b/tests/wpt/web-platform-tests/page-visibility/visibility-state-entry.tentative.html @@ -1,6 +1,6 @@ <!DOCTYPE HTML> <title>Test VisibleStateEntry</title> -<link rel="author" title="Noam Rosenthal" href="mailto:noam@chromium.org"> +<link rel="author" title="Noam Rosenthal" href="mailto:nrosenthal@chromium.org"> <link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#page-visibility"> <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> @@ -15,68 +15,56 @@ setup(() => { }); promise_test(async t => { - const {minimize, restore} = window_state_context(t); + const {minimizeAndWait, restoreAndWait} = window_state_context(t); + const all = performance.getEntries(); let entries = performance.getEntriesByType("visibility-state"); assert_equals(entries.length, 1); assert_equals(entries[0].name, "visible"); assert_equals(entries[0].startTime, 0); assert_equals(entries[0].duration, 0); - await minimize(); + await minimizeAndWait(); entries = performance.getEntriesByType("visibility-state"); assert_equals(entries.length, 2); assert_equals(entries[1].name, "hidden"); assert_equals(entries[1].duration, 0); - await restore(); + await restoreAndWait(); + entries = performance.getEntriesByType("visibility-state"); assert_equals(entries.length, 3); assert_equals(entries[2].name, "visible"); assert_equals(entries[2].duration, 0); }, "Hiding/showing the page should create visibility-state entries"); promise_test(async t => { - const {minimize, restore} = window_state_context(t); - await minimize(); - const popup = window.open("resources/blank_page_green.html"); - t.add_cleanup(() => popup.close()); - await restore(); - let entries = popup.performance.getEntriesByType("visibility-state"); - assert_equals(entries.length, 2); + const {minimizeAndWait} = window_state_context(t); + await minimizeAndWait(); + const iframe = document.createElement("iframe"); + iframe.src = "resources/blank_page_green.html"; + const loaded = new Promise(resolve => iframe.addEventListener("load", resolve)); + t.add_cleanup(() => iframe.remove()); + document.body.appendChild(iframe); + await loaded; + const entries = iframe.contentWindow.performance.getEntriesByType("visibility-state"); assert_equals(entries[0].name, "hidden"); assert_equals(entries[0].startTime, 0); - assert_equals(entries[1].name, "visible"); - assert_greater_than(entries[1].startTime, 0); - }, "If a page starts as hidden, the first visibility-state entry should be hidden"); promise_test(async t => { const {minimize, restore} = window_state_context(t); - await minimize(); const observed = new Promise(resolve => new PerformanceObserver(list => { - const entries = list.getEntries(); - assert_equals(entries.length, 1); - assert_equals(entries[0].name, "visible"); - assert_greater_than(entries[0].startTime, 0); - assert_equals(entries[0].duration, 0); + if (list.getEntries()[0].name === "visible") resolve(); - }).observe({entryTypes: ['visibility-state'], buffered: true})); + }).observe({entryTypes: ['visibility-state']})); + await minimize(); await restore(); await observed; }, "Visibility state entries should be queued to performance observers"); promise_test(async t => { - const {minimize, restore} = window_state_context(t); - await minimize(); - await restore(); - await new Promise(resolve => new PerformanceObserver(list => { - const entries = list.getEntries(); - assert_equals(entries.length, 3); - assert_equals(entries[0].name, "visible"); - assert_equals(entries[0].startTime, 0); - assert_equals(entries[0].duration, 0); - assert_equals(entries[1].name, "hidden"); - assert_equals(entries[1].duration, 0); - assert_equals(entries[2].name, "visible"); - assert_equals(entries[2].duration, 0); - resolve(); - }).observe({entryTypes: ['visibility-state'], buffered: true})); -}, "Visibility state entries should respect the buffered flag"); + const entry = await new Promise(resolve => new PerformanceObserver( + (list, observer) => { + observer.disconnect(); + resolve(list.getEntries()[0]); + }).observe({type: "visibility-state", buffered: true})); + assert_equals(entry.name, "visible"); +}, "Visibility state observers should respect the buffered flag"); </script> diff --git a/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js b/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js index 91efe529f2a..21811ed52da 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js +++ b/tests/wpt/web-platform-tests/resources/chromium/mock-pressure-service.js @@ -1,5 +1,5 @@ import {PressureManager, PressureManagerReceiver, PressureStatus} from '/gen/services/device/public/mojom/pressure_manager.mojom.m.js' -import {PressureFactor, PressureState} from '/gen/services/device/public/mojom/pressure_update.mojom.m.js' +import {PressureFactor, PressureSource, PressureState} from '/gen/services/device/public/mojom/pressure_update.mojom.m.js' class MockPressureService { constructor() { @@ -9,11 +9,8 @@ class MockPressureService { this.interceptor_.oninterfacerequest = e => { this.receiver_.$.bindHandle(e.handle); }; - this.receiver_.onConnectionError.addListener(() => { - this.stopPlatformCollector(); - this.observer_ = null; - }); this.reset(); + this.mojomSourceType_ = new Map([['cpu', PressureSource.kCpu]]); this.mojomStateType_ = new Map([ ['nominal', PressureState.kNominal], ['fair', PressureState.kFair], ['serious', PressureState.kSerious], ['critical', PressureState.kCritical] @@ -40,22 +37,27 @@ class MockPressureService { } reset() { - this.observer_ = null; + this.observers_ = []; this.pressureUpdate_ = null; this.pressureServiceReadingTimerId_ = null; this.pressureStatus_ = PressureStatus.kOk; this.updatesDelivered_ = 0; } - async addClient(observer) { - if (this.observer_ !== null) - throw new Error('BindObserver() has already been called'); + async addClient(observer, source) { + if (this.observers_.indexOf(observer) >= 0) + throw new Error('addClient() has already been called'); - this.observer_ = observer; - this.observer_.onConnectionError.addListener(() => { - this.stopPlatformCollector(); - this.observer_ = null; + // TODO(crbug.com/1342184): Consider other sources. + // For now, "cpu" is the only source. + if (source !== PressureSource.kCpu) + throw new Error('Call addClient() with a wrong PressureSource'); + + observer.onConnectionError.addListener(() => { + // Remove this observer from observer array. + this.observers_.splice(this.observers_.indexOf(observer), 1); }); + this.observers_.push(observer); return {status: this.pressureStatus_}; } @@ -83,20 +85,21 @@ class MockPressureService { const epochDeltaInMs = unixEpoch - windowsEpoch; const timeout = (1 / sampleRate) * 1000; - this.pressureServiceReadingTimerId_ = window.setInterval(() => { - if (this.pressureUpdate_ === null || this.observer_ === null) + this.pressureServiceReadingTimerId_ = self.setInterval(() => { + if (this.pressureUpdate_ === null || this.observers_.length === 0) return; this.pressureUpdate_.timestamp = { internalValue: BigInt((new Date().getTime() + epochDeltaInMs) * 1000) }; - this.observer_.onPressureUpdated(this.pressureUpdate_); + for (let observer of this.observers_) + observer.onPressureUpdated(this.pressureUpdate_); this.updatesDelivered_++; }, timeout); } stopPlatformCollector() { if (this.pressureServiceReadingTimerId_ != null) { - window.clearInterval(this.pressureServiceReadingTimerId_); + self.clearInterval(this.pressureServiceReadingTimerId_); this.pressureServiceReadingTimerId_ = null; } this.updatesDelivered_ = 0; @@ -106,7 +109,10 @@ class MockPressureService { return this.updatesDelivered_; } - setPressureUpdate(state, factors) { + setPressureUpdate(source, state, factors) { + if (!this.mojomSourceType_.has(source)) + throw new Error(`PressureSource '${source}' is invalid`); + if (!this.mojomStateType_.has(state)) throw new Error(`PressureState '${state}' is invalid`); @@ -120,6 +126,7 @@ class MockPressureService { } this.pressureUpdate_ = { + source: this.mojomSourceType_.get(source), state: this.mojomStateType_.get(state), factors: pressureFactors, }; diff --git a/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js b/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js index b63e97b8c4d..b81936713b1 100644 --- a/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js +++ b/tests/wpt/web-platform-tests/resources/chromium/mock-subapps.js @@ -37,7 +37,7 @@ self.SubAppsServiceTest = (() => { remove() { return Promise.resolve({ - result: testInternal.serviceResultCode, + result: testInternal.removeCallReturnValue, }); } } @@ -48,6 +48,7 @@ self.SubAppsServiceTest = (() => { serviceResultCode: 0, addCallReturnValue: [], listCallReturnValue: [], + removeCallReturnValue: [], } class SubAppsServiceTestChromium { @@ -55,7 +56,7 @@ self.SubAppsServiceTest = (() => { Object.freeze(this); // Make it immutable. } - initialize(service_result_code, add_call_return_value, list_call_return_value) { + initialize(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value) { if (!testInternal.initialized) { testInternal = { mockSubAppsService: new MockSubAppsService(), @@ -63,6 +64,7 @@ self.SubAppsServiceTest = (() => { serviceResultCode: service_result_code, addCallReturnValue: add_call_return_value, listCallReturnValue: list_call_return_value, + removeCallReturnValue: remove_call_return_value, }; }; } @@ -76,6 +78,7 @@ self.SubAppsServiceTest = (() => { serviceResultCode: 0, addCallReturnValue: [], listCallReturnValue: [], + removeCallReturnValue: [], }; await new Promise(resolve => setTimeout(resolve, 0)); } diff --git a/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html b/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html index 0bebb6723a3..90bbb8071da 100644 --- a/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html +++ b/tests/wpt/web-platform-tests/screen-orientation/orientation-reading.html @@ -6,110 +6,91 @@ <script src="/resources/testdriver.js"></script> <script src="/resources/testdriver-vendor.js"></script> <script type="module"> - -import { makeCleanup, getOppositeOrientation } from "./resources/orientation-utils.js"; - -test(() => { - assert_true("type" in screen.orientation); - assert_true("angle" in screen.orientation); -}, "Test screen.orientation properties"); +"use strict"; +import { + makeCleanup, + getOppositeOrientation, +} from "./resources/orientation-utils.js"; test(() => { - const type = screen.orientation.type; - const angle = screen.orientation.angle; + assert_true("type" in screen.orientation, ".type must be present"); + assert_true("angle" in screen.orientation, ".angle must be present"); +}, "screen.orientation attributes are present"); - if (screen.width > screen.height) { - assert_true(type == "landscape-primary" || type == "landscape-secondary"); - } else if (screen.width < screen.height) { - assert_true(type == "portrait-primary" || type == "portrait-secondary"); +async function testExpectedOrientationAngles(expectedAngles) { + for (const [orientation, expectedAngle] of Object.entries(expectedAngles)) { + try { + if (screen.orientation.type !== orientation) { + await screen.orientation.lock(orientation); + } + assert_equals( + screen.orientation.angle, + expectedAngle, + `Orientation angle for '${orientation}' must be ${expectedAngle} degrees` + ); + } catch (err) { + // implementation might not support locking to this orientation + } } +} + +promise_test(async (t) => { + t.add_cleanup(makeCleanup()); + await test_driver.bless("request full screen"); + await document.documentElement.requestFullscreen(); - assert_true(angle == 0 || angle == 90 || angle == 180 || angle == 270); -}, "Test screen.orientation default values."); + const expectedAnglesPortrait = { + "portrait-primary": 0, + "landscape-primary": 90, + "portrait-secondary": 180, + "landscape-secondary": 270, + }; -promise_test(async t => { + await testExpectedOrientationAngles(expectedAnglesPortrait); +}, "Test the orientations and associated angles when the natural orientation is 'portrait'"); + +promise_test(async (t) => { t.add_cleanup(makeCleanup()); await test_driver.bless("request full screen"); await document.documentElement.requestFullscreen(); - try { - await screen.orientation.lock("portrait-primary"); - } catch (err) { - // implementation might not support locking to portrait-primary - return; - } - const orientations = - screen.orientation.angle === 0 - ? { - secondaryOrientation1: "portrait-secondary", - primaryOrientation2: "landscape-primary", - secondaryOrientation2: "landscape-secondary", - } - : { - secondaryOrientation1: "landscape-secondary", - primaryOrientation2: "portrait-primary", - secondaryOrientation2: "portrait-secondary", - }; - try { - await screen.orientation.lock(orientations.secondaryOrientation1); - } catch (err) { - // implementation might not support locking to this orientation - return; - } - assert_equals( - screen.orientation.angle, - 180, - "Secondary orientation 1 angle must be 180" - ); - try { - await screen.orientation.lock(orientations.primaryOrientation2); - } catch (err) { - // implementation might not support locking to this orientation - return; - } - assert_true( - screen.orientation.angle == 90 || screen.orientation.angle == 270, - "Primary orientation 2 angle must be either 90 or 270" - ); - const primaryOrientation2Angle = screen.orientation.angle; - const secondaryOrientation2Angle = primaryOrientation2Angle === 90 ? 270 : 90; - try { - await screen.orientation.lock(orientations.secondaryOrientation2); - } catch (err) { - // implementation might not support locking to this orientation - return; - } - assert_equals( - screen.orientation.angle, - secondaryOrientation2Angle, - "Secondary orientation 2 angle must be the opposite angle to primary orientation 2" - ); - screen.orientation.unlock(); -}, "Test the orientations and associated angles"); + + const expectedAnglesLandscape = { + "landscape-primary": 0, + "portrait-primary": 90, + "landscape-secondary": 180, + "portrait-secondary": 270, + }; + + await testExpectedOrientationAngles(expectedAnglesLandscape); +}, "Test the orientations and associated angles when the natural orientation is 'landscape'"); test(() => { - const type = screen.orientation.type; - const angle = screen.orientation.angle; + const { angle, type } = screen.orientation; - try { - screen.orientation.type = "foo"; - } catch (err) { - // implementation might throw an exception due to readonly - } - try { - screen.orientation.angle = 42; - } catch (err) { - // implementation might throw an exception due to readonly - } + assert_throws_js( + TypeError, + () => { + screen.orientation.type = "foo"; + }, + "throws when setting ScreenOrientation.type to a string in strict mode" + ); + assert_throws_js( + TypeError, + () => { + screen.orientation.angle = 42; + }, + "throws when setting ScreenOrientation.angle to a number in strict mode" + ); assert_equals(screen.orientation.type, type); assert_equals(screen.orientation.angle, angle); -}, "Test that screen.orientation properties are not writable"); +}, "Test that ScreenOrientation properties are not writable"); test(() => { assert_equals(screen.orientation, screen.orientation); -}, "Test that screen.orientation is always the same object"); +}, "Test that ScreenOrientation is always the same object"); -promise_test(async t => { +promise_test(async (t) => { t.add_cleanup(makeCleanup()); await test_driver.bless("request full screen"); await document.documentElement.requestFullscreen(); @@ -121,10 +102,18 @@ promise_test(async t => { // change event is fired before resolving promise by lock. const event = await Promise.race([ orientationWatcher.wait_for("change"), - screen.orientation.lock(newOrientationType) + screen.orientation.lock(newOrientationType), ]); assert_true(event instanceof Event, "expected event"); - assert_not_equals(screen.orientation.type, initialType, "type should have changed"); - assert_not_equals(screen.orientation.angle, initialAngle, "angle should have changed"); -}, "Test that screen.orientation values change if the orientation changes"); + assert_not_equals( + screen.orientation.type, + initialType, + ".type must change" + ); + assert_not_equals( + screen.orientation.angle, + initialAngle, + ".angle must change" + ); +}, "Test that ScreenOrientation's attribute values change after 'change' event fires"); </script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html index f44a682890d..375489c26a4 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/animation-duration-auto.tentative.html @@ -13,7 +13,7 @@ width: 100px; height: 100px; } - #scroller > div { + #scroller > #content { height: 200px; width: 200px; } @@ -36,9 +36,9 @@ </style> <main> <div id=scroller> - <div></div> + <div id=content></div> + <div id=element></div> </div> - <div id=element></div> </main> <script> promise_test(async (t) => { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html index 7e5b6607b6e..05fab3e46ad 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html @@ -41,8 +41,8 @@ <div id="scroller"> <div id="contents"></div> + <div id="box"></div> </div> -<div id="box"></div> <script> window.addEventListener('load', function() { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html index 9074f2454b1..d2f2d8f73d7 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html @@ -23,8 +23,8 @@ <div id="scroller"> <div id="contents"></div> + <div id="box"></div> </div> -<div id="box"></div> <script> window.addEventListener('load', function() { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html index 2e910cbe51e..3f1aeed0ae9 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/progress-based-animation-timeline.html @@ -28,6 +28,7 @@ animation-duration: 10s; animation-timing-function: linear; animation-timeline: top_timeline; + position: absolute; } /* Ensure stable expectations if feature is not supported */ @supports not (animation-timeline:foo) { @@ -35,8 +36,10 @@ } </style> <main> - <div id=scroller1><div></div></div> - <div id=element></div> + <div id=scroller1> + <div></div> + <div id=element></div> + </div> </main> <script> window.onload = async () => { diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html new file mode 100644 index 00000000000..78ca2574373 --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-attachment.html @@ -0,0 +1,296 @@ +<!DOCTYPE html> +<title>Scroll Timeline Attachment</title> +<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> + +<main id=main></main> +<script> + function inflate(t, template) { + t.add_cleanup(() => main.replaceChildren()); + main.append(template.content.cloneNode(true)); + main.offsetTop; + } + + async function scrollTop(e, value) { + e.scrollTop = value; + await waitForNextFrame(); + } +</script> +<style> + @keyframes anim { + from { width: 0px; --applied:true; } + to { width: 200px; --applied:true; } + } + + .scroller { + overflow-y: hidden; + width: 200px; + height: 200px; + } + .scroller > .content { + margin: 400px 0px; + width: 100px; + height: 100px; + background-color: green; + } + .target { + background-color: coral; + width: 0px; + animation: anim auto linear; + animation-timeline: t1; + } + .timeline { + scroll-timeline-name: t1; + } + .local { + scroll-timeline-attachment: local; + } + .defer { + scroll-timeline-attachment: defer; + } + .ancestor { + scroll-timeline-attachment: ancestor; + } + +</style> + + +<!-- Basic Behavior --> + +<template id=scroll_timeline_defer> + <div class="timeline defer"> + <div class=target>Test</div> + <div class="scroller timeline ancestor"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_defer); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Descendant can attach to deferred timeline'); +</script> + +<template id=scroll_timeline_defer_no_attach> + <div class="timeline defer"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_defer_no_attach); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Deferred timeline with no attachments'); +</script> + +<template id=scroll_timeline_local_ancestor> + <div class="scroller timeline local"> + <div class=content> + <div class=target>Test</div> + <div class="scroller timeline ancestor"> + <div class=content></div> + </div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_local_ancestor); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Timeline with ancestor attachment does not attach to local'); +</script> + +<template id=scroll_timeline_defer_two_attachments> + <div class="timeline defer"> + <div class=target>Test</div> + <div class="scroller timeline ancestor"> + <div class=content></div> + </div> + <!-- Extra attachment --> + <div class="timeline ancestor"></div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_defer_two_attachments); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Deferred timeline with two attachments'); +</script> + +<!-- Effective Axis of ScrollTimeline --> + +<template id=scroll_timeline_defer_axis> + <div class="timeline defer" style="scroll-timeline-axis:inline"> + <div class=target>Test</div> + <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_defer_axis); + let target = main.querySelector('.target'); + assert_equals(target.getAnimations().length, 1); + let anim = target.getAnimations()[0]; + assert_not_equals(anim.timeline, null); + assert_equals(anim.timeline.axis, 'vertical'); + }, 'Axis of deferred timeline is taken from attached timeline'); +</script> + + +<template id=scroll_timeline_defer_axis_multiple> + <div class="timeline defer" style="scroll-timeline-axis:inline"> + <div class=target>Test</div> + <div class="scroller timeline ancestor" style="scroll-timeline-axis:vertical"> + <div class=content></div> + </div> + <!-- Extra attachment --> + <div class="timeline ancestor"></div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_defer_axis_multiple); + let target = main.querySelector('.target'); + assert_equals(target.getAnimations().length, 1); + let anim = target.getAnimations()[0]; + assert_not_equals(anim.timeline, null); + assert_equals(anim.timeline.axis, 'block'); + }, 'Axis of deferred timeline with multiple attachments'); +</script> + + +<!-- Dynamic Reattachment --> + + +<template id=scroll_timeline_reattach> + <div class="timeline defer"> + <div class=target>Test</div> + <div class="scroller timeline ancestor"> + <div class=content></div> + </div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_reattach); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to scrollers[0]. + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Reattach to scrollers[1]. + scrollers[0].classList.remove('ancestor'); + scrollers[1].classList.add('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25% + }, 'Dynamically re-attaching'); +</script> + + +<template id=scroll_timeline_dynamic_attach_second> + <div class="timeline defer"> + <div class=target>Test</div> + <div class="scroller timeline"> + <div class=content></div> + </div> + <div class="scroller timeline"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_dynamic_attach_second); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to no timelines initially: + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + + // Attach to scrollers[0]. + scrollers[0].classList.add('ancestor'); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Also attach scrollers[1]. + scrollers[1].classList.add('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Dynamically attaching'); +</script> + + +<template id=scroll_timeline_dynamic_detach_second> + <div class="timeline defer"> + <div class=target>Test</div> + <div class="scroller timeline ancestor"> + <div class=content></div> + </div> + <div class="scroller timeline ancestor"> + <div class=content></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, scroll_timeline_dynamic_detach_second); + let scrollers = main.querySelectorAll('.scroller'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 175); // 25% + + // Attached to two timelines initially: + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + + // Detach scrollers[1]. + scrollers[1].classList.remove('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Also detach scrollers[0]. + scrollers[0].classList.remove('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Dynamically detaching'); +</script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html index 37b4dfdf549..958ce4964e8 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/scroll-timeline-axis-writing-mode.html @@ -41,15 +41,16 @@ scroll-timeline: timeline_inline_in_vertical inline; writing-mode: vertical-lr; } - #container > div { + .target { width: 0px; animation-name: expand; animation-duration: 10s; animation-timing-function: linear; + position: absolute; } /* Ensure stable expectations if feature is not supported */ @supports not (animation-timeline:foo) { - #container > div { animation-play-state: paused; } + .target { animation-play-state: paused; } } #element_initial_axis { animation-timeline: timeline_initial_axis; } #element_vertical { animation-timeline: timeline_vertical; } @@ -59,21 +60,33 @@ #element_block_in_vertical { animation-timeline: timeline_block_in_vertical; } #element_inline_in_vertical { animation-timeline: timeline_inline_in_vertical; } </style> -<div class=scroller id=timeline_initial_axis><div class=contents></div></div> -<div class=scroller id=timeline_vertical><div class=contents></div></div> -<div class=scroller id=timeline_horizontal><div class=contents></div></div> -<div class=scroller id=timeline_block_in_horizontal><div class=contents></div></div> -<div class=scroller id=timeline_inline_in_horizontal><div class=contents></div></div> -<div class=scroller id=timeline_block_in_vertical><div class=contents></div></div> -<div class=scroller id=timeline_inline_in_vertical><div class=contents></div></div> -<div id=container> - <div id=element_initial_axis></div> - <div id=element_vertical></div> - <div id=element_horizontal></div> - <div id=element_block_in_horizontal></div> - <div id=element_inline_in_horizontal></div> - <div id=element_block_in_vertical></div> - <div id=element_inline_in_vertical></div> +<div class=scroller id=timeline_initial_axis> + <div class=contents></div> + <div class=target id=element_initial_axis></div> +</div> +<div class=scroller id=timeline_vertical> + <div class=contents></div> + <div class=target id=element_vertical></div> +</div> +<div class=scroller id=timeline_horizontal> + <div class=contents></div> + <div class=target id=element_horizontal></div> +</div> +<div class=scroller id=timeline_block_in_horizontal> + <div class=contents></div> + <div class=target id=element_block_in_horizontal></div> +</div> +<div class=scroller id=timeline_inline_in_horizontal> + <div class=contents></div> + <div class=target id=element_inline_in_horizontal></div> +</div> +<div class=scroller id=timeline_block_in_vertical> + <div class=contents></div> + <div class=target id=element_block_in_vertical></div> +</div> +<div class=scroller id=timeline_inline_in_vertical> + <div class=contents></div> + <div class=target id=element_inline_in_vertical></div> </div> <script> // Animations linked to vertical scroll-timelines are at 75% progress. diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html index 047acfed33f..389c8baca3a 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-offset-keyframes-hidden-subject.html @@ -62,7 +62,10 @@ async function runTest() { promise_test(async t => { await waitForNextFrame(); - const anim = document.getAnimations()[0]; + const anims = document.getAnimations(); + assert_equals(anims.length, 1, + "Should have one animation attatched to the view-timeline"); + const anim = anims[0]; await anim.ready; await waitForNextFrame(); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html index a0d1bd92f09..7bae49c2e97 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/timeline-range-name-offset-in-keyframes.tentative.html @@ -51,7 +51,6 @@ // scrollTop=200 to 400 is the entry range container.scrollTop = 200; await waitForNextFrame(); - const anim = document.getAnimations()[0]; assert_equals(getComputedStyle(subject).opacity, '0', 'Effect at entry 0%'); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html index b816bb68973..73189b85917 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-animation.html @@ -1,5 +1,6 @@ <!DOCTYPE html> <title>Animations using view-timeline</title> +<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1"> <link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#view-timelines-named"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html new file mode 100644 index 00000000000..47f4444b0dc --- /dev/null +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-attachment.html @@ -0,0 +1,338 @@ +<!DOCTYPE html> +<title>View Timeline Attachment</title> +<link rel="help" src="https://github.com/w3c/csswg-drafts/issues/7759"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/web-animations/testcommon.js"></script> + +<main id=main></main> +<script> + function inflate(t, template) { + t.add_cleanup(() => main.replaceChildren()); + main.append(template.content.cloneNode(true)); + main.offsetTop; + } + + async function scrollTop(e, value) { + e.scrollTop = value; + await waitForNextFrame(); + } +</script> +<style> + @keyframes anim { + from { width: 0px; --applied:true; } + to { width: 200px; --applied:true; } + } + + .scroller { + overflow-y: hidden; + width: 200px; + height: 200px; + } + .scroller > .content { + margin: 400px 0px; + width: 100px; + height: 100px; + background-color: green; + } + .target { + background-color: coral; + width: 0px; + animation: anim auto linear; + animation-timeline: t1; + } + /* + .defer { + view-timeline-name: t1; + view-timeline-attachment: defer; + } + */ + .timeline { + view-timeline-name: t1; + } + .local { + view-timeline-attachment: local; + } + .defer { + view-timeline-attachment: defer; + } + .ancestor { + view-timeline-attachment: ancestor; + } + +</style> + +<!-- Basic Behavior --> + +<template id=view_timeline_defer> + <div class="timeline defer"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_defer); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + }, 'Descendant can attach to deferred timeline'); +</script> + +<template id=view_timeline_defer_no_attach> + <div class="timeline defer"> + <div class=target>Test</div> + <div class=scroller> + <div class="timeline content"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_defer_no_attach); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Deferred timeline with no attachments'); +</script> + +<template id=view_timeline_defer_two_attachments> + <div class="timeline defer"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor"></div> + <!-- Extra attachment --> + <div class="timeline ancestor"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_defer_two_attachments); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + await scrollTop(scroller, 350); // 50% + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Deferred timeline with two attachments'); +</script> + +<!-- Effective Axis of ViewTimeline --> + +<template id=view_timeline_defer_axis> + <div class="timeline defer" style="view-timeline-axis:inline"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_defer_axis); + let target = main.querySelector('.target'); + assert_equals(target.getAnimations().length, 1); + let anim = target.getAnimations()[0]; + assert_not_equals(anim.timeline, null); + assert_equals(anim.timeline.axis, 'vertical'); + }, 'Axis of deferred timeline is taken from attached timeline'); +</script> + +<template id=view_timeline_defer_axis_multiple> + <div class="timeline defer" style="view-timeline-axis:inline"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor" style="view-timeline-axis:vertical"></div> + <!-- Extra attachment --> + <div class="timeline ancestor"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_defer_axis_multiple); + let target = main.querySelector('.target'); + assert_equals(target.getAnimations().length, 1); + let anim = target.getAnimations()[0]; + assert_not_equals(anim.timeline, null); + assert_equals(anim.timeline.axis, 'block'); + }, 'Axis of deferred timeline with multiple attachments'); +</script> + +<!-- Effective Inset of ViewTimeline --> + +<template id=view_timeline_inset> + <div class="timeline defer" style="view-timeline-inset:0px"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor" style="view-timeline-inset:50px"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_inset); + let scroller = main.querySelector('.scroller'); + let target = main.querySelector('.target'); + + // Range: [200, 500] + [50, -50] (inset) = [250, 450] + await scrollTop(scroller, 300); // 25% + assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25% + }, 'Inset of deferred timeline is taken from attached timeline'); +</script> + +<!-- Dynamic Reattachment --> + +<template id=view_timeline_reattach> + <div class="timeline defer"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor"></div> + </div> + <div class=scroller> + <div class="content timeline"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_reattach); + let scrollers = main.querySelectorAll('.scroller'); + let contents = main.querySelectorAll('.content'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + // Range: [200, 500] + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 275); // 25% + + // Attached to contents[0]. + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Reattach to contents[1]. + contents[0].classList.remove('ancestor'); + contents[1].classList.add('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '50px'); // 0px => 200px, 25% + }, 'Dynamically re-attaching'); +</script> + + +<template id=view_timeline_dynamic_attach_second> + <div class="timeline defer"> + <div class=target>Test</div> + <div class=scroller> + <div class="timeline content"></div> + </div> + <div class=scroller> + <div class="timeline content"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_dynamic_attach_second); + let scrollers = main.querySelectorAll('.scroller'); + let contents = main.querySelectorAll('.content'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + // Range: [200, 500] + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 275); // 25% + + // Attached to no timelines initially: + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + + // Attach to contents[0]. + contents[0].classList.add('ancestor'); + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Also attach contents[1]. + contents[1].classList.add('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Dynamically attaching'); +</script> + + +<template id=view_timeline_dynamic_detach_second> + <div class="timeline defer"> + <div class=target>Test</div> + <div class=scroller> + <div class="content timeline ancestor"></div> + </div> + <div class=scroller> + <div class="content timeline ancestor"></div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_timeline_dynamic_detach_second); + let scrollers = main.querySelectorAll('.scroller'); + let contents = main.querySelectorAll('.content'); + assert_equals(scrollers.length, 2); + let target = main.querySelector('.target'); + // Range: [200, 500] + await scrollTop(scrollers[0], 350); // 50% + await scrollTop(scrollers[1], 275); // 25% + + // Attached to two timelines initially: + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + + // Detach contents[1]. + contents[1].classList.remove('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '100px'); // 0px => 200px, 50% + + // Also detach contents[0]. + contents[0].classList.remove('ancestor'); + + await waitForNextFrame(); + assert_equals(getComputedStyle(target).width, '0px'); + assert_equals(getComputedStyle(target).getPropertyValue('--applied'), ''); + }, 'Dynamically detaching'); +</script> + +<!-- ViewTimelines and ScrollTimelines --> + +<template id=view_scroll_timeline_defer> + <div style="scroll-timeline: t1 defer"> + <div class=target>Test1</div> + <div class="timeline defer"> + <div class=target>Test2</div> + <div class=scroller style="scroll-timeline: t1 ancestor;"> + <div class="content timeline ancestor" style="view-timeline-inset: 0px 50px"></div> + </div> + </div> + </div> +</template> +<script> + promise_test(async (t) => { + inflate(t, view_scroll_timeline_defer); + let scroller = main.querySelector('.scroller'); + let targets = main.querySelectorAll('.target'); + await scrollTop(scroller, 350); + + // Attached to ScrollTimeline: + // Range: [0, 700] + // 350 => 50% + assert_equals(getComputedStyle(targets[0]).width, '100px'); + + // Attached to ViewTimeline: + // Range: [200, 500] + [50, 0] (inset) = [250, 500] + // 350 => 40% + assert_equals(getComputedStyle(targets[1]).width, '80px'); + }, 'Mixing deferred scroll and view-timelines'); +</script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html index a95086b62bf..a7e807c2e81 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-inset-animation.html @@ -1,5 +1,6 @@ <!DOCTYPE html> <title>Animations using view-timeline-inset</title> +<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1"> <link rel="help" src="https://drafts.csswg.org/scroll-animations-1/#propdef-view-timeline-inset"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html index 1dc766d961c..04eb6489490 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-keyframe-boundary-interpolation.html @@ -80,7 +80,10 @@ promise_test(async t => { await waitForNextFrame(); - const anim = document.getAnimations()[0]; + const anims = document.getAnimations(); + assert_equals(anims.length, 1, + "Should have one animation attatched to the view-timeline"); + const anim = anims[0]; await anim.ready; await waitForNextFrame(); diff --git a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html index c1797c7ba1c..b8a5b0008be 100644 --- a/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html +++ b/tests/wpt/web-platform-tests/scroll-animations/css/view-timeline-lookup.html @@ -260,8 +260,7 @@ }, 'view-timeline on ancestor sibling, closer scroll-timeline wins'); </script> - -<template id=timeline_ancestor_view_timeline_wins_on_same_element> +<template id=timeline_ancestor_scroll_timeline_wins_on_same_element> <style> #timelines { height: 0px; @@ -294,8 +293,11 @@ </template> <script> promise_test(async (t) => { - inflate(t, timeline_ancestor_view_timeline_wins_on_same_element); + inflate(t, timeline_ancestor_scroll_timeline_wins_on_same_element); await waitForNextFrame(); - assert_equals(getComputedStyle(target).zIndex, '75'); - }, 'view-timeline on ancestor sibling, view-timeline wins on same element'); + // In case of a name conflict on the same element, scroll progress timelines + // take precedence over view progress timelines. + // https://drafts.csswg.org/scroll-animations-1/#timeline-scope + assert_equals(getComputedStyle(target).zIndex, '0'); + }, 'view-timeline on ancestor sibling, scroll-timeline wins on same element'); </script> diff --git a/tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html b/tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html new file mode 100644 index 00000000000..1c01fa0e89c --- /dev/null +++ b/tests/wpt/web-platform-tests/secure-payment-confirmation/authentication-disallowed-when-hidden.https.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Test for the 'secure-payment-confirmation' payment method authentication - accepted case</title> +<link rel="help" href="https://w3c.github.io/secure-payment-confirmation#sctn-authentication"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<!-- For minimize() --> +<script src="/page-visibility/resources/window_state_context.js"></script> +<script src="utils.sub.js"></script> +<script> +'use strict'; + +promise_test(async t => { + const {minimize, restore} = window_state_context(t); + + const authenticator = await window.test_driver.add_virtual_authenticator( + AUTHENTICATOR_OPTS); + t.add_cleanup(() => { + return window.test_driver.remove_virtual_authenticator(authenticator); + }); + + await window.test_driver.set_spc_transaction_mode("autoAccept"); + t.add_cleanup(() => { + return window.test_driver.set_spc_transaction_mode("none"); + }); + + const credential = await createCredential(); + + const challenge = 'server challenge'; + const payeeOrigin = 'https://merchant.com'; + const displayName = 'Troycard ***1234'; + const request = new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + credentialIds: [credential.rawId], + challenge: Uint8Array.from(challenge, c => c.charCodeAt(0)), + payeeOrigin, + rpId: window.location.hostname, + timeout: 60000, + instrument: { + displayName, + icon: ICON_URL, + }, + } + }], PAYMENT_DETAILS); + + // Before we trigger the Payment Request, minimize the window. This should + // cause the show() call to be rejected. + await minimize(); + assert_equals(document.hidden, true); + + await test_driver.bless('user activation'); + return promise_rejects_dom(t, "AbortError", request.show()); +}, 'SPC authentication cannot be triggered from a hidden context'); +</script> diff --git a/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html b/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html index 2f3d49ec267..1ce2cf34401 100644 --- a/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html +++ b/tests/wpt/web-platform-tests/shadow-dom/leaktests/html-collection.html @@ -67,10 +67,13 @@ var testParams = [ ['document.links should not contain shadow nodes', 'links'], ['document.anchors should not contain shadow nodes', 'anchors'], ['document.embeds should not contain shadow nodes', 'embeds'], - ['document.plugins should not contain shadow nodes', 'plugins'], - ['document.applets should not contain shadow nodes', 'applets']]; + ['document.plugins should not contain shadow nodes', 'plugins']]; generate_tests(testCollection, testParams); +test(() => { + assert_equals(document.applets.length, 0); +}, 'document.applets should not contain any nodes'); + </script> </html> diff --git a/tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html b/tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html new file mode 100644 index 00000000000..7ddf02f861a --- /dev/null +++ b/tests/wpt/web-platform-tests/shared-storage/insecure-context.tentative.http.html @@ -0,0 +1,10 @@ +<!doctype html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script> + test(t => { + assert_equals(window.sharedStorage, undefined); + }, 'test window.sharedStorage in insecure context'); + </script> +</body> diff --git a/tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html b/tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html new file mode 100644 index 00000000000..69e84333aa4 --- /dev/null +++ b/tests/wpt/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="resources/utils.sub.js"></script> +<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> +<script> +// Regression test for https://crbug.com/1431804. +promise_test(async t => { + assert_implements(HTMLScriptElement.supports('speculationrules'), + "Speculation Rules not supported"); + + const win = await spawnWindow(t, { protocol: 'https' }); + const nextUrl = win.getExecutorURL({ protocol: 'https', page: 2 }); + + // Navigate `win` from Document #1 -> #2 (nextUrl) -> #3 (tempUrl) -> + // #4 (nextUrl), + // Start speculation rules prefetch from #1, and + // Try using the prefetched result for the navigation #3 -> #4. + // The Documents #2 and #4 are different, but the same RenderFrameHost is + // used before https://crbug.com/936696 is done. + + await win.forceSinglePrefetch(nextUrl); + + // Register a SW for `nextUrl` -- this is a trick to make the prefetched + // result to put in `PrefetchService::prefetches_ready_to_serve_` in + // Chromium implementation but actually not used by this navigation. + const r = await service_worker_unregister_and_register( + t, 'resources/sw.js', nextUrl); + await wait_for_state(t, r.installing, 'activated'); + + // Navigate #1 -> #2. + // This doesn't use the prefetched result due to the ServiceWorker. + await win.navigate(nextUrl); + + // Unregister the SW. + await service_worker_unregister(t, nextUrl); + + // Navigate #2 -> #3 -> #4. + const tempUrl = win.getExecutorURL({ protocol: 'https', page: 3 }); + await win.navigate(tempUrl); + await win.navigate(nextUrl); + + const headers = await win.execute_script(() => { + return requestHeaders; + }, []); + assert_not_prefetched(headers, + "Prefetch should not work for different initiators."); +}, "Prefetches from different initiator Documents with same RenderFrameHost"); +</script> diff --git a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html index e85ffd74a78..917c3b4d022 100644 --- a/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/remove-error.tentative.https.html @@ -20,7 +20,7 @@ promise_test(async t => { // At this point the iframe is detached and unloaded, and its execution // context is gone. - await promise_rejects_dom(t, 'NotFoundError', iframeDOMException, iframeNavigator.subApps.remove('/sub-app-id')); + await promise_rejects_dom(t, 'NotFoundError', iframeDOMException, iframeNavigator.subApps.remove(['/sub-app-id'])); }, "The object is no longer associated to a document."); promise_test(async t => { @@ -31,22 +31,57 @@ promise_test(async t => { const iframeDOMException = iframe.contentWindow.DOMException; t.add_cleanup(() => iframe.remove()); - await promise_rejects_dom(t, 'InvalidStateError', iframeDOMException, iframeNavigator.subApps.remove('/sub-app-id')); + await promise_rejects_dom(t, 'InvalidStateError', iframeDOMException, iframeNavigator.subApps.remove(['/sub-app-id'])); }, "API is only supported in top-level browsing contexts."); promise_test(async t => { const full_url = document.location.origin + '/sub-app-id'; - await promise_rejects_dom(t, 'NotSupportedError', navigator.subApps.remove(full_url)); + await promise_rejects_dom(t, 'NotSupportedError', navigator.subApps.remove([full_url])); }, 'API supports only root-relative paths.'); promise_test(async t => { - t.add_cleanup(async () => { - await mockSubAppsService.reset(); - mockSubAppsService = null; - }); - await createMockSubAppsService(Status.FAILURE, [], []); - return promise_rejects_dom(t, 'OperationError', navigator.subApps.remove('/sub-app-id')); -}, 'Remove call failed.'); + const url_1 = '/sub-app-1'; + const url_2 = '/sub-app-2'; + const url_3 = '/sub-app-3'; + + let remove_call_params = [url_1, url_2, url_3]; + + let mocked_response = [ + { "unhashedAppIdPath": url_1, "resultCode": Status.FAILURE }, + { "unhashedAppIdPath": url_2, "resultCode": Status.FAILURE }, + { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE } + ]; + + let expected_results = { + [url_1]: "failure", + [url_2]: "failure", + [url_3]: "failure" + }; + + await subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results); +}, 'Remove call fails.'); + +promise_test(async t => { + const url_1 = '/sub-app-1'; + const url_2 = '/sub-app-2'; + const url_3 = '/sub-app-3'; + + let remove_call_params = [url_1, url_2, url_3]; + + let mocked_response = [ + { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS }, + { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS }, + { "unhashedAppIdPath": url_3, "resultCode": Status.FAILURE } + ]; + + let expected_results = { + [url_1]: "success", + [url_2]: "success", + [url_3]: "failure" + }; + + await subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results); +}, 'Remove call fails with mixed results.'); </script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html index ca73cbea888..6fd4305b434 100644 --- a/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html +++ b/tests/wpt/web-platform-tests/subapps/remove-success.tentative.https.html @@ -5,8 +5,37 @@ <script src="resources/subapps-helpers.js"></script> <script> -subapps_test(async (t, mockSubAppsService) => { - await navigator.subApps.remove('/sub-app-id'); -}, 'Remove API call works.'); +promise_test(async t => { + +const url = '/sub-app'; +let remove_call_params = [url]; +let mocked_response = [{ "unhashedAppIdPath": url, "resultCode": Status.SUCCESS }]; +let expected_results = {[url]: "success"}; + +await subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results); +}, 'Remove API call works with one app.'); + +promise_test(async t => { + +const url_1 = '/sub-app-1'; +const url_2 = '/sub-app-2'; +const url_3 = '/sub-app-3'; + +let remove_call_params = [url_1, url_2, url_3]; + +let mocked_response = [ + { "unhashedAppIdPath": url_1, "resultCode": Status.SUCCESS }, + { "unhashedAppIdPath": url_2, "resultCode": Status.SUCCESS }, + { "unhashedAppIdPath": url_3, "resultCode": Status.SUCCESS } +]; + +let expected_results = { + [url_1]: "success", + [url_2]: "success", + [url_3]: "success" +}; + +await subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results); +}, 'Remove API call works with several apps.'); </script>
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js b/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js index 9158d15c6c8..38b8d114660 100644 --- a/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js +++ b/tests/wpt/web-platform-tests/subapps/resources/subapps-helpers.js @@ -15,7 +15,7 @@ const Status = { FAILURE: 1, }; -async function createMockSubAppsService(service_result_code, add_call_return_value, list_call_return_value) { +async function createMockSubAppsService(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value) { if (typeof SubAppsServiceTest === 'undefined') { // Load test-only API helpers. const script = document.createElement('script'); @@ -39,7 +39,7 @@ async function createMockSubAppsService(service_result_code, add_call_return_val if (mockSubAppsService === null) { mockSubAppsService = new SubAppsServiceTest(); - mockSubAppsService.initialize(service_result_code, add_call_return_value, list_call_return_value); + mockSubAppsService.initialize(service_result_code, add_call_return_value, list_call_return_value, remove_call_return_value); } } @@ -49,7 +49,7 @@ function subapps_test(func, description) { await mockSubAppsService.reset(); mockSubAppsService = null; }); - await createMockSubAppsService(Status.SUCCESS, [], []); + await createMockSubAppsService(Status.SUCCESS, [], [], []); await func(test, mockSubAppsService); }, description); } @@ -60,7 +60,7 @@ async function subapps_add_expect_reject_with_result(t, add_call_params, mocked_ mockSubAppsService = null; }); - await createMockSubAppsService(Status.FAILURE, mocked_response, []); + await createMockSubAppsService(Status.FAILURE, mocked_response, [], []); await navigator.subApps.add(add_call_params).then( result => { assert_unreached("Should have rejected: ", result); @@ -79,7 +79,7 @@ async function subapps_add_expect_success_with_result(t, add_call_params, mocked mockSubAppsService = null; }); - await createMockSubAppsService(Status.SUCCESS, mocked_response); + await createMockSubAppsService(Status.SUCCESS, mocked_response, [], []); await navigator.subApps.add(add_call_params).then(result => { for (const app_id in expected_results) { assert_own_property(result, app_id, "Return results are missing entry for subapp.") @@ -87,3 +87,37 @@ async function subapps_add_expect_success_with_result(t, add_call_params, mocked } }); } + +async function subapps_remove_expect_reject_with_result(t, remove_call_params, mocked_response, expected_results) { + t.add_cleanup(async () => { + await mockSubAppsService.reset(); + mockSubAppsService = null; + }); + + await createMockSubAppsService(Status.FAILURE, [], [], mocked_response); + await navigator.subApps.remove(remove_call_params).then( + result => { + assert_unreached("Should have rejected: ", result); + }, + error => { + for (const app_id in expected_results) { + assert_own_property(error, app_id, "Return results are missing entry for subapp.") + assert_equals(error[app_id], expected_results[app_id], "Return results are not as expected.") + } + }); +} + +async function subapps_remove_expect_success_with_result(t, remove_call_params, mocked_response, expected_results) { + t.add_cleanup(async () => { + await mockSubAppsService.reset(); + mockSubAppsService = null; + }); + + await createMockSubAppsService(Status.SUCCESS, [], [], mocked_response); + await navigator.subApps.remove(remove_call_params).then(result => { + for (const app_id in expected_results) { + assert_own_property(result, app_id, "Return results are missing entry for subapp.") + assert_equals(result[app_id], expected_results[app_id], "Return results are not as expected.") + } + }); +} diff --git a/tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg b/tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg new file mode 100644 index 00000000000..18c00ab332c --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/text/reftests/opacity-ref.svg @@ -0,0 +1,26 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + <style> + text { + font-size: 50px; + } + </style> + <defs> + <path id="path" d="M100, 120 300, 120"/> + </defs> + <text x="100" y="60" opacity="0.5"> + <tspan>tspan</tspan> + </text> + <text opacity="0.5"> + <textPath href="#path">textPath</textPath> + </text> + <text x="100" y="180" opacity="0.5"> + <a href="https://www.w3.org"><tspan>link</tspan></a> + </text> + <text x="100" y="240" opacity="0.5"> + <a href="https://www.w3.org"><tspan>another link</tspan></a> + </text> + <text x="100" y="300" opacity="0.25" font-family="Ahem"> + <tspan>XXXX</tspan> + </text> +</svg> diff --git a/tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg b/tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg new file mode 100644 index 00000000000..949de0cbf0c --- /dev/null +++ b/tests/wpt/web-platform-tests/svg/text/reftests/opacity.svg @@ -0,0 +1,31 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml"> + <metadata> + <h:title>Opacity on tspan, textPath, and a elements</h:title> + <h:link rel="help" href="https://svgwg.org/svg2-draft/text.html"/> + <h:link rel="match" href="opacity-ref.svg"/> + <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + </metadata> + <style> + text { + font-size: 50px; + } + </style> + <defs> + <path id="path" d="M100, 120 300, 120"/> + </defs> + <text x="100" y="60"> + <tspan style="opacity: 0.5">tspan</tspan> + </text> + <text> + <textPath href="#path" style="opacity: 0.5">textPath</textPath> + </text> + <text x="100" y="180"> + <a href="https://www.w3.org" style="opacity: 0.5"><tspan>link</tspan></a> + </text> + <text x="100" y="240"> + <a href="https://www.w3.org"><tspan style="opacity: 0.5">another link</tspan></a> + </text> + <text x="100" y="300" opacity="0.5" font-family="Ahem"> + <tspan style="opacity: 0.5">XXXX</tspan> + </text> +</svg> diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt index 03fe7d73efa..c2137af3156 100644 --- a/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt +++ b/tests/wpt/web-platform-tests/tools/ci/requirements_build.txt @@ -1,5 +1,5 @@ cairocffi==1.5.0 -fonttools==4.33.2 +fonttools==4.39.3 genshi==0.7.7 jinja2==3.1.2 pyyaml==6.0 diff --git a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt index 53b10f8dcaa..64b51841b0c 100644 --- a/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt +++ b/tests/wpt/web-platform-tests/tools/ci/requirements_tc.txt @@ -1,4 +1,4 @@ pygithub==1.58.1 pyyaml==6.0 requests==2.28.2 -taskcluster==48.2.1 +taskcluster==49.0.0 diff --git a/tests/wpt/web-platform-tests/tools/ci/run_tc.py b/tests/wpt/web-platform-tests/tools/ci/run_tc.py index 46e3d613a99..a5a6256ad54 100755 --- a/tests/wpt/web-platform-tests/tools/ci/run_tc.py +++ b/tests/wpt/web-platform-tests/tools/ci/run_tc.py @@ -46,8 +46,8 @@ import tarfile import tempfile import zipfile -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -from wpt.utils import get_download_to_descriptor # type: ignore +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) +from tools.wpt.utils import get_download_to_descriptor root = os.path.abspath( os.path.join(os.path.dirname(__file__), diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py index 89ecee8035c..f255c024952 100644 --- a/tests/wpt/web-platform-tests/tools/lint/lint.py +++ b/tests/wpt/web-platform-tests/tools/lint/lint.py @@ -689,7 +689,7 @@ class OpenModeCheck(ASTCheck): errors = [] for node in ast.walk(root): if isinstance(node, ast.Call): - if hasattr(node.func, "id") and node.func.id in ("open", "file"): # type: ignore + if hasattr(node.func, "id") and node.func.id in ("open", "file"): if (len(node.args) < 2 and all(item.arg != "mode" for item in node.keywords)): errors.append(node.lineno) diff --git a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py index 689533421d7..21be8a26cd3 100644 --- a/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py +++ b/tests/wpt/web-platform-tests/tools/manifest/XMLParser.py @@ -62,7 +62,7 @@ class XMLParser: self._parser.EndElementHandler = self._end self._parser.CharacterDataHandler = self._data self._parser.ExternalEntityRefHandler = self._external - self._parser.SkippedEntityHandler = self._skipped # type: ignore + self._parser.SkippedEntityHandler = self._skipped # used for our horrible re-encoding hack self._fed_data = [] # type: Optional[List[bytes]] self._read_encoding = None # type: Optional[Text] diff --git a/tests/wpt/web-platform-tests/tools/manifest/item.py b/tests/wpt/web-platform-tests/tools/manifest/item.py index 02a72eeb292..f798ec2ae8d 100644 --- a/tests/wpt/web-platform-tests/tools/manifest/item.py +++ b/tests/wpt/web-platform-tests/tools/manifest/item.py @@ -29,16 +29,14 @@ class ManifestItemMeta(ABCMeta): assert issubclass(inst, ManifestItem) if MYPY: - inst_ = cast(Type[ManifestItem], inst) - item_type = cast(str, inst_.item_type) + item_type = cast(str, inst.item_type) else: - inst_ = inst - assert isinstance(inst_.item_type, str) - item_type = inst_.item_type + assert isinstance(inst.item_type, str) + item_type = inst.item_type - item_types[item_type] = inst_ + item_types[item_type] = inst - return inst_ + return inst class ManifestItem(metaclass=ManifestItemMeta): diff --git a/tests/wpt/web-platform-tests/tools/mypy.ini b/tests/wpt/web-platform-tests/tools/mypy.ini index fb9b5c81c2c..def40c0bd06 100644 --- a/tests/wpt/web-platform-tests/tools/mypy.ini +++ b/tests/wpt/web-platform-tests/tools/mypy.ini @@ -7,6 +7,7 @@ # - tools/wptserve/docs/conf.py (generated code) # - tools/wptserve/tests/ (deliberately invalid syntax) exclude = (^tools/third_party/|/setup\.py$|^tools/wptserve/docs/conf.py|^tools/wptserve/tests/) +mypy_path = tools/wptrunner:tools/wptserve:tools/webdriver:tools/webtransport #check_untyped_defs = True disallow_any_generics = True disallow_incomplete_defs = True diff --git a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt index ff878deb613..c95a836e6ab 100644 --- a/tests/wpt/web-platform-tests/tools/requirements_mypy.txt +++ b/tests/wpt/web-platform-tests/tools/requirements_mypy.txt @@ -1,12 +1,14 @@ -mypy==0.961 -mypy-extensions==0.4.3 +mypy==1.2.0 +mypy-extensions==1.0.0 toml==0.10.2 +tomli==2.0.1 typed-ast==1.5.4 -types-atomicwrites==1.4.5 -types-python-dateutil==2.8.19 +types-atomicwrites==1.4.5.1 +types-python-dateutil==2.8.19.12 types-PyYAML==6.0.12.9 -types-requests==2.28.11.16 -types-setuptools==67.6.0.5 +types-requests==2.28.11.17 +types-setuptools==67.6.0.7 types-six==1.16.21.8 -types-ujson==4.2.1 -typing-extensions==4.1.1 +types-ujson==5.7.0.1 +types-urllib3==1.26.25.10 +typing_extensions==4.5.0 diff --git a/tests/wpt/web-platform-tests/tools/requirements_pytest.txt b/tests/wpt/web-platform-tests/tools/requirements_pytest.txt index 0bb151cb644..78e1ae4d613 100644 --- a/tests/wpt/web-platform-tests/tools/requirements_pytest.txt +++ b/tests/wpt/web-platform-tests/tools/requirements_pytest.txt @@ -1,3 +1,3 @@ -pytest==7.2.2 +pytest==7.3.0 pytest-cov==4.0.0 -hypothesis==6.70.1 +hypothesis==6.71.0 diff --git a/tests/wpt/web-platform-tests/tools/requirements_tests.txt b/tests/wpt/web-platform-tests/tools/requirements_tests.txt index 26bf23a7f5e..9ccaaa0d02a 100644 --- a/tests/wpt/web-platform-tests/tools/requirements_tests.txt +++ b/tests/wpt/web-platform-tests/tools/requirements_tests.txt @@ -1,5 +1,5 @@ -httpx[http2]==0.23.3 -json-e==4.5.1 +httpx[http2]==0.24.0 +json-e==4.5.2 jsonschema==4.17.3 pyyaml==6.0 -taskcluster==48.2.1 +taskcluster==49.0.0 diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini index 6a3001e25a0..5efbe9b37ab 100644 --- a/tests/wpt/web-platform-tests/tools/tox.ini +++ b/tests/wpt/web-platform-tests/tools/tox.ini @@ -16,7 +16,7 @@ changedir = commands = !flake8-!mypy: pytest --cov=tools --cov-report=term {posargs} flake8: flake8 --append-config={toxinidir}/flake8.ini {posargs} - mypy: mypy --config-file={toxinidir}/mypy.ini tools/ + mypy: mypy --config-file={toxinidir}/mypy.ini --explicit-package-bases tools passenv = HYPOTHESIS_PROFILE diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py index 56fa274cdc4..9bb03b34f96 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/client.py @@ -145,7 +145,7 @@ class BidiSession: await self.transport.start() if self.session_id is None: - self.session_id, self.capabilities = await self.session.new( + self.session_id, self.capabilities = await self.session.new( # type: ignore capabilities=self.requested_capabilities) async def send_command( diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py index 81910a63eb2..d9ea28c78fd 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/error.py @@ -38,6 +38,9 @@ class InvalidArgumentException(BidiException): class NoSuchFrameException(BidiException): error_code = "no such frame" +class NoSuchHandleException(BidiException): + error_code = "no such handle" + class NoSuchNodeException(BidiException): error_code = "no such node" diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py index c2034033c79..e28a83584a8 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/_module.py @@ -1,7 +1,6 @@ import functools from typing import ( Any, - Awaitable, Callable, Optional, Mapping, @@ -80,10 +79,6 @@ class command: # Overwrite the method on the owner class with the wrapper setattr(owner, name, inner) - def __call__(*args: Any, **kwargs: Any) -> Awaitable[Any]: - # This isn't really used, but mypy doesn't understand __set_name__ - pass - class BidiModule: def __init__(self, session: "BidiSession"): diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py index d2ee17e36e2..be0d745a0ca 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/modules/input.py @@ -69,11 +69,11 @@ class PointerAction(Action): self.y = y self.duration = duration self.origin = origin - self.width = width, + self.width = width self.height = height self.pressure = pressure self.tangential_pressure = tangential_pressure - self.tilt_x = tilt_x, + self.tilt_x = tilt_x self.tilt_y = tilt_y self.twist = twist self.altitude_angle = altitude_angle @@ -113,7 +113,7 @@ class PointerAction(Action): class PointerDownAction(PointerAction): - type = "pointerDown" + action_type = "pointerDown" def __init__(self, button: int, @@ -134,7 +134,7 @@ class PointerDownAction(PointerAction): class PointerUpAction(PointerAction): - type = "pointerUp" + action_type = "pointerUp" def __init__(self, button: int, @@ -155,7 +155,7 @@ class PointerUpAction(PointerAction): class PointerMoveAction(PointerAction): - type = "pointerMove" + action_type = "pointerMove" def __init__(self, x: int, @@ -179,7 +179,7 @@ class PointerMoveAction(PointerAction): class WheelScrollAction(Action): - type = "scroll" + action_type = "scroll" def __init__(self, x: int, @@ -355,3 +355,8 @@ class Input(BidiModule): else: params["actions"] = actions return params + + @command + def release_actions(self, context: str) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = {"context": context} + return params diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py index a28c484b83c..2d5d8ee9224 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/bidi/transport.py @@ -26,7 +26,7 @@ class Transport: msg_handler: Callable[[Mapping[str, Any]], Coroutine[Any, Any, None]], loop: Optional[asyncio.AbstractEventLoop] = None): self.url = url - self.connection: Optional[websockets.WebSocketClientProtocol] = None + self.connection: Optional[websockets.WebSocketClientProtocol] = None # type: ignore self.msg_handler = msg_handler self.send_buf: List[Mapping[str, Any]] = [] @@ -37,7 +37,7 @@ class Transport: self.read_message_task: Optional[asyncio.Task[Any]] = None async def start(self) -> None: - self.connection = await websockets.connect(self.url) + self.connection = await websockets.connect(self.url) # type: ignore self.read_message_task = self.loop.create_task(self.read_messages()) for msg in self.send_buf: @@ -51,7 +51,7 @@ class Transport: @staticmethod async def _send( - connection: websockets.WebSocketClientProtocol, + connection: websockets.WebSocketClientProtocol, # type: ignore data: Mapping[str, Any] ) -> None: msg = json.dumps(data) diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py index 851c6722fc2..f33fc34dac9 100644 --- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py +++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py @@ -310,27 +310,24 @@ class Window: return handles - # The many "type: ignore" comments here and below are to silence mypy's - # "Decorated property not supported" error, which is due to a limitation - # in mypy, see https://github.com/python/mypy/issues/1362. - @property # type: ignore + @property @command def rect(self): return self.session.send_session_command("GET", "window/rect") - @rect.setter # type: ignore + @rect.setter @command def rect(self, new_rect): self.session.send_session_command("POST", "window/rect", new_rect) - @property # type: ignore + @property @command def size(self): """Gets the window size as a tuple of `(width, height)`.""" rect = self.rect return (rect["width"], rect["height"]) - @size.setter # type: ignore + @size.setter @command def size(self, new_size): """Set window size by passing a tuple of `(width, height)`.""" @@ -343,14 +340,14 @@ class Window: # for Android. Revert this once it is implemented. pass - @property # type: ignore + @property @command def position(self): """Gets the window position as a tuple of `(x, y)`.""" rect = self.rect return (rect["x"], rect["y"]) - @position.setter # type: ignore + @position.setter @command def position(self, new_position): """Set window position by passing a tuple of `(x, y)`.""" @@ -475,12 +472,12 @@ class UserPrompt: def accept(self): self.session.send_session_command("POST", "alert/accept") - @property # type: ignore + @property @command def text(self): return self.session.send_session_command("GET", "alert/text") - @text.setter # type: ignore + @text.setter @command def text(self, value): body = {"text": value} @@ -660,12 +657,12 @@ class Session: url = urlparse.urljoin("session/%s/" % self.session_id, uri) return self.send_command(method, url, body, timeout) - @property # type: ignore + @property @command def url(self): return self.send_session_command("GET", "url") - @url.setter # type: ignore + @url.setter @command def url(self, url): if urlparse.urlsplit(url).netloc is None: @@ -685,12 +682,12 @@ class Session: def refresh(self): return self.send_session_command("POST", "refresh") - @property # type: ignore + @property @command def title(self): return self.send_session_command("GET", "title") - @property # type: ignore + @property @command def source(self): return self.send_session_command("GET", "source") @@ -702,12 +699,12 @@ class Session: return value["handle"] - @property # type: ignore + @property @command def window_handle(self): return self.send_session_command("GET", "window") - @window_handle.setter # type: ignore + @window_handle.setter @command def window_handle(self, handle): body = {"handle": handle} @@ -723,12 +720,12 @@ class Session: return self.send_session_command("POST", url, body) - @property # type: ignore + @property @command def handles(self): return self.send_session_command("GET", "window/handles") - @property # type: ignore + @property @command def active_element(self): return self.send_session_command("GET", "element/active") @@ -855,12 +852,12 @@ class Element: def send_keys(self, text): return self.send_element_command("POST", "value", {"text": text}) - @property # type: ignore + @property @command def text(self): return self.send_element_command("GET", "text") - @property # type: ignore + @property @command def name(self): return self.send_element_command("GET", "name") @@ -869,12 +866,12 @@ class Element: def style(self, property_name): return self.send_element_command("GET", "css/%s" % property_name) - @property # type: ignore + @property @command def rect(self): return self.send_element_command("GET", "rect") - @property # type: ignore + @property @command def selected(self): return self.send_element_command("GET", "selected") @@ -883,7 +880,7 @@ class Element: def screenshot(self): return self.send_element_command("GET", "screenshot") - @property # type: ignore + @property @command def shadow_root(self): return self.send_element_command("GET", "shadow") diff --git a/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py b/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py index 6384a5aefb2..141bd9f7dc9 100644 --- a/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py +++ b/tests/wpt/web-platform-tests/tools/webtransport/h3/webtransport_h3_server.py @@ -23,7 +23,8 @@ from aioquic.quic.connection import stream_is_unidirectional from aioquic.quic.events import QuicEvent, ProtocolNegotiated, ConnectionTerminated, StreamReset # type: ignore from aioquic.tls import SessionTicket # type: ignore -from tools.wptserve.wptserve import stash # type: ignore +from tools import localpaths # noqa: F401 +from wptserve import stash from .capsule import H3Capsule, H3CapsuleDecoder, CapsuleType """ @@ -309,8 +310,8 @@ class WebTransportSession: def stash(self) -> stash.Stash: """A Stash object for storing cross-session state.""" if self._stash is None: - address, authkey = stash.load_env_config() - self._stash = stash.Stash(self._stash_path, address, authkey) + address, authkey = stash.load_env_config() # type: ignore + self._stash = stash.Stash(self._stash_path, address, authkey) # type: ignore return self._stash @property diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py index d6c238a1f27..7a046e8f07c 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/browser.py +++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py @@ -7,7 +7,7 @@ import stat import subprocess import tempfile from abc import ABCMeta, abstractmethod -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from distutils.spawn import find_executable from urllib.parse import urlsplit @@ -93,6 +93,36 @@ class Browser: return dest + def download_from_url( + self, url, dest=None, channel=None, rename=None, default_name="download" + ): + """Download a URL into a dest/channel + :param url: The URL to download + :param dest: Directory in which to put the dowloaded + :param channel: Browser channel to append to the dest + :param rename: Optional name for the download; the original extension + is preserved + :param default_name: The default name for the download if none is + provided and none can be found from the network + :return: The path to the downloaded package/installer + """ + self.logger.info("Downloading from %s" % url) + + dest = self._get_browser_binary_dir(dest, channel) + + resp = get(url) + filename = get_download_filename(resp, default_name) + if rename: + filename = "%s%s" % (rename, get_ext(filename)) + + output_path = os.path.join(dest, filename) + + with open(output_path, "wb") as f: + for chunk in resp.iter_content(chunk_size=64 * 1024): + f.write(chunk) + + return output_path + @abstractmethod def download(self, dest=None, channel=None, rename=None): """Download a package or installer for the browser @@ -1891,23 +1921,108 @@ class WebKitTestRunner(Browser): product = "wktr" requirements = None - def download(self, dest=None, channel=None, rename=None): - raise NotImplementedError + def _find_apple_port_builds(self, channel="main"): + if channel != "main": + raise ValueError(f"unable to get builds for branch {channel}") - def install(self, dest=None, channel=None): - raise NotImplementedError + system_version, _, _ = platform.mac_ver() + if system_version in SpecifierSet("==13.*"): + platform_key = "mac-ventura-x86_64%20arm64" + elif system_version in SpecifierSet("==12.*"): + platform_key = "mac-monterey-x86_64%20arm64" + else: + raise ValueError( + f"don't know what platform to use for macOS {system_version}" + ) - def install_webdriver(self, dest=None, channel=None, browser_binary=None): + # This should match http://github.com/WebKit/WebKit/blob/main/Websites/webkit.org/wp-content/themes/webkit/build-archives.php + build_index = get( + f"https://q1tzqfy48e.execute-api.us-west-2.amazonaws.com/v3/latest/{platform_key}-release" + ).json() + + builds = [] + + for entry in build_index["Items"]: + creation_time = datetime.fromtimestamp( + int(entry["creationTime"]["N"]), timezone.utc + ) + identifier = entry["identifier"]["S"] + s3_url = entry["s3_url"]["S"] + + builds.append((s3_url, identifier, creation_time)) + + return builds + + def _download_metadata_apple_port(self, channel="main"): + digit_re = re.compile("([0-9]+)") + + def natsort(string_to_split): + split = digit_re.split(string_to_split) + # this converts the split numbers into tuples so that "01" < "1" + split[1::2] = [(int(i), i) for i in split[1::2]] + return split + + builds = sorted( + self._find_apple_port_builds(channel), + key=lambda x: natsort(x[1]), + reverse=True, + ) + latest_build = builds[0] + + return { + "url": latest_build[0], + "identifier": latest_build[1], + "creation_time": latest_build[2], + } + + def download( + self, dest=None, channel="main", rename=None, version=None, revision=None + ): + if platform.system() == "Darwin": + meta = self._download_metadata_apple_port(channel) + else: + raise ValueError("Unsupported platform") + + output_path = self.download_from_url( + meta["url"], + dest=dest, + channel=channel, + rename=rename, + ) + + dest = os.path.dirname(output_path) # This is the actual, used dest. + + self.last_revision_used = meta["identifier"] + with open(os.path.join(dest, "identifier"), "w") as f: + f.write(self.last_revision_used) + + return output_path + + def install(self, dest=None, channel="main"): + dest = self._get_browser_binary_dir(dest, channel) + installer_path = self.download(dest=dest, channel=channel) + self.logger.info(f"Extracting to {dest}") + with open(installer_path, "rb") as f: + unzip(f, dest) + + def install_webdriver(self, dest=None, channel="main", browser_binary=None): raise NotImplementedError - def find_binary(self, venv_path=None, channel=None): - return None + def find_binary(self, venv_path=None, channel="main"): + path = self._get_browser_binary_dir(venv_path, channel) + return find_executable("WebKitTestRunner", os.path.join(path, "Release")) - def find_webdriver(self, venv_path=None, channel=None): + def find_webdriver(self, venv_path=None, channel="main"): return None def version(self, binary=None, webdriver_binary=None): - return None + dirname = os.path.dirname(binary) + identifier = os.path.join(dirname, "identifier") + if not os.path.exists(identifier): + return None + + with open(identifier, "r") as f: + return f.read().strip() class WebKitGTKMiniBrowser(WebKit): diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py index 821ce86f97f..5bcbb7a7c33 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/install.py +++ b/tests/wpt/web-platform-tests/tools/wpt/install.py @@ -13,7 +13,8 @@ latest_channels = { 'edgechromium': 'dev', 'safari': 'preview', 'servo': 'nightly', - 'webkitgtk_minibrowser': 'nightly' + 'webkitgtk_minibrowser': 'nightly', + 'wktr': 'main', } channel_by_name = { @@ -44,7 +45,7 @@ def get_parser(): parser = argparse.ArgumentParser( parents=[channel_args], description="Install a given browser or webdriver frontend.") - parser.add_argument('browser', choices=['firefox', 'chrome', 'chromium', 'servo', 'safari'], + parser.add_argument('browser', choices=['firefox', 'chrome', 'chromium', 'servo', 'safari', 'wktr'], help='name of web browser product') parser.add_argument('component', choices=['browser', 'webdriver'], help='name of component') @@ -107,7 +108,12 @@ def install(name, component, destination, channel="nightly", logger=None, downlo method = prefix + suffix - browser_cls = getattr(browser, name.title()) + if name == "wktr": + canonical_name = "WebKitTestRunner" + else: + canonical_name = name.title() + + browser_cls = getattr(browser, canonical_name) logger.info('Now installing %s %s...', name, component) kwargs = {} if download_only and rename: diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py index 0b7d73b2042..72ceab08b97 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/run.py +++ b/tests/wpt/web-platform-tests/tools/wpt/run.py @@ -265,6 +265,9 @@ Consider installing certutil via your OS package manager or directly.""") kwargs["headless"] = True logger.info("Running in headless mode, pass --no-headless to disable") + if kwargs["browser_channel"] == "nightly" and kwargs["enable_webtransport_h3"] is None: + kwargs["enable_webtransport_h3"] = True + # Turn off Firefox WebRTC ICE logging on WPT (turned on by mozrunner) safe_unsetenv('R_LOG_LEVEL') safe_unsetenv('R_LOG_DESTINATION') @@ -691,10 +694,16 @@ class WebKitTestRunner(BrowserSetup): browser_cls = browser.WebKitTestRunner def install(self, channel=None): - raise NotImplementedError + if self.prompt_install(self.name): + return self.browser.install(self.venv.path, channel=channel) def setup_kwargs(self, kwargs): - pass + if kwargs["binary"] is None: + binary = self.browser.find_binary(self.venv.path, channel=kwargs["browser_channel"]) + + if binary is None: + raise WptrunError("Unable to find binary in PATH") + kwargs["binary"] = binary class WebKitGTKMiniBrowser(BrowserSetup): diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py index 1635dce7ec6..184cd7247b3 100644 --- a/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py +++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_update_expectations.py @@ -6,8 +6,8 @@ import os import pytest from tools.wpt import wpt -from tools.wptrunner.wptrunner import manifestexpected -from tools.wptrunner.wptrunner.manifestupdate import get_test_name +from wptrunner import manifestexpected +from wptrunner.manifestupdate import get_test_name from localpaths import repo_root @pytest.fixture diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt index ccf09be728d..bfd21934d99 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt +++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt @@ -1,9 +1,9 @@ html5lib==1.1 mozdebug==0.3.0 mozinfo==1.2.2 # https://bugzilla.mozilla.org/show_bug.cgi?id=1621226 -mozlog==7.1.0 +mozlog==7.1.1 mozprocess==1.3.0 -pillow==8.4.0 +pillow==9.4.0 requests==2.28.2 six==1.16.0 urllib3[secure]==1.26.15 diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt index 64546d55314..0b51ee8f463 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt +++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_firefox.txt @@ -1,5 +1,5 @@ -marionette_driver==3.1.0 -mozcrash==2.1.0 +marionette_driver==3.2.0 +mozcrash==2.2.0 mozdevice==4.1.0 mozinstall==2.0.1 mozleak==0.2 @@ -7,3 +7,4 @@ mozprofile==2.5.0 mozrunner==8.2.1 mozversion==2.3.0 psutil==5.9.4 +redo==2.0.4 diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py index eca63d136bb..95f53011bfc 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters/chromium.py @@ -258,6 +258,8 @@ class ChromiumFormatter(base.BaseFormatter): # type: ignore def suite_start(self, data): if self.start_timestamp_seconds is None: self.start_timestamp_seconds = self._get_time(data) + if 'run_info' in data: + self.flag_specific = data['run_info'].get('flag_specific', '') def test_start(self, data): test_name = data["test"] @@ -325,6 +327,7 @@ class ChromiumFormatter(base.BaseFormatter): # type: ignore "version": 3, "seconds_since_epoch": self.start_timestamp_seconds, "num_failures_by_type": self.num_failures_by_status, + "flag_name": self.flag_specific, "tests": self.tests } return json.dumps(final_result) diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py index 35c75758f53..6cbe335cfe7 100644 --- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py +++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_update.py @@ -3,7 +3,7 @@ import json import os import sys -from io import BytesIO +from io import BytesIO, StringIO from unittest import mock import pytest @@ -116,7 +116,7 @@ def create_updater(tests, url_base="/", **kwargs): def create_log(entries): - data = BytesIO() + data = StringIO() if isinstance(entries, list): logger = structuredlog.StructuredLogger("expected_test") handler = handlers.StreamHandler(data, formatters.JSONFormatter()) @@ -127,7 +127,7 @@ def create_log(entries): getattr(logger, action)(**kwargs) logger.remove_handler(handler) else: - data.write(json.dumps(entries).encode()) + data.write(json.dumps(entries)) data.seek(0) return data diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py index be5dc0d102c..f47308d88df 100644 --- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py +++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/base.py @@ -95,6 +95,7 @@ class TestUsingH2Server: http2=True, verify=False) def teardown_method(self, test_method): + self.client.close() self.server.stop() diff --git a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html index 73af4634b6d..883c438fa93 100644 --- a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html +++ b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html @@ -10,7 +10,6 @@ assert_throws_dom("InvalidStateError", () => { let request = new XMLHttpRequest(); request.setPrivateToken({ - type: 'private-state-token', version: 1, operation: 'token-request' }); @@ -23,7 +22,6 @@ request.open('GET', 'https://privatetoken.example'); request.send(); request.setPrivateToken({ - type: 'private-state-token', version: 1, operation: 'token-request' }); @@ -34,26 +32,7 @@ assert_throws_js(TypeError, () => { let request = new XMLHttpRequest(); request.open('GET', 'https://privatetoken.example'); - request.setPrivateToken({}); - }); - }, 'Private Token operations require present `type` values.'); - - test(() => { - assert_throws_js(TypeError, () => { - let request = new XMLHttpRequest(); - request.open('GET', 'https://privatetoken.example'); - request.setPrivateToken({ - type: "invalid" - }); - }); - }, 'Private Token operations require valid `type` values.'); - - test(() => { - assert_throws_js(TypeError, () => { - let request = new XMLHttpRequest(); - request.open('GET', 'https://privatetoken.example'); request.setPrivateToken({ - type: "private-state-token", version: 1, operation: "token-request", refreshPolicy: "not a member of the refreshPolicy enum", @@ -66,7 +45,6 @@ let request = new XMLHttpRequest(); request.open('GET', 'https://privatetoken.example'); request.setPrivateToken({ - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: [] @@ -79,7 +57,6 @@ let request = new XMLHttpRequest(); request.open('GET', 'https://privatetoken.example'); request.setPrivateToken({ - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: [3] @@ -92,7 +69,6 @@ let request = new XMLHttpRequest(); request.open('GET', 'https://privatetoken.example'); request.setPrivateToken({ - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: ["not a valid URL"] @@ -105,7 +81,6 @@ let request = new XMLHttpRequest(); request.open('GET', 'https://privatetoken.example'); request.setPrivateToken({ - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: ["http://not-secure.com"] @@ -117,7 +92,6 @@ let request = new XMLHttpRequest(); request.open('GET', 'https://privatetoken.example'); request.setPrivateToken({ - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: ["http://localhost"] diff --git a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html index e2ab079434b..cf24b232e83 100644 --- a/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html +++ b/tests/wpt/web-platform-tests/trust-tokens/trust-token-parameter-validation.tentative.https.html @@ -9,26 +9,7 @@ test(() => { assert_throws_js(TypeError, () => { new Request('https://example.com', { - privateToken: {} - }); - }); - }, 'Private Token fetches require present `type` values.'); - - test(() => { - assert_throws_js(TypeError, () => { - new Request('https://example.com', { - privateToken: { - type: "invalid" - } - }); - }); - }, 'Private Token fetches require valid `type` values.'); - - test(() => { - assert_throws_js(TypeError, () => { - new Request('https://example.com', { privateToken: { - type: "private-state-token", version: 1, operation: "token-request", refreshPolicy: "not a member of the refreshPolicy enum", @@ -41,7 +22,6 @@ assert_throws_js(TypeError, () => { new Request('https://example.com', { privateToken: { - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: [] @@ -54,7 +34,6 @@ assert_throws_js(TypeError, () => { new Request('https://example.com', { privateToken: { - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: [3] @@ -67,7 +46,6 @@ assert_throws_js(TypeError, () => { new Request('https://example.com', { privateToken: { - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: ["not a valid URL"] @@ -80,7 +58,6 @@ assert_throws_js(TypeError, () => { new Request('https://example.com', { privateToken: { - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: ["http://not-secure.com"] @@ -92,7 +69,6 @@ test(() => { new Request('https://example.com', { privateToken: { - type: "private-state-token", version: 1, operation: "send-redemption-record", issuers: ["http://localhost"] diff --git a/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js b/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js index b5c511d4062..229ae32edd4 100644 --- a/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js +++ b/tests/wpt/web-platform-tests/webcodecs/video-encoder.https.any.js @@ -295,7 +295,7 @@ promise_test(async t => { encoder.configure(defaultConfig); - assert_throws_dom("OperationError", () => { + assert_throws_js(TypeError, () => { encoder.encode(frame); }); }, 'Verify encoding closed frames throws.'); diff --git a/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html b/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html index cb02ad4bcc3..8fe7cf44cc6 100644 --- a/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html +++ b/tests/wpt/web-platform-tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html @@ -208,11 +208,11 @@ function createVideoFrame(ts) { }); } -function canSerializeVideoFrame(target, vf, transfer) { +function canSerializeVideoFrame(target, vf) { return canPostVideoFrame(target, vf, false); }; -function canTransferVideoFrame(target, vf, transfer) { +function canTransferVideoFrame(target, vf) { return canPostVideoFrame(target, vf, true); }; diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py index 486414aa3cd..9723ee4a4ed 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/dom_content_loaded/dom_content_loaded.py @@ -135,3 +135,14 @@ async def test_document_write(bidi_session, subscribe_events, top_context, wait_ event = await on_entry assert_navigation_info(event, {"context": top_context["context"]}) + + +async def test_page_with_base_tag(bidi_session, subscribe_events, inline, new_tab, wait_for_event): + await subscribe_events(events=[DOM_CONTENT_LOADED_EVENT]) + + on_entry = wait_for_event(DOM_CONTENT_LOADED_EVENT) + url = inline("""<base href="/relative-path">""") + await bidi_session.browsing_context.navigate(context=new_tab["context"], url=url) + event = await on_entry + + assert_navigation_info(event, {"context": new_tab["context"], "url": url}) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py index 878d26eaad8..b4b174818cf 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/load/load.py @@ -124,3 +124,14 @@ async def test_document_write(bidi_session, subscribe_events, top_context, wait_ event = await on_entry assert_navigation_info(event, {"context": top_context["context"]}) + + +async def test_page_with_base_tag(bidi_session, subscribe_events, inline, new_tab, wait_for_event): + await subscribe_events(events=[CONTEXT_LOAD_EVENT]) + + on_entry = wait_for_event(CONTEXT_LOAD_EVENT) + url = inline("""<base href="/relative-path">""") + await bidi_session.browsing_context.navigate(context=new_tab["context"], url=url) + event = await on_entry + + assert_navigation_info(event, {"context": new_tab["context"], "url": url}) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py index dd1fbcb9ae7..b66fb9881e5 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/browsing_context/print/page.py @@ -4,13 +4,20 @@ pytestmark = pytest.mark.asyncio @pytest.mark.parametrize( - "page, expected_dimensions", + "page, orientation, expected_dimensions", [ - (None, {"width": 21.59, "height": 27.94}), - ({}, {"width": 21.59, "height": 27.94}), - ({"width": 4.5}, {"width": 4.5, "height": 27.94}), - ({"height": 23}, {"width": 21.59, "height": 23}), - ({"width": 4.5, "height": 12}, {"width": 4.5, "height": 12}), + (None, "portrait", {"width": 21.59, "height": 27.94}), + ({}, "portrait",{"width": 21.59, "height": 27.94}), + ({"width": 4.5}, "portrait", {"width": 4.5, "height": 27.94}), + ({"height": 23}, "portrait", {"width": 21.59, "height": 23}), + ({"width": 4.5, "height": 12}, "portrait", {"width": 4.5, "height": 12}), + ({"height": 12}, "portrait", {"width": 21.59, "height": 12}), + (None, "landscape", {"width": 27.94, "height": 21.59}), + ({}, "landscape",{"width": 27.94, "height": 21.59}), + ({"width": 4.5}, "landscape", {"width": 27.94, "height": 4.5}), + ({"height": 23}, "landscape", {"width": 23, "height": 21.59}), + ({"width": 4.5, "height": 12}, "landscape", {"width": 12, "height": 4.5}), + ({"height": 12}, "landscape", {"width": 12, "height": 21.59}), ], ) async def test_page( @@ -19,13 +26,14 @@ async def test_page( inline, assert_pdf_dimensions, page, + orientation, expected_dimensions, ): await bidi_session.browsing_context.navigate( context=top_context["context"], url=inline(""), wait="complete" ) value = await bidi_session.browsing_context.print( - context=top_context["context"], page=page, orientation="portrait" + context=top_context["context"], page=page, orientation=orientation ) await assert_pdf_dimensions(value, expected_dimensions) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py new file mode 100644 index 00000000000..3aa0c3a19d1 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/__init__.py @@ -0,0 +1,28 @@ +import json + +from webdriver.bidi.modules.script import ContextTarget + + +async def get_events(context, bidi_session): + """Return list of key events recorded on the test_actions.html page.""" + events_str = await bidi_session.script.evaluate( + expression="JSON.stringify(allEvents.events)", + target=ContextTarget(context), + await_promise=False, + ) + events = json.loads(events_str["value"]) + + # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in + # test_actions.html), so this converts them back into unicode literals. + for e in events: + # example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char) + if "key" in e and e["key"].startswith("U+"): + key = e["key"] + hex_suffix = key[key.index("+") + 1 :] + e["key"] = chr(int(hex_suffix, 16)) + + # WebKit sets code as 'Unidentified' for unidentified key codes, but + # tests expect ''. + if "code" in e and e["code"] == "Unidentified": + e["code"] = "" + return events diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py new file mode 100644 index 00000000000..0ec3174163f --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/conftest.py @@ -0,0 +1,21 @@ +import pytest + +from webdriver.bidi.modules.script import ContextTarget + + +@pytest.fixture +def get_focused_key_input(bidi_session, top_context): + """Get focused input element, containing pressed key data.""" + + async def get_focused_key_input(context=top_context): + return await bidi_session.script.call_function( + function_declaration="""() => { + const elem = document.getElementById("keys"); + elem.focus(); + return elem; + }""", + target=ContextTarget(context["context"]), + await_promise=False, + ) + + return get_focused_key_input diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/__init__.py diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py new file mode 100644 index 00000000000..4dee9e33654 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/invalid.py @@ -0,0 +1,22 @@ +import pytest + +from webdriver.bidi.modules.input import Actions +from webdriver.bidi.error import InvalidArgumentException, NoSuchFrameException + + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", [None, True, 42, {}, []]) +async def test_params_context_invalid_type(bidi_session, value): + actions = Actions() + actions.add_key() + with pytest.raises(InvalidArgumentException): + await bidi_session.input.perform_actions(actions=actions, context=value) + + +async def test_params_contexts_value_invalid_value(bidi_session): + actions = Actions() + actions.add_key() + with pytest.raises(NoSuchFrameException): + await bidi_session.input.perform_actions(actions=actions, context="foo") diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py index 65f54ed7b38..e222776d1f9 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/perform_actions/key_events.py @@ -1,38 +1,14 @@ -import json - import pytest from webdriver.bidi.modules.input import Actions from webdriver.bidi.modules.script import ContextTarget -from tests.support.helpers import filter_dict +from tests.support.helpers import filter_supported_key_events +from .. import get_events pytestmark = pytest.mark.asyncio -async def get_events(context, bidi_session): - """Return list of key events recorded in the test_keys_page fixture.""" - events_str = await bidi_session.script.evaluate(expression="JSON.stringify(allEvents.events)", - target=ContextTarget(context), - await_promise=False) - events = json.loads(events_str["value"]) - - # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in - # test_actions.html), so this converts them back into unicode literals. - for e in events: - # example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char) - if "key" in e and e["key"].startswith(u"U+"): - key = e["key"] - hex_suffix = key[key.index("+") + 1:] - e["key"] = chr(int(hex_suffix, 16)) - - # WebKit sets code as 'Unidentified' for unidentified key codes, but - # tests expect ''. - if "code" in e and e["code"] == "Unidentified": - e["code"] = "" - return events - - @pytest.mark.parametrize("value,code", [ (u"a", "KeyA",), ("a", "KeyA",), @@ -44,20 +20,11 @@ async def get_events(context, bidi_session): (u"\u2603", ""), (u"\uF6C2", ""), # PUA ]) -async def test_printable_key_sends_correct_events(bidi_session, top_context, url, value, code): - await bidi_session.browsing_context.navigate( - context=top_context["context"], - url=url("/webdriver/tests/support/html/test_actions.html"), - wait="complete" - ) - await bidi_session.script.call_function(function_declaration=""" -() => { - let elem = document.getElementById("keys"); - elem.focus(); - resetEvents(); -}""", - target=ContextTarget(top_context["context"]), - await_promise=False) +async def test_printable_key_sends_correct_events( + bidi_session, top_context, test_actions_page_bidi, get_focused_key_input, value, code +): + await test_actions_page_bidi() + elem = await get_focused_key_input() actions = Actions() (actions.add_key() @@ -74,19 +41,15 @@ async def test_printable_key_sends_correct_events(bidi_session, top_context, url {"code": code, "key": value, "type": "keyup"}, ] - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - events = [filter_dict(e, expected[0]) for e in events] + (events, expected) = filter_supported_key_events(all_events, expected) assert events == expected keys_value = await bidi_session.script.call_function(function_declaration=""" -() => { - let elem = document.getElementById("keys"); +(elem) => { return elem.value }""", target=ContextTarget(top_context["context"]), + arguments=[elem], await_promise=False) assert keys_value["value"] == value diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/__init__.py diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py new file mode 100644 index 00000000000..0cb407606d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/context.py @@ -0,0 +1,42 @@ +import pytest +from webdriver.bidi.modules.input import Actions +from webdriver.bidi.modules.script import ContextTarget + +from tests.support.helpers import filter_supported_key_events +from .. import get_events + +pytestmark = pytest.mark.asyncio + + +async def test_different_top_level_contexts( + bidi_session, new_tab, top_context, test_actions_page_bidi, get_focused_key_input +): + await test_actions_page_bidi() + await get_focused_key_input() + + actions = Actions() + actions.add_key().key_down("a") + await bidi_session.input.perform_actions( + actions=actions, context=top_context["context"] + ) + # Reset so we only see the release events + await bidi_session.script.evaluate( + expression="resetEvents()", + target=ContextTarget(top_context["context"]), + await_promise=False, + ) + # Release actions in another context + await bidi_session.input.release_actions(context=new_tab["context"]) + + events = await get_events(top_context["context"], bidi_session) + assert len(events) == 0 + + # Release actions in right context + await bidi_session.input.release_actions(context=top_context["context"]) + + expected = [ + {"code": "KeyA", "key": "a", "type": "keyup"}, + ] + all_events = await get_events(top_context["context"], bidi_session) + (events, expected) = filter_supported_key_events(all_events, expected) + assert events == expected diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py new file mode 100644 index 00000000000..2adc0aa9538 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/invalid.py @@ -0,0 +1,16 @@ +import pytest +from webdriver.bidi.error import InvalidArgumentException, NoSuchFrameException + + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("value", [None, True, 42, {}, []]) +async def test_params_context_invalid_type(bidi_session, value): + with pytest.raises(InvalidArgumentException): + await bidi_session.input.release_actions(context=value) + + +async def test_params_contexts_value_invalid_value(bidi_session): + with pytest.raises(NoSuchFrameException): + await bidi_session.input.release_actions(context="foo") diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py new file mode 100644 index 00000000000..c4990b702ae --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/release.py @@ -0,0 +1,28 @@ +import pytest +from webdriver.bidi.modules.script import ContextTarget + +from .. import get_events + +pytestmark = pytest.mark.asyncio + + +async def test_release_no_actions_sends_no_events( + bidi_session, top_context, test_actions_page_bidi, get_focused_key_input +): + await test_actions_page_bidi() + elem = await get_focused_key_input() + + await bidi_session.input.release_actions(context=top_context["context"]) + + keys = await bidi_session.script.call_function( + function_declaration="""(elem) => { + return elem.value; + }""", + arguments=[elem], + target=ContextTarget(top_context["context"]), + await_promise=False, + ) + events = await get_events(top_context["context"], bidi_session) + + assert len(keys["value"]) == 0 + assert len(events) == 0 diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py new file mode 100644 index 00000000000..bd1d7752303 --- /dev/null +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/input/release_actions/sequence.py @@ -0,0 +1,84 @@ +import pytest +from webdriver.bidi.modules.input import Actions +from webdriver.bidi.modules.script import ContextTarget + +from tests.support.helpers import filter_dict, filter_supported_key_events +from .. import get_events + +pytestmark = pytest.mark.asyncio + + +async def test_release_char_sequence_sends_keyup_events_in_reverse( + bidi_session, top_context, test_actions_page_bidi, get_focused_key_input +): + await test_actions_page_bidi() + await get_focused_key_input() + + actions = Actions() + actions.add_key().key_down("a").key_down("b") + await bidi_session.input.perform_actions( + actions=actions, context=top_context["context"] + ) + # Reset so we only see the release events + await bidi_session.script.evaluate( + expression="resetEvents()", + target=ContextTarget(top_context["context"]), + await_promise=False, + ) + await bidi_session.input.release_actions(context=top_context["context"]) + expected = [ + {"code": "KeyB", "key": "b", "type": "keyup"}, + {"code": "KeyA", "key": "a", "type": "keyup"}, + ] + all_events = await get_events(top_context["context"], bidi_session) + (events, expected) = filter_supported_key_events(all_events, expected) + assert events == expected + + +@pytest.mark.parametrize( + "release_actions", + [True, False], + ids=["with release actions", "without release actions"], +) +async def test_release_mouse_sequence_resets_dblclick_state( + bidi_session, + top_context, + test_actions_page_bidi, + release_actions +): + await test_actions_page_bidi() + reporter = await bidi_session.script.evaluate( + expression="document.querySelector('#outer')", + target=ContextTarget(top_context["context"]), + await_promise=False, + ) + actions = Actions() + actions.add_pointer(pointer_type="mouse").pointer_move( + x=0, y=0, origin=reporter["value"] + ).pointer_down(button=0).pointer_up(button=0) + await bidi_session.input.perform_actions( + actions=actions, context=top_context["context"] + ) + + if release_actions: + await bidi_session.input.release_actions(context=top_context["context"]) + + await bidi_session.input.perform_actions( + actions=actions, context=top_context["context"] + ) + events = await get_events(top_context["context"], bidi_session) + + expected = [ + {"type": "mousedown", "button": 0}, + {"type": "mouseup", "button": 0}, + {"type": "click", "button": 0}, + {"type": "mousedown", "button": 0}, + {"type": "mouseup", "button": 0}, + {"type": "click", "button": 0}, + ] + + if not release_actions: + expected.append({"type": "dblclick", "button": 0}) + + filtered_events = [filter_dict(e, expected[0]) for e in events] + assert expected == filtered_events[1:] diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py index e6ca1f999b0..21a037a0f77 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/network/conftest.py @@ -11,25 +11,30 @@ PAGE_EMPTY_HTML = "/webdriver/tests/bidi/network/support/empty.html" @pytest.fixture -def fetch(bidi_session, top_context): +def fetch(bidi_session, top_context, configuration): """Perform a fetch from the page of the provided context, default to the top context. """ - async def fetch(url, method="GET", headers=None, context=top_context): + async def fetch(url, method="GET", headers=None, context=top_context, timeout_in_seconds=1): method_arg = f"method: '{method}'," headers_arg = "" if headers != None: headers_arg = f"headers: {json.dumps(headers)}," + timeout_in_seconds = timeout_in_seconds * configuration["timeout_multiplier"] + # Wait for fetch() to resolve a response and for response.text() to # resolve as well to make sure the request/response is completed when # the helper returns. await bidi_session.script.evaluate( expression=f""" + const controller = new AbortController(); + setTimeout(() => controller.abort(), {timeout_in_seconds * 1000}); fetch("{url}", {{ {method_arg} {headers_arg} + signal: controller.signal }}).then(response => response.text());""", target=ContextTarget(context["context"]), await_promise=True, diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py index d73705c6724..015fd40cf90 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/call_function/invalid.py @@ -118,6 +118,21 @@ async def test_params_arguments_handle_invalid_type( target=ContextTarget(top_context["context"])) +async def test_params_arguments_handle_unknown_value( + bidi_session, top_context +): + serialized_value = { + "handle": "foo", + } + + with pytest.raises(error.NoSuchHandleException): + await bidi_session.script.call_function( + function_declaration="(arg) => arg", + arguments=[serialized_value], + await_promise=False, + target=ContextTarget(top_context["context"])) + + @pytest.mark.parametrize("value", [None, False, 42, {}, []]) async def test_params_arguments_sharedId_invalid_type( bidi_session, top_context, value diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py index d4a51457662..e1226463a5c 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/handles.py @@ -27,7 +27,7 @@ async def test_basic_handle(bidi_session, top_context, call_function): handles=[remote_value["handle"]], target=ContextTarget(top_context["context"]) ) - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value]) @@ -67,10 +67,10 @@ async def test_multiple_handles_for_different_objects( ) # using handle a or b should raise an exception - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value_a]) - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.b", [remote_value_b]) # remote value c should still work @@ -84,7 +84,7 @@ async def test_multiple_handles_for_different_objects( ) # using handle c should raise an exception - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.c", [remote_value_c]) @@ -126,7 +126,7 @@ async def test_multiple_handles_for_same_object( ) # Using handle 1 should raise an exception - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value1]) # Using handle 2 should still work @@ -139,7 +139,7 @@ async def test_multiple_handles_for_same_object( ) # Using handle 2 should raise an exception - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value2]) @@ -169,5 +169,5 @@ async def test_unknown_handle(bidi_session, top_context, call_function): target=ContextTarget(top_context["context"]), ) - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value]) diff --git a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py index d8439c2be3d..67d857a0414 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/bidi/script/disown/target.py @@ -29,7 +29,7 @@ async def test_realm(bidi_session, top_context, call_function): target=RealmTarget(remote_value["realm"]), ) - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value["result"]]) @@ -83,7 +83,7 @@ async def test_sandbox(bidi_session, top_context, call_function): target=ContextTarget(top_context["context"], "basic_sandbox"), ) - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [sandbox_value], sandbox="basic_sandbox") # Disown the non-sandboxed remote value from the top context @@ -91,5 +91,5 @@ async def test_sandbox(bidi_session, top_context, call_function): handles=[remote_value["handle"]], target=ContextTarget(top_context["context"]) ) - with pytest.raises(error.InvalidArgumentException): + with pytest.raises(error.NoSuchHandleException): await call_function("arg => arg.a", [remote_value], sandbox="basic_sandbox") diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py index f28fb06ce29..30069a02386 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/conftest.py @@ -69,7 +69,7 @@ def release_actions(session, request): @pytest.fixture def key_reporter(session, test_actions_page, request): - """Represents focused input element from `test_keys_page` fixture.""" + """Represents focused input element from `test_actions_page` fixture.""" input_el = session.find.css("#keys", all=False) input_el.click() session.execute_script("resetEvents();") diff --git a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py index 8dbe024d183..9f912684c76 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/perform_actions/key_events.py @@ -6,7 +6,7 @@ import pytest from tests.perform_actions.support.keys import ALL_EVENTS, Keys, ALTERNATIVE_KEY_NAMES from tests.perform_actions.support.refine import get_events, get_keys -from tests.support.helpers import filter_dict +from tests.support.helpers import filter_dict, filter_supported_key_events def test_keyup_only_sends_no_events(session, key_reporter, key_chain): @@ -48,11 +48,7 @@ def test_modifier_key_sends_correct_events(session, key_reporter, key_chain, key {"code": code, "key": value, "type": "keyup"}, ] - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - events = [filter_dict(e, expected[0]) for e in events] + (events, expected) = filter_supported_key_events(all_events, expected) assert events == expected assert len(get_keys(key_reporter)) == 0 @@ -85,12 +81,8 @@ def test_non_printable_key_sends_events(session, key_reporter, key_chain, key, e alt_expected[0]["key"] = ALTERNATIVE_KEY_NAMES[event] alt_expected[2]["key"] = ALTERNATIVE_KEY_NAMES[event] - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - alt_expected = [filter_dict(e, {"key": "", "type": ""}) for e in alt_expected] - events = [filter_dict(e, expected[0]) for e in events] + (_, expected) = filter_supported_key_events(all_events, expected) + (events, alt_expected) = filter_supported_key_events(all_events, alt_expected) if len(events) == 2: # most browsers don't send a keypress for non-printable keys assert events == [expected[0], expected[2]] or events == [alt_expected[0], alt_expected[2]] @@ -124,11 +116,7 @@ def test_printable_key_sends_correct_events(session, key_reporter, key_chain, va {"code": code, "key": value, "type": "keyup"}, ] - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - events = [filter_dict(e, expected[0]) for e in events] + (events, expected) = filter_supported_key_events(all_events, expected) assert events == expected assert get_keys(key_reporter) == value @@ -148,11 +136,7 @@ def test_sequence_of_keydown_printable_keys_sends_events(session, key_reporter, {"code": "KeyB", "key": "b", "type": "keypress"}, ] - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - events = [filter_dict(e, expected[0]) for e in events] + (events, expected) = filter_supported_key_events(all_events, expected) assert events == expected assert get_keys(key_reporter) == "ab" @@ -171,11 +155,7 @@ def test_sequence_of_keydown_printable_characters_sends_events(session, key_repo {"code": "KeyF", "key": "f", "type": "keyup"}, ] - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - events = [filter_dict(e, expected[0]) for e in events] + (events, expected) = filter_supported_key_events(all_events, expected) assert events == expected assert get_keys(key_reporter) == "ef" diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py index 34c8e5de183..8275efc23b7 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/conftest.py @@ -28,7 +28,7 @@ def release_actions(session, request): @pytest.fixture def key_reporter(session, test_actions_page, request): - """Represents focused input element from `test_keys_page` fixture.""" + """Represents focused input element from `test_actions_page` fixture.""" input_el = session.find.css("#keys", all=False) input_el.click() session.execute_script("resetEvents();") diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py index 75143d85ca6..24ca16c8604 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/sequence.py @@ -1,7 +1,7 @@ # META: timeout=long from tests.release_actions.support.refine import get_events, get_keys -from tests.support.helpers import filter_dict +from tests.support.helpers import filter_dict, filter_supported_key_events def test_release_no_actions_sends_no_events(session, key_reporter): @@ -25,11 +25,7 @@ def test_release_char_sequence_sends_keyup_events_in_reverse(session, {"code": "KeyA", "key": "a", "type": "keyup"}, ] all_events = get_events(session) - events = [filter_dict(e, expected[0]) for e in all_events] - if len(events) > 0 and events[0]["code"] is None: - # Remove 'code' entry if browser doesn't support it - expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] - events = [filter_dict(e, expected[0]) for e in events] + (events, expected) = filter_supported_key_events(all_events, expected) assert events == expected diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py index 90f722587c3..d4052097493 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/refine.py @@ -1,5 +1,5 @@ def get_events(session): - """Return list of key events recorded in the test_keys_page fixture.""" + """Return list of key events recorded in the test_actions_page fixture.""" events = session.execute_script("return allEvents.events;") or [] # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in # test_keys_wdspec.html), so this converts them back into unicode literals. diff --git a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html b/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html deleted file mode 100644 index 6f844cd255a..00000000000 --- a/tests/wpt/web-platform-tests/webdriver/tests/release_actions/support/test_actions_wdspec.html +++ /dev/null @@ -1,197 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<html> -<head> - <title>Test Actions</title> - <style> - div { padding:0px; margin: 0px; } - #trackPointer { position: fixed; } - #resultContainer { width: 600px; height: 60px; } - .area { width: 100px; height: 50px; background-color: #ccc; } - .block { width: 5px; height: 5px; border: solid 1px red; } - #dragArea { position: relative; } - #dragTarget { position: absolute; top:22px; left:47px;} - </style> - <script> - "use strict"; - var els = {}; - var allEvents = { events: [] }; - function displayMessage(message) { - document.getElementById("events").innerHTML = "<p>" + message + "</p>"; - } - - function appendMessage(message) { - document.getElementById("events").innerHTML += "<p>" + message + "</p>"; - } - - /** - * Escape |key| if it's in a surrogate-half character range. - * - * Example: given "\ud83d" return "U+d83d". - * - * Otherwise JSON.stringify will convert it to U+FFFD (REPLACEMENT CHARACTER) - * when returning a value from executeScript, for example. - */ - function escapeSurrogateHalf(key) { - if (typeof key !== "undefined" && key.length === 1) { - var charCode = key.charCodeAt(0); - var highSurrogate = charCode >= 0xD800 && charCode <= 0xDBFF; - var surrogate = highSurrogate || (charCode >= 0xDC00 && charCode <= 0xDFFF); - if (surrogate) { - key = "U+" + charCode.toString(16); - } - } - return key; - } - - function recordKeyboardEvent(event) { - var key = escapeSurrogateHalf(event.key); - allEvents.events.push({ - "code": event.code, - "key": key, - "which": event.which, - "location": event.location, - "ctrl": event.ctrlKey, - "meta": event.metaKey, - "shift": event.shiftKey, - "repeat": event.repeat, - "type": event.type - }); - appendMessage(event.type + " " + - "code: " + event.code + ", " + - "key: " + key + ", " + - "which: " + event.which + ", " + - "keyCode: " + event.keyCode); - } - - function recordPointerEvent(event) { - if (event.type === "contextmenu") { - event.preventDefault(); - } - allEvents.events.push({ - "type": event.type, - "button": event.button, - "buttons": event.buttons, - "pageX": event.pageX, - "pageY": event.pageY, - "ctrlKey": event.ctrlKey, - "metaKey": event.metaKey, - "altKey": event.altKey, - "shiftKey": event.shiftKey, - "target": event.target.id - }); - appendMessage(event.type + " " + - "button: " + event.button + ", " + - "pageX: " + event.pageX + ", " + - "pageY: " + event.pageY + ", " + - "button: " + event.button + ", " + - "buttons: " + event.buttons + ", " + - "ctrlKey: " + event.ctrlKey + ", " + - "altKey: " + event.altKey + ", " + - "metaKey: " + event.metaKey + ", " + - "shiftKey: " + event.shiftKey + ", " + - "target id: " + event.target.id); - } - - function recordFirstPointerMove(event) { - recordPointerEvent(event); - window.removeEventListener("mousemove", recordFirstPointerMove); - } - - function grabOnce(event) { - grab(event); - els.dragTarget.removeEventListener("mousedown", grabOnce); - } - - function dropOnce(moveHandler) { - return function (event) { - moveHandler(event); - els.dragArea.removeEventListener("mouseup", dropOnce); - } - } - - function resetEvents() { - allEvents.events.length = 0; - displayMessage(""); - } - - function drop(moveHandler) { - return function (event) { - els.dragArea.removeEventListener("mousemove", moveHandler); - els.dragTarget.style.backgroundColor = "yellow"; - els.dragTarget.addEventListener("mousedown", grab); - recordPointerEvent(event); - }; - } - - function move(el, offsetX, offsetY, timeout) { - return function(event) { - setTimeout(function() { - el.style.top = event.clientY + offsetY + "px"; - el.style.left = event.clientX + offsetX + "px"; - }, timeout); - }; - } - - function grab(event) { - event.target.style.backgroundColor = "red"; - let boxRect = event.target.getBoundingClientRect(); - let areaRect = event.target.parentElement.getBoundingClientRect(); - let moveHandler = move( - event.target, - // coordinates of dragTarget must be relative to dragArea such that - // dragTarget remains under the pointer - -(areaRect.left + (event.clientX - boxRect.left)), - -(areaRect.top + (event.clientY - boxRect.top)), - 20); - els.dragArea.addEventListener("mousemove", moveHandler); - els.dragArea.addEventListener("mouseup", dropOnce(drop(moveHandler))); - } - - document.addEventListener("DOMContentLoaded", function() { - var keyReporter = document.getElementById("keys"); - keyReporter.addEventListener("keyup", recordKeyboardEvent); - keyReporter.addEventListener("keypress", recordKeyboardEvent); - keyReporter.addEventListener("keydown", recordKeyboardEvent); - - var outer = document.getElementById("outer"); - outer.addEventListener("click", recordPointerEvent); - outer.addEventListener("dblclick", recordPointerEvent); - outer.addEventListener("mousedown", recordPointerEvent); - outer.addEventListener("mouseup", recordPointerEvent); - outer.addEventListener("contextmenu", recordPointerEvent); - - window.addEventListener("mousemove", recordFirstPointerMove); - //visual cue for mousemove - var pointer = document.getElementById("trackPointer"); - window.addEventListener("mousemove", move(pointer, 15, 15, 30)); - // drag and drop - els.dragArea = document.getElementById("dragArea"); - els.dragTarget = document.getElementById("dragTarget"); - els.dragTarget.addEventListener("mousedown", grabOnce); - }); - </script> -</head> -<body> - <div id="trackPointer" class="block"></div> - <div> - <h2>KeyReporter</h2> - <input type="text" id="keys" size="80"> - </div> - <div> - <h2>ClickReporter</h2> - <div id="outer" class="area"> - </div> - </div> - <div> - <h2>DragReporter</h2> - <div id="dragArea" class="area"> - <div id="dragTarget" class="block"></div> - </div> - </div> - <div id="resultContainer"> - <h2>Events</h2> - <div id="events"></div> - </div> -</body> -</html> diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py b/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py index 9407dc16070..612718b89e5 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures_bidi.py @@ -334,3 +334,17 @@ def render_pdf_to_png_bidi(bidi_session, new_tab, url): return base64.b64decode(image_string_without_data_type) return render_pdf_to_png_bidi + + +@pytest.fixture +def test_actions_page_bidi(bidi_session, url, top_context): + """Navigate to test_actions.html.""" + + async def test_actions_page_bidi(context=top_context): + await bidi_session.browsing_context.navigate( + context=context["context"], + url=url("/webdriver/tests/support/html/test_actions.html"), + wait="complete", + ) + + return test_actions_page_bidi diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py b/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py index b0c065dca11..45f4f4d2392 100644 --- a/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py +++ b/tests/wpt/web-platform-tests/webdriver/tests/support/helpers.py @@ -245,6 +245,16 @@ def filter_dict(source, d): return {k: source[k] for k in d.keys()} +def filter_supported_key_events(all_events, expected): + events = [filter_dict(e, expected[0]) for e in all_events] + if len(events) > 0 and events[0]["code"] is None: + # Remove 'code' entry if browser doesn't support it + expected = [filter_dict(e, {"key": "", "type": ""}) for e in expected] + events = [filter_dict(e, expected[0]) for e in events] + + return (events, expected) + + def wait_for_new_handle(session, handles_before): def find_new_handle(session): new_handles = list(set(session.handles) - set(handles_before)) diff --git a/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json b/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json index f3855b0f4e1..e1bf6782619 100644 --- a/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json +++ b/tests/wpt/web-platform-tests/webnn/resources/test_data/prelu.json @@ -514,7 +514,82 @@ "type": "float32" }, "slope": { - "shape": [1], + "shape": [3], // broadcast [3] --> [2, 2, 2, 3] + "data": [ + 5.073923296191488, + 0.48077445494619653, + -7.091750168010829 + ], + "type": "float32" + } + }, + "expected": { + "name": "ouput", + "shape": [2, 2, 2, 3], + "data": [ + -12.934283256530762, + -2.3052449226379395, + 8.413617134094238, + 6.108623504638672, + -4.082877159118652, + 3.3143365383148193, + 1.1687211990356445, + -0.06815595179796219, + 47.61863327026367, + 5.787421703338623, + -1.8056097030639648, + 34.737422943115234, + 7.3295159339904785, + -1.901092767715454, + 7.067296981811523, + 9.439736366271973, + -1.2299076318740845, + 61.40629196166992, + 8.47507381439209, + 4.551425457000732, + 65.72542572021484, + -1.330268144607544, + 1.3258955478668213, + 52.60881042480469 + ], + "type": "float32" + } + }, + { + "name": "prelu float32 broadcast 4D x 1D slope of shape [1]", + "inputs": { + "x": { + "shape": [2, 2, 2, 3], + "data": [ + -2.5491681672317235, + -4.794857500523286, + 8.413617520687886, + 6.108623511441287, + -8.492292847462334, + 3.3143364551069876, + 1.1687212422078108, + -0.1417628422981423, + -6.714651930677875, + 5.787421746282195, + -3.7556274239369847, + -4.898286418001732, + 7.329515995865023, + -3.9542297833176665, + 7.067297201348715, + 9.439736453375971, + -2.5581801134299775, + -8.658834185932482, + 8.475073893236225, + 4.551425642121982, + -9.267870491380243, + -0.26217744010265776, + 1.325895534951659, + -7.418311114031475 + ], + "type": "float32" + }, + "slope": { + "shape": [1], // broadcast [1] --> [2, 2, 2, 3] "data": [ 5.0114545056636395 ], @@ -587,7 +662,7 @@ "type": "float32" }, "slope": { - "shape": [2, 3], + "shape": [2, 3], // broadcast [2, 3] --> [2, 2, 2, 3] "data": [ 4.8742760041637645, -8.50163357869285, @@ -665,7 +740,7 @@ "type": "float32" }, "slope": { - "shape": [1, 1, 3], + "shape": [1, 1, 3], // broadcast [1, 1, 3] --> [2, 2, 2, 3] "data": [ 5.073923296191488, 0.48077445494619653, @@ -740,7 +815,7 @@ "type": "float32" }, "slope": { - "shape": [1, 1, 1, 1], + "shape": [1, 1, 1, 1], // broadcast [1, 1, 1, 1] --> [2, 2, 2, 3] "data": [ 5.0114545056636395 ], diff --git a/tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json b/tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json new file mode 100644 index 00000000000..e3208b18ad4 --- /dev/null +++ b/tests/wpt/web-platform-tests/webnn/resources/test_data/softsign.json @@ -0,0 +1,400 @@ +{ // softsign: The calculation follows the expression x / (1 + |x|). + "tests": [ + { + "name": "softsign positive float32 1D tensor", + "inputs": { + "x": { + "shape": [24], + "data": [ + 1.5834133593790956, + 4.0787189411490115, + 8.883356617490337, + 8.070860233252166, + 8.211773633019915, + 2.4554003891197818, + 0.653374178120758, + 7.866281154604682, + 3.1239552336192666, + 8.013792390668268, + 3.9409862749371283, + 1.8131727337833081, + 2.390676102273188, + 1.3359680092645565, + 9.416410839467265, + 0.44325690899325254, + 5.236662013213598, + 9.424242359034539, + 7.816190418459348, + 5.849185795081855, + 8.780370640491928, + 5.1205157788312246, + 7.1172223514005095, + 4.59910661262345 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [24], + "data": [ + 0.6129152178764343, + 0.8030999898910522, + 0.8988198041915894, + 0.8897568583488464, + 0.8914432525634766, + 0.7105979323387146, + 0.3951762318611145, + 0.8872131109237671, + 0.7575143575668335, + 0.8890588879585266, + 0.7976112365722656, + 0.6445294618606567, + 0.7050735354423523, + 0.5719119310379028, + 0.9039976596832275, + 0.30712267756462097, + 0.8396578431129456, + 0.9040697813034058, + 0.8865723013877869, + 0.8539972305297852, + 0.8977543711662292, + 0.8366150856018066, + 0.8768051266670227, + 0.8214001059532166 + ], + "type": "float32" + } + }, + { + "name": "softsign negative float32 1D tensor", + "inputs": { + "x": { + "shape": [24], + "data": [ + -2.5978440095516913, + -0.4449555447737712, + -9.095475232407683, + -3.7480076975512873, + -1.3867289790255697, + -8.220328902868987, + -3.538342320320556, + -9.364588742025619, + -6.283252341501335, + -5.0020120266550006, + -8.245729151019969, + -3.775470497728266, + -4.087254829132392, + -7.3816760861585795, + -5.882921529710956, + -8.338910337100263, + -6.6015492897072185, + -4.491942000901396, + -3.524778486355298, + -4.439912258765581, + -5.2342625634221225, + -1.5911732471016933, + -9.106277545690418, + -8.523774275382141 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [24], + "data": [ + -0.7220557928085327, + -0.3079372048377991, + -0.9009457230567932, + -0.7893853783607483, + -0.5810165405273438, + -0.891543984413147, + -0.7796552181243896, + -0.9035176634788513, + -0.8626986742019653, + -0.8333892226219177, + -0.8918419480323792, + -0.7905965447425842, + -0.8034303188323975, + -0.8806921243667603, + -0.8547128438949585, + -0.8929211497306824, + -0.8684478402137756, + -0.8179150223731995, + -0.7789947390556335, + -0.8161734938621521, + -0.8395960927009583, + -0.6140744686126709, + -0.9010515809059143, + -0.894999623298645 + ], + "type": "float32" + } + }, + { + "name": "softsign float32 2D tensor", + "inputs": { + "x": { + "shape": [4, 6], + "data": [ + -8.343496173533422, + -6.92015211612679, + 2.699638761922575, + -8.663104577031863, + -3.190534368785616, + 7.657887080586452, + 6.650215091182602, + 6.058011004380681, + 0.6634320403254037, + 5.805803683155526, + -0.32821124531446344, + 1.270430403469046, + -9.946119978610852, + 6.905375202832072, + -0.031071535439890496, + -3.9696409293645862, + 6.270823207970878, + -2.6392608577007914, + 3.051350503137261, + 7.42647683445869, + -8.454667518154086, + 7.135868292466057, + -4.9860941550065885, + -7.859615086397076 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [4, 6], + "data": [ + -0.8929736614227295, + -0.8737397789955139, + 0.7297033667564392, + -0.8965135812759399, + -0.7613669633865356, + 0.8844983577728271, + 0.8692847490310669, + 0.8583170175552368, + 0.3988332748413086, + 0.8530665636062622, + -0.24710771441459656, + 0.5595548748970032, + -0.9086434245109558, + 0.8735038042068481, + -0.03013519011437893, + -0.798778235912323, + 0.8624640107154846, + -0.7252188920974731, + 0.7531687617301941, + 0.88132643699646, + -0.8942321538925171, + 0.8770874738693237, + -0.8329461812973022, + -0.8871282935142517 + ], + "type": "float32" + } + }, + { + "name": "softsign float32 3D tensor", + "inputs": { + "x": { + "shape": [2, 3, 4], + "data": [ + -8.343496173533422, + -6.92015211612679, + 2.699638761922575, + -8.663104577031863, + -3.190534368785616, + 7.657887080586452, + 6.650215091182602, + 6.058011004380681, + 0.6634320403254037, + 5.805803683155526, + -0.32821124531446344, + 1.270430403469046, + -9.946119978610852, + 6.905375202832072, + -0.031071535439890496, + -3.9696409293645862, + 6.270823207970878, + -2.6392608577007914, + 3.051350503137261, + 7.42647683445869, + -8.454667518154086, + 7.135868292466057, + -4.9860941550065885, + -7.859615086397076 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [2, 3, 4], + "data": [ + -0.8929736614227295, + -0.8737397789955139, + 0.7297033667564392, + -0.8965135812759399, + -0.7613669633865356, + 0.8844983577728271, + 0.8692847490310669, + 0.8583170175552368, + 0.3988332748413086, + 0.8530665636062622, + -0.24710771441459656, + 0.5595548748970032, + -0.9086434245109558, + 0.8735038042068481, + -0.03013519011437893, + -0.798778235912323, + 0.8624640107154846, + -0.7252188920974731, + 0.7531687617301941, + 0.88132643699646, + -0.8942321538925171, + 0.8770874738693237, + -0.8329461812973022, + -0.8871282935142517 + ], + "type": "float32" + } + }, + { + "name": "softsign float32 4D tensor", + "inputs": { + "x": { + "shape": [1, 2, 3, 4], + "data": [ + -8.343496173533422, + -6.92015211612679, + 2.699638761922575, + -8.663104577031863, + -3.190534368785616, + 7.657887080586452, + 6.650215091182602, + 6.058011004380681, + 0.6634320403254037, + 5.805803683155526, + -0.32821124531446344, + 1.270430403469046, + -9.946119978610852, + 6.905375202832072, + -0.031071535439890496, + -3.9696409293645862, + 6.270823207970878, + -2.6392608577007914, + 3.051350503137261, + 7.42647683445869, + -8.454667518154086, + 7.135868292466057, + -4.9860941550065885, + -7.859615086397076 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [1, 2, 3, 4], + "data": [ + -0.8929736614227295, + -0.8737397789955139, + 0.7297033667564392, + -0.8965135812759399, + -0.7613669633865356, + 0.8844983577728271, + 0.8692847490310669, + 0.8583170175552368, + 0.3988332748413086, + 0.8530665636062622, + -0.24710771441459656, + 0.5595548748970032, + -0.9086434245109558, + 0.8735038042068481, + -0.03013519011437893, + -0.798778235912323, + 0.8624640107154846, + -0.7252188920974731, + 0.7531687617301941, + 0.88132643699646, + -0.8942321538925171, + 0.8770874738693237, + -0.8329461812973022, + -0.8871282935142517 + ], + "type": "float32" + } + }, + { + "name": "softsign float32 5D tensor", + "inputs": { + "x": { + "shape": [1, 2, 1, 3, 4], + "data": [ + -8.343496173533422, + -6.92015211612679, + 2.699638761922575, + -8.663104577031863, + -3.190534368785616, + 7.657887080586452, + 6.650215091182602, + 6.058011004380681, + 0.6634320403254037, + 5.805803683155526, + -0.32821124531446344, + 1.270430403469046, + -9.946119978610852, + 6.905375202832072, + -0.031071535439890496, + -3.9696409293645862, + 6.270823207970878, + -2.6392608577007914, + 3.051350503137261, + 7.42647683445869, + -8.454667518154086, + 7.135868292466057, + -4.9860941550065885, + -7.859615086397076 + ], + "type": "float32" + } + }, + "expected": { + "name": "output", + "shape": [1, 2, 1, 3, 4], + "data": [ + -0.8929736614227295, + -0.8737397789955139, + 0.7297033667564392, + -0.8965135812759399, + -0.7613669633865356, + 0.8844983577728271, + 0.8692847490310669, + 0.8583170175552368, + 0.3988332748413086, + 0.8530665636062622, + -0.24710771441459656, + 0.5595548748970032, + -0.9086434245109558, + 0.8735038042068481, + -0.03013519011437893, + -0.798778235912323, + 0.8624640107154846, + -0.7252188920974731, + 0.7531687617301941, + 0.88132643699646, + -0.8942321538925171, + 0.8770874738693237, + -0.8329461812973022, + -0.8871282935142517 + ], + "type": "float32" + } + } + ] +}
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/webnn/resources/utils.js b/tests/wpt/web-platform-tests/webnn/resources/utils.js index a91dfa04c6e..427b47e28cc 100644 --- a/tests/wpt/web-platform-tests/webnn/resources/utils.js +++ b/tests/wpt/web-platform-tests/webnn/resources/utils.js @@ -287,6 +287,7 @@ const PrecisionMetrics = { sigmoid: {ULP: {float32: 32+2, float16: 3}}, // float32 (leaving a few ULP for roundoff) slice: {ULP: {float32: 0, float16: 0}}, softmax: {ULP: {float32: getSoftmaxPrecisionTolerance, float16: getSoftmaxPrecisionTolerance}}, + softsign: {ULP: {float32: 3, float16: 3}}, split: {ULP: {float32: 0, float16: 0}}, squeeze: {ULP: {float32: 0, float16: 0}}, tanh: {ATOL: {float32: 1/1024, float16: 1/512}}, diff --git a/tests/wpt/web-platform-tests/webnn/softsign.https.any.js b/tests/wpt/web-platform-tests/webnn/softsign.https.any.js new file mode 100644 index 00000000000..61a7d5365fa --- /dev/null +++ b/tests/wpt/web-platform-tests/webnn/softsign.https.any.js @@ -0,0 +1,10 @@ +// META: title=test WebNN API softsign operation +// META: global=window,dedicatedworker +// META: script=./resources/utils.js +// META: timeout=long + +'use strict'; + +// https://webmachinelearning.github.io/webnn/#api-mlgraphbuilder-softsign + +testWebNNOperation('softsign', buildOperationWithSingleInput);
\ No newline at end of file diff --git a/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html index b6dc7da5d40..79eba02727b 100644 --- a/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html +++ b/tests/wpt/web-platform-tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html @@ -16,61 +16,88 @@ async function negotiate(pc1, pc2) { await pc1.setRemoteDescription(pc2.localDescription); } -test(function(t) { - const pc = new RTCPeerConnection(); - t.add_cleanup(() => pc.close()); - const transceiver = pc.addTransceiver('video'); - const capabilities = transceiver.getHeaderExtensionsToNegotiate(); - let capability = capabilities.find((capability) => { - return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid" && - capability.direction != "stopped"; - }); - assert_not_equals(capability, undefined); -}, `the video transceiver.getHeaderExtensionsToNegotiate() includes mandatory extensions`); +['audio', 'video'].forEach(kind => { + test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver(kind); + const capabilities = transceiver.getHeaderExtensionsToNegotiate(); + const capability = capabilities.find((capability) => { + return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid'; + }); + assert_not_equals(capability, undefined); + assert_equals(capability.direction, 'sendrecv'); + }, `the ${kind} transceiver.getHeaderExtensionsToNegotiate() includes mandatory extensions`); +}); -test(function(t) { +test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); - let capability = capabilities.find((capability) => { - return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid" && - capability.direction != "stopped"; - }); - assert_not_equals(capability, undefined); -}, `the audio transceiver.getHeaderExtensionsToNegotiate() includes mandatory extensions`); + capabilities[0].uri = ''; + assert_throws_js(TypeError, () => { + transceiver.setHeaderExtensionsToNegotiate(capabilities); + }, 'transceiver should throw TypeError when setting an empty URI'); +}, `setHeaderExtensionsToNegotiate throws TypeError on encountering missing URI`); -test(function(t) { +test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); - capabilities[0].uri = ""; + capabilities[0].direction = ''; assert_throws_js(TypeError, () => { transceiver.setHeaderExtensionsToNegotiate(capabilities); - }, 'transceiver should throw TypeError when setting an empty URI'); -}, `setHeaderExtensionsToNegotiate throws TypeError on encountering missing URI`); + }, 'transceiver should throw TypeError when setting an empty direction'); +}, `setHeaderExtensionsToNegotiate throws TypeError on encountering missing direction`); -test(function(t) { +test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); - capabilities[0].uri = "4711"; + capabilities[0].uri = '4711'; assert_throws_dom('InvalidModificationError', () => { transceiver.setHeaderExtensionsToNegotiate(capabilities); }, 'transceiver should throw InvalidModificationError when setting an unknown URI'); }, `setHeaderExtensionsToNegotiate throws InvalidModificationError on encountering unknown URI`); -test(function(t) { +test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + const capabilities = transceiver.getHeaderExtensionsToNegotiate().filter(capability => { + return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid'; + }); + assert_throws_dom('InvalidModificationError', () => { + transceiver.setHeaderExtensionsToNegotiate(capabilities); + }, 'transceiver should throw InvalidModificationError when removing elements from the list'); +}, `setHeaderExtensionsToNegotiate throws InvalidModificationError when removing elements from the list`); + +test(t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + const capabilities = transceiver.getHeaderExtensionsToNegotiate(); + capabilities.push({ + uri: '4711', + direction: 'recvonly', + }); + assert_throws_dom('InvalidModificationError', () => { + transceiver.setHeaderExtensionsToNegotiate(capabilities); + }, 'transceiver should throw InvalidModificationError when adding elements to the list'); +}, `setHeaderExtensionsToNegotiate throws InvalidModificationError when adding elements to the list`); + +test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); let capability = capabilities.find((capability) => { - return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid"; + return capability.uri === 'urn:ietf:params:rtp-hdrext:sdes:mid'; }); - ["sendonly", "recvonly", "inactive", "stopped"].map(direction => { + ['sendonly', 'recvonly', 'inactive', 'stopped'].map(direction => { capability.direction = direction; assert_throws_dom('InvalidModificationError', () => { transceiver.setHeaderExtensionsToNegotiate(capabilities); @@ -78,23 +105,23 @@ test(function(t) { }); }, `setHeaderExtensionsToNegotiate throws InvalidModificationError when setting a mandatory header extension\'s direction to something else than "sendrecv"`); -test(function(t) { +test(t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio'); let capabilities = transceiver.getHeaderExtensionsToNegotiate(); let selected_capability = capabilities.find((capability) => { - return capability.direction == "sendrecv" && - capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid"; + return capability.direction === 'sendrecv' && + capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid'; }); - selected_capability.direction = "stopped"; - const offered_capabilities = transceiver.getHeaderExtensionsToNegotiate; + selected_capability.direction = 'stopped'; + const offered_capabilities = transceiver.getHeaderExtensionsToNegotiate(); let altered_capability = capabilities.find((capability) => { - return capability.uri == selected_capability.uri && - capability.direction == "stopped"; + return capability.uri === selected_capability.uri && + capability.direction === 'stopped'; }); assert_not_equals(altered_capability, undefined); -}, `modified direction set by setHeaderExtensionsToNegotiate is visible in headerExtensionsOffered`); +}, `modified direction set by setHeaderExtensionsToNegotiate is visible in subsequent getHeaderExtensionsToNegotiate`); promise_test(async t => { const pc = new RTCPeerConnection(); @@ -102,19 +129,16 @@ promise_test(async t => { const transceiver = pc.addTransceiver('video'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); const offer = await pc.createOffer(); - const extmaps = offer - .sdp - .split("\n") - .filter(line => { return line.includes("a=extmap:"); }) - .join("\n"); + const extensions = SDPUtils.matchPrefix(SDPUtils.splitSections(offer.sdp)[1], 'a=extmap:') + .map(line => SDPUtils.parseExtmap(line)); for (const capability of capabilities) { - if (capability.direction == "stopped") { - assert_false(extmaps.includes(capability.uri)); + if (capability.direction === 'stopped') { + assert_equals(undefined, extensions.find(e => e.uri === capability.uri)); } else { - assert_true(extmaps.includes(capability.uri)); + assert_not_equals(undefined, extensions.find(e => e.uri === capability.uri)); } } -}, `unstopped extensions turn up in offer`); +}, `Unstopped extensions turn up in offer`); promise_test(async t => { const pc = new RTCPeerConnection(); @@ -122,25 +146,22 @@ promise_test(async t => { const transceiver = pc.addTransceiver('video'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); const selected_capability = capabilities.find((capability) => { - return capability.direction == "sendrecv" && - capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid"; + return capability.direction === 'sendrecv' && + capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid'; }); - selected_capability.direction = "stopped"; + selected_capability.direction = 'stopped'; transceiver.setHeaderExtensionsToNegotiate(capabilities); const offer = await pc.createOffer(); - const extmaps = offer - .sdp - .split("\n") - .filter(line => { return line.includes("a=extmap:"); }) - .join("\n"); + const extensions = SDPUtils.matchPrefix(SDPUtils.splitSections(offer.sdp)[1], 'a=extmap:') + .map(line => SDPUtils.parseExtmap(line)); for (const capability of capabilities) { - if (capability.direction == "stopped") { - assert_false(extmaps.includes(capability.uri)); + if (capability.direction === 'stopped') { + assert_equals(undefined, extensions.find(e => e.uri === capability.uri)); } else { - assert_true(extmaps.includes(capability.uri)); + assert_not_equals(undefined, extensions.find(e => e.uri === capability.uri)); } } -}, `stopped extensions do not turn up in offers`); +}, `Stopped extensions do not turn up in offers`); promise_test(async t => { const pc1 = new RTCPeerConnection(); @@ -152,27 +173,17 @@ promise_test(async t => { const transceiver = pc1.addTransceiver('video'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); const selected_capability = capabilities.find((capability) => { - return capability.direction == "sendrecv" && - capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid"; + return capability.direction === 'sendrecv' && + capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid'; }); - selected_capability.direction = "stopped"; + selected_capability.direction = 'stopped'; transceiver.setHeaderExtensionsToNegotiate(capabilities); await negotiate(pc1, pc2); const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions(); - // Attempt enabling the extension. - selected_capability.direction = "sendrecv"; - - // The enabled extension should not be part of the negotiated set. - transceiver.setHeaderExtensionsToNegotiate(capabilities); - await negotiate(pc1, pc2); - assert_not_equals( - transceiver.getNegotiatedHeaderExtensions().find(capability => { - return capability.uri == selected_capability.uri && - capability.direction == "sendrecv"; - }), undefined); -}, `the set of negotiated extensions grows with subsequent offers`); + assert_equals(capabilities.length, negotiated_capabilites.length); +}, `The set of negotiated extensions has the same size as the set of extensions to negotiate`); promise_test(async t => { const pc1 = new RTCPeerConnection(); @@ -184,28 +195,27 @@ promise_test(async t => { const transceiver = pc1.addTransceiver('video'); const capabilities = transceiver.getHeaderExtensionsToNegotiate(); const selected_capability = capabilities.find((capability) => { - return capability.direction == "sendrecv" && - capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid"; + return capability.direction === 'sendrecv' && + capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid'; }); - selected_capability.direction = "stopped"; + selected_capability.direction = 'stopped'; transceiver.setHeaderExtensionsToNegotiate(capabilities); await negotiate(pc1, pc2); const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions(); - for (const capability of negotiated_capabilites) { - assert_not_equals(capabilities.find((cap) => { - return cap.uri == capability.uri && cap.direction != "stopped"; - }), undefined); - } - for (const capability of capabilities) { - if (capability.direction != "stopped") { - assert_not_equals(negotiated_capabilites.find((cap) => { - return cap.uri == capability.uri; + // Attempt enabling the extension. + selected_capability.direction = 'sendrecv'; + + // The enabled extension should not be part of the negotiated set. + transceiver.setHeaderExtensionsToNegotiate(capabilities); + await negotiate(pc1, pc2); + assert_not_equals( + transceiver.getNegotiatedHeaderExtensions().find(capability => { + return capability.uri === selected_capability.uri && + capability.direction === 'sendrecv'; }), undefined); - } - } -}, `the set of negotiated extensions is the set of unstopped extensions`); +}, `Header extensions can be reactivated in subsequent offers`); promise_test(async t => { const pc = new RTCPeerConnection(); @@ -235,6 +245,51 @@ promise_test(async t => { assert_equals(extensions.length, 2); assert_false(!!extensions[0].find(extension => extension.uri === extensionUri)); assert_true(!!extensions[1].find(extension => extension.uri === extensionUri)); -}, 'Extensions can be deactivated on a per-mline basis'); +}, 'Header extensions can be deactivated on a per-mline basis'); + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + const t1 = pc1.addTransceiver('video'); + + await pc1.setLocalDescription(); + await pc2.setRemoteDescription(pc1.localDescription); + // Get the transceiver after it is created by SRD. + const t2 = pc2.getTransceivers()[0]; + const t2_capabilities = t2.getHeaderExtensionsToNegotiate(); + const t2_capability_to_stop = t2_capabilities + .find(capability => capability.uri !== 'urn:ietf:params:rtp-hdrext:sdes:mid'); + assert_not_equals(undefined, t2_capability_to_stop); + t2_capability_to_stop.direction = 'stopped'; + t2.setHeaderExtensionsToNegotiate(t2_capabilities); + + await pc2.setLocalDescription(); + await pc1.setRemoteDescription(pc2.localDescription); + + const t1_negotiated = t1.getNegotiatedHeaderExtensions() + .find(extension => extension.uri === t2_capability_to_stop.uri); + assert_not_equals(undefined, t1_negotiated); + assert_equals(t1_negotiated.direction, 'stopped'); + const t1_capability = t1.getHeaderExtensionsToNegotiate() + .find(extension => extension.uri === t2_capability_to_stop.uri); + assert_not_equals(undefined, t1_capability); + assert_equals(t1_capability.direction, 'sendrecv'); +}, 'Extensions not negotiated by the peer are `stopped` in getNegotiatedHeaderExtensions'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + const transceiver = pc.addTransceiver('video'); + const negotiated_capabilites = transceiver.getNegotiatedHeaderExtensions(); + assert_equals(negotiated_capabilites.length, + transceiver.getHeaderExtensionsToNegotiate().length); + for (const capability of negotiated_capabilites) { + assert_equals(capability.direction, 'stopped'); + } +}, 'Prior to negotiation, getNegotiatedHeaderExtensions() returns `stopped` for all extensions.'); </script> diff --git a/tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini deleted file mode 100644 index 6f118ff5f27..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/close.https.any.js.ini +++ /dev/null @@ -1,19 +0,0 @@ -[close.https.any.html] - disabled: - if product != "chrome": true - -[close.https.any.window.html] - disabled: - if product != "chrome": true - -[close.https.any.worker.html] - disabled: - if product != "chrome": true - -[close.https.any.sharedworker.html] - disabled: - if product != "chrome": true - -[close.https.any.serviceworker.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini deleted file mode 100644 index d53cd702ccd..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/connect.https.any.js.ini +++ /dev/null @@ -1,19 +0,0 @@ -[connect.https.any.html] - disabled: - if product != "chrome": true - -[connect.https.any.window.html] - disabled: - if product != "chrome": true - -[connect.https.any.worker.html] - disabled: - if product != "chrome": true - -[connect.https.any.sharedworker.html] - disabled: - if product != "chrome": true - -[connect.https.any.serviceworker.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini b/tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini deleted file mode 100644 index adbd3c13592..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/csp-fail.https.window.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[csp-fail.https.window.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini b/tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini deleted file mode 100644 index 28d68410bbe..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/csp-pass.https.window.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[csp-pass.https.window.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js index b96b36fc369..dc7133bb867 100644 --- a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js +++ b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js @@ -23,6 +23,20 @@ async function write_datagrams(writer, signal) { return sentTokens; } +// Write N datagrams without waiting, then wait for them +async function write_N_datagrams(writer, n) { + const encoder = new TextEncoder(); + const sentTokens = []; + const promises = []; + while (sentTokens.length < n) { + const token = sentTokens.length.toString(); + sentTokens.push(token); + promises.push(writer.write(encoder.encode(token))); + } + await Promise.all(promises); + return sentTokens; +} + // Read datagrams until the consumer has received enough i.e. N datagrams. Call // abort() after reading. async function read_datagrams(reader, controller, N) { @@ -156,6 +170,37 @@ promise_test(async t => { }, 'Reading datagrams with insufficient buffer should be rejected.'); promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + const writer = wt.datagrams.writable.getWriter(); + const reader = wt.datagrams.readable.getReader(); + + // Write and read max-size datagram. + await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize)); + const { value: token, done } = await reader.read(); + assert_false(done); + assert_equals(token.length, wt.datagrams.maxDatagramSize); +}, 'Transfer max-size datagram'); + +promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + const writer = wt.datagrams.writable.getWriter(); + const reader = wt.datagrams.readable.getReader(); + + // Write and read max-size datagram. + await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize+1)); + // This should resolve with no datagram sent, which is hard to test for. + // Wait for incoming datagrams to arrive, and if they do, fail. + const result = await Promise.race([reader.read(), wait(500)]); + assert_equals(result, undefined); +}, 'Fail to transfer max-size+1 datagram'); + +promise_test(async t => { // Make a WebTransport connection, but session is not necessarily established. const wt = new WebTransport(webtransport_url('echo.py')); @@ -166,9 +211,10 @@ promise_test(async t => { const signal = controller.signal; // Write and read datagrams. - const N = 1; + const N = 5; + wt.datagrams.outgoingHighWaterMark = N; const [sentTokens, receivedTokens] = await Promise.all([ - write_datagrams(writer, signal), + write_N_datagrams(writer, N), read_datagrams(reader, controller, N) ]); @@ -269,3 +315,56 @@ promise_test(async t => { // incomingHighWaterMark. assert_less_than_equal(receivedDatagrams, N); }, 'Datagrams read is less than or equal to the incomingHighWaterMark'); + +promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + assert_equals(wt.datagrams.incomingMaxAge, Infinity); + assert_equals(wt.datagrams.outgoingMaxAge, Infinity); + + wt.datagrams.incomingMaxAge = 5; + assert_equals(wt.datagrams.incomingMaxAge, 5); + wt.datagrams.outgoingMaxAge = 5; + assert_equals(wt.datagrams.outgoingMaxAge, 5); + + assert_throws_js(RangeError, () => { wt.datagrams.incomingMaxAge = -1; }); + assert_throws_js(RangeError, () => { wt.datagrams.outgoingMaxAge = -1; }); + assert_throws_js(RangeError, () => { wt.datagrams.incomingMaxAge = NaN; }); + assert_throws_js(RangeError, () => { wt.datagrams.outgoingMaxAge = NaN; }); + + wt.datagrams.incomingMaxAge = 0; + assert_equals(wt.datagrams.incomingMaxAge, Infinity); + wt.datagrams.outgoingMaxAge = 0; + assert_equals(wt.datagrams.outgoingMaxAge, Infinity); +}, 'Datagram MaxAge getters/setters work correctly'); + +promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + // Initial values are implementation-defined + assert_greater_than_equal(wt.datagrams.incomingHighWaterMark, 1); + assert_greater_than_equal(wt.datagrams.outgoingHighWaterMark, 1); + + wt.datagrams.incomingHighWaterMark = 5; + assert_equals(wt.datagrams.incomingHighWaterMark, 5); + wt.datagrams.outgoingHighWaterMark = 5; + assert_equals(wt.datagrams.outgoingHighWaterMark, 5); + + assert_throws_js(RangeError, () => { wt.datagrams.incomingHighWaterMark = -1; }); + assert_throws_js(RangeError, () => { wt.datagrams.outgoingHighWaterMark = -1; }); + assert_throws_js(RangeError, () => { wt.datagrams.incomingHighWaterMark = NaN; }); + assert_throws_js(RangeError, () => { wt.datagrams.outgoingHighWaterMark = NaN; }); + + wt.datagrams.incomingHighWaterMark = 0.5; + assert_equals(wt.datagrams.incomingHighWaterMark, 1); + wt.datagrams.outgoingHighWaterMark = 0.5; + assert_equals(wt.datagrams.outgoingHighWaterMark, 1); + wt.datagrams.incomingHighWaterMark = 0; + assert_equals(wt.datagrams.incomingHighWaterMark, 1); + wt.datagrams.outgoingHighWaterMark = 0; + assert_equals(wt.datagrams.outgoingHighWaterMark, 1); +}, 'Datagram HighWaterMark getters/setters work correctly'); diff --git a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini deleted file mode 100644 index 49ad1548df3..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/datagrams.https.any.js.ini +++ /dev/null @@ -1,19 +0,0 @@ -[datagrams.https.any.html] - disabled: - if product != "chrome": true - -[datagrams.https.any.window.html] - disabled: - if product != "chrome": true - -[datagrams.https.any.worker.html] - disabled: - if product != "chrome": true - -[datagrams.https.any.sharedworker.html] - disabled: - if product != "chrome": true - -[datagrams.https.any.serviceworker.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js b/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js index 733153e1202..9f9127b22f9 100644 --- a/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js +++ b/tests/wpt/web-platform-tests/webtransport/resources/webtransport-test-helpers.sub.js @@ -20,6 +20,23 @@ function webtransport_code_to_http_code(n) { return first + n + Math.floor(n / 0x1e); } +// Read all chunks from |readable_stream| and return as an array of arrays +async function read_stream(readable_stream) { + const reader = readable_stream.getReader(); + + let chunks = []; + while (true) { + const {value: chunk, done} = await reader.read(); + if (done) { + break; + } + chunks.push(chunk); + } + reader.releaseLock(); + + return chunks; +} + // Read all chunks from |readable_stream|, decode chunks to a utf-8 string, then // return the string. async function read_stream_as_string(readable_stream) { diff --git a/tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini deleted file mode 100644 index 0d60f7e54db..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/streams-close.https.any.js.ini +++ /dev/null @@ -1,19 +0,0 @@ -[streams-close.https.any.html] - disabled: - if product != "chrome": true - -[streams-close.https.any.window.html] - disabled: - if product != "chrome": true - -[streams-close.https.any.worker.html] - disabled: - if product != "chrome": true - -[streams-close.https.any.sharedworker.html] - disabled: - if product != "chrome": true - -[streams-close.https.any.serviceworker.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js b/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js index 32781419ebf..3b402d00e08 100644 --- a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js +++ b/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js @@ -151,3 +151,83 @@ promise_test(async t => { } reader.releaseLock(); }, 'Can read data from a unidirectional stream with BYOB reader'); + +promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + // Create a bidirectional stream. + const bidi_stream = await wt.createBidirectionalStream(); + + // Write a message to the writable end, and close it. + const writer = bidi_stream.writable.getWriter(); + const bytes = new Uint8Array(16384); + const [reply] = await Promise.all([ + read_stream(bidi_stream.readable), + writer.write(bytes), + writer.write(bytes), + writer.write(bytes), + writer.close() + ]); + let len = 0; + for (chunk of reply) { + len += chunk.length; + } + // Check that the message from the readable end matches the writable end. + assert_equals(len, 3*bytes.length); +}, 'Transfer large chunks of data on a bidirectional stream'); + +promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + // Create a unidirectional stream. + const uni_stream = await wt.createUnidirectionalStream(); + + // Write a message to the writable end, and close it. + const writer = uni_stream.getWriter(); + const bytes = new Uint8Array(16384); + await Promise.all([ + writer.write(bytes), + writer.write(bytes), + writer.write(bytes), + writer.close() + ]); + // XXX Update once chrome fixes https://crbug.com/929585 + // The echo handler creates a new unidirectional stream to echo back data from + // the server to client. Accept the unidirectional stream. + const readable = wt.incomingUnidirectionalStreams; + const stream_reader = readable.getReader(); + const { value: recv_stream } = await stream_reader.read(); + stream_reader.releaseLock(); + + // Read the data on the readable end. + const reply = await read_stream(recv_stream); + let len = 0; + for (chunk of reply) { + len += chunk.length; + } + // Check that the message from the readable end matches the writable end. + assert_equals(len, 3*bytes.length); +}, 'Transfer large chunks of data on a unidirectional stream'); + +promise_test(async t => { + // Establish a WebTransport session. + const wt = new WebTransport(webtransport_url('echo.py')); + await wt.ready; + + // Create a bidirectional stream. + const bidi_stream = await wt.createBidirectionalStream(); + + // Close the writable end with no data at all. + const writer = bidi_stream.writable.getWriter(); + writer.close(); + + // Read the data on the readable end. + const chunks = await read_stream(bidi_stream.readable); + assert_equals(chunks.length, 0); + + await bidi_stream.readable.closed; +}, 'Closing the stream with no data still resolves the read request'); diff --git a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini b/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini deleted file mode 100644 index eb11ca786f1..00000000000 --- a/tests/wpt/web-platform-tests/webtransport/streams-echo.https.any.js.ini +++ /dev/null @@ -1,19 +0,0 @@ -[streams-echo.https.any.html] - disabled: - if product != "chrome": true - -[streams-echo.https.any.window.html] - disabled: - if product != "chrome": true - -[streams-echo.https.any.worker.html] - disabled: - if product != "chrome": true - -[streams-echo.https.any.sharedworker.html] - disabled: - if product != "chrome": true - -[streams-echo.https.any.serviceworker.html] - disabled: - if product != "chrome": true diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini index 4e4810ca509..278f0d1eb20 100644 --- a/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/misc/origin-clean-conformance-offscreencanvas.html.ini @@ -2,6 +2,3 @@ expected: ERROR [WebGL test #2: Unable to fetch WebGL rendering context for Canvas] expected: FAIL - - [WebGL test #0: img was loaded] - expected: FAIL diff --git a/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini b/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini index 4e4810ca509..278f0d1eb20 100644 --- a/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini +++ b/tests/wpt/webgl/meta/conformance2/textures/misc/origin-clean-conformance-offscreencanvas.html.ini @@ -2,6 +2,3 @@ expected: ERROR [WebGL test #2: Unable to fetch WebGL rendering context for Canvas] expected: FAIL - - [WebGL test #0: img was loaded] - expected: FAIL |