diff --git a/.azure-pipelines/publish-docker.yml b/.azure-pipelines/publish-docker.yml
new file mode 100644
index 0000000000000..4c089b2aa6293
--- /dev/null
+++ b/.azure-pipelines/publish-docker.yml
@@ -0,0 +1,96 @@
+# Trigger: any `v*` release tag (e.g. v1.40.0).
+# Can also be queued manually from the ADO UI.
+trigger:
+ tags:
+ include:
+ - v*
+ exclude:
+ - v*-*
+
+pr: none
+
+parameters:
+- name: releaseChannel
+ displayName: "IMPORTANT: set this to 'canary' when triggering manually"
+ type: string
+ default: stable
+ values:
+ - stable
+ - canary
+
+resources:
+ repositories:
+ - repository: 1esPipelines
+ type: git
+ name: 1ESPipelineTemplates/1ESPipelineTemplates
+ ref: refs/tags/release
+
+extends:
+ template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines
+ parameters:
+ pool:
+ name: DevDivPlaywrightAzurePipelinesUbuntu2204
+ os: linux
+ sdl:
+ sourceAnalysisPool:
+ name: DevDivPlaywrightAzurePipelinesWindows2022
+ # The image must be windows-based due to restrictions of the SDL tools. See: https://aka.ms/AAo6v8e
+ os: windows
+ stages:
+ - stage: Publish
+ jobs:
+ - job: PublishDocker
+ displayName: "Publish Docker images to ACR"
+ # arm64 images are cross-built under QEMU emulation, which is slow.
+ timeoutInMinutes: 360
+ steps:
+ - checkout: self
+ fetchDepth: 0
+ displayName: "Checkout code"
+
+ - task: UseNode@1
+ inputs:
+ version: '22.x'
+ displayName: "Install Node.js"
+
+ # Relocate the Docker data-root to the large /mnt volume: this job builds
+ # 6 images (jammy/noble/resolute x amd64/arm64) and `docker system prune`s
+ # between them, so the default disk fills up.
+ - task: Bash@3
+ displayName: "Setup docker"
+ inputs:
+ targetType: "inline"
+ script: |
+ set -x
+ sudo service docker stop
+ sudo mkdir -p /etc/docker
+ echo '{ "data-root": "/mnt/docker" }' | sudo tee /etc/docker/daemon.json
+ sudo service docker start
+
+ # Register QEMU/binfmt handlers so `docker build --platform linux/arm64`
+ # works on the amd64 host. Equivalent to docker/setup-qemu-action@v4.
+ - task: Bash@3
+ displayName: "Set up QEMU for arm64 builds"
+ inputs:
+ targetType: "inline"
+ script: docker run --privileged --rm tonistiigi/binfmt --install arm64
+
+ - script: npm ci
+ displayName: "npm ci"
+
+ - script: npm run build
+ displayName: "npm run build"
+
+ - task: AzureCLI@2
+ displayName: "Login to ACR via OIDC"
+ inputs:
+ azureSubscription: "Playwright-CDN"
+ scriptType: "bash"
+ scriptLocation: "inlineScript"
+ inlineScript: "az acr login --name playwright"
+
+ - task: Bash@3
+ displayName: "Build & publish Docker images"
+ inputs:
+ targetType: "inline"
+ script: "./utils/docker/publish_docker.sh ${{ parameters.releaseChannel }}"
diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml
index 07eb51e35d67c..aed173fb6ee4c 100644
--- a/.github/workflows/publish_release.yml
+++ b/.github/workflows/publish_release.yml
@@ -1,4 +1,4 @@
-name: "publish release - npm, driver, trace viewer"
+name: "publish release - npm, trace viewer"
on:
workflow_dispatch:
@@ -11,14 +11,13 @@ on:
types: [published]
jobs:
- publish-npm-and-driver:
- name: "publish NPM and driver"
+ publish-npm:
+ name: "publish NPM"
runs-on: ubuntu-24.04
if: github.repository == 'microsoft/playwright'
permissions:
- id-token: write # This is required for OIDC login (azure/login, NPM publish) to succeed
+ id-token: write # This is required for OIDC login (NPM publish) to succeed
contents: read # This is required for actions/checkout to succeed
- environment: allow-publish-driver-to-cdn # This is required for OIDC login (azure/login)
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
@@ -50,19 +49,6 @@ jobs:
if: github.event_name == 'release' && github.event.action == 'published'
run: utils/publish_all_packages.sh --release
- - name: Azure Login
- uses: azure/login@v3
- with:
- client-id: ${{ secrets.AZURE_PW_CDN_CLIENT_ID }}
- tenant-id: ${{ secrets.AZURE_PW_CDN_TENANT_ID }}
- subscription-id: ${{ secrets.AZURE_PW_CDN_SUBSCRIPTION_ID }}
- - name: build & publish driver
- env:
- AZ_UPLOAD_FOLDER: ${{ github.event_name == 'release' && 'driver' || 'driver/next' }}
- run: |
- utils/build/build-playwright-driver.sh
- utils/build/upload-playwright-driver.sh
-
publish-trace-viewer:
name: "publish Trace Viewer to trace.playwright.dev"
runs-on: ubuntu-24.04
diff --git a/.github/workflows/tests_secondary.yml b/.github/workflows/tests_secondary.yml
index a32354c87d26e..ebd3a5b4c5aa0 100644
--- a/.github/workflows/tests_secondary.yml
+++ b/.github/workflows/tests_secondary.yml
@@ -179,18 +179,6 @@ jobs:
env:
PWTEST_CHANNEL: ${{ matrix.channel }}
- build-playwright-driver:
- name: "build-playwright-driver"
- runs-on: ubuntu-24.04
- steps:
- - uses: actions/checkout@v6
- - uses: actions/setup-node@v6
- with:
- node-version: 20
- - run: npm ci
- - run: npm run build
- - run: utils/build/build-playwright-driver.sh
-
test_android:
name: Android
environment: ${{ github.event_name == 'push' && 'allow-uploading-flakiness-results' || null }}
diff --git a/docs/src/api/class-elementhandle.md b/docs/src/api/class-elementhandle.md
index 10a862cfcf77f..a14f91156a7de 100644
--- a/docs/src/api/class-elementhandle.md
+++ b/docs/src/api/class-elementhandle.md
@@ -191,6 +191,8 @@ When all steps combined have not finished during the specified [`option: timeout
### option: ElementHandle.check.timeout = %%-input-timeout-js-%%
* since: v1.8
+### option: ElementHandle.check.signal = %%-input-signal-%%
+
### option: ElementHandle.check.trial = %%-input-trial-%%
* since: v1.11
@@ -239,6 +241,8 @@ When all steps combined have not finished during the specified [`option: timeout
### option: ElementHandle.click.timeout = %%-input-timeout-js-%%
* since: v1.8
+### option: ElementHandle.click.signal = %%-input-signal-%%
+
### option: ElementHandle.click.trial = %%-input-trial-%%
* since: v1.11
@@ -298,6 +302,8 @@ When all steps combined have not finished during the specified [`option: timeout
### option: ElementHandle.dblclick.timeout = %%-input-timeout-js-%%
* since: v1.8
+### option: ElementHandle.dblclick.signal = %%-input-signal-%%
+
### option: ElementHandle.dblclick.trial = %%-input-trial-%%
* since: v1.11
@@ -560,6 +566,8 @@ Value to set for the ``, `