Added support for Edge Stable channel (#21245)

diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
index 03e5a51..7e1732f 100644
--- a/.azure-pipelines.yml
+++ b/.azure-pipelines.yml
@@ -19,6 +19,7 @@
 # These are all the branches referenced in the jobs that follow.
 - epochs/daily
 - epochs/three_hourly
+- triggers/edge_stable
 - triggers/edge_dev
 - triggers/edge_canary
 - triggers/safari_stable
@@ -239,6 +240,42 @@
     condition: always()
   - template: tools/ci/azure/cleanup_win10.yml
 
+- job: results_edge_stable
+  displayName: 'all tests: Edge Stable'
+  condition: |
+    or(eq(variables['Build.SourceBranch'], 'refs/heads/epochs/daily'),
+       eq(variables['Build.SourceBranch'], 'refs/heads/triggers/edge_stable'),
+       and(eq(variables['Build.Reason'], 'Manual'), variables['run_all_edge_stable']))
+  strategy:
+    parallel: 10 # chosen to make runtime ~2h
+  timeoutInMinutes: 180
+  pool:
+    name: 'Hosted Windows Client'
+  steps:
+  - template: tools/ci/azure/system_info.yml
+  - template: tools/ci/azure/checkout.yml
+  - template: tools/ci/azure/install_python.yml
+  - template: tools/ci/azure/pip_install.yml
+    parameters:
+      packages: virtualenv
+  - template: tools/ci/azure/install_certs.yml
+  - template: tools/ci/azure/install_edge.yml
+    parameters:
+      channel: stable
+  - template: tools/ci/azure/update_hosts.yml
+  - template: tools/ci/azure/update_manifest.yml
+  - script: python ./wpt run --yes --no-manifest-update --no-restart-on-unexpected --no-fail-on-unexpected --install-fonts --this-chunk $(System.JobPositionInPhase) --total-chunks $(System.TotalJobsInPhase) --chunk-type hash --log-wptreport $(Build.ArtifactStagingDirectory)/wpt_report_$(System.JobPositionInPhase).json --log-wptscreenshot $(Build.ArtifactStagingDirectory)/wpt_screenshot_$(System.JobPositionInPhase).txt --log-mach - --log-mach-level info --channel stable edgechromium
+    displayName: 'Run tests (Edge Stable)'
+  - task: PublishBuildArtifacts@1
+    displayName: 'Publish results'
+    inputs:
+      artifactName: 'edge-stable-results'
+  - template: tools/ci/azure/cleanup_win10.yml
+- template: tools/ci/azure/fyi_hook.yml
+  parameters:
+    dependsOn: results_edge_stable
+    artifactName: edge-stable-results
+
 - job: results_edge_dev
   displayName: 'all tests: Edge Dev'
   condition: |
diff --git a/tools/ci/azure/install_edge.yml b/tools/ci/azure/install_edge.yml
index e4c425a..297b6e6 100644
--- a/tools/ci/azure/install_edge.yml
+++ b/tools/ci/azure/install_edge.yml
@@ -4,6 +4,26 @@
 # Should match https://web-platform-tests.org/running-tests/chrome.html
 # Just replace chrome with edgechromium
 steps:
+- ${{ if eq(parameters.channel, 'stable') }}:
+  - powershell: |
+      $edgeInstallerName = 'MicrosoftEdgeSetup.exe'
+      # Link to Stable channel installer
+      Start-BitsTransfer -Source 'https://go.microsoft.com/fwlink/?linkid=2108834&Channel=Stable&language=en' -Destination MicrosoftEdgeSetup.exe
+      if (-not (Test-Path $edgeInstallerName)) {
+        Throw "Failed to download Edge installer to $edgeInstallerName."
+      }
+      cmd /c START /WAIT $edgeInstallerName /silent /install
+      $edgePath = "$env:systemdrive\Program Files (x86)\Microsoft\Edge\Application"
+      if (Test-Path $edgePath) {
+        Write-Host "##vso[task.prependpath]$edgePath"
+        Write-Host "Edge Stable installed at $edgePath."
+        (Get-Item -Path "$edgePath\msedge.exe").VersionInfo | Format-List
+      } else {
+        Copy-Item -Path "$env:temp\*edge*.log" -Destination $(Build.ArtifactStagingDirectory)  -Force
+        Throw "Failed to install Edge at $edgePath"
+      }
+    displayName: 'Install Edge Stable'
+
 - ${{ if eq(parameters.channel, 'canary') }}:
   - powershell: |
       $edgeInstallerName = 'MicrosoftEdgeSetup.exe'
diff --git a/tools/wpt/browser.py b/tools/wpt/browser.py
index f0c2eeb..13ce823 100644
--- a/tools/wpt/browser.py
+++ b/tools/wpt/browser.py
@@ -888,8 +888,10 @@
             if not binary:
                 # Use paths from different Edge channels starting with Release\Beta\Dev\Canary
                 winpaths = [os.path.expanduser("~\\AppData\\Local\\Microsoft\\Edge\\Application"),
+                            os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge\\Application"),
                             os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Beta\\Application"),
                             os.path.expandvars("$SYSTEMDRIVE\\Program Files\\Microsoft\\Edge Dev\\Application"),
+                            os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge\\Application"),
                             os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Beta\\Application"),
                             os.path.expandvars("$SYSTEMDRIVE\\Program Files (x86)\\Microsoft\\Edge Dev\\Application"),
                             os.path.expanduser("~\\AppData\Local\\Microsoft\\Edge SxS\\Application")]