diff --git a/.ado/build-template.yml b/.ado/build-template.yml index 43a3cb1dccd..0caad2c6ece 100644 --- a/.ado/build-template.yml +++ b/.ado/build-template.yml @@ -176,10 +176,12 @@ extends: - script: npx --yes midgard-yarn-strict@1.2.4 @rnw-scripts/beachball-config displayName: Strict yarn install @rnw-scripts/beachball-config condition: and(succeeded(), eq(variables['detectScenario.isReleaseBuild'], 'False')) + retryCountOnTaskFailure: 2 - script: npx lage build --scope @rnw-scripts/prepare-release --scope @rnw-scripts/beachball-config displayName: Build prepare-release and beachball-config condition: and(succeeded(), eq(variables['detectScenario.isReleaseBuild'], 'False')) + retryCountOnTaskFailure: 2 # 5. Beachball check (Developer PR only) - pwsh: npx beachball check --branch "origin/$env:BEACHBALL_BRANCH" --verbose --changehint "##vso[task.logissue type=error]Run 'yarn change' from root of repo to generate a change file." diff --git a/.ado/jobs/e2e-test.yml b/.ado/jobs/e2e-test.yml index d0ee4102a6b..d6c9d3b3e18 100644 --- a/.ado/jobs/e2e-test.yml +++ b/.ado/jobs/e2e-test.yml @@ -8,6 +8,17 @@ parameters: - Continuous - name: AgentPool type: object + # When set to true on a PR-validation queue, the E2E app deliberately + # crashes (simulateCrashForTesting) or hangs (simulateHangForTesting) so we + # can re-validate that the crash-dump collection path still produces a + # usable artifact. Disabled by default — the test step is doomed by design + # when these are on. + - name: simulateCrashForTesting + type: boolean + default: false + - name: simulateHangForTesting + type: boolean + default: false - name: buildMatrix type: object default: @@ -46,6 +57,12 @@ jobs: platform: ${{ matrix.BuildPlatform }} configuration: Release buildEnvironment: ${{ config.buildEnvironment }} + # Capture crash dumps for the E2E test app (packaged UWP) and + # the Metro bundler. ProcDump-as-AeDebug does not reliably fire + # for packaged apps; WER LocalDumps does. + localDumpsExeNames: + - RNTesterApp-Fabric + - node - pwsh: | Write-Host "##vso[task.setvariable variable=BuildLogDirectory]$(Build.BinariesDirectory)\${{ matrix.BuildPlatform }}\BuildLogs" @@ -70,11 +87,238 @@ jobs: echo ##vso[task.setvariable variable=StartedFabricTests]true displayName: Set StartedFabricTests - - script: | - yarn e2etest - displayName: yarn e2etest - workingDirectory: packages/e2e-test-app-fabric - timeoutInMinutes: 10 # Time to wait for this task to complete before the server kills it. + # Test-only: arm the crash-simulation sentinel so RNTesterApp-Fabric + # crashes on startup. Validates the in-process minidump path. + - ${{ if eq(parameters.simulateCrashForTesting, true) }}: + - pwsh: | + $flagPath = Join-Path $env:ProgramData 'rnw-e2e-simulate-crash.flag' + New-Item -Path $flagPath -ItemType File -Force | Out-Null + Write-Host "Crash-simulation sentinel created at $flagPath" + $dumpDir = Join-Path $env:ProgramData 'RNW-E2E-Dumps' + if (Test-Path $dumpDir) { + Remove-Item -Path "$dumpDir\*" -Recurse -Force -ErrorAction SilentlyContinue + Write-Host "Cleared stale dumps under $dumpDir" + } + displayName: Arm crash-simulation sentinel (TEST ONLY) + + # Test-only: arm the hang-simulation env var, which switches on + # the HangSimulationTest.test.ts test. That test invokes the + # `HangForTesting` automation command, jamming the app's UI thread + # so the post-failure ProcDump path captures a hang dump. + - ${{ if eq(parameters.simulateHangForTesting, true) }}: + - pwsh: | + Write-Host "##vso[task.setvariable variable=RNW_SIMULATE_HANG]1" + Write-Host "Hang simulation armed (RNW_SIMULATE_HANG=1)" + displayName: Arm hang-simulation env var (TEST ONLY) + + # When simulating a hang, run ONLY the HangSimulationTest. The default + # jest sequencer puts brand-new (no-timing-history) tests late in the order, + # so without filtering the test step times out before the hang test even + # runs. 4-minute timeout: enough for app launch (~30 s) + the test's 70 s + # jest testTimeout + jest teardown attempt; ADO will cut off at 4 min if the + # hang prevents jest from exiting cleanly, which is fine — Capture step then + # finds the still-alive UI-hung app. + - ${{ if eq(parameters.simulateHangForTesting, true) }}: + - script: | + yarn e2etest --testPathPattern HangSimulationTest + displayName: yarn e2etest (hang simulation only) + workingDirectory: packages/e2e-test-app-fabric + timeoutInMinutes: 4 + + - ${{ if not(eq(parameters.simulateHangForTesting, true)) }}: + - script: | + yarn e2etest + displayName: yarn e2etest + workingDirectory: packages/e2e-test-app-fabric + # Drop to 2 min during crash simulation — the app crashes + # immediately on startup, so a 10-minute wait is dead time. + ${{ if eq(parameters.simulateCrashForTesting, true) }}: + timeoutInMinutes: 2 + ${{ if not(eq(parameters.simulateCrashForTesting, true)) }}: + timeoutInMinutes: 10 + + # Always disarm the crash sentinel so it cannot leak to a rerun on + # the same agent. + - ${{ if eq(parameters.simulateCrashForTesting, true) }}: + - pwsh: | + $flagPath = Join-Path $env:ProgramData 'rnw-e2e-simulate-crash.flag' + if (Test-Path $flagPath) { + Remove-Item $flagPath -Force + Write-Host "Removed crash-simulation sentinel at $flagPath" + } + displayName: Disarm crash-simulation sentinel (TEST ONLY) + condition: always() + + # Always disarm the hang-simulation env var so the post-failure + # `Update snapshots` step (which also runs `yarn e2etest`) does not + # re-trigger the hang and burn 10 minutes of dead time. Setting an + # ADO variable to empty string clears it for subsequent steps. + - ${{ if eq(parameters.simulateHangForTesting, true) }}: + - pwsh: | + Write-Host "##vso[task.setvariable variable=RNW_SIMULATE_HANG]" + Write-Host "Hang simulation disarmed (RNW_SIMULATE_HANG cleared)" + displayName: Disarm hang-simulation env var (TEST ONLY) + condition: always() + + # On test failure, snapshot any lingering RNTesterApp-Fabric / node + # processes before subsequent steps (or the agent) tear them down. + # WER LocalDumps only fires on actual crashes; this catches hangs + # (e.g. "Unable to enter correct text" timeouts) where the process + # is alive but unresponsive. + # + # Dumps must go into a subfolder of $(CrashDumpRootPath). Files + # written directly at the root were observed to disappear during + # the long `Update snapshots` step that runs after a failed test; + # files in a subfolder survive. We don't know which agent + # behavior deletes them — Defender, a 1ES cleanup script, or a + # side-effect of `yarn e2etest -u` — but a subfolder evades it. + - pwsh: | + $procDump = Join-Path "$(ProcDumpPath)" 'procdump64.exe' + if (-not (Test-Path $procDump)) { + Write-Host "ProcDump not found at $procDump; skipping live-process dump capture." + exit 0 + } + + $hangDir = Join-Path "$(CrashDumpRootPath)" 'hang' + New-Item -ItemType Directory -Path $hangDir -Force | Out-Null + + $targets = @('RNTesterApp-Fabric', 'node') + foreach ($name in $targets) { + Get-Process -Name $name -ErrorAction SilentlyContinue | ForEach-Object { + $dumpPath = Join-Path $hangDir ("hang_{0}_{1}.dmp" -f $name, $_.Id) + Write-Host "Capturing full dump of $name (pid $($_.Id)) to $dumpPath" + & $procDump -accepteula -ma $_.Id $dumpPath + Write-Host ("ProcDump exit code: {0} (non-zero is normal - encodes the dump count written)" -f $LASTEXITCODE) + } + } + # ProcDump uses non-zero exit codes to encode the number of dumps written. + # Force a clean PowerShell exit so the step doesn't show as a warning. + exit 0 + displayName: Capture dumps of surviving test processes + condition: and(failed(), eq(variables.StartedFabricTests, 'true')) + continueOnError: true + + # Collect any in-process minidumps the app's UEF wrote to + # %ProgramData%\RNW-E2E-Dumps, plus any dumps WER may have written + # to its standard fallback locations, and stage them into + # subfolders of $(CrashDumpRootPath) so they ride the crash-dumps + # artifact. Dumps in subfolders survive the post-failure + # `Update snapshots` step (see comment on the Capture step above). + - pwsh: | + # In-process minidumps (primary mechanism for actual crashes). + $inProc = Join-Path $env:ProgramData 'RNW-E2E-Dumps' + if (Test-Path $inProc) { + $dest = Join-Path "$(CrashDumpRootPath)" 'in-process' + New-Item -ItemType Directory -Path $dest -Force | Out-Null + Copy-Item -Path "$inProc\*" -Destination $dest -Recurse -Force -ErrorAction SilentlyContinue + Get-ChildItem -Path $dest -Recurse -Force -ErrorAction SilentlyContinue | + Select-Object FullName, Length | Format-Table -AutoSize | Out-String | Write-Host + } + + # Fallback search: if the agent image ever changes back to a + # working WER LocalDumps configuration, dumps may land here. + $searchRoots = @( + "$env:LOCALAPPDATA\CrashDumps", + "$env:ProgramData\Microsoft\Windows\WER\ReportQueue", + "$env:ProgramData\Microsoft\Windows\WER\ReportArchive", + "$env:ProgramData\Microsoft\Windows\WER\Temp" + ) + $found = @() + foreach ($root in $searchRoots) { + if (-not (Test-Path $root)) { continue } + $found += Get-ChildItem -Path $root -Recurse -Include *.dmp,*.mdmp -ErrorAction SilentlyContinue -Force | + Where-Object { -not $_.PSIsContainer -and $_.LastWriteTime -gt (Get-Date).AddHours(-2) } + } + if ($found.Count -gt 0) { + $dest = Join-Path "$(CrashDumpRootPath)" 'recovered' + New-Item -ItemType Directory -Path $dest -Force | Out-Null + foreach ($h in $found) { + $target = Join-Path $dest ($h.FullName -replace '[:\\/]', '_') + Copy-Item -LiteralPath $h.FullName -Destination $target -Force -ErrorAction SilentlyContinue + Write-Host "Recovered $($h.FullName) ($($h.Length) bytes) -> $target" + } + } + displayName: Collect in-process and fallback crash dumps + condition: and(failed(), eq(variables.StartedFabricTests, 'true')) + continueOnError: true + + # Bundle matching PDBs and a debugging README into the Crash dumps + # artifact so the dump is self-contained for an offline developer. + # Skipped if no .dmp/.mdmp files exist — $(CrashDumpRootPath) also + # holds MSBuild failure logs (MSBUILDDEBUGPATH points here), and + # those don't need symbols or this README. + - pwsh: | + $dumps = Get-ChildItem -Path "$(CrashDumpRootPath)" -Recurse -Include *.dmp,*.mdmp -File -ErrorAction SilentlyContinue + if (-not $dumps -or $dumps.Count -eq 0) { + Write-Host "No .dmp/.mdmp files in $(CrashDumpRootPath); skipping symbols + README bundling." + exit 0 + } + Write-Host "Found $($dumps.Count) dump file(s); bundling matching PDBs and README." + + $symbolsDir = Join-Path "$(CrashDumpRootPath)" 'symbols' + $releaseRoot = "$(Build.SourcesDirectory)\packages\e2e-test-app-fabric\windows\${{ matrix.BuildPlatform }}\Release" + if (Test-Path $releaseRoot) { + $pdbs = Get-ChildItem -Path $releaseRoot -Recurse -Filter *.pdb -File -ErrorAction SilentlyContinue + foreach ($pdb in $pdbs) { + $rel = $pdb.FullName.Substring($releaseRoot.Length).TrimStart('\','/') + $target = Join-Path $symbolsDir $rel + New-Item -ItemType Directory -Path (Split-Path -Parent $target) -Force | Out-Null + Copy-Item -LiteralPath $pdb.FullName -Destination $target -Force -ErrorAction SilentlyContinue + } + Write-Host "Staged $($pdbs.Count) PDB(s) under $symbolsDir" + } else { + Write-Host "Release root not found at $releaseRoot; skipping PDB stage." + } + + $readme = @' + # Reading these crash dumps + + This artifact contains crash and/or hang dumps from a failed React + Native Windows E2E test run, plus matching debug symbols. + + ## What is in here + + - `hang/` -- full-memory dumps captured by procdump64 from + RNTesterApp-Fabric / node processes that were still alive when + the test step timed out. + - `in-process/` -- full-memory minidumps written by + RNTesterApp-Fabric's own unhandled-exception filter when the app + actually crashed. + - `recovered/` -- dumps recovered from common WER fallback + locations on the agent. Usually empty. + - `symbols/` -- PDBs that match the binaries deployed to the test + agent. Folder layout mirrors the test app's Release deploy tree. + + ## Opening in WinDbg + + 1. Download and extract this artifact. Note the absolute path of + the extracted `symbols/` folder. + 2. Open a dump: + + windbg -z hang\hang_RNTesterApp-Fabric_.dmp + + 3. Set the symbol path (this artifact's symbols + Microsoft public + symbol server) and reload: + + .sympath srv*C:\symbols*https://msdl.microsoft.com/download/symbols;\symbols + .reload /f + + 4. Useful first commands: + - `~* k` -- call stack of every thread (most useful for hangs) + - `!analyze -v` -- automatic crash analysis (most useful for crashes) + + ## If you need the binaries too + + The PDBs alone are enough for stack walks and type info. If you + need module bytes (e.g. to disassemble), download the matching + `RNTesterApp-Fabric--` artifact from the same + pipeline run; its layout matches `symbols/` here. + '@ + Set-Content -LiteralPath "$(CrashDumpRootPath)\README.md" -Value $readme -Encoding utf8 + Write-Host "Wrote $(CrashDumpRootPath)\README.md" + displayName: Bundle symbols and README with crash dumps + condition: and(failed(), eq(variables.StartedFabricTests, 'true')) + continueOnError: true - script: npx jest --clearCache displayName: clear jest cache diff --git a/.ado/prepare-release-bot.yml b/.ado/prepare-release-bot.yml index 8ec0586c128..b556080e064 100644 --- a/.ado/prepare-release-bot.yml +++ b/.ado/prepare-release-bot.yml @@ -62,9 +62,11 @@ jobs: - script: npx --yes midgard-yarn@1.23.34 --ignore-scripts --frozen-lockfile displayName: yarn install + retryCountOnTaskFailure: 2 - script: npx lage build --scope @rnw-scripts/prepare-release --scope @rnw-scripts/beachball-config displayName: Build prepare-release and dependencies + retryCountOnTaskFailure: 2 - ${{ if ne(parameters.targetBranch, '(source branch)') }}: - pwsh: Write-Host "##vso[task.setvariable variable=TargetBranch]${{ parameters.targetBranch }}" diff --git a/.ado/scripts/SetupLocalDumps.cmd b/.ado/scripts/SetupLocalDumps.cmd index b52847d928c..d30962be887 100644 --- a/.ado/scripts/SetupLocalDumps.cmd +++ b/.ado/scripts/SetupLocalDumps.cmd @@ -1,37 +1,57 @@ @echo off -REM SetupLocalDumps.cmd [ExecutableName] [DumpFolder] -REM Ex: .\SetupLocalDumps.cmd RNTesterApp C:\WER\UserDumps +REM SetupLocalDumps.cmd [ExecutableName] [DumpFolder] [DumpType] [DumpCount] +REM Ex: .\SetupLocalDumps.cmd RNTesterApp-Fabric C:\WER\UserDumps +REM Ex: .\SetupLocalDumps.cmd RNTesterApp-Fabric C:\WER\UserDumps 2 5 REM -REM This script sets the registry so that, if an executable of the given name crashes, to -REM prevent any automatic debugger from attaching, and instead save a full crash dump to -REM the given folder. +REM Configures Windows Error Reporting (WER) to save crash dumps for the named +REM executable to the given folder. This is the supported mechanism for +REM packaged/UWP apps where AeDebug-based JIT debuggers (e.g. ProcDump) are +REM not reliably invoked. +REM +REM DumpType: +REM 1 = Custom dump (uses CustomDumpFlags) +REM 2 = Full dump (default) +REM 3 = Mini dump +REM +REM DumpCount: max number of dumps to keep per exe (default 10) -setlocal +setlocal enableextensions -if "%1"=="" ( +if "%~1"=="" ( @echo Must provide an executable name to set up local crash dumps exit /b 1 ) -if "%2"=="" ( +if "%~2"=="" ( @echo Must provide a writable folder to save local crash dumps exit /b 1 ) -set CRASHDUMPS_FOLDER=%2 -@echo Configuring registry to save "%1.exe" crash dumps to "%CRASHDUMPS_FOLDER%"... -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /v DumpFolder /t REG_EXPAND_SZ /d %CRASHDUMPS_FOLDER% -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /v DumpType /t REG_DWORD /d 2 -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /v DumpCount /t REG_DWORD /d 3 -reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v %1.exe /t REG_DWORD /d 1 -if not exist %CRASHDUMPS_FOLDER% ( +set EXE_NAME=%~1 +set CRASHDUMPS_FOLDER=%~2 +set DUMP_TYPE=%~3 +set DUMP_COUNT=%~4 +if "%DUMP_TYPE%"=="" set DUMP_TYPE=2 +if "%DUMP_COUNT%"=="" set DUMP_COUNT=10 + +if not exist "%CRASHDUMPS_FOLDER%" ( @echo Creating %CRASHDUMPS_FOLDER% - md %CRASHDUMPS_FOLDER% + md "%CRASHDUMPS_FOLDER%" ) +set REG_KEY=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%EXE_NAME%.exe +@echo Configuring WER to save "%EXE_NAME%.exe" crash dumps (DumpType=%DUMP_TYPE%, DumpCount=%DUMP_COUNT%) to "%CRASHDUMPS_FOLDER%"... +reg add "%REG_KEY%" /v DumpFolder /t REG_EXPAND_SZ /d "%CRASHDUMPS_FOLDER%" /f +reg add "%REG_KEY%" /v DumpType /t REG_DWORD /d %DUMP_TYPE% /f +reg add "%REG_KEY%" /v DumpCount /t REG_DWORD /d %DUMP_COUNT% /f + +REM Prevent the AeDebug post-mortem debugger from being invoked for this +REM executable so that WER LocalDumps gets first crack and writes to our folder. +reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v %EXE_NAME%.exe /t REG_DWORD /d 1 /f + @echo Registry configuration: -reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\%1.exe" /s -reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" +reg query "%REG_KEY%" /s +reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v %EXE_NAME%.exe endlocal -exit /b %ERRORLEVEL% \ No newline at end of file +exit /b %ERRORLEVEL% diff --git a/.ado/templates/prepare-build-env.yml b/.ado/templates/prepare-build-env.yml index 2e81a4bad40..8e6ea5449c4 100644 --- a/.ado/templates/prepare-build-env.yml +++ b/.ado/templates/prepare-build-env.yml @@ -22,6 +22,13 @@ parameters: # - PullRequest # - Continuous # - Publish + - name: localDumpsExeNames + type: object + default: [] + # List of executable base names (without .exe) to register with WER LocalDumps, + # so that crashes in those processes write a dump to $(CrashDumpRootPath). + # Required for packaged/UWP apps where ProcDump-as-AeDebug is not reliably + # invoked. Example: ['RNTesterApp-Fabric', 'Playground']. steps: # The commit tag in the nuspec requires that we use at least nuget 5.8 (because things break with nuget versions before and Vs 16.8 or later) @@ -44,8 +51,15 @@ steps: displayName: Check and enable Windows Error Reporting - pwsh: | - Write-Host "##vso[task.setvariable variable=CrashDumpRootPath]$(Build.StagingDirectory)\CrashDumps" - New-Item -Path '$(Build.StagingDirectory)\CrashDumps' -ItemType Directory + $path = '$(Build.StagingDirectory)\CrashDumps' + Write-Host "##vso[task.setvariable variable=CrashDumpRootPath]$path" + New-Item -Path $path -ItemType Directory -Force | Out-Null + # Grant full control to NT AUTHORITY\SYSTEM and Users so the WER service + # (running as LocalSystem) and any child process — including packaged + # apps — can write dumps here. Without this, per-exe LocalDumps can + # silently fail on agents that lock down the work directory. + & icacls $path /grant 'SYSTEM:(OI)(CI)F' 'Users:(OI)(CI)F' /T /C | Out-Null + & icacls $path displayName: Set CrashDumpRootPath - pwsh: | @@ -59,4 +73,13 @@ steps: - pwsh: | & $(Build.SourcesDirectory)\.ado\scripts\RunProcDump.ps1 -ProcDumpArgs @("-mm", "-i", "$(CrashDumpRootPath)") -ProcDumpInstallPath "$(ProcDumpPath)" -Verbose displayName: Setup ProcDump as AeDebug - \ No newline at end of file + + # Register WER LocalDumps for any executables the caller cares about. + # This catches crashes in packaged/UWP apps (e.g. RNTesterApp-Fabric) that + # the AeDebug-based ProcDump path does not reliably intercept. Dumps land + # in $(CrashDumpRootPath), which is already wired to the crash-dump artifact + # publisher in upload-build-logs.yml. + - ${{ each exeName in parameters.localDumpsExeNames }}: + - script: | + call "$(Build.SourcesDirectory)\.ado\scripts\SetupLocalDumps.cmd" "${{ exeName }}" "$(CrashDumpRootPath)" + displayName: Register WER LocalDumps for ${{ exeName }}.exe diff --git a/.ado/templates/strict-yarn-install.yml b/.ado/templates/strict-yarn-install.yml index 0faa7454083..98985b46871 100644 --- a/.ado/templates/strict-yarn-install.yml +++ b/.ado/templates/strict-yarn-install.yml @@ -13,3 +13,4 @@ steps: - script: npx --yes midgard-yarn-strict@1.2.4 ${{ parameters.workspace }} displayName: Strict yarn install ${{ parameters.workspace }} + retryCountOnTaskFailure: 2 diff --git a/.ado/templates/yarn-install.yml b/.ado/templates/yarn-install.yml index 74d3d6757dc..b2f3270cea9 100644 --- a/.ado/templates/yarn-install.yml +++ b/.ado/templates/yarn-install.yml @@ -15,9 +15,11 @@ steps: - ${{ if eq(parameters.agentImage, 'ManagedImage') }}: - script: midgard-yarn --ignore-scripts --frozen-lockfile --cwd ${{ parameters.workingDirectory }} displayName: midgard-yarn (faster yarn install) + retryCountOnTaskFailure: 2 # If using an image we don't control, acquire a fixed version of midgard-yarn # before install - ${{ else }}: - script: npx --yes midgard-yarn@1.23.34 --ignore-scripts --frozen-lockfile --cwd ${{ parameters.workingDirectory }} displayName: midgard-yarn (faster yarn install) + retryCountOnTaskFailure: 2 diff --git a/.cspell.json b/.cspell.json index d2973503eb1..9402ff8bb0a 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,7 +1,10 @@ // cSpell Settings { "version": "0.2", - "language": "en", + // American English. The broader "en" accepts both British and American + // spellings; "en-US" flags British forms (synthesised, behaviour, etc.) + // so contributors and AI assistants don't drift away from US conventions. + "language": "en-US", "dictionaryDefinitions": [ { "name": "project-words", diff --git a/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts b/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts index d27af11844f..a8d0a55285b 100644 --- a/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts +++ b/packages/e2e-test-app-fabric/test/AccessibilityTest.test.ts @@ -25,12 +25,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts b/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts index f7b85df5c53..854db2a5e9c 100644 --- a/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/ButtonComponentTest.test.ts @@ -26,6 +26,11 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); if (input === '') { return (await searchBox.getText()) === 'Search...'; @@ -34,8 +39,8 @@ const searchBox = async (input: string) => { } }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts b/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts index 727e622c0fd..b52afe565a3 100644 --- a/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/FlatListComponentTest.test.ts @@ -28,12 +28,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); @@ -43,12 +48,14 @@ const searchBoxBasic = async (input: string) => { const searchBox = await app.findElementByTestID('search_bar_flat_list'); await app.waitUntil( async () => { + // See comment in searchBox above for the clearValue rationale. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts b/packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts new file mode 100644 index 00000000000..163f1ae6c7b --- /dev/null +++ b/packages/e2e-test-app-fabric/test/HangSimulationTest.test.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + * + * @format + */ + +// Test-only: validates the hang-dump capture path of the E2E pipeline. +// +// Auto-skips unless RNW_SIMULATE_HANG=1, which the pipeline only sets when +// `simulateHangForTesting=true` is passed to .ado/jobs/e2e-test.yml. When +// active, asks the app to jam its UI thread via the `HangForTesting` +// automation command; the post-failure ProcDump step in the pipeline then +// captures a full memory dump of the still-alive packaged-app process. + +import {app} from '@react-native-windows/automation'; +import {AutomationClient} from '@react-native-windows/automation-channel'; + +declare const automationClient: AutomationClient | undefined; + +const shouldRun = process.env.RNW_SIMULATE_HANG === '1'; + +(shouldRun ? describe : describe.skip)('Hang Simulation (TEST ONLY)', () => { + test('jams the UI thread until the test times out', async () => { + if (!automationClient) { + throw new Error('RPC client is not enabled'); + } + + // Asks the app to Post a Sleep(INFINITE) onto its UI dispatcher. The + // command itself returns quickly; the UI thread is jammed on the next + // queued work item, so any subsequent UIA query will block. + await automationClient.invoke('HangForTesting', {}); + + // Touch the UI to surface the hang to jest. This call would normally + // return quickly; with the UI thread jammed it blocks until jest's + // testTimeout fires. + const anyElement = await app.findElementByTestID('components-tab'); + await anyElement.waitForDisplayed({timeout: 60000}); + }); +}); + +export {}; diff --git a/packages/e2e-test-app-fabric/test/HomeUIADump.test.ts b/packages/e2e-test-app-fabric/test/HomeUIADump.test.ts deleted file mode 100644 index b34262affd5..00000000000 --- a/packages/e2e-test-app-fabric/test/HomeUIADump.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Copyright (c) Microsoft Corporation. - * Licensed under the MIT License. - * - * @format - */ - -import {app} from '@react-native-windows/automation'; -import {verifyNoErrorLogs} from './Helpers'; -import {dumpVisualTree} from '@react-native-windows/automation-commands'; - -type RNTesterExampleModule = { - title: string; - description: string; -}; - -type RNTesterModuleInfo = { - key: string; - module: RNTesterExampleModule; -}; - -type RNTesterList = { - APIs: RNTesterModuleInfo[]; - Components: RNTesterModuleInfo[]; -}; - -const testerList: RNTesterList = require('@react-native-windows/tester/js/utils/RNTesterList'); - -const apiExamples = testerList.APIs.map(e => e.module.title); -const componentExamples = testerList.Components.map(e => e.module.title); - -afterEach(async () => { - await verifyNoErrorLogs(); -}); - -beforeAll(async () => { - // If window is partially offscreen, tests will fail to click on certain elements - await app.setWindowPosition(0, 0); - await app.setWindowSize(1000, 1250); -}); - -describe('Home UIA Tree Dump', () => { - test('Components Tab', async () => { - const componentsTabButton = await app.findElementByTestID('components-tab'); - await componentsTabButton.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree('components-tab'); - expect(dump).toMatchSnapshot(); - }); - test('APIs Tab', async () => { - const apisTabButton = await app.findElementByTestID('apis-tab'); - await apisTabButton.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree('apis-tab'); - expect(dump).toMatchSnapshot(); - }); - test('Search Bar', async () => { - const component = await app.findElementByTestID('explorer_search'); - await component.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree('explorer_search'); - expect(dump).toMatchSnapshot(); - }); - for (const component of componentExamples) { - test(component, async () => { - const componentsTabButton = await app.findElementByTestID( - 'components-tab', - ); - await componentsTabButton.click(); - const componentTile = await app.findElementByTestID(component); - await componentTile.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree(component); - expect(dump).toMatchSnapshot(); - }); - } - for (const api of apiExamples) { - test(api, async () => { - const apisTabButton = await app.findElementByTestID('apis-tab'); - await apisTabButton.click(); - const apiTile = await app.findElementByTestID(api); - await apiTile.waitForDisplayed({timeout: 20000}); - const dump = await dumpVisualTree(api); - expect(dump).toMatchSnapshot(); - }); - } -}); - -export {}; diff --git a/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts b/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts index 4271a2ab1f5..53ac332fb4b 100644 --- a/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/PointerButtonComponentTest.test.ts @@ -25,6 +25,11 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); if (input === '') { return (await searchBox.getText()) === 'Search...'; @@ -33,8 +38,8 @@ const searchBox = async (input: string) => { } }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts b/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts index 55675930e59..268cfcc964a 100644 --- a/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts +++ b/packages/e2e-test-app-fabric/test/RNTesterNavigation.ts @@ -37,12 +37,17 @@ async function goToExample(example: string) { await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(searchString); return (await searchBox.getText()) === searchString; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts b/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts index 3f40bae68db..21bfd242c55 100644 --- a/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/SwitchComponentTest.test.ts @@ -14,12 +14,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts b/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts index 1894a4bca81..b065057aab0 100644 --- a/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/TextInputComponentTest.test.ts @@ -25,12 +25,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces "onPressInonPressIn" + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts b/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts index ba1f75fbcc4..e17447c4d0e 100644 --- a/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/TouchableComponentTest.test.ts @@ -25,6 +25,11 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); if (input === '') { return (await searchBox.getText()) === 'Search...'; @@ -32,8 +37,8 @@ const searchBox = async (input: string) => { return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts b/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts index 4b6e7574fe6..6c2bd33c6df 100644 --- a/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts +++ b/packages/e2e-test-app-fabric/test/ViewComponentTest.test.ts @@ -25,12 +25,17 @@ const searchBox = async (input: string) => { const searchBox = await app.findElementByTestID('example_search'); await app.waitUntil( async () => { + // Clear before each attempt: WinAppDriver's setValue can fall back to + // synthesized keystrokes for custom RN TextInputs, which append rather + // than replace. Without the clear, a retry produces concatenated text + // and the comparison never converges. + await searchBox.clearValue(); await searchBox.setValue(input); return (await searchBox.getText()) === input; }, { - interval: 1500, - timeout: 5000, + interval: 500, + timeout: 10000, timeoutMsg: `Unable to enter correct search text into test searchbox.`, }, ); diff --git a/packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap b/packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap deleted file mode 100644 index 5a6be1b4c2d..00000000000 --- a/packages/e2e-test-app-fabric/test/__snapshots__/HomeUIADump.test.ts.snap +++ /dev/null @@ -1,6764 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Home UIA Tree Dump APIs Tab 1`] = ` -{ - "Automation Tree": { - "AutomationId": "apis-tab", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "APIs", - "TextRangePattern.GetText": "APIs", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "TestId": "apis-tab", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": {}, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ImageComponentView", - "_Props": { - "Sources": [ - { - "Size": "111, 72", - "Type": "Local", - "Uri": "@react-native-windows/tester/js/assets/bottom-nav-apis-icon-light.png", - }, - ], - }, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(243, 248, 255, 255)", - }, - "Comment": "apis-tab", - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "151, 13, 0", - "Size": "30, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "30, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - { - "Offset": "153, 33, 0", - "Size": "27, 19", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "27, 19", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Accessibility 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Accessibility", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Accessibility Examples of using Accessibility APIs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Accessibility", - "TextRangePattern.GetText": "Accessibility", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of using Accessibility APIs.", - "TextRangePattern.GetText": "Examples of using Accessibility APIs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Accessibility Examples of using Accessibility APIs.", - "TestId": "Accessibility", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Accessibility", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "96, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "96, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Accessibility Windows 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Accessibility Windows", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Accessibility Windows Usage of accessibility properties.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Accessibility Windows", - "TextRangePattern.GetText": "Accessibility Windows", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of accessibility properties.", - "TextRangePattern.GetText": "Usage of accessibility properties.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Accessibility Windows Usage of accessibility properties.", - "TestId": "Accessibility Windows", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Accessibility Windows", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "174, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "174, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump AccessibilityInfo 1`] = ` -{ - "Automation Tree": { - "AutomationId": "AccessibilityInfo", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "AccessibilityInfo Examples of using AccessibilityInfo APIs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "AccessibilityInfo", - "TextRangePattern.GetText": "AccessibilityInfo", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of using AccessibilityInfo APIs.", - "TextRangePattern.GetText": "Examples of using AccessibilityInfo APIs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "AccessibilityInfo Examples of using AccessibilityInfo APIs.", - "TestId": "AccessibilityInfo", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "AccessibilityInfo", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "127, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "127, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ActivityIndicator 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ActivityIndicator", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ActivityIndicator Animated loading indicators.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ActivityIndicator", - "TextRangePattern.GetText": "ActivityIndicator", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Animated loading indicators.", - "TextRangePattern.GetText": "Animated loading indicators.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ActivityIndicator Animated loading indicators.", - "TestId": "ActivityIndicator", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ActivityIndicator", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "129, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "129, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Alerts 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Alerts", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Alerts Alerts display a concise and informative message and prompt the user to make a decision.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Alerts", - "TextRangePattern.GetText": "Alerts", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Alerts display a concise and informative message and prompt the user to make a decision.", - "TextRangePattern.GetText": "Alerts display a concise and informative message and prompt the user to make a decision.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Alerts Alerts display a concise and informative message and prompt the user to make a decision.", - "TestId": "Alerts", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Alerts", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "46, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "46, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Animated - Gratuitous App 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Animated - Gratuitous App", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Animated - Gratuitous App Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Animated - Gratuitous App", - "TextRangePattern.GetText": "Animated - Gratuitous App", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - "TextRangePattern.GetText": "Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Animated - Gratuitous App Bunch of Animations - tap a circle to open a view with more animations, or longPress and drag to reorder circles.", - "TestId": "Animated - Gratuitous App", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Animated - Gratuitous App", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "215, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "215, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Animated 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Animated", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Animated Library designed to make animations fluid, powerful, and painless to build and maintain.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Animated", - "TextRangePattern.GetText": "Animated", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Library designed to make animations fluid, powerful, and painless to build and maintain.", - "TextRangePattern.GetText": "Library designed to make animations fluid, powerful, and painless to build and maintain.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Animated Library designed to make animations fluid, powerful, and painless to build and maintain.", - "TestId": "Animated", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Animated", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "77, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "77, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump AppState 1`] = ` -{ - "Automation Tree": { - "AutomationId": "AppState", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "AppState app background status", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "AppState", - "TextRangePattern.GetText": "AppState", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "app background status", - "TextRangePattern.GetText": "app background status", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "AppState app background status", - "TestId": "AppState", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "AppState", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "73, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "73, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Appearance 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Appearance", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Appearance Light and dark user interface examples.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Appearance", - "TextRangePattern.GetText": "Appearance", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Light and dark user interface examples.", - "TextRangePattern.GetText": "Light and dark user interface examples.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Appearance Light and dark user interface examples.", - "TestId": "Appearance", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Appearance", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Border 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Border", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Border Demonstrates some of the border styles available to Views.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Border", - "TextRangePattern.GetText": "Border", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates some of the border styles available to Views.", - "TextRangePattern.GetText": "Demonstrates some of the border styles available to Views.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Border Demonstrates some of the border styles available to Views.", - "TestId": "Border", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Border", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Button 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Button", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Button Simple React Native button component.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Button", - "TextRangePattern.GetText": "Button", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Simple React Native button component.", - "TextRangePattern.GetText": "Simple React Native button component.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Button Simple React Native button component.", - "TestId": "Button", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Button", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "54, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Components Tab 1`] = ` -{ - "Automation Tree": { - "AutomationId": "components-tab", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Components", - "TextRangePattern.GetText": "Components", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "TestId": "components-tab", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": {}, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ImageComponentView", - "_Props": { - "Sources": [ - { - "Size": "66, 72", - "Type": "Local", - "Uri": "@react-native-windows/tester/js/assets/bottom-nav-components-icon-dark.png", - }, - ], - }, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(243, 248, 255, 255)", - }, - "Comment": "components-tab", - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "333, 65", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "0, 2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, 0, 0", - "Size": "-0, 2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "-0, 0, 0", - "Size": "0, 2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "-0, 2, 0", - "Size": "0, -2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "-0, -0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, -0, 0", - "Size": "-0, 0", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, -0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "0, 2, 0", - "Size": "0, -2", - "Visual Type": "SpriteVisual", - }, - { - "Offset": "156, 14, 0", - "Size": "20, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "20, 20", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - { - "Offset": "126, 34, 0", - "Size": "80, 19", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "80, 19", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Composition Bugs Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Composition Bugs Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Composition Bugs Example See bugs in UI.Composition driven native animations", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Composition Bugs Example", - "TextRangePattern.GetText": "Composition Bugs Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "See bugs in UI.Composition driven native animations", - "TextRangePattern.GetText": "See bugs in UI.Composition driven native animations", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Composition Bugs Example See bugs in UI.Composition driven native animations", - "TestId": "Composition Bugs Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Composition Bugs Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "217, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "217, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ContentURLAndroid 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ContentURLAndroid", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ContentURLAndroid Android specific fetch content:// scheme urls as blob.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ContentURLAndroid", - "TextRangePattern.GetText": "ContentURLAndroid", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Android specific fetch content:// scheme urls as blob.", - "TextRangePattern.GetText": "Android specific fetch content:// scheme urls as blob.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ContentURLAndroid Android specific fetch content:// scheme urls as blob.", - "TestId": "ContentURLAndroid", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ContentURLAndroid", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "160, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "160, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Crash 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Crash", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Crash Crash examples.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Crash", - "TextRangePattern.GetText": "Crash", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Crash examples.", - "TextRangePattern.GetText": "Crash examples.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Crash Crash examples.", - "TestId": "Crash", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Crash", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Custom Native Accessibility Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Custom Native Accessibility Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Custom Native Accessibility Example Sample of a Custom Native Component overriding default accessibility", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Custom Native Accessibility Example", - "TextRangePattern.GetText": "Custom Native Accessibility Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample of a Custom Native Component overriding default accessibility", - "TextRangePattern.GetText": "Sample of a Custom Native Component overriding default accessibility", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Custom Native Accessibility Example Sample of a Custom Native Component overriding default accessibility", - "TestId": "Custom Native Accessibility Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Custom Native Accessibility Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "290, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "290, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Cxx TurboModule 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Cxx TurboModule", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Cxx TurboModule Usage of Cxx TurboModule", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Cxx TurboModule", - "TextRangePattern.GetText": "Cxx TurboModule", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of Cxx TurboModule", - "TextRangePattern.GetText": "Usage of Cxx TurboModule", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Cxx TurboModule Usage of Cxx TurboModule", - "TestId": "Cxx TurboModule", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Cxx TurboModule", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "141, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "141, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump DevSettings 1`] = ` -{ - "Automation Tree": { - "AutomationId": "DevSettings", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "DevSettings Customize the development settings", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "DevSettings", - "TextRangePattern.GetText": "DevSettings", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Customize the development settings", - "TextRangePattern.GetText": "Customize the development settings", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "DevSettings Customize the development settings", - "TestId": "DevSettings", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "DevSettings", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Dimensions 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Dimensions", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Dimensions Dimensions of the viewport", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Dimensions", - "TextRangePattern.GetText": "Dimensions", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Dimensions of the viewport", - "TextRangePattern.GetText": "Dimensions of the viewport", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Dimensions Dimensions of the viewport", - "TestId": "Dimensions", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Dimensions", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "93, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "93, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Display: contents 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Display: contents", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Display: contents Demonstrates various ways display: contents may be used in the tree", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Display: contents", - "TextRangePattern.GetText": "Display: contents", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates various ways display: contents may be used in the tree", - "TextRangePattern.GetText": "Demonstrates various ways display: contents may be used in the tree", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Display: contents Demonstrates various ways display: contents may be used in the tree", - "TestId": "Display: contents", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Display: contents", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Display:none Style 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Display:none Style", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Display:none Style Style prop which will collapse the element in XAML tree.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Display:none Style", - "TextRangePattern.GetText": "Display:none Style", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Style prop which will collapse the element in XAML tree.", - "TextRangePattern.GetText": "Style prop which will collapse the element in XAML tree.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Display:none Style Style prop which will collapse the element in XAML tree.", - "TestId": "Display:none Style", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Display:none Style", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "145, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "145, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Drawing Island Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Drawing Island Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Drawing Island Example Sample Fabric Native Component that contains a custom ContentIsland", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Drawing Island Example", - "TextRangePattern.GetText": "Drawing Island Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Fabric Native Component that contains a custom ContentIsland", - "TextRangePattern.GetText": "Sample Fabric Native Component that contains a custom ContentIsland", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Drawing Island Example Sample Fabric Native Component that contains a custom ContentIsland", - "TestId": "Drawing Island Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Drawing Island Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Fabric Native Component 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Fabric Native Component", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Fabric Native Component Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Fabric Native Component", - "TextRangePattern.GetText": "Fabric Native Component", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - "TextRangePattern.GetText": "Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Fabric Native Component Sample Fabric Native Component that sizes based on max desired size of native XAML contained within", - "TestId": "Fabric Native Component", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Fabric Native Component", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "203, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "203, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Fabric Native Component Yoga 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Fabric Native Component Yoga", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Fabric Native Component Yoga Sample Fabric Native Component that places native XAML inside a container sized by yoga", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Fabric Native Component Yoga", - "TextRangePattern.GetText": "Fabric Native Component Yoga", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Fabric Native Component that places native XAML inside a container sized by yoga", - "TextRangePattern.GetText": "Sample Fabric Native Component that places native XAML inside a container sized by yoga", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Fabric Native Component Yoga Sample Fabric Native Component that places native XAML inside a container sized by yoga", - "TestId": "Fabric Native Component Yoga", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Fabric Native Component Yoga", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "246, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "246, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Fast Path Texts 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Fast Path Texts", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Fast Path Texts Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Fast Path Texts", - "TextRangePattern.GetText": "Fast Path Texts", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - "TextRangePattern.GetText": "Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Fast Path Texts Examples of performant fast path texts, turn on IsTextPerformanceVisualizationEnabled to visualize examples", - "TestId": "Fast Path Texts", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Fast Path Texts", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Filter 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Filter", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Filter A set of graphical effects that can be applied to a view.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Filter", - "TextRangePattern.GetText": "Filter", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "A set of graphical effects that can be applied to a view.", - "TextRangePattern.GetText": "A set of graphical effects that can be applied to a view.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Filter A set of graphical effects that can be applied to a view.", - "TestId": "Filter", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Filter", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "40, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "40, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump FlatList 1`] = ` -{ - "Automation Tree": { - "AutomationId": "FlatList", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "FlatList Performant, scrollable list of data.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "FlatList", - "TextRangePattern.GetText": "FlatList", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Performant, scrollable list of data.", - "TextRangePattern.GetText": "Performant, scrollable list of data.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "FlatList Performant, scrollable list of data.", - "TestId": "FlatList", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "FlatList", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "55, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "55, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Flyout 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Flyout", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Flyout Displays content on top of existing content, within the bounds of the application window.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Flyout", - "TextRangePattern.GetText": "Flyout", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Displays content on top of existing content, within the bounds of the application window.", - "TextRangePattern.GetText": "Displays content on top of existing content, within the bounds of the application window.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Flyout Displays content on top of existing content, within the bounds of the application window.", - "TestId": "Flyout", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Flyout", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "49, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "49, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Glyph UWP 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Glyph UWP", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Glyph UWP Usage of Glyph control.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Glyph UWP", - "TextRangePattern.GetText": "Glyph UWP", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of Glyph control.", - "TextRangePattern.GetText": "Usage of Glyph control.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Glyph UWP Usage of Glyph control.", - "TestId": "Glyph UWP", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Glyph UWP", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "91, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "91, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Image 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Image", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Image Base component for displaying different types of images.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Image", - "TextRangePattern.GetText": "Image", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Base component for displaying different types of images.", - "TextRangePattern.GetText": "Base component for displaying different types of images.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Image Base component for displaying different types of images.", - "TestId": "Image", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Image", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "50, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "50, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard Demonstrates usage of the "Keyboard" static API", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard", - "TextRangePattern.GetText": "Keyboard", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates usage of the "Keyboard" static API", - "TextRangePattern.GetText": "Demonstrates usage of the "Keyboard" static API", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard Demonstrates usage of the "Keyboard" static API", - "TestId": "Keyboard", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard 2`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard Demonstrates usage of the "Keyboard" static API", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard", - "TextRangePattern.GetText": "Keyboard", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates usage of the "Keyboard" static API", - "TextRangePattern.GetText": "Demonstrates usage of the "Keyboard" static API", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard Demonstrates usage of the "Keyboard" static API", - "TestId": "Keyboard", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "76, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard Focus Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard Focus Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard Focus Example Demo of keyboard focus.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard Focus Example", - "TextRangePattern.GetText": "Keyboard Focus Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demo of keyboard focus.", - "TextRangePattern.GetText": "Demo of keyboard focus.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard Focus Example Demo of keyboard focus.", - "TestId": "Keyboard Focus Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard Focus Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Keyboard extension Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Keyboard extension Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Keyboard extension Example Demo of keyboard properties.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Keyboard extension Example", - "TextRangePattern.GetText": "Keyboard extension Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demo of keyboard properties.", - "TextRangePattern.GetText": "Demo of keyboard properties.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Keyboard extension Example Demo of keyboard properties.", - "TestId": "Keyboard extension Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Keyboard extension Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "228, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "228, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Layout - Flexbox 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Layout - Flexbox", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Layout - Flexbox Examples of using the flexbox API to layout views.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Layout - Flexbox", - "TextRangePattern.GetText": "Layout - Flexbox", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples of using the flexbox API to layout views.", - "TextRangePattern.GetText": "Examples of using the flexbox API to layout views.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Layout - Flexbox Examples of using the flexbox API to layout views.", - "TestId": "Layout - Flexbox", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Layout - Flexbox", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "131, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "131, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Layout Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Layout Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Layout Events Examples that show how Layout events can be used to measure view size and position.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Layout Events", - "TextRangePattern.GetText": "Layout Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples that show how Layout events can be used to measure view size and position.", - "TextRangePattern.GetText": "Examples that show how Layout events can be used to measure view size and position.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Layout Events Examples that show how Layout events can be used to measure view size and position.", - "TestId": "Layout Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Layout Events", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Legacy Native Module 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Legacy Native Module", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Legacy Native Module Usage of legacy Native Module", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy Native Module", - "TextRangePattern.GetText": "Legacy Native Module", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of legacy Native Module", - "TextRangePattern.GetText": "Usage of legacy Native Module", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Legacy Native Module Usage of legacy Native Module", - "TestId": "Legacy Native Module", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Legacy Native Module", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyControlStyleTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyControlStyleTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyControlStyleTest Legacy e2e test for Control Styles", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyControlStyleTest", - "TextRangePattern.GetText": "LegacyControlStyleTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for Control Styles", - "TextRangePattern.GetText": "Legacy e2e test for Control Styles", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyControlStyleTest Legacy e2e test for Control Styles", - "TestId": "LegacyControlStyleTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyControlStyleTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "183, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "183, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyImageTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyImageTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyImageTest Legacy e2e test for Image", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyImageTest", - "TextRangePattern.GetText": "LegacyImageTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for Image", - "TextRangePattern.GetText": "Legacy e2e test for Image", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyImageTest Legacy e2e test for Image", - "TestId": "LegacyImageTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyImageTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyLoginTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyLoginTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyLoginTest Legacy e2e test for TextInput with password", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyLoginTest", - "TextRangePattern.GetText": "LegacyLoginTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for TextInput with password", - "TextRangePattern.GetText": "Legacy e2e test for TextInput with password", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyLoginTest Legacy e2e test for TextInput with password", - "TestId": "LegacyLoginTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyLoginTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "130, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "130, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacySelectableTextTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacySelectableTextTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacySelectableTextTest Legacy e2e test for selectable Text hit testing", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacySelectableTextTest", - "TextRangePattern.GetText": "LegacySelectableTextTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for selectable Text hit testing", - "TextRangePattern.GetText": "Legacy e2e test for selectable Text hit testing", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacySelectableTextTest Legacy e2e test for selectable Text hit testing", - "TestId": "LegacySelectableTextTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacySelectableTextTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "198, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyTextHitTestTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyTextHitTestTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyTextHitTestTest Legacy e2e test for Text hit testing", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyTextHitTestTest", - "TextRangePattern.GetText": "LegacyTextHitTestTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for Text hit testing", - "TextRangePattern.GetText": "Legacy e2e test for Text hit testing", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyTextHitTestTest Legacy e2e test for Text hit testing", - "TestId": "LegacyTextHitTestTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyTextHitTestTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "171, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "171, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump LegacyTextInputTest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "LegacyTextInputTest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "LegacyTextInputTest Legacy e2e test for TextInput", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "LegacyTextInputTest", - "TextRangePattern.GetText": "LegacyTextInputTest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Legacy e2e test for TextInput", - "TextRangePattern.GetText": "Legacy e2e test for TextInput", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "LegacyTextInputTest Legacy e2e test for TextInput", - "TestId": "LegacyTextInputTest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "LegacyTextInputTest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Linking 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Linking", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Linking Shows how to use Linking to open URLs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Linking", - "TextRangePattern.GetText": "Linking", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Shows how to use Linking to open URLs.", - "TextRangePattern.GetText": "Shows how to use Linking to open URLs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Linking Shows how to use Linking to open URLs.", - "TestId": "Linking", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Linking", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "58, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "58, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Modal 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Modal", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Modal Component for presenting modal views.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Modal", - "TextRangePattern.GetText": "Modal", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component for presenting modal views.", - "TextRangePattern.GetText": "Component for presenting modal views.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Modal Component for presenting modal views.", - "TestId": "Modal", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Modal", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "51, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "51, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Mouse Click Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Mouse Click Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Mouse Click Events Tests that mouse click events work on intended components", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Mouse Click Events", - "TextRangePattern.GetText": "Mouse Click Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Tests that mouse click events work on intended components", - "TextRangePattern.GetText": "Tests that mouse click events work on intended components", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Mouse Click Events Tests that mouse click events work on intended components", - "TestId": "Mouse Click Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Mouse Click Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "152, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "152, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Mouse Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Mouse Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Mouse Events Tests that mouse events can be observed", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Mouse Events", - "TextRangePattern.GetText": "Mouse Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Tests that mouse events can be observed", - "TextRangePattern.GetText": "Tests that mouse events can be observed", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Mouse Events Tests that mouse events can be observed", - "TestId": "Mouse Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Mouse Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "110, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Moving Light Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Moving Light Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Moving Light Example Sample Custom Fabric Native Component", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Moving Light Example", - "TextRangePattern.GetText": "Moving Light Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Sample Custom Fabric Native Component", - "TextRangePattern.GetText": "Sample Custom Fabric Native Component", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Moving Light Example Sample Custom Fabric Native Component", - "TestId": "Moving Light Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Moving Light Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "177, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Native Animated Example 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Native Animated Example", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Native Animated Example Test out Native Animations", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Native Animated Example", - "TextRangePattern.GetText": "Native Animated Example", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Test out Native Animations", - "TextRangePattern.GetText": "Test out Native Animations", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Native Animated Example Test out Native Animations", - "TestId": "Native Animated Example", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Native Animated Example", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "205, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "205, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump New App Screen 1`] = ` -{ - "Automation Tree": { - "AutomationId": "New App Screen", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "New App Screen Displays the content of the new app screen", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "New App Screen", - "TextRangePattern.GetText": "New App Screen", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Displays the content of the new app screen", - "TextRangePattern.GetText": "Displays the content of the new app screen", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "New App Screen Displays the content of the new app screen", - "TestId": "New App Screen", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "New App Screen", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "132, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "132, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump PanResponder Sample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "PanResponder Sample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "PanResponder Sample Shows the Use of PanResponder to provide basic gesture handling", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "PanResponder Sample", - "TextRangePattern.GetText": "PanResponder Sample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Shows the Use of PanResponder to provide basic gesture handling", - "TextRangePattern.GetText": "Shows the Use of PanResponder to provide basic gesture handling", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "PanResponder Sample Shows the Use of PanResponder to provide basic gesture handling", - "TestId": "PanResponder Sample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "PanResponder Sample", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "178, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "178, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Performance Comparison Examples 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Performance Comparison Examples", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Performance Comparison Examples Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Performance Comparison Examples", - "TextRangePattern.GetText": "Performance Comparison Examples", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - "TextRangePattern.GetText": "Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Performance Comparison Examples Compare performance with bad and good examples. Use React DevTools to highlight re-renders is recommended.", - "TestId": "Performance Comparison Examples", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Performance Comparison Examples", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "280, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "280, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump PixelRatio 1`] = ` -{ - "Automation Tree": { - "AutomationId": "PixelRatio", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "PixelRatio Gives access to device's pixel density and font scale", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "PixelRatio", - "TextRangePattern.GetText": "PixelRatio", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Gives access to device's pixel density and font scale", - "TextRangePattern.GetText": "Gives access to device's pixel density and font scale", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "PixelRatio Gives access to device's pixel density and font scale", - "TestId": "PixelRatio", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "PixelRatio", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "78, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "78, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump PlatformColor 1`] = ` -{ - "Automation Tree": { - "AutomationId": "PlatformColor", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "PlatformColor Examples that show how PlatformColors may be used in an app.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "PlatformColor", - "TextRangePattern.GetText": "PlatformColor", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples that show how PlatformColors may be used in an app.", - "TextRangePattern.GetText": "Examples that show how PlatformColors may be used in an app.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "PlatformColor Examples that show how PlatformColors may be used in an app.", - "TestId": "PlatformColor", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "PlatformColor", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "111, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "111, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Pointer Button 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Pointer Button", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Pointer Button Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Pointer Button", - "TextRangePattern.GetText": "Pointer Button", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - "TextRangePattern.GetText": "Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Pointer Button Tests that PointerEvent.button and PointerEvent.buttons are correctly populated.", - "TestId": "Pointer Button", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Pointer Button", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "115, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Pointer Events 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Pointer Events", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Pointer Events Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Pointer Events", - "TextRangePattern.GetText": "Pointer Events", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - "TextRangePattern.GetText": "Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Pointer Events Demonstrates the use of the pointerEvents prop of a View to control how touches should be handled.", - "TestId": "Pointer Events", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Pointer Events", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "113, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "113, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Popup 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Popup", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Popup Displays content on top of existing content, within the bounds of the application window.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Popup", - "TextRangePattern.GetText": "Popup", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Displays content on top of existing content, within the bounds of the application window.", - "TextRangePattern.GetText": "Displays content on top of existing content, within the bounds of the application window.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Popup Displays content on top of existing content, within the bounds of the application window.", - "TestId": "Popup", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Popup", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Pressable 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Pressable", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Pressable Component for making views pressable.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Pressable", - "TextRangePattern.GetText": "Pressable", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component for making views pressable.", - "TextRangePattern.GetText": "Component for making views pressable.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Pressable Component for making views pressable.", - "TestId": "Pressable", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Pressable", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "75, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "75, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump RTLExample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "RTLExample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "RTLExample Examples to show how to apply components to RTL layout.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "RTLExample", - "TextRangePattern.GetText": "RTLExample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Examples to show how to apply components to RTL layout.", - "TextRangePattern.GetText": "Examples to show how to apply components to RTL layout.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "RTLExample Examples to show how to apply components to RTL layout.", - "TestId": "RTLExample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "RTLExample", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "95, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ScrollView 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ScrollView", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ScrollView Component that enables scrolling through child components", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ScrollView", - "TextRangePattern.GetText": "ScrollView", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component that enables scrolling through child components", - "TextRangePattern.GetText": "Component that enables scrolling through child components", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ScrollView Component that enables scrolling through child components", - "TestId": "ScrollView", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ScrollView", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "82, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "82, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ScrollViewAnimated 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ScrollViewAnimated", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ScrollViewAnimated Component that is animated when ScrollView is offset.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ScrollViewAnimated", - "TextRangePattern.GetText": "ScrollViewAnimated", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component that is animated when ScrollView is offset.", - "TextRangePattern.GetText": "Component that is animated when ScrollView is offset.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ScrollViewAnimated Component that is animated when ScrollView is offset.", - "TestId": "ScrollViewAnimated", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ScrollViewAnimated", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "159, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 16", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump ScrollViewSimpleExample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "ScrollViewSimpleExample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "ScrollViewSimpleExample Component that enables scrolling through child components.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "ScrollViewSimpleExample", - "TextRangePattern.GetText": "ScrollViewSimpleExample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Component that enables scrolling through child components.", - "TextRangePattern.GetText": "Component that enables scrolling through child components.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "ScrollViewSimpleExample Component that enables scrolling through child components.", - "TestId": "ScrollViewSimpleExample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "ScrollViewSimpleExample", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "202, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "202, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Search Bar 1`] = ` -{ - "Automation Tree": { - "AutomationId": "explorer_search", - "ControlType": 50004, - "HelpText": "Search...", - "IsKeyboardFocusable": true, - "LocalizedControlType": "edit", - "Name": "Search...", - "TextRangePattern.GetText": "Search...", - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.WindowsTextInputComponentView", - "_Props": { - "TestId": "explorer_search", - }, - }, - "Visual Tree": { - "Comment": "explorer_search", - "Offset": "0, 0, 0", - "Size": "938, 35", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "0, 0, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "7, 0, 0", - "Size": "924, 1", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "-7, 0, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "-1, 7, 0", - "Size": "1, 21", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "-7, -7, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "7, -1, 0", - "Size": "924, 1", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "0, -7, 0", - "Size": "7, 7", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(60, 60, 67, 45)", - }, - "Offset": "0, 7, 0", - "Size": "1, 21", - "Visual Type": "SpriteVisual", - }, - { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(0, 0, 0, 255)", - }, - "Offset": "0, 0, 0", - "Opacity": 0, - "Size": "0, 0", - "Visual Type": "SpriteVisual", - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump SectionList 1`] = ` -{ - "Automation Tree": { - "AutomationId": "SectionList", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "SectionList Performant, scrollable list of data.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "SectionList", - "TextRangePattern.GetText": "SectionList", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Performant, scrollable list of data.", - "TextRangePattern.GetText": "Performant, scrollable list of data.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "SectionList Performant, scrollable list of data.", - "TestId": "SectionList", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "SectionList", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "86, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "86, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Share 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Share", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Share Share data with other Apps.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Share", - "TextRangePattern.GetText": "Share", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Share data with other Apps.", - "TextRangePattern.GetText": "Share data with other Apps.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Share Share data with other Apps.", - "TestId": "Share", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Share", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "45, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump SwipeableCard 1`] = ` -{ - "Automation Tree": { - "AutomationId": "SwipeableCard", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "SwipeableCard Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "SwipeableCard", - "TextRangePattern.GetText": "SwipeableCard", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - "TextRangePattern.GetText": "Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "SwipeableCard Example of a swipeable card with scrollable content to test PanResponder and JSResponderHandler interaction.", - "TestId": "SwipeableCard", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "SwipeableCard", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "118, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "118, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Switch 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Switch", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Switch Native boolean input", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Switch", - "TextRangePattern.GetText": "Switch", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Native boolean input", - "TextRangePattern.GetText": "Native boolean input", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Switch Native boolean input", - "TestId": "Switch", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Switch", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "52, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Text 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Text", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Text Base component for rendering styled text.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Text", - "TextRangePattern.GetText": "Text", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Base component for rendering styled text.", - "TextRangePattern.GetText": "Base component for rendering styled text.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Text Base component for rendering styled text.", - "TestId": "Text", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Text", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "32, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "32, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TextInput 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TextInput", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TextInput Single and multi-line text inputs.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TextInput", - "TextRangePattern.GetText": "TextInput", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Single and multi-line text inputs.", - "TextRangePattern.GetText": "Single and multi-line text inputs.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TextInput Single and multi-line text inputs.", - "TestId": "TextInput", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TextInput", - "Offset": "0, 0, 0", - "Size": "966, 77", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "74, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "74, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TextInputs with key prop 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TextInputs with key prop", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TextInputs with key prop Periodically render large number of TextInputs with key prop without a Runtime Error", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TextInputs with key prop", - "TextRangePattern.GetText": "TextInputs with key prop", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Periodically render large number of TextInputs with key prop without a Runtime Error", - "TextRangePattern.GetText": "Periodically render large number of TextInputs with key prop without a Runtime Error", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TextInputs with key prop Periodically render large number of TextInputs with key prop without a Runtime Error", - "TestId": "TextInputs with key prop", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TextInputs with key prop", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "195, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "195, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Timers 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Timers", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Timers A demonstration of Timers in React Native.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Timers", - "TextRangePattern.GetText": "Timers", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "A demonstration of Timers in React Native.", - "TextRangePattern.GetText": "A demonstration of Timers in React Native.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Timers A demonstration of Timers in React Native.", - "TestId": "Timers", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Timers", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "53, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "53, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Touchable* and onPress 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Touchable* and onPress", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Touchable* and onPress Touchable and onPress examples.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Touchable* and onPress", - "TextRangePattern.GetText": "Touchable* and onPress", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Touchable and onPress examples.", - "TextRangePattern.GetText": "Touchable and onPress examples.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Touchable* and onPress Touchable and onPress examples.", - "TestId": "Touchable* and onPress", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Touchable* and onPress", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "190, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TransferProperties 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TransferProperties", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TransferProperties Some tests that change the backing XAML element to see if transfer properties is working.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TransferProperties", - "TextRangePattern.GetText": "TransferProperties", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Some tests that change the backing XAML element to see if transfer properties is working.", - "TextRangePattern.GetText": "Some tests that change the backing XAML element to see if transfer properties is working.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TransferProperties Some tests that change the backing XAML element to see if transfer properties is working.", - "TestId": "TransferProperties", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TransferProperties", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "144, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "144, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Transforms 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Transforms", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Transforms View transforms", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Transforms", - "TextRangePattern.GetText": "Transforms", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "View transforms", - "TextRangePattern.GetText": "View transforms", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Transforms View transforms", - "TestId": "Transforms", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Transforms", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "87, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "87, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TransparentHitTestExample 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TransparentHitTestExample", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TransparentHitTestExample Transparent view receiving touch events", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TransparentHitTestExample", - "TextRangePattern.GetText": "TransparentHitTestExample", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Transparent view receiving touch events", - "TextRangePattern.GetText": "Transparent view receiving touch events", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TransparentHitTestExample Transparent view receiving touch events", - "TestId": "TransparentHitTestExample", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TransparentHitTestExample", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "214, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "214, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump TurboModule 1`] = ` -{ - "Automation Tree": { - "AutomationId": "TurboModule", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "TurboModule Usage of TurboModule", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "TurboModule", - "TextRangePattern.GetText": "TurboModule", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Usage of TurboModule", - "TextRangePattern.GetText": "Usage of TurboModule", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "TurboModule Usage of TurboModule", - "TestId": "TurboModule", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "TurboModule", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "109, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "109, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump URL 1`] = ` -{ - "Automation Tree": { - "AutomationId": "URL", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "URL URL Parameters test", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "URL", - "TextRangePattern.GetText": "URL", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "URL Parameters test", - "TextRangePattern.GetText": "URL Parameters test", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "URL URL Parameters test", - "TestId": "URL", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "URL", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "32, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "32, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump View 1`] = ` -{ - "Automation Tree": { - "AutomationId": "View", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "View Basic building block of all UI, examples that demonstrate some of the many styles available.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "View", - "TextRangePattern.GetText": "View", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Basic building block of all UI, examples that demonstrate some of the many styles available.", - "TextRangePattern.GetText": "Basic building block of all UI, examples that demonstrate some of the many styles available.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "View Basic building block of all UI, examples that demonstrate some of the many styles available.", - "TestId": "View", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "View", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "38, 24", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "38, 24", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump WebSocket 1`] = ` -{ - "Automation Tree": { - "AutomationId": "WebSocket", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "WebSocket WebSocket API", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "WebSocket", - "TextRangePattern.GetText": "WebSocket", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "WebSocket API", - "TextRangePattern.GetText": "WebSocket API", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "WebSocket WebSocket API", - "TestId": "WebSocket", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "WebSocket", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "89, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "89, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump XMLHttpRequest 1`] = ` -{ - "Automation Tree": { - "AutomationId": "XMLHttpRequest", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "XMLHttpRequest Example that demonstrates upload and download requests using XMLHttpRequest.", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "XMLHttpRequest", - "TextRangePattern.GetText": "XMLHttpRequest", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Example that demonstrates upload and download requests using XMLHttpRequest.", - "TextRangePattern.GetText": "Example that demonstrates upload and download requests using XMLHttpRequest.", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "XMLHttpRequest Example that demonstrates upload and download requests using XMLHttpRequest.", - "TestId": "XMLHttpRequest", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "XMLHttpRequest", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "135, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; - -exports[`Home UIA Tree Dump Xaml WinUI3 (Experimental, for Fabric) 1`] = ` -{ - "Automation Tree": { - "AutomationId": "Xaml WinUI3 (Experimental, for Fabric)", - "ControlType": 50026, - "IsKeyboardFocusable": true, - "LocalizedControlType": "group", - "Name": "Xaml WinUI3 (Experimental, for Fabric) Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - "__Children": [ - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Xaml WinUI3 (Experimental, for Fabric)", - "TextRangePattern.GetText": "Xaml WinUI3 (Experimental, for Fabric)", - }, - { - "AutomationId": "", - "ControlType": 50020, - "LocalizedControlType": "text", - "Name": "Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - "TextRangePattern.GetText": "Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - }, - ], - }, - "Component Tree": { - "Type": "Microsoft.ReactNative.Composition.ViewComponentView", - "_Props": { - "AccessibilityLabel": "Xaml WinUI3 (Experimental, for Fabric) Requires UseExperimentalWinUI3 - Xaml content that works in Fabric", - "TestId": "Xaml WinUI3 (Experimental, for Fabric)", - }, - "__Children": [ - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - { - "Type": "Microsoft.ReactNative.Composition.ParagraphComponentView", - "_Props": {}, - }, - ], - }, - "Visual Tree": { - "Brush": { - "Brush Type": "ColorBrush", - "Color": "rgba(255, 255, 255, 255)", - }, - "Comment": "Xaml WinUI3 (Experimental, for Fabric)", - "Offset": "0, 0, 0", - "Size": "966, 78", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "16, 16, 0", - "Size": "305, 25", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "305, 25", - "Visual Type": "SpriteVisual", - }, - ], - }, - { - "Offset": "16, 45, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - "__Children": [ - { - "Offset": "0, 0, 0", - "Size": "934, 17", - "Visual Type": "SpriteVisual", - }, - ], - }, - ], - }, -} -`; diff --git a/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp b/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp index 0ded5f28259..953c8714e84 100644 --- a/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp +++ b/packages/e2e-test-app-fabric/windows/RNTesterApp-Fabric/RNTesterApp-Fabric.cpp @@ -5,9 +5,12 @@ #include "RNTesterApp-Fabric.h" #include +#include #include #include "winrt/AutomationChannel.h" +#pragma comment(lib, "dbghelp.lib") + // Includes from sample-custom-component #include @@ -37,6 +40,7 @@ winrt::Microsoft::ReactNative::IReactContext global_reactContext{nullptr}; // Forward declarations of functions included in this code module: winrt::Windows::Data::Json::JsonObject ListErrors(winrt::Windows::Data::Json::JsonValue payload); winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json::JsonValue payload); +winrt::Windows::Data::Json::JsonObject HangForTesting(winrt::Windows::Data::Json::JsonValue payload); winrt::Windows::Foundation::IAsyncAction LoopServer(winrt::AutomationChannel::Server &server); float ScaleFactor(HWND hwnd) noexcept { @@ -120,8 +124,133 @@ winrt::Microsoft::ReactNative::ReactNativeHost CreateReactNativeHost( return host; } +// In-process crash dump writer. Installed as the top-level +// `UnhandledExceptionFilter`, so any unhandled structured exception in the +// app (e.g. access violations) writes a full-memory minidump to a well-known +// folder before the OS tears the process down. This is independent of +// Windows Error Reporting — needed because hosted CI agents route WER through +// a corporate-server policy that silently ignores per-exe LocalDumps. +// +// The dump folder is %ProgramData%\RNW-E2E-Dumps. The pipeline scans that path +// after a failing test run and publishes anything found. +static LONG WINAPI WriteDumpOnUnhandledException(EXCEPTION_POINTERS *pExceptionInfo) { + wchar_t dumpDir[MAX_PATH]; + DWORD len = GetEnvironmentVariableW(L"ProgramData", dumpDir, MAX_PATH); + if (len == 0 || len >= MAX_PATH) { + return EXCEPTION_CONTINUE_SEARCH; + } + if (FAILED(PathCchAppend(dumpDir, MAX_PATH, L"RNW-E2E-Dumps"))) { + return EXCEPTION_CONTINUE_SEARCH; + } + CreateDirectoryW(dumpDir, nullptr); // ignore ERROR_ALREADY_EXISTS + + wchar_t dumpPath[MAX_PATH]; + SYSTEMTIME st; + GetLocalTime(&st); + swprintf_s( + dumpPath, + MAX_PATH, + L"%s\\RNTesterApp-Fabric-%04u%02u%02u-%02u%02u%02u-%u.dmp", + dumpDir, + st.wYear, + st.wMonth, + st.wDay, + st.wHour, + st.wMinute, + st.wSecond, + GetCurrentProcessId()); + + HANDLE hFile = CreateFileW(dumpPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + if (hFile == INVALID_HANDLE_VALUE) { + return EXCEPTION_CONTINUE_SEARCH; + } + + MINIDUMP_EXCEPTION_INFORMATION exInfo{}; + exInfo.ThreadId = GetCurrentThreadId(); + exInfo.ExceptionPointers = pExceptionInfo; + exInfo.ClientPointers = FALSE; + + const MINIDUMP_TYPE dumpType = static_cast( + MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules | + MiniDumpWithProcessThreadData); + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + hFile, + dumpType, + pExceptionInfo ? &exInfo : nullptr, + nullptr, + nullptr); + + FlushFileBuffers(hFile); + CloseHandle(hFile); + + // Let normal processing continue so the process still terminates and any + // downstream handlers (including WER, if it's active) also run. + return EXCEPTION_CONTINUE_SEARCH; +} + +static void InstallInProcessCrashDumpWriter() { + SetUnhandledExceptionFilter(WriteDumpOnUnhandledException); + // Suppress the fault dialog so the process exits promptly after our UEF runs + // — on a hosted agent there is nobody to click a dialog anyway. + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); +} + +// Test-only: if the sentinel file exists, deliberately crash the app on +// startup. Used by the E2E pipeline (see .ado/jobs/e2e-test.yml +// `simulateCrashForTesting` parameter) to re-validate that the in-process +// minidump writer + artifact publish actually produces a usable .dmp. +// File-based trigger because environment variables do not reliably propagate +// through the packaged-app activation flow used by the automation test driver. +static void MaybeSimulateCrashForTesting() { + wchar_t flagPath[MAX_PATH]; + DWORD len = GetEnvironmentVariableW(L"ProgramData", flagPath, MAX_PATH); + if (len == 0 || len >= MAX_PATH) { + return; + } + if (FAILED(PathCchAppend(flagPath, MAX_PATH, L"rnw-e2e-simulate-crash.flag"))) { + return; + } + if (GetFileAttributesW(flagPath) == INVALID_FILE_ATTRIBUTES) { + return; + } + + // Deliberate null-pointer write to trigger an access violation. Volatile so + // the optimizer keeps it. + *reinterpret_cast(nullptr) = 0xC0FFEE; +} + +// Test-only: when invoked over the automation channel, jam the UI thread +// forever. Used by the E2E pipeline (see .ado/jobs/e2e-test.yml +// `simulateHangForTesting` parameter) to validate that the post-failure +// ProcDump capture step actually produces a usable dump of a hung app. +// +// We Post the sleep onto the UI dispatcher rather than blocking inline so the +// channel handler returns a normal response to the test client — that's the +// realistic scenario (the app appears to acknowledge a request, then locks up +// on the next UI-thread work item, exactly like a deadlock in production). +winrt::Windows::Data::Json::JsonObject HangForTesting(winrt::Windows::Data::Json::JsonValue /*payload*/) { + if (global_reactContext) { + global_reactContext.UIDispatcher().Post([]() { ::Sleep(INFINITE); }); + } else { + // Fallback: hang the channel-loop thread itself. Less realistic but still + // produces a hung process that the post-failure ProcDump path can capture. + ::Sleep(INFINITE); + } + return {}; +} + _Use_decl_annotations_ int CALLBACK WinMain(HINSTANCE /* instance */, HINSTANCE, PSTR /* commandLine */, int /* showCmd */) { + // Install our in-process crash handler before anything else can crash. This + // is the primary mechanism for capturing dumps on hosted CI agents, where + // Windows Error Reporting is policy-routed away from local disk. + InstallInProcessCrashDumpWriter(); + + MaybeSimulateCrashForTesting(); + // Initialize WinRT. winrt::init_apartment(winrt::apartment_type::single_threaded); @@ -195,6 +324,7 @@ WinMain(HINSTANCE /* instance */, HINSTANCE, PSTR /* commandLine */, int /* show winrt::AutomationChannel::CommandHandler handler; handler.BindOperation(L"DumpVisualTree", DumpVisualTree); handler.BindOperation(L"ListErrors", ListErrors); + handler.BindOperation(L"HangForTesting", HangForTesting); global_rootView = &rootView; auto server = winrt::AutomationChannel::Server(handler); @@ -802,8 +932,7 @@ winrt::Windows::Data::Json::JsonObject DumpNativeComponentTreeHelper( return visualTree; } -winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json::JsonValue payload) { - winrt::Windows::Data::Json::JsonObject payloadObj = payload.GetObject(); +static winrt::Windows::Data::Json::JsonObject DumpVisualTreeOnce(winrt::Windows::Data::Json::JsonObject payloadObj) { winrt::Windows::Data::Json::JsonObject result; result.Insert(L"Automation Tree", DumpUIATreeHelper(payloadObj)); result.Insert(L"Visual Tree", DumpVisualTreeHelper(payloadObj)); @@ -811,6 +940,34 @@ winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json return result; } +// Dump the visual / automation / component trees up to 3 times and return +// the first dump that matches the next one. If no two consecutive dumps +// agree, return the final attempt as a best-effort. +// +// Why: composition `Visual::Size` is read after Composition's commit has +// already rounded a sub-pixel text-layout result to an integer. Adjacent +// commits can produce different roundings (24 vs 25 for a ~24.5 measurement), +// so a single dump captures whichever frame happens to be live. Two +// consecutive identical dumps indicate the system has reached a stable +// post-layout state for this query. +winrt::Windows::Data::Json::JsonObject DumpVisualTree(winrt::Windows::Data::Json::JsonValue payload) { + winrt::Windows::Data::Json::JsonObject payloadObj = payload.GetObject(); + + constexpr int kMaxAttempts = 3; + constexpr int kSettleDelayMs = 50; + + winrt::Windows::Data::Json::JsonObject prev = DumpVisualTreeOnce(payloadObj); + for (int i = 1; i < kMaxAttempts; ++i) { + ::Sleep(kSettleDelayMs); + auto curr = DumpVisualTreeOnce(payloadObj); + if (prev.Stringify() == curr.Stringify()) { + return curr; + } + prev = curr; + } + return prev; +} + winrt::Windows::Foundation::IAsyncAction LoopServer(winrt::AutomationChannel::Server &server) { while (true) { try {