diff --git a/.gitattributes b/.gitattributes index c2a49aa7..708c168a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -31,3 +31,6 @@ docs/validation/paste-copy/** -text -whitespace # Preserve recorded-test receipts and native capture bytes. docs/validation/recorded-tests/** -text -whitespace + +# Preserve WebView engine evidence bytes, including native XML CRLF. +docs/validation/webview-engine/** -text -whitespace diff --git a/app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt b/app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt index 25ba306b..fd934be7 100644 --- a/app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt +++ b/app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt @@ -245,6 +245,12 @@ class ReviewedTextLifecycleDeviceTest { val command = catalog.running!!.second directRuntime = ExtensionRuntime(it, catalog, extension, command) bridge = directRuntime!!.Bridge() + directRuntime!!.start() + } + // The live control must pass the real engine gate and publish its + // owned fixture before direct host calls acquire execution authority. + awaitInput() + ui { assertTrue(JSONObject(bridge.invokeSync("fs", "writeFile", write(liveFile))).getBoolean("ok")) bridge.render("""{"type":"Detail","id":"live-control","props":{"markdown":"Owned live control"}}""") assertEquals("live-control", catalog.runtimeTree!!.getString("id")) @@ -320,6 +326,10 @@ class ReviewedTextLifecycleDeviceTest { val second = approve(receive("Next owned input"), show = false) ui { directRuntime = ExtensionRuntime(it, catalog, extension, catalog.running!!.second) + directRuntime!!.start() + } + awaitInput("Next owned input") + ui { assertFalse(JSONObject(directRuntime!!.Bridge().invokeSync("fs", "exists", JSONArray().put("/owned-denied-outside").toString())).getBoolean("ok")) } compose.waitForIdle(); rejected(second) diff --git a/app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt b/app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt new file mode 100644 index 00000000..cb0ad3f6 --- /dev/null +++ b/app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt @@ -0,0 +1,370 @@ +package dev.tinycast.android + +import android.content.Context +import android.os.Build +import android.os.SystemClock +import android.webkit.WebView +import androidx.compose.ui.test.* +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.semantics.SemanticsActions +import androidx.compose.ui.text.TextLayoutResult +import dev.tinycast.android.extensions.* +import java.io.File +import org.json.JSONObject +import org.junit.* +import org.junit.Assert.* +import org.junit.Assume.assumeTrue +import org.junit.runner.RunWith + +/** The host owns this disposable API26 fixture; it has no clipboard/network actions. */ +@RunWith(AndroidJUnit4::class) +class WebViewRecoveryDeviceTest { + @get:Rule val compose = createAndroidComposeRule() + @get:Rule val testName = org.junit.rules.TestName() + private val instrumentation get() = InstrumentationRegistry.getInstrumentation() + private val context get() = instrumentation.targetContext + private val device get() = UiDevice.getInstance(instrumentation) + private var prepared = false + private var palette = emptyMap() + private lateinit var extension: InstalledExtension + private val record = JSONObject().put("scope", "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit") + private val evidence get() = File(context.filesDir, "webview-compatibility-evidence") + + @Before fun prepare() { + val args = InstrumentationRegistry.getArguments() + assumeTrue("Use the owned WebView compatibility runner", args.getString("webViewFixture") == "true") + assertTrue(Build.VERSION.SDK_INT in listOf(26, 36)) + val nonce = requireNotNull(args.getString("webViewOwner")) + assertTrue(nonce.matches(Regex("[0-9a-f]{32}"))) + val owner = JSONObject(File(context.filesDir, "webview-compatibility-lease/owner.json").readText()) + assertEquals("webview-compatibility-v1", owner.getString("kind")) + assertEquals(nonce, owner.getString("nonce")) + assertEquals(Build.VERSION.SDK_INT == 26, owner.getBoolean("fresh_disposable_avd")) + val id = owner.getString("extension_id") + assertEquals("webview-engine-$nonce", id) + compose.waitUntil(15000) { !compose.activity.store.loading } + extension = compose.activity.store.extensions.installed.single { it.listing.id == id } + assertEquals("Owned engine fixture", extension.listing.title) + palette = context.getSharedPreferences("palette", Context.MODE_PRIVATE).all.toMap() + prepared = true + val provider = WebView.getCurrentWebViewPackage() + record.put("case", testName.methodName).put("android_api", Build.VERSION.SDK_INT).put("provider", provider?.packageName) + .put("provider_version", provider?.versionName).put("font_scale", context.resources.configuration.fontScale) + .put("fixture_bytecode_scope", "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking") + } + + private fun capture(phase: String) { + compose.waitForIdle() + val frames = java.util.concurrent.CountDownLatch(1) + instrumentation.runOnMainSync { compose.activity.window.decorView.postOnAnimation { + compose.activity.window.decorView.postOnAnimation { frames.countDown() } + } } + assertTrue("Two UI frames", frames.await(5, java.util.concurrent.TimeUnit.SECONDS)) + compose.waitForIdle() + evidence.mkdirs() + testAutomation().clearCacheForTest() + device.dumpWindowHierarchy(File(evidence, "$phase.xml")) + assertTrue(device.takeScreenshot(File(evidence, "$phase.png"))) + File(evidence, "$phase-frame.json").writeText(JSONObject().put("phase", phase) + .put("synchronization", "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26") + .put("api", Build.VERSION.SDK_INT).put("scope", record.getString("scope")).toString(2)) + } + + private fun recoveryTargetsAndText() { + val viewport = compose.onNodeWithTag("extension-engine-problem").fetchSemanticsNode().boundsInRoot + val density = context.resources.displayMetrics.density + for (tag in listOf("extension-engine-settings", "extension-engine-return")) { + val bounds = compose.onNodeWithTag(tag).fetchSemanticsNode().boundsInRoot + assertTrue("Full 48dp recovery target: $tag", bounds.height >= 48 * density - 1 && + bounds.top >= viewport.top - 1 && bounds.bottom <= viewport.bottom + 1 && + bounds.left >= viewport.left - 1 && bounds.right <= viewport.right + 1) + record.append("target_witnesses", org.json.JSONArray().put(tag).put(bounds.width).put(bounds.height)) + } + val body = compose.onNode(hasScrollAction() and hasAnyAncestor(hasTestTag("extension-engine-problem"))) + for (tag in listOf("extension-engine-title", "extension-engine-provider", "extension-engine-explanation", "extension-engine-guidance")) { + val text = compose.onNodeWithTag(tag, useUnmergedTree = true) + text.performScrollTo(); compose.waitForIdle() + val node = text.fetchSemanticsNode(); val layouts = mutableListOf() + assertTrue(requireNotNull(node.config[SemanticsActions.GetTextLayoutResult].action).invoke(layouts)) + val layout = layouts.single() + assertFalse(layout.didOverflowHeight); assertEquals(layout.size.height, node.size.height) + repeat(layout.lineCount) { line -> + assertFalse(layout.isLineEllipsized(line)) + assertTrue(layout.getLineLeft(line) >= -1 && layout.getLineRight(line) <= node.size.width + 1) + var reached = false + for (attempt in 0..30) { + val current = text.fetchSemanticsNode(); val visible = body.fetchSemanticsNode().boundsInRoot + val origin = compose.runOnUiThread { current.layoutInfo.coordinates.localToRoot(Offset.Zero) } + val top = origin.y + layout.getLineTop(line); val bottom = origin.y + layout.getLineBottom(line) + if (top >= visible.top - 1 && bottom <= visible.bottom + 1) { reached = true; break } + val delta = (if (top < visible.top) top - visible.top - 4 else bottom - visible.bottom + 4) + .coerceIn(-visible.height * .4f, visible.height * .4f) + body.performTouchInput { swipe(Offset(centerX, centerY + delta / 2), Offset(centerX, centerY - delta / 2), 250) } + compose.waitForIdle() + } + assertTrue("Full natural line $line of $tag", reached) + } + record.append("text_witnesses", JSONObject().put("tag", tag).put("lines", layout.lineCount).put("all_lines_reached", true)) + } + record.put("text_setup", "Semantic scroll to each paragraph; pointer swipes establish sequential full-line reachability") + capture("engine-content-end") + } + + @Test fun incompatibleEngineShowsNativeRecoveryWithoutDispatch() { + assumeTrue(Build.VERSION.SDK_INT == 26) + val caller = "owned-engine-caller-日本" + compose.activityRule.scenario.onActivity { it.store.reset(); it.store.search(caller) } + val start = SystemClock.uptimeMillis() + compose.activityRule.scenario.onActivity { it.store.openExtension(extension, extension.commands.single { it.name == "index" }) } + compose.waitUntil(25000) { compose.activity.store.extensions.runtimeError != null || + compose.activity.store.extensions.runtimeTree != null } + val catalog = compose.activity.store.extensions + record.put("time_to_result_ms", SystemClock.uptimeMillis() - start).put("runtime_error", catalog.runtimeError) + .put("published_native_tree", catalog.runtimeTree != null) + assertNotNull("The actual legacy engine must report its boundary", catalog.runtimeError) + assertNull("An incompatible engine must not publish the owned command", catalog.runtimeTree) + capture("engine-result") + // Common-harness old-app control reaches the captured late error, then + // fails here. No new application type/method is referenced before it. + compose.onNodeWithTag("extension-engine-problem").assertExists() + compose.onNodeWithTag("extension-engine-provider").assertTextContains(record.getString("provider"), substring = true) + compose.onNodeWithTag("extension-engine-provider").assertTextContains(record.getString("provider_version"), substring = true) + recoveryTargetsAndText() + compose.onNodeWithTag("extension-engine-return").performTouchInput { click(center) } + compose.waitUntil(10000) { compose.activity.store.dialog == null } + assertEquals(caller, compose.activity.store.query) + record.put("caller_query_restored", true).put("passed", true) + capture("returned-caller") + } + + @Test fun incompatibleEngineOpensOnlyActualProviderSettingsAndReturns() { + assumeTrue(Build.VERSION.SDK_INT == 26) + val caller = "engine-settings-caller-日本" + compose.activityRule.scenario.onActivity { it.store.reset(); it.store.search(caller); it.store.openExtension(extension, extension.commands.single { c -> c.name == "index" }) } + compose.waitUntil(15000) { compose.activity.store.extensions.runtimeError != null } + compose.onNodeWithTag("extension-engine-problem").assertExists() + capture("settings-before") + compose.onNodeWithTag("extension-engine-settings").performTouchInput { click(center) } + assertTrue("Explicit touch opens OS settings", device.wait(androidx.test.uiautomator.Until.hasObject( + androidx.test.uiautomator.By.pkg("com.android.settings")), 10000)) + assertEquals("com.android.settings", device.currentPackageName) + record.put("explicit_settings_destination", device.currentPackageName) + capture("settings-destination") + device.pressBack() + compose.waitUntil(10000) { compose.activity.hasWindowFocus() } + compose.onNodeWithTag("extension-engine-return").performTouchInput { click(center) } + compose.waitUntil(10000) { compose.activity.store.dialog == null } + assertEquals(caller, compose.activity.store.query) + record.put("caller_query_restored", true).put("passed", true) + capture("settings-returned") + } + + @Test fun actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax() { + var engine: WebView? = null + fun evaluate(script: String): String? { + var completed = false + var result: String? = null + instrumentation.runOnMainSync { engine!!.evaluateJavascript(script) { result = it; completed = true } } + compose.waitUntil(10000) { completed } + return result + } + try { + instrumentation.runOnMainSync { + engine = WebView(context).apply { settings.javaScriptEnabled = true; loadData("", "text/html", "UTF-8") } + } + compose.waitUntil(10000) { + var complete = false + instrumentation.runOnMainSync { complete = engine?.progress == 100 } + complete + } + val stage = ExtensionEngineProbe.Stage.ADAPTER + val result = ExtensionEngineProbe.decode(evaluate(ExtensionEngineProbe.compileScript(stage, + "window.__ownedProbeExecuted=true;throw new Error('must not execute');")), stage) + assertEquals(ExtensionEngineProbe.Result.Passed, result) + assertEquals("\"undefined\"", evaluate("typeof window.__ownedProbeExecuted")) + assertEquals(ExtensionEngineProbe.Result.Rejected(ExtensionEngineFailure.SYNTAX), + ExtensionEngineProbe.decode(evaluate(ExtensionEngineProbe.compileScript(stage, "function (")), stage)) + val apiResult = ExtensionEngineProbe.decode(evaluate(ExtensionEngineProbe.apiScript()), ExtensionEngineProbe.Stage.APIS) + if (Build.VERSION.SDK_INT == 26) { + assertTrue(apiResult is ExtensionEngineProbe.Result.Rejected && apiResult.failure == ExtensionEngineFailure.MISSING_APIS) + } else assertEquals(ExtensionEngineProbe.Result.Passed, apiResult) + record.put("compile_body_executed", false).put("invalid_syntax_caught", true).put("api_probe_result", apiResult.toString()).put("passed", true) + } finally { instrumentation.runOnMainSync { engine?.destroy() } } + } + + private fun modernCommand(name: String, type: String, row: String, updated: String) { + assumeTrue(Build.VERSION.SDK_INT == 36) + val caller = "modern-$name-caller-日本" + compose.activityRule.scenario.onActivity { it.store.reset(); it.store.search(caller); it.store.openExtension(extension, extension.commands.single { c -> c.name == name }) } + compose.waitUntil(20000) { compose.activity.store.extensions.runtimeTree != null || compose.activity.store.extensions.runtimeError != null } + assertNull(compose.activity.store.extensions.runtimeError) + assertEquals(type, activeRoot(compose.activity.store.extensions.runtimeTree)?.optString("type")) + if (type == "Grid") compose.onNodeWithTag("extension-grid-cell-0").assertTextContains(row, substring = true) + else compose.onNodeWithText(row).assertExists() + capture("$name-ready") + compose.onNodeWithTag("extension-primary").performTouchInput { click(center) } + compose.waitUntil(10000) { compose.activity.store.extensions.runtimeTree?.toString()?.contains(updated) == true } + if (type == "Grid") compose.onNodeWithTag("extension-grid-cell-0").assertTextContains(updated, substring = true) + else compose.onNodeWithText(updated).assertExists() + capture("$name-action") + compose.onNodeWithTag("extension-back").performTouchInput { click(center) } + compose.waitUntil(10000) { compose.activity.store.dialog == null } + assertEquals(caller, compose.activity.store.query) + record.put("live_action_published", true).put("caller_query_restored", true).put("passed", true) + capture("$name-returned") + } + + @Test fun modernEnginePublishesListAndRunsLiveAction() = modernCommand("index", "List", "Owned engine row one", "Owned List action published") + @Test fun modernEnginePublishesGridAndRunsLiveAction() = modernCommand("grid", "Grid", "Owned grid row one", "Owned Grid action published") + + @Test fun closingBeforePreflightFinishesRejectsLatePublication() { + val caller = "cancelled-engine-caller-日本" + compose.activityRule.scenario.onActivity { + it.store.reset(); it.store.search(caller) + it.store.openExtension(extension, extension.commands.single { c -> c.name == "index" }) + val runtime = ExtensionRuntime(it, it.store.extensions, extension, it.store.extensions.running!!.second) + runtime.start() + runtime.close() + it.store.extensions.close(); it.store.dialog = null + } + // Two UI-loop turns plus the bounded startup interval permit a queued + // page callback to arrive; the old owner must stay closed. + val deadline = SystemClock.uptimeMillis() + 1200 + compose.waitUntil(3000) { SystemClock.uptimeMillis() >= deadline } + assertNull(compose.activity.store.extensions.runtimeTree) + assertNull(compose.activity.store.extensions.runtimeError) + assertNull(compose.activity.store.dialog) + assertEquals(caller, compose.activity.store.query) + record.put("closed_owner_remained_inactive", true).put("passed", true) + capture("cancelled-caller") + } + + @Test fun bridgeCannotPublishOrReadHostApisBeforeApproval() { + lateinit var runtime: ExtensionRuntime + lateinit var bridge: ExtensionRuntime.Bridge + var created = false + val file = File(extension.directory, "index.js").canonicalFile + assertTrue("The harmless supported probe targets the existing owned fixture", file.isFile) + val arguments = org.json.JSONArray().put(file.path).toString() + try { + compose.activityRule.scenario.onActivity { activity -> + val catalog = activity.store.extensions + activity.store.reset() + activity.store.openExtension(extension, extension.commands.single { it.name == "index" }) + // This test owns its engine directly; keep Compose from + // constructing another runtime for the same invocation. + activity.store.dialog = null + runtime = ExtensionRuntime(activity, catalog, extension, catalog.running!!.second) + created = true + bridge = runtime.Bridge() + runtime.Bridge().render("{\"type\":\"List\",\"children\":[]}") + val response = JSONObject(bridge.invokeSync("fs", "exists", arguments)) + record.put("supported_probe_operation", "fs.exists").put("owned_probe_file_exists", true) + .put("preflight_response_ok", response.getBoolean("ok")) + assertFalse("Supported fs.exists must remain blocked before approval", response.getBoolean("ok")) + assertNull(catalog.runtimeTree) + runtime.dispatch("not-approved") + record.put("preflight_bridge_render_rejected", true).put("preflight_host_api_rejected", true) + if (Build.VERSION.SDK_INT == 36) runtime.start() + } + if (Build.VERSION.SDK_INT == 36) { + compose.waitUntil(20000) { compose.activity.store.extensions.runtimeError != null || + (runtime.isCurrentInvocation() && compose.activity.store.extensions.runtimeTree != null) } + compose.activityRule.scenario.onActivity { activity -> + assertNull(activity.store.extensions.runtimeError) + assertTrue(runtime.isCurrentInvocation()) + val response = JSONObject(bridge.invokeSync("fs", "exists", arguments)) + record.put("approved_response_ok", response.getBoolean("ok")) + .put("approved_owned_file_exists", response.optBoolean("value")) + assertTrue("The same supported probe succeeds after actual approval", response.getBoolean("ok")) + assertTrue("The same owned fixture still exists", response.getBoolean("value")) + record.put("same_engine_bridge_operation_and_arguments", true) + } + } else record.put("approved_control_scope", "The paired approved control runs on API36; this actual API26 engine cannot pass preflight") + } finally { + compose.activityRule.scenario.onActivity { activity -> + if (created) runtime.close() + activity.store.extensions.close(); activity.store.dialog = null + } + } + compose.waitForIdle() + assertNull(compose.activity.store.extensions.runtimeTree) + record.put("passed", true) + } + + @Test fun replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks() { + assumeTrue(Build.VERSION.SDK_INT == 26) + compose.activityRule.scenario.onActivity { it.store.openExtension(extension, extension.commands.single { c -> c.name == "index" }) } + compose.waitUntil(15000) { compose.activity.store.extensions.runtimeError != null } + val settings = requireNotNull(compose.onNodeWithTag("extension-engine-settings").fetchSemanticsNode().config[SemanticsActions.OnClick].action) + val back = requireNotNull(compose.onNodeWithTag("extension-engine-return").fetchSemanticsNode().config[SemanticsActions.OnClick].action) + val monitor = instrumentation.addMonitor(android.content.IntentFilter(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS), + android.app.Instrumentation.ActivityResult(0, null), true) + try { + compose.activityRule.scenario.onActivity { + val next = extension.commands.single { c -> c.name == "grid" } + it.store.openExtension(extension, next) + // Invoke retained callbacks before Compose disposes the old UI. + settings(); back() + assertEquals("extension-run", it.store.dialog) + assertSame(next, it.store.extensions.running!!.second) + } + compose.waitForIdle() + assertEquals(0, monitor.hits) + record.put("stale_settings_launches", 0).put("replacement_not_closed", true).put("passed", true) + } finally { instrumentation.removeMonitor(monitor) } + } + + @Test fun equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition() { + assumeTrue(Build.VERSION.SDK_INT == 26) + compose.activityRule.scenario.onActivity { it.store.openExtension(extension, extension.commands.single { c -> c.name == "index" }) } + compose.waitUntil(15000) { compose.activity.store.extensions.runtimeEngineProblem != null } + // Keep newer application types out of reflected synthetic method + // signatures so the common old-app case can initialize under JUnit. + val first: Any = requireNotNull(compose.activity.store.extensions.runtimeEngineProblem) + compose.onNodeWithTag("extension-engine-settings").performTouchInput { click(center) } + assertTrue(device.wait(androidx.test.uiautomator.Until.hasObject(androidx.test.uiautomator.By.pkg("com.android.settings")), 10000)) + device.pressBack(); compose.waitUntil(10000) { compose.activity.hasWindowFocus() } + compose.onNodeWithTag("extension-engine-settings").assertIsNotEnabled() + compose.activityRule.scenario.onActivity { + val next = extension.commands.single { c -> c.name == "index" } + it.store.openExtension(extension, next) + val catalog = it.store.extensions + val current = requireNotNull(catalog.running).second + assertEquals("index", current.name) + val owner = catalog.captureText(extension, current).owner + val previous = first as ExtensionEngineProblem + assertTrue(catalog.reportEngineProblem(owner, extension, current, + ExtensionEngineProblem(previous.engine, previous.failure, previous.missingApis))) + } + compose.waitForIdle() + compose.onNodeWithTag("extension-engine-settings").assertIsEnabled() + compose.onNodeWithTag("extension-engine-return").assertIsEnabled() + record.put("second_failure_scope", "Controlled native publication of an equivalent failure before recomposition; first failure used the actual legacy engine") + .put("fresh_recovery_actions", true) + capture("equivalent-failure-ready") + compose.onNodeWithTag("extension-engine-return").performTouchInput { click(center) } + compose.waitUntil(10000) { compose.activity.store.dialog == null } + record.put("passed", true) + } + + @After fun restore() { + if (!prepared) return + try { + if (!record.optBoolean("passed")) capture("failure") + } finally { + compose.activityRule.scenario.onActivity { it.store.extensions.close(); it.store.dialog = null } + compose.waitForIdle() + restorePalettePreferences(context, palette) + assertEquals(palette, context.getSharedPreferences("palette", Context.MODE_PRIVATE).all) + record.put("palette_preferences_restored", true).put("fixture_cleanup_owner", "Host retains ownership until evidence is pulled and registered paths are removed") + evidence.mkdirs() + val case = testName.methodName.replace(Regex("[A-Z]")) { "-${it.value.lowercase()}" } + File(evidence, "case-$case.json").writeText(record.toString(2)) + } + } +} diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt index cfe7a0a8..7f2d7cfb 100644 --- a/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt @@ -81,9 +81,11 @@ class ExtensionCatalog(private val context: Context) { var running by mutableStateOf?>(null) var runtimeTree by mutableStateOf(null) private var runtimeErrorState by mutableStateOf(null) + internal var runtimeEngineProblem by mutableStateOf(null); private set var runtimeError: String? get() = runtimeErrorState set(value) { + runtimeEngineProblem = null if (value != null) revokeReviewedText(preservePasteCopy = true) runtimeErrorState = value } @@ -334,5 +336,17 @@ class ExtensionCatalog(private val context: Context) { reviewedText.invalidate(); commandText = null; preparedText = null preparedCommandLaunch = null; invocationLaunchProperties = ordinaryLaunchProperties(emptyMap()); commandHandoffDepth = 0 } + internal fun reportEngineProblem(owner: Any, extension: InstalledExtension, command: ExtensionCommand, + problem: ExtensionEngineProblem): Boolean { + if (!ownsRuntime(owner, extension, command) || runtimeError != null) return false + val epoch = launchEpoch + // Setting the error revokes input and stops the runtime. The native + // recovery belongs to this failed screen, not to the revoked JS owner. + runtimeError = "The JavaScript engine could not pass the startup check." + if (launchEpoch != epoch || running?.first !== extension || running?.second !== command) return false + runtimeTree = null + runtimeEngineProblem = problem + return true + } fun close() { revokeReviewedText(); running = null; runtimeTree = null; runtimeError = null; runtimeStatus = ""; runtimeReady = false } } diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt new file mode 100644 index 00000000..092d0cef --- /dev/null +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt @@ -0,0 +1,109 @@ +package dev.tinycast.android.extensions + +import org.json.JSONArray +import org.json.JSONObject +import org.json.JSONTokener + +internal data class ExtensionEngineIdentity(val packageName: String?, val version: String?) { + val settingsPackage: String? get() = packageName?.takeIf { + it.length <= 255 && it.matches(Regex("[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)+")) + } + val display: String get() = listOfNotNull(settingsPackage, + version?.filterNot(Char::isISOControl)?.trim()?.take(120)?.takeIf(String::isNotBlank)) + .joinToString(" ").ifBlank { "Provider information unavailable" } +} + +internal enum class ExtensionEngineFailure { SYNTAX, MISSING_APIS, CHECK_UNAVAILABLE, CHECK_TIMED_OUT } +// Each failure owns a fresh recovery lifetime, even when its display values +// equal a preceding failure. Compose must not retain a consumed action slot. +internal class ExtensionEngineProblem(val engine: ExtensionEngineIdentity, val failure: ExtensionEngineFailure, + val missingApis: List = emptyList()) + +/** Only this ordered check can enable host dispatch. An ended check never reopens. */ +internal class ExtensionEngineGate { + private enum class State { NEW, ADAPTER, RUNTIME, APIS, APPROVED, BLOCKED, CLOSED } + @Volatile private var state = State.NEW + val approved: Boolean get() = state == State.APPROVED + val stage: ExtensionEngineProbe.Stage? get() = when (state) { + State.ADAPTER -> ExtensionEngineProbe.Stage.ADAPTER + State.RUNTIME -> ExtensionEngineProbe.Stage.RUNTIME + State.APIS -> ExtensionEngineProbe.Stage.APIS + else -> null + } + @Synchronized fun begin(): Boolean { + if (state != State.NEW) return false + state = State.ADAPTER + return true + } + @Synchronized fun accept(stage: ExtensionEngineProbe.Stage): Boolean { + state = when { + state == State.ADAPTER && stage == ExtensionEngineProbe.Stage.ADAPTER -> State.RUNTIME + state == State.RUNTIME && stage == ExtensionEngineProbe.Stage.RUNTIME -> State.APIS + state == State.APIS && stage == ExtensionEngineProbe.Stage.APIS -> State.APPROVED + else -> return false + } + return true + } + @Synchronized fun block() { if (state != State.CLOSED) state = State.BLOCKED } + @Synchronized fun close() { state = State.CLOSED } +} + +/** Probe wrappers use ES5 syntax. Modern vendor source appears only in escaped strings. */ +internal object ExtensionEngineProbe { + enum class Stage(val wire: String) { ADAPTER("adapter"), RUNTIME("runtime"), APIS("apis") } + sealed interface Result { + data object Passed : Result + data class Rejected(val failure: ExtensionEngineFailure, val missingApis: List = emptyList()) : Result + } + + // Browser primitives used by the bundled adapter/runtime, not desktop APIs + // supplied by the host or browser facilities replaced by the portable runtime. + private val functions = listOf("Map", "Set", "WeakMap", "WeakSet", "Proxy", "Symbol", "Symbol.for", + "Promise", "Promise.all", "Promise.resolve", "Promise.reject", "ArrayBuffer", "Uint8Array", + "Array.from", "Array.isArray", "Array.prototype.includes", "Array.prototype.at", + "Object.assign", "Object.create", "Object.defineProperties", "Object.defineProperty", "Object.entries", + "Object.freeze", "Object.fromEntries", "Object.getOwnPropertyDescriptor", "Object.getOwnPropertyDescriptors", + "Object.getOwnPropertyNames", "Object.getPrototypeOf", "Object.hasOwn", "Object.is", "Object.keys", "Object.setPrototypeOf", + "Reflect.apply", "Reflect.construct", "Reflect.get", "Reflect.getOwnPropertyDescriptor", "Reflect.ownKeys", + "Number.isFinite", "Number.isInteger", "Number.isNaN", "Number.parseInt", "Math.clz32", "Math.trunc", + "String.fromCharCode", "String.fromCodePoint", "String.prototype.includes", "String.prototype.startsWith", "String.prototype.endsWith") + private val contract = functions.associateWith { "function" } + mapOf("globalThis" to "object", "Symbol.iterator" to "symbol") + + private fun literal(value: String) = JSONObject.quote(value).replace("\u2028", "\\u2028").replace("\u2029", "\\u2029") + fun compileScript(stage: Stage, source: String): String { + require(stage != Stage.APIS && source.length <= 1_000_000) + val body = literal(source) + // Constructing the function parses its body; the returned function is + // never invoked. No extension bundle is supplied to this check. + return """(function(){var problem=null;try{new Function($body);}catch(error){problem=error instanceof SyntaxError?'syntax':'unavailable';}return JSON.stringify({v:1,stage:'${stage.wire}',problem:problem,missing:[]});})()""" + } + fun apiScript(): String { + val checks = JSONArray(contract.map { (path, type) -> JSONArray().put(path).put(type) }) + return """(function(){var checks=$checks,missing=[],problem=null;try{for(var i=0;i 8192) return unavailable() + return try { + val outer = JSONTokener(raw) + val text = outer.nextValue() as? String ?: return unavailable() + if (outer.nextClean() != '\u0000') return unavailable() + val inner = JSONTokener(text) + val value = inner.nextValue() as? JSONObject ?: return unavailable() + if (inner.nextClean() != '\u0000') return unavailable() + if (value.keys().asSequence().toSet() != setOf("v", "stage", "problem", "missing") || + value.opt("v") != 1 || value.opt("stage") != expected.wire) return unavailable() + val array = value.opt("missing") as? JSONArray ?: return unavailable() + if (array.length() > contract.size) return unavailable() + val missing = (0 until array.length()).map { array.opt(it) as? String ?: return unavailable() } + if (missing.distinct().size != missing.size || missing.any { it !in contract }) return unavailable() + when (value.opt("problem")) { + JSONObject.NULL -> if (missing.isEmpty()) Result.Passed else unavailable() + "syntax" -> if (expected != Stage.APIS && missing.isEmpty()) Result.Rejected(ExtensionEngineFailure.SYNTAX) else unavailable() + "apis" -> if (expected == Stage.APIS && missing.isNotEmpty()) Result.Rejected(ExtensionEngineFailure.MISSING_APIS, missing) else unavailable() + "unavailable" -> unavailable() + else -> unavailable() + } + } catch (_: Exception) { unavailable() } + } +} diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt new file mode 100644 index 00000000..f4a2e781 --- /dev/null +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt @@ -0,0 +1,102 @@ +package dev.tinycast.android.extensions + +import android.content.ActivityNotFoundException +import android.content.Intent +import android.net.Uri +import android.provider.Settings +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.* +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import dev.tinycast.android.LocalPaletteWide +import dev.tinycast.android.PaletteTheme +import dev.tinycast.android.paletteFooterSurface + +private class EngineRecoveryLifetime { var active = true; var returned = false } + +/** The OS provider identity is the only input to this host-constructed intent. */ +internal fun engineSettingsIntent(engine: ExtensionEngineIdentity): Intent = engine.settingsPackage?.let { + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", it, null)) +} ?: Intent(Settings.ACTION_APPLICATION_SETTINGS) + +@Composable +internal fun ColumnScope.EngineRecovery(catalog: ExtensionCatalog, problem: ExtensionEngineProblem, + isCurrent: () -> Boolean, close: () -> Unit) { + val lifetime = remember(problem) { EngineRecoveryLifetime() } + var settingsOpened by remember(problem) { mutableStateOf(false) } + var settingsError by remember(problem) { mutableStateOf(false) } + val context = LocalContext.current + val window = LocalWindowInfo.current + val view = LocalView.current + val focus = LocalFocusManager.current + val keyboard = LocalSoftwareKeyboardController.current + DisposableEffect(lifetime) { onDispose { lifetime.active = false } } + LaunchedEffect(problem) { + if (window.isWindowFocused && isCurrent()) { focus.clearFocus(force = true); keyboard?.hide() } + } + fun current() = lifetime.active && !lifetime.returned && isCurrent() && + catalog.runtimeError != null && catalog.runtimeEngineProblem === problem && + window.isWindowFocused && view.isAttachedToWindow && view.hasWindowFocus() + val unsupported = problem.failure in setOf(ExtensionEngineFailure.SYNTAX, ExtensionEngineFailure.MISSING_APIS) + Column(Modifier.weight(1f).fillMaxWidth().testTag("extension-engine-problem")) { + Column(Modifier.weight(1f).fillMaxWidth().verticalScroll(rememberScrollState()).padding(24.dp), + verticalArrangement = Arrangement.spacedBy(14.dp)) { + Text(if (unsupported) "WebView update needed" else "Couldn’t check WebView", + fontSize = 18.sp, lineHeight = 26.sp, color = PaletteTheme.ink, + modifier = Modifier.testTag("extension-engine-title")) + Text(problem.engine.display, fontSize = 13.sp, lineHeight = 20.sp, color = PaletteTheme.secondary, + modifier = Modifier.testTag("extension-engine-provider")) + Text(when (problem.failure) { + ExtensionEngineFailure.SYNTAX -> "This WebView cannot parse the bundled JavaScript runtime. The command was not started." + ExtensionEngineFailure.MISSING_APIS -> "This WebView is missing JavaScript features required by the bundled runtime. The command was not started." + ExtensionEngineFailure.CHECK_UNAVAILABLE -> "The startup check did not return a valid result. The command was not started." + ExtensionEngineFailure.CHECK_TIMED_OUT -> "The startup check did not finish in time. The command was not started." + }, fontSize = 14.sp, lineHeight = 22.sp, color = PaletteTheme.secondary, + modifier = Modifier.testTag("extension-engine-explanation")) + if (problem.missingApis.isNotEmpty()) Text("Missing: ${problem.missingApis.joinToString(", ")}", + fontSize = 12.sp, lineHeight = 19.sp, color = PaletteTheme.secondary) + Text("Update Android System WebView or Chrome through your device’s app store. Engine settings shows the provider used here. On older Android versions, an adequate update may be unavailable.", + fontSize = 14.sp, lineHeight = 22.sp, color = PaletteTheme.secondary, + modifier = Modifier.testTag("extension-engine-guidance")) + Text("Return, then run the command again after updating. Any selected text needs a new review.", + fontSize = 14.sp, lineHeight = 22.sp, color = PaletteTheme.secondary) + if (settingsError) Text("Couldn’t open engine settings. Open your device’s Settings app to manage WebView or Chrome.", + color = MaterialTheme.colorScheme.error, fontSize = 14.sp, lineHeight = 22.sp, + modifier = Modifier.testTag("extension-engine-settings-error")) + } + val settings: @Composable (Modifier) -> Unit = { modifier -> + OutlinedButton(onClick = { + if (current() && !settingsOpened) { + settingsOpened = true + try { context.startActivity(engineSettingsIntent(problem.engine)) } + catch (_: ActivityNotFoundException) { settingsOpened = false; settingsError = true } + catch (_: SecurityException) { settingsOpened = false; settingsError = true } + } + }, enabled = current() && !settingsOpened, shape = RoundedCornerShape(10.dp), + modifier = modifier.heightIn(min = 48.dp).testTag("extension-engine-settings")) { + Text("Engine settings", fontSize = 14.sp, lineHeight = 20.sp) + } + } + val back: @Composable (Modifier) -> Unit = { modifier -> + Button(onClick = { if (current()) { lifetime.returned = true; close() } }, enabled = current(), + shape = RoundedCornerShape(10.dp), modifier = modifier.heightIn(min = 48.dp).testTag("extension-engine-return")) { + Text("Return", fontSize = 14.sp, lineHeight = 20.sp) + } + } + if (LocalPaletteWide.current) { + Row(Modifier.fillMaxWidth().paletteFooterSurface().padding(20.dp), horizontalArrangement = Arrangement.spacedBy(12.dp)) { + settings(Modifier.weight(1f)); back(Modifier.weight(1f)) + } + } else { + Column(Modifier.fillMaxWidth().paletteFooterSurface().padding(20.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) { + settings(Modifier.fillMaxWidth()); back(Modifier.fillMaxWidth()) + } + } + } +} diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt index 775710d9..862d021a 100644 --- a/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt @@ -19,6 +19,7 @@ import java.io.ByteArrayInputStream import java.security.MessageDigest import java.security.SecureRandom import java.util.UUID +import kotlin.coroutines.resume import dev.tinycast.android.TextInputProblem import dev.tinycast.android.TextInputRejected @@ -42,6 +43,8 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens private var pendingLaunchAcknowledgement: Any? = null private var acknowledgementTimeout: Runnable? = null private var engineDestroyed = false + private val engineGate = ExtensionEngineGate() + private var engineCheckDeadline: Job? = null val webView = WebView(context).apply { // This is a headless JavaScript engine; visible native controls own input. isFocusable = false; isFocusableInTouchMode = false @@ -68,34 +71,68 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens } } private val runtimeRegistration = catalog.attachRuntime(textContext.owner, extension, command) { + engineGate.close() scope.cancel() if (pendingLaunchAcknowledgement == null) webView.stopLoading() } - init { if (runtimeRegistration == null) scope.cancel() } + init { if (runtimeRegistration == null) { engineGate.close(); scope.cancel() } } private fun active() = !destroyed && scope.isActive && catalog.ownsRuntime(textContext.owner,extension,command) && catalog.runtimeError == null - internal fun isCurrentInvocation(): Boolean = active() - internal fun formFileStorage(): FormFileStorage? = if (active()) FormFileStorage(context.filesDir, extension.listing.id) else null + private fun authorized() = engineGate.approved && active() + internal fun isCurrentInvocation(): Boolean = authorized() + internal fun formFileStorage(): FormFileStorage? = if (authorized()) FormFileStorage(context.filesDir, extension.listing.id) else null private fun fail(message: String) { if (!active()) return + engineGate.block() ready() catalog.runtimeError = message scope.cancel() } + private fun failEngine(failure: ExtensionEngineFailure, missingApis: List = emptyList()) { + if (!active()) return + engineGate.block() + val provider = WebView.getCurrentWebViewPackage() + val problem = ExtensionEngineProblem(ExtensionEngineIdentity(provider?.packageName, provider?.versionName), failure, missingApis) + ready() + catalog.reportEngineProblem(textContext.owner, extension, command, problem) + scope.cancel() + } fun start() { if(started || !active())return started = true + engineCheckDeadline = scope.launch { delay(10000); if (active() && !engineGate.approved) failEngine(ExtensionEngineFailure.CHECK_TIMED_OUT) } watchdog = scope.launch { delay(20000); if (active() && !catalog.runtimeReady) fail("This command did not respond. It may require unsupported desktop APIs.") } webView.loadDataWithBaseURL("https://tinycast.invalid/", "", "text/html", "UTF-8", null) } private fun evaluate(script: String, then: (() -> Unit)? = null) { - if (active()) webView.evaluateJavascript(script) { if (active()) then?.invoke() } + if (authorized()) webView.evaluateJavascript(script) { if (authorized()) then?.invoke() } + } + private suspend fun checkEngine(stage: ExtensionEngineProbe.Stage, script: String): Boolean { + if (!active() || engineGate.stage != stage) return false + val result = try { + val raw = suspendCancellableCoroutine { continuation -> + webView.evaluateJavascript(script) { value -> if (continuation.isActive) continuation.resume(value) } + } + ExtensionEngineProbe.decode(raw, stage) + } catch (cancelled: CancellationException) { throw cancelled } + catch (_: RuntimeException) { ExtensionEngineProbe.Result.Rejected(ExtensionEngineFailure.CHECK_UNAVAILABLE) } + if (!active() || engineGate.stage != stage) return false + return when (result) { + ExtensionEngineProbe.Result.Passed -> engineGate.accept(stage) + is ExtensionEngineProbe.Result.Rejected -> { failEngine(result.failure, result.missingApis); false } + } } private fun boot() { + if (!engineGate.begin()) return scope.launch { - val (adapter, runtime, bundle) = withContext(Dispatchers.IO) { - Triple(context.assets.open("android-runtime.js").bufferedReader().use { it.readText() }, - context.assets.open("RaycastRuntime.generated.js").bufferedReader().use { it.readText() }, File(extension.directory, "${command.name}.js").readText()) + val (adapter, runtime) = withContext(Dispatchers.IO) { + context.assets.open("android-runtime.js").bufferedReader().use { it.readText() } to + context.assets.open("RaycastRuntime.generated.js").bufferedReader().use { it.readText() } } + if (!checkEngine(ExtensionEngineProbe.Stage.ADAPTER, ExtensionEngineProbe.compileScript(ExtensionEngineProbe.Stage.ADAPTER, adapter)) || + !checkEngine(ExtensionEngineProbe.Stage.RUNTIME, ExtensionEngineProbe.compileScript(ExtensionEngineProbe.Stage.RUNTIME, runtime)) || + !checkEngine(ExtensionEngineProbe.Stage.APIS, ExtensionEngineProbe.apiScript())) return@launch + engineCheckDeadline?.cancel() + val bundle = withContext(Dispatchers.IO) { File(extension.directory, "${command.name}.js").readText() } evaluate(adapter) { evaluate(runtime) { val node = JSONObject().put("platform", "android").put("arch", "arm64").put("cwd", support.path).put("homedir", support.path).put("tmpdir", support.path).put("env", JSONObject()) val env = JSONObject().put("extensionName", extension.listing.name).put("commandName", command.name).put("commandMode", command.mode) @@ -107,15 +144,15 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens } } fun dispatch(handle: String?, args: JSONArray = JSONArray()) { - if (active() && !handle.isNullOrBlank()) evaluate("__tinycast.dispatch(${quote(session)},${quote(handle)},${quote(args.toString())})") + if (authorized() && !handle.isNullOrBlank()) evaluate("__tinycast.dispatch(${quote(session)},${quote(handle)},${quote(args.toString())})") } fun dispatchFormFocus(handle: String?, fieldId: String, focused: Boolean, value: Any) { - if (active() && !handle.isNullOrBlank()) evaluate("__androidDispatchFormFocus(${quote(session)},${quote(handle)},${quote(fieldId)},${quote(if (focused) "focus" else "blur")},${quote(JSONArray().put(value).toString())})") + if (authorized() && !handle.isNullOrBlank()) evaluate("__androidDispatchFormFocus(${quote(session)},${quote(handle)},${quote(fieldId)},${quote(if (focused) "focus" else "blur")},${quote(JSONArray().put(value).toString())})") } fun back() { evaluate("__tinycast.popNavigation(${quote(session)})") } fun close() { if (destroyed) return - destroyed = true; catalog.detachRuntime(runtimeRegistration); textContext.input?.let(catalog.reviewedText::release); scope.cancel() + destroyed = true; engineGate.close(); catalog.detachRuntime(runtimeRegistration); textContext.input?.let(catalog.reviewedText::release); scope.cancel() (webView.parent as? android.view.ViewGroup)?.removeView(webView) // Only the acknowledgement may finish in this retired, detached engine. // Its authority was revoked before settlement; the timeout is independent @@ -174,7 +211,7 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens error("Clipboard paste into another app is unavailable on Android. Use Copy result instead in Droidcast.") } private fun quote(s: String) = JSONObject.quote(s) - private fun post(block: () -> Unit) { if (active()) scope.launch { if (active()) block() } } + private fun post(block: () -> Unit) { if (authorized()) scope.launch { if (authorized()) block() } } inner class Bridge { @JavascriptInterface fun render(tree: String) = post { ready(); catalog.runtimeTree = JSONObject(tree); catalog.runtimeStatus = "" } @JavascriptInterface fun failed(message: String) = post { fail(message.take(3000)) } @@ -183,7 +220,7 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens @JavascriptInterface fun log(message: String) = post { if (catalog.runtimeTree == null) catalog.runtimeStatus = message.take(300) } @JavascriptInterface fun invoke(id: String, api: String, method: String, raw: String) { scope.launch { - if(!active())return@launch + if(!authorized())return@launch try { if (api == "system" && method == "launchCommand") { launchCommand(id, raw) @@ -191,7 +228,7 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens } if (api == "clipboard" && method == "paste") rejectPasteWithCopyOffer(raw) val result = asyncCall(api, method, JSONArray(raw)) - if(!active())return@launch + if(!authorized())return@launch val encoded = JSONArray().put(result ?: JSONObject.NULL).toString().drop(1).dropLast(1) evaluate("__tinycast.settle(${quote(id)},true,${quote(encoded)})") } catch (e: CancellationException) { throw e } catch (e: Throwable) { @@ -201,7 +238,7 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens } } @JavascriptInterface fun invokeSync(api: String, method: String, raw: String): String = try { - check(active()) { "This command session has ended" } + check(authorized()) { "This command session has ended" } JSONObject().put("ok", true).put("value", syncCall(api, method, JSONArray(raw)) ?: JSONObject.NULL).toString() } catch (e: Throwable) { post { catalog.releaseText(textContext.owner) } diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt index 3352ba0c..610f64bd 100644 --- a/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt @@ -695,7 +695,9 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman if(pasteCopy!=null){ PasteCopyFallback(catalog,pasteCopy,{ currentChrome() && !store.backupBusy },close) }else if(catalog.runtimeError!=null){ - Column(Modifier.weight(1f).padding(24.dp).verticalScroll(rememberScrollState())){Text("This command stopped",fontSize=17.sp,color=ink);Text(catalog.runtimeError!!,color=muted,fontSize=12.sp,lineHeight=19.sp,modifier=Modifier.padding(top=15.dp).testTag("extension-error"))} + val engineProblem = catalog.runtimeEngineProblem + if (engineProblem != null) EngineRecovery(catalog, engineProblem, { currentChrome() && !store.backupBusy }, close) + else Column(Modifier.weight(1f).padding(24.dp).verticalScroll(rememberScrollState())){Text("This command stopped",fontSize=17.sp,color=ink);Text(catalog.runtimeError!!,color=muted,fontSize=12.sp,lineHeight=19.sp,modifier=Modifier.padding(top=15.dp).testTag("extension-error"))} }else if(root==null){ Column(Modifier.weight(1f).fillMaxWidth().testTag("extension-completion")) { Column(Modifier.weight(1f).fillMaxWidth().verticalScroll(rememberScrollState()).padding(24.dp),verticalArrangement=Arrangement.Center,horizontalAlignment=Alignment.CenterHorizontally){ diff --git a/app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt b/app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt new file mode 100644 index 00000000..83d98ce4 --- /dev/null +++ b/app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt @@ -0,0 +1,81 @@ +package dev.tinycast.android + +import dev.tinycast.android.extensions.* +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class ExtensionEngineCompatibilityTest { + private val adapter = ExtensionEngineProbe.Stage.ADAPTER + private val runtime = ExtensionEngineProbe.Stage.RUNTIME + private val apis = ExtensionEngineProbe.Stage.APIS + private fun wire(stage: ExtensionEngineProbe.Stage, problem: Any = JSONObject.NULL, missing: JSONArray = JSONArray()) = + JSONObject.quote(JSONObject().put("v", 1).put("stage", stage.wire).put("problem", problem).put("missing", missing).toString()) + private fun unavailable(raw: String?, stage: ExtensionEngineProbe.Stage = adapter) = + assertEquals(ExtensionEngineProbe.Result.Rejected(ExtensionEngineFailure.CHECK_UNAVAILABLE), ExtensionEngineProbe.decode(raw, stage)) + + @Test fun noDispatchAuthorityUntilAllOrderedChecksPass() { + val gate = ExtensionEngineGate() + assertFalse(gate.approved) + assertFalse(gate.accept(adapter)) + assertTrue(gate.begin()); assertFalse(gate.begin()) + assertFalse(gate.accept(apis)); assertFalse(gate.approved) + assertTrue(gate.accept(adapter)); assertFalse(gate.accept(adapter)); assertFalse(gate.approved) + assertTrue(gate.accept(runtime)); assertFalse(gate.approved) + assertTrue(gate.accept(apis)); assertTrue(gate.approved) + assertFalse(gate.accept(apis)); assertFalse(gate.begin()) + } + @Test fun cancelledOrRejectedGateCannotBeReopenedByLateCallbacks() { + for (closedAt in 0..3) { + val gate = ExtensionEngineGate(); gate.begin() + listOf(adapter, runtime, apis).take(closedAt).forEach { assertTrue(gate.accept(it)) } + gate.block(); assertFalse(gate.approved) + gate.close(); gate.block() + assertFalse(gate.begin()) + listOf(adapter, runtime, apis).forEach { assertFalse(gate.accept(it)) } + assertFalse(gate.approved) + } + } + @Test fun resultsAreBoundToTheirExactStageAndFailureClass() { + for (stage in listOf(adapter, runtime, apis)) assertEquals(ExtensionEngineProbe.Result.Passed, ExtensionEngineProbe.decode(wire(stage), stage)) + assertEquals(ExtensionEngineProbe.Result.Rejected(ExtensionEngineFailure.SYNTAX), ExtensionEngineProbe.decode(wire(adapter, "syntax"), adapter)) + assertEquals(ExtensionEngineProbe.Result.Rejected(ExtensionEngineFailure.MISSING_APIS, listOf("Object.hasOwn", "Array.prototype.at")), + ExtensionEngineProbe.decode(wire(apis, "apis", JSONArray().put("Object.hasOwn").put("Array.prototype.at")), apis)) + unavailable(wire(runtime), adapter); unavailable(wire(apis, "syntax"), apis) + unavailable(wire(adapter, "apis", JSONArray().put("Map"))) + unavailable(wire(apis, "apis"), apis) + } + @Test fun invalidOrUnboundedBridgeResultsCannotApproveAnEngine() { + for (raw in listOf(null, "null", "{}", "true", "\"\"", "\"not JSON\"", "x".repeat(8193), wire(adapter) + " true")) unavailable(raw) + unavailable(JSONObject.quote("{\"v\":1,\"stage\":\"adapter\",\"problem\":null,\"missing\":[]} false")) + val original = JSONObject("""{"v":1,"stage":"adapter","problem":null,"missing":[]}""") + for (key in listOf("v", "stage", "problem", "missing")) { + val value = JSONObject(original.toString()); value.remove(key); unavailable(JSONObject.quote(value.toString())) + } + for (version in listOf("1", 2, true)) unavailable(JSONObject.quote(JSONObject(original.toString()).put("v", version).toString())) + unavailable(JSONObject.quote(JSONObject(original.toString()).put("extra", true).toString())) + } + @Test fun missingApiResultsContainOnlyDistinctKnownNames() { + for (missing in listOf(JSONArray().put("unknown"), JSONArray().put(7), JSONArray().put("Map").put("Map"))) + unavailable(wire(apis, "apis", missing), apis) + unavailable(wire(apis, JSONObject.NULL, JSONArray().put("Map")), apis) + } + @Test fun compileInputCannotEscapeItsStringOrRunAsPartOfTheProbe() { + val source = "globalThis.called=true;\n'\"\\\u2028\u2029" + val script = ExtensionEngineProbe.compileScript(adapter, source) + assertTrue(script.contains("new Function(")) + assertFalse(script.contains('\u2028')); assertFalse(script.contains('\u2029')) + assertTrue(script.contains("\\u2028")); assertTrue(script.contains("\\u2029")) + assertThrows(IllegalArgumentException::class.java) { ExtensionEngineProbe.compileScript(apis, "") } + assertThrows(IllegalArgumentException::class.java) { ExtensionEngineProbe.compileScript(adapter, "x".repeat(1_000_001)) } + } + @Test fun providerIdentityNeverAcceptsAnIntentOrDisplaysControlCharacters() { + assertEquals("com.google.android.webview", ExtensionEngineIdentity("com.google.android.webview", "58.0.3029.125").settingsPackage) + for (pkg in listOf("https://evil.test", "com.chrome/Activity", "com.chrome?x=1", "package:com.chrome", "com. chrome", "")) + assertNull(ExtensionEngineIdentity(pkg, null).settingsPackage) + assertEquals("58.0", ExtensionEngineIdentity(null, "\n58.0\u0000").display) + assertEquals("Provider information unavailable", ExtensionEngineIdentity(null, null).display) + assertTrue(ExtensionEngineIdentity(null, "x".repeat(500)).display.length <= 120) + } +} diff --git a/docs/PARITY-TRACKER.md b/docs/PARITY-TRACKER.md index 873119d4..d66bbbb3 100644 --- a/docs/PARITY-TRACKER.md +++ b/docs/PARITY-TRACKER.md @@ -198,3 +198,11 @@ PR #106's first correctness audit found one P2 in the historical Weather identit The fresh PR #106 UX audit found three P3 issues: a fallback plus in Clear search, an empty message that did not distinguish installed commands from other-source history, and cached Weather XML bounds. The close glyph and qualified text are corrected. Fresh capture code clears the node cache and validates Weather XML against current Compose bounds before/after the dump. The frozen 2f7a3edf app / 975ba30e harness has 44 native positives across six whole profiles /116 restoration checks, with four common-harness old-app negatives /zero passes /38 checks. The earlier uncalibrated pixel probe remains a failed11/12 cohort, and its old controls receive no final-control credit. Prior28/34 results retain their own source/APK identities; earlier XML is explicitly potentially stale. Unchanged-source JVM336/Python118-per-mode/provenance results are retained; both final build variants and fresh lint0 errors/56warnings pass. Fresh exact-head CI, both independent sol/high audits and expected-head merge remain gates. These viewer tests certify no new command execution or broad compatibility. + + +Recorded tests #105 merged in [PR #106](https://github.com/moikdev/droidcast/pull/106) as `8ff8f4d032ee351626fbfcbd6d5998e32e9577b4`, closing #105. Both new independent full-change gpt-6.1-sol/high audits cleared `6ccb1e29`; root verified exact-head hosted Android run41944911428 and local/android58106906644 success, expected merge parents and identical tree `0f89f6fa455f5ead019690e5c54b1bb1b5a6360b`. The watch is stopped. Final viewer credit is 44 executions / six whole cohorts / 116 restoration checks, with four separate intended negatives / zero passes / 38 checks; the 99 raw sets and all historical/source/APK identities remain bounded in the report. This adds no new command-execution or whole-Store credit. + +The active [#68](https://github.com/moikdev/droidcast/issues/68) slice now checks the actual engine before evaluating extension assets and provides explicit native settings/Return recovery. The final `fec0a4bf` runtime has **29 positive executions / nine complete cohorts / 133 successful cohort restoration checks** across actual API26/WebView58 rejection, modern List/Grid actions, 100%/200% recovery, caller/input lifecycle, handoff and paste regressions. One common-harness old-app control has zero passes / one intended missing-recovery failure / ten restoration checks. [The report](WEBVIEW-ENGINE-RECOVERY.md) binds 62 actual capture sets, three distinct credited instrumentation APKs, all 245 frozen source inputs, JVM343, Python124/mode, both build variants and lint0 errors/56 warnings each. Earlier failed cohorts, JUnit initialization failure and separate recoveries remain excluded. Existing asset/notice bytes are unchanged; modern runs restore all573 original files/evidence and both original APKs. Exact-head hosted CI, both independent sol/high audits and expected-head merge remain pending. This is engine rejection/recovery, without Android8 execution parity. Native input #69, broader readability/accessibility #71/#20, the remaining20 historical-catalog declarations, #89 and production signing/migration remain separate. No project rename or migration is performed. + + +PR #107's first independent correctness audit found a P2 in the synchronous preflight test: an unsupported operation could mask loss of its approval guard. The strengthened owned `fs.exists` case records rejection before startup and successful same-runtime/bridge/argument execution after actual API36 approval. Refreshed complete legacy7/modern5 cohorts replace the two affected originals, preserving **29 current positives / nine cohorts /133 checks**. A separate single-guard mutant demonstrates an insensitive old-test pass versus the strengthened test's intended failure; both controls restore original data/APKs with thirty checks. The mutant and the retained failed positive-only runner receipt earn no candidate credit. The candidate app/production sources remain unchanged. [The repair checkpoint](validation/webview-engine/audit-repair/checkpoint.json) preserves the immutable first checkpoint, sixteen fresh capture sets and explicit source/APK/calibration boundaries. Both fresh exact-head independent sol/high audits, hosted CI and an expected-head merge remain required. diff --git a/docs/WEBVIEW-ENGINE-RECOVERY.md b/docs/WEBVIEW-ENGINE-RECOVERY.md new file mode 100644 index 00000000..c491e1f6 --- /dev/null +++ b/docs/WEBVIEW-ENGINE-RECOVERY.md @@ -0,0 +1,72 @@ +# WebView startup checks and native recovery + +Issue #68 concerns the engine that runs extensions. Droidcast now checks that engine before evaluating the unchanged Android adapter, shared runtime, or extension command. A failed check shows the actual loaded provider/version, update guidance, explicit **Engine settings**, and **Return**. Android 8 extension execution remains partial. + +The check uses ES5 wrappers. It constructs, but never invokes, functions containing each bundled runtime asset, then checks the browser primitives the assets require. Parser rejection, missing APIs, invalid responses, and a ten-second startup-check deadline have distinct native explanations. The ordered gate permits host calls, publications, navigation and action dispatch only after all three checks pass. Closing or replacing an invocation permanently closes its gate. The bounded acknowledgement for an already committed command handoff retains its existing separate authority. + +Engine settings uses a host-constructed Android app-details intent for the OS-reported provider. It opens only after a current, focused native button action. No extension value supplies the destination. Return preserves the caller query; failure revokes reviewed input, so a later attempt requires another explicit review. Each failure owns a fresh recovery lifetime, including equivalent failures published before recomposition. The body scrolls independently of reserved recovery buttons. + +## Validation boundary + +The owned Android 8 emulator uses API26, the ARM64 Google APIs image **revision 1**, physical **1080×1920 / 420 dpi**, and **com.google.android.webview 58.0.3029.125**. This is a new reproduction, separate from the revision-3 observation in the original issue. The dedicated modern emulator uses API36 and **com.google.android.webview 133.0.6943.137**, with tablet, phone and short-landscape viewports. + +Before the repair, the legacy engine reaches `ReferenceError: __tinycast is not defined` without publishing its List. The new parser check catches the adapter incompatibility before asset evaluation. A separate real-engine probe confirms that parsing does not execute its supplied body, catches deliberately invalid syntax, and observes missing `Array.prototype.at`, `Object.fromEntries`, `Object.hasOwn`, and `globalThis` on WebView 58. Modern-engine checks and owned List/Grid local-state actions exercise the approved path. + +The final runtime records **29 positive executions across nine complete cohorts**, with **133 successful cohort restoration checks**. The common-harness old-app control records **one intended missing-recovery failure, zero passes, and ten successful restoration checks**. The shared regression wrapper separately verifies four preservation/release outcomes. [The repaired matrix](validation/webview-engine/audit-repair/matrix.json) binds every cohort to its actual APK pair. + +| Cohort | Positive cases | Scope | +| --- | ---: | --- | +| API26 / 100% | 7 | Actual rejection/settings/return, ES5 probe, preflight denial, cancellation, stale callbacks and independent failure lifetimes | +| API26 / 200% | 2 | Natural recovery text, complete touch targets, provider settings and caller return | +| API36 tablet / 100% | 5 | List/Grid local-state actions, actual probe, supported filesystem denial/approved control, and cancellation | +| API36 phone / 200% | 2 | List/Grid action publication and explicit touch Back | +| API36 short landscape / 200% | 2 | List/Grid functional smoke and explicit touch Back | +| Reviewed input / lifecycle | 5 | Real frozen JSON workflow, cancellation, stale host calls, input release and no-view completion | +| Command handoff | 2 | Context/arguments/fallback/exact Copy and parent revocation before child composition | +| Explicit paste fallback | 2 | Exact single Copy and cancellation without Copy | +| Common legacy supplement | 2 | Same-APK positive counterpart and equivalent-failure lifetime after the reflection-only harness correction | + +The app is source `fec0a4bf1155c08c141606f92ae8fb1feab4bba0`, SHA256 `ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71`. The refreshed seven-case legacy and five-case modern tablet cohorts use source `29a0a5a1` / test APK `1e450e76…66f13`. Retained modern enlarged/regression cohorts use `302f5e3a` / `906bc489…49a9c`; the retained enlarged legacy pair uses `5ff271ab` / `40edc44f…83747`; the common UI supplement uses `0328732e` / `29f7f69d…d163e`. These are four distinct instrumentation binaries. The [strengthened identity](validation/webview-engine/audit-repair/identity.json) binds all 245 current frozen inputs. The full [modern](validation/webview-engine/identities/candidate-v4.json), [legacy](validation/webview-engine/identities/candidate-v5.json) and [common](validation/webview-engine/identities/candidate-v6.json) identities retain their source boundaries. No stamp-only APK equivalence is inferred. + +Recorded host checks pass **343 JVM cases**, **124 Python cases per normal/optimized mode**, debug/test and benchmark/test builds, and lint **0 errors / 56 warnings per variant**. The final AndroidTest harness compiles in both variants. JVM results remain bound to the unchanged final production/JVM sources; they are not a final-document-head rerun. Benchmark device execution is untested. The immutable [original checkpoint](validation/webview-engine/checkpoint.json) retains its 320 files and 62 capture sets. The [repair checkpoint](validation/webview-engine/audit-repair/checkpoint.json) adds 93 files and sixteen actual sets, including the counterfactual failure capture; all 119 XML reports parse. Its matrix substitutes the two newly completed whole cohorts and retains unaffected observations at their original identities. Current modern cohorts restore all **573 pre-existing files/evidence** and both original APKs. Private originals and cross-boot recovery are not publicly certified. + +Before and after below use the same final common instrumentation, the same ES5 fixture, physical API26 geometry, 100% text and actual WebView58. The old app is the retained `2f7a3edf` binary (`b0fa0e30…535e54`); the repaired app is the final runtime above. + +| Before: late runtime error | After: native engine recovery | +| --- | --- | +| ![Old app: undefined runtime, no provider guidance](screenshots/webview-engine/legacy-common-negative/engine-result.png) | ![Repaired app: actual provider, guidance, settings and Return](screenshots/webview-engine/legacy-common-positive/engine-result.png) | + +| Explicit settings destination | 200% recovery content after scrolling | Modern Grid local-state action | +| --- | --- | --- | +| ![Actual provider app-info screen reached by touch](screenshots/webview-engine/legacy100/settings-destination.png) | ![Large text with reserved recovery controls](screenshots/webview-engine/legacy200/engine-content-end.png) | ![Owned Grid action published on WebView133](screenshots/webview-engine/modern-tablet100/grid-action.png) | + +The enlarged recovery checks measure full 48 dp targets and natural, non-ellipsized title/provider/explanation/guidance lines. Semantic paragraph positioning is setup; subsequent pointer swipes witness full lines sequentially. Captures wait for Compose idle and two UI frames, then write native XML before PNG. API26 XML bounds are not credited as independent visibility witnesses. Modern List/Grid enlarged cases are functional smoke, not comprehensive typography or accessibility certification. + +The guarded runner owns only its nonce-scoped fixture paths. On the fresh legacy emulator it verifies and restores the original absence of both packages. On the modern emulator it preserves installed files/evidence and both original APKs. Recovery inputs remain private. The app lease is retained through restoration and verification; modern release is the final device operation, and legacy release occurs when PackageManager removes the owned app. + +## Supported host-API approval proof + +The first correctness audit at `b417d94` found that `localStorage.getItem` was unsupported by the synchronous bridge. Its rejection could therefore mask a missing approval check. The two earlier passing cohorts remain historical; their old `preflight_host_api_rejected` fields are not independent evidence of synchronous gate enforcement. + +The strengthened case uses supported `fs.exists` on the existing owned `index.js`. Before startup, the response has `ok=false`. On API36, the same runtime, bridge, operation and argument string then pass actual preflight and publish the owned tree; the response becomes `ok=true, value=true`. API26 records only the rejection because its real engine cannot pass preflight. The complete refreshed cohorts pass **7/7 legacy and 5/5 modern cases**, with all **25 restoration checks**. They replace the two affected whole cohorts in current credit, keeping the total at 29 positives. + +A separate, synthetic APK changes exactly the synchronous bridge guard from `authorized()` to `active()` and uses an explicit `local` build stamp. On that **same exact mutant APK**, the old test passes, while the strengthened test fails its intended “Supported fs.exists must remain blocked before approval” assertion with a captured `preflight_response_ok=true`. Both controls restore all 573 original files/evidence and both APKs, with **30 passing restoration checks**. The new test's positive-only runner receipt remains failed; the [separate calibration wrapper](validation/webview-engine/audit-repair/mutation-calibration.json) classifies the intended negative without rewriting it. Neither mutant result earns candidate credit. + +The temporary source mutation was restored byte-for-byte. The candidate remains the original `ae03c859…4ec71` APK. An unused post-control rebuild has a different raw APK hash while every uncompressed entry equals the candidate; no raw binary equivalence or device execution is inferred from that rebuild. Both final-harness variants compile and lint successfully. The initial repair-harness local-property-reference compile failure remains failed and unexecuted. + +## Retained failures + +- The first old-app observation has zero passes/one intended missing-recovery failure. Its outer runner failed because API26 could not execute the `test` utility through `run-as`; a separate recovery preserved the raw evidence and restored package absence. That outer run remains failed. +- Initial SDK/package-inventory preflights executed zero native tests. A later fresh-install setup failed before instrumentation because the app had no `files` directory. Separate recovery restored package absence; the run remains failed. +- The first candidate's legacy 3/4 and modern 2/4 cohorts remain failed. The probe queried WebView progress on the instrumentation thread; the Grid assertion matched both cell and footer. The modern outer restoration also detected AndroidX's changed `profileInstalled` marker. A separate recovery restored that marker, all 573 original files, and both APKs. +- The first enlarged legacy cohort passed two native cases but failed raw font restoration when Android26 materialized its default row. Separate recovery established eight stable observations of the original absent setting and restored package absence. The runner now requires the original raw setting to settle, without treating an effective default as exact restoration. +- The first enlarged modern phone cohort passed both action publications but failed its two return assertions: the system Back key hid the IME first. The corrected protocol touches the visible native Back control. This is a test-protocol correction, with no app-repair credit. +- Earlier runtime candidates, harnesses and diagnostic builds remain distinct. An unused build with an incorrect source stamp was never installed or executed. +- The first final-runtime seven-case cohort remained **6/7 failed**: its controlled equivalent-failure publication supplied an equal but noncurrent command object. The corrected setup uses the catalog's actual current object. The following complete seven-case cohort passes; this earns no additional app-repair claim. +- The first common-control harness failed JUnit initialization because a synthetic method signature referenced a newer application type. It executed no actual test case and is excluded. The final harness captures that value as `Any`, casts within the controlled method body, and reaches the intended old-app missing-recovery assertion. The same APK passes its current-app counterparts. + +## Limits + +Readable rejection does not provide Android 8 extension execution, full Raycast/Fetch compatibility, security certification, production signing, or an engine update. No updated API26 provider, maintained embedded engine, physical/OEM device, TalkBack, or whole-Store matrix is certified. The owned List/Grid fixtures update local React state; their smoke results are not Store-command compatibility results. The equivalent-failure supplement includes a labeled controlled native publication. Timeout and settings-launch-exception handling are source covered without induced device failures. Selected-input, completion, handoff and paste regression observations retain their individual scopes. Issues #7, #69, #71 and #89 remain separate and open. + +All existing asset and notice bytes remain unchanged, including the recorded-workflow catalog. The original WebView diagnostic test is preserved unchanged. Hosted Android CI, local checks and the two independent sol/high audits are separate merge gates. diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/cancelled-caller.png b/docs/screenshots/webview-engine/audit-repair/legacy100/cancelled-caller.png new file mode 100644 index 00000000..8f87c707 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/cancelled-caller.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/engine-content-end.png b/docs/screenshots/webview-engine/audit-repair/legacy100/engine-content-end.png new file mode 100644 index 00000000..9838c46f Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/engine-content-end.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/engine-result.png b/docs/screenshots/webview-engine/audit-repair/legacy100/engine-result.png new file mode 100644 index 00000000..9838c46f Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/engine-result.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/equivalent-failure-ready.png b/docs/screenshots/webview-engine/audit-repair/legacy100/equivalent-failure-ready.png new file mode 100644 index 00000000..ef48fd1f Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/equivalent-failure-ready.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/returned-caller.png b/docs/screenshots/webview-engine/audit-repair/legacy100/returned-caller.png new file mode 100644 index 00000000..1e7c1155 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/returned-caller.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/settings-before.png b/docs/screenshots/webview-engine/audit-repair/legacy100/settings-before.png new file mode 100644 index 00000000..9838c46f Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/settings-before.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/settings-destination.png b/docs/screenshots/webview-engine/audit-repair/legacy100/settings-destination.png new file mode 100644 index 00000000..3883c4f1 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/settings-destination.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/legacy100/settings-returned.png b/docs/screenshots/webview-engine/audit-repair/legacy100/settings-returned.png new file mode 100644 index 00000000..bc044ca4 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/legacy100/settings-returned.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/cancelled-caller.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/cancelled-caller.png new file mode 100644 index 00000000..59b05d62 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/cancelled-caller.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-action.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-action.png new file mode 100644 index 00000000..58cbcdc6 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-action.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-ready.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-ready.png new file mode 100644 index 00000000..f674bbba Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-ready.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-returned.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-returned.png new file mode 100644 index 00000000..71baaf51 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-returned.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-action.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-action.png new file mode 100644 index 00000000..012b6e22 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-action.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-ready.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-ready.png new file mode 100644 index 00000000..34f18c54 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-ready.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-returned.png b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-returned.png new file mode 100644 index 00000000..2b948ee3 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-returned.png differ diff --git a/docs/screenshots/webview-engine/audit-repair/mutant-new-sensitive/failure.png b/docs/screenshots/webview-engine/audit-repair/mutant-new-sensitive/failure.png new file mode 100644 index 00000000..6d3e1f88 Binary files /dev/null and b/docs/screenshots/webview-engine/audit-repair/mutant-new-sensitive/failure.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png b/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png new file mode 100644 index 00000000..744e451b Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png b/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png new file mode 100644 index 00000000..59cc97b6 Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png b/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png new file mode 100644 index 00000000..b900b4a4 Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png new file mode 100644 index 00000000..736c2068 Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..ee683a16 Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png new file mode 100644 index 00000000..11e5fbec Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png differ diff --git a/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png new file mode 100644 index 00000000..c39f2609 Binary files /dev/null and b/docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png differ diff --git a/docs/screenshots/webview-engine/legacy-common-negative/engine-result.png b/docs/screenshots/webview-engine/legacy-common-negative/engine-result.png new file mode 100644 index 00000000..48f26057 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy-common-negative/engine-result.png differ diff --git a/docs/screenshots/webview-engine/legacy-common-negative/failure.png b/docs/screenshots/webview-engine/legacy-common-negative/failure.png new file mode 100644 index 00000000..48f26057 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy-common-negative/failure.png differ diff --git a/docs/screenshots/webview-engine/legacy-common-positive/engine-content-end.png b/docs/screenshots/webview-engine/legacy-common-positive/engine-content-end.png new file mode 100644 index 00000000..01003956 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy-common-positive/engine-content-end.png differ diff --git a/docs/screenshots/webview-engine/legacy-common-positive/engine-result.png b/docs/screenshots/webview-engine/legacy-common-positive/engine-result.png new file mode 100644 index 00000000..01003956 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy-common-positive/engine-result.png differ diff --git a/docs/screenshots/webview-engine/legacy-common-positive/equivalent-failure-ready.png b/docs/screenshots/webview-engine/legacy-common-positive/equivalent-failure-ready.png new file mode 100644 index 00000000..f5844c91 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy-common-positive/equivalent-failure-ready.png differ diff --git a/docs/screenshots/webview-engine/legacy-common-positive/returned-caller.png b/docs/screenshots/webview-engine/legacy-common-positive/returned-caller.png new file mode 100644 index 00000000..8c1098f5 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy-common-positive/returned-caller.png differ diff --git a/docs/screenshots/webview-engine/legacy100/cancelled-caller.png b/docs/screenshots/webview-engine/legacy100/cancelled-caller.png new file mode 100644 index 00000000..25087314 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/cancelled-caller.png differ diff --git a/docs/screenshots/webview-engine/legacy100/engine-content-end.png b/docs/screenshots/webview-engine/legacy100/engine-content-end.png new file mode 100644 index 00000000..dd7c68ac Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/engine-content-end.png differ diff --git a/docs/screenshots/webview-engine/legacy100/engine-result.png b/docs/screenshots/webview-engine/legacy100/engine-result.png new file mode 100644 index 00000000..dd7c68ac Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/engine-result.png differ diff --git a/docs/screenshots/webview-engine/legacy100/equivalent-failure-ready.png b/docs/screenshots/webview-engine/legacy100/equivalent-failure-ready.png new file mode 100644 index 00000000..1a47188b Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/equivalent-failure-ready.png differ diff --git a/docs/screenshots/webview-engine/legacy100/returned-caller.png b/docs/screenshots/webview-engine/legacy100/returned-caller.png new file mode 100644 index 00000000..57464ced Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/returned-caller.png differ diff --git a/docs/screenshots/webview-engine/legacy100/settings-before.png b/docs/screenshots/webview-engine/legacy100/settings-before.png new file mode 100644 index 00000000..dd7c68ac Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/settings-before.png differ diff --git a/docs/screenshots/webview-engine/legacy100/settings-destination.png b/docs/screenshots/webview-engine/legacy100/settings-destination.png new file mode 100644 index 00000000..a95c2c39 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/settings-destination.png differ diff --git a/docs/screenshots/webview-engine/legacy100/settings-returned.png b/docs/screenshots/webview-engine/legacy100/settings-returned.png new file mode 100644 index 00000000..3a1bba08 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy100/settings-returned.png differ diff --git a/docs/screenshots/webview-engine/legacy200/engine-content-end.png b/docs/screenshots/webview-engine/legacy200/engine-content-end.png new file mode 100644 index 00000000..751cbd9d Binary files /dev/null and b/docs/screenshots/webview-engine/legacy200/engine-content-end.png differ diff --git a/docs/screenshots/webview-engine/legacy200/engine-result.png b/docs/screenshots/webview-engine/legacy200/engine-result.png new file mode 100644 index 00000000..71eb1757 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy200/engine-result.png differ diff --git a/docs/screenshots/webview-engine/legacy200/returned-caller.png b/docs/screenshots/webview-engine/legacy200/returned-caller.png new file mode 100644 index 00000000..13ea5e43 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy200/returned-caller.png differ diff --git a/docs/screenshots/webview-engine/legacy200/settings-before.png b/docs/screenshots/webview-engine/legacy200/settings-before.png new file mode 100644 index 00000000..f525d4d7 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy200/settings-before.png differ diff --git a/docs/screenshots/webview-engine/legacy200/settings-destination.png b/docs/screenshots/webview-engine/legacy200/settings-destination.png new file mode 100644 index 00000000..4b8da7ad Binary files /dev/null and b/docs/screenshots/webview-engine/legacy200/settings-destination.png differ diff --git a/docs/screenshots/webview-engine/legacy200/settings-returned.png b/docs/screenshots/webview-engine/legacy200/settings-returned.png new file mode 100644 index 00000000..4e9d0b41 Binary files /dev/null and b/docs/screenshots/webview-engine/legacy200/settings-returned.png differ diff --git a/docs/screenshots/webview-engine/modern-landscape200/grid-action.png b/docs/screenshots/webview-engine/modern-landscape200/grid-action.png new file mode 100644 index 00000000..9e5e4ee0 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-landscape200/grid-action.png differ diff --git a/docs/screenshots/webview-engine/modern-landscape200/grid-ready.png b/docs/screenshots/webview-engine/modern-landscape200/grid-ready.png new file mode 100644 index 00000000..760fc764 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-landscape200/grid-ready.png differ diff --git a/docs/screenshots/webview-engine/modern-landscape200/grid-returned.png b/docs/screenshots/webview-engine/modern-landscape200/grid-returned.png new file mode 100644 index 00000000..dd8c3897 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-landscape200/grid-returned.png differ diff --git a/docs/screenshots/webview-engine/modern-landscape200/index-action.png b/docs/screenshots/webview-engine/modern-landscape200/index-action.png new file mode 100644 index 00000000..ccdc595f Binary files /dev/null and b/docs/screenshots/webview-engine/modern-landscape200/index-action.png differ diff --git a/docs/screenshots/webview-engine/modern-landscape200/index-ready.png b/docs/screenshots/webview-engine/modern-landscape200/index-ready.png new file mode 100644 index 00000000..5ca70feb Binary files /dev/null and b/docs/screenshots/webview-engine/modern-landscape200/index-ready.png differ diff --git a/docs/screenshots/webview-engine/modern-landscape200/index-returned.png b/docs/screenshots/webview-engine/modern-landscape200/index-returned.png new file mode 100644 index 00000000..da852c44 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-landscape200/index-returned.png differ diff --git a/docs/screenshots/webview-engine/modern-phone200/grid-action.png b/docs/screenshots/webview-engine/modern-phone200/grid-action.png new file mode 100644 index 00000000..eb0760ad Binary files /dev/null and b/docs/screenshots/webview-engine/modern-phone200/grid-action.png differ diff --git a/docs/screenshots/webview-engine/modern-phone200/grid-ready.png b/docs/screenshots/webview-engine/modern-phone200/grid-ready.png new file mode 100644 index 00000000..aff0cc47 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-phone200/grid-ready.png differ diff --git a/docs/screenshots/webview-engine/modern-phone200/grid-returned.png b/docs/screenshots/webview-engine/modern-phone200/grid-returned.png new file mode 100644 index 00000000..22435065 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-phone200/grid-returned.png differ diff --git a/docs/screenshots/webview-engine/modern-phone200/index-action.png b/docs/screenshots/webview-engine/modern-phone200/index-action.png new file mode 100644 index 00000000..a58b3a3c Binary files /dev/null and b/docs/screenshots/webview-engine/modern-phone200/index-action.png differ diff --git a/docs/screenshots/webview-engine/modern-phone200/index-ready.png b/docs/screenshots/webview-engine/modern-phone200/index-ready.png new file mode 100644 index 00000000..8cff14de Binary files /dev/null and b/docs/screenshots/webview-engine/modern-phone200/index-ready.png differ diff --git a/docs/screenshots/webview-engine/modern-phone200/index-returned.png b/docs/screenshots/webview-engine/modern-phone200/index-returned.png new file mode 100644 index 00000000..51a72574 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-phone200/index-returned.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/cancelled-caller.png b/docs/screenshots/webview-engine/modern-tablet100/cancelled-caller.png new file mode 100644 index 00000000..f6ffe970 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/cancelled-caller.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/grid-action.png b/docs/screenshots/webview-engine/modern-tablet100/grid-action.png new file mode 100644 index 00000000..40aba41f Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/grid-action.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/grid-ready.png b/docs/screenshots/webview-engine/modern-tablet100/grid-ready.png new file mode 100644 index 00000000..0902c205 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/grid-ready.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/grid-returned.png b/docs/screenshots/webview-engine/modern-tablet100/grid-returned.png new file mode 100644 index 00000000..9377c37e Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/grid-returned.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/index-action.png b/docs/screenshots/webview-engine/modern-tablet100/index-action.png new file mode 100644 index 00000000..56ecc030 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/index-action.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/index-ready.png b/docs/screenshots/webview-engine/modern-tablet100/index-ready.png new file mode 100644 index 00000000..4f81e054 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/index-ready.png differ diff --git a/docs/screenshots/webview-engine/modern-tablet100/index-returned.png b/docs/screenshots/webview-engine/modern-tablet100/index-returned.png new file mode 100644 index 00000000..ac9d7371 Binary files /dev/null and b/docs/screenshots/webview-engine/modern-tablet100/index-returned.png differ diff --git a/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-caller-return.png b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-caller-return.png new file mode 100644 index 00000000..be1ae99e Binary files /dev/null and b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-caller-return.png differ diff --git a/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png new file mode 100644 index 00000000..125f8912 Binary files /dev/null and b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png differ diff --git a/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png new file mode 100644 index 00000000..712683c8 Binary files /dev/null and b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png differ diff --git a/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png new file mode 100644 index 00000000..c9356c8a Binary files /dev/null and b/docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png differ diff --git a/docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png b/docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png new file mode 100644 index 00000000..f14f8108 Binary files /dev/null and b/docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png differ diff --git a/docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png b/docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png new file mode 100644 index 00000000..ce79c86f Binary files /dev/null and b/docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png b/docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png new file mode 100644 index 00000000..f02e24eb Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png b/docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png new file mode 100644 index 00000000..3d3d70b9 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png b/docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png new file mode 100644 index 00000000..bfee1f85 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png b/docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png new file mode 100644 index 00000000..a7b7a77f Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png new file mode 100644 index 00000000..f02e24eb Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png new file mode 100644 index 00000000..9af60847 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png new file mode 100644 index 00000000..b11c5594 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png new file mode 100644 index 00000000..3d3d70b9 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png new file mode 100644 index 00000000..f16918f3 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png differ diff --git a/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png new file mode 100644 index 00000000..9f6b7042 Binary files /dev/null and b/docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png differ diff --git a/docs/validation/webview-engine/README.md b/docs/validation/webview-engine/README.md new file mode 100644 index 00000000..fd5ff5a8 --- /dev/null +++ b/docs/validation/webview-engine/README.md @@ -0,0 +1,5 @@ +# WebView evidence checkpoints + +The original `checkpoint.json` and its 320 files retain their b417d94 identities. Its unsupported-operation preflight assertion was not sufficient to prove synchronous gate enforcement. The two affected original cohorts remain historical. + +Use [the repaired matrix](audit-repair/matrix.json) and [repair checkpoint](audit-repair/checkpoint.json) for current credit. The repair substitutes two newly completed whole cohorts, preserves unaffected outcomes at their original binaries, and separately records a deliberately regressed guard. The old test passes that mutant; the strengthened test fails its intended supported-operation assertion. Neither mutation result earns candidate-runtime credit. diff --git a/docs/validation/webview-engine/audit-repair/bindings.json b/docs/validation/webview-engine/audit-repair/bindings.json new file mode 100644 index 00000000..8ac54ac0 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/bindings.json @@ -0,0 +1,478 @@ +[ + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/tests.log", + "original_sha256": "8d95f81a833339d18d8583f8eca6842f4ded218314788e4377792a0a0512b9bc", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/tests.log", + "public_sha256": "8d95f81a833339d18d8583f8eca6842f4ded218314788e4377792a0a0512b9bc", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/cancelled-caller.xml", + "original_sha256": "221e06797fc398c8335a39e2dd2ba8675db581c3965ef8f81a194aef467fd966", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller.xml", + "public_sha256": "221e06797fc398c8335a39e2dd2ba8675db581c3965ef8f81a194aef467fd966", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/cancelled-caller.png", + "original_sha256": "930e0bfcf2b787e2ff0592140ceb41e8fd645218ab4cf01bd56721161306ecfe", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/cancelled-caller.png", + "public_sha256": "930e0bfcf2b787e2ff0592140ceb41e8fd645218ab4cf01bd56721161306ecfe", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-destination-frame.json", + "original_sha256": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination-frame.json", + "public_sha256": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-destination.xml", + "original_sha256": "0b8d9220e23fd2f9cbb81ac9f65806efa157fd4902d522fef30b8c5ae00be803", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination.xml", + "public_sha256": "0b8d9220e23fd2f9cbb81ac9f65806efa157fd4902d522fef30b8c5ae00be803", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-destination.png", + "original_sha256": "8673ebb15291182db47edcad30181ad0e4c167a93ccdf00168d38f3c7efd552c", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/settings-destination.png", + "public_sha256": "8673ebb15291182db47edcad30181ad0e4c167a93ccdf00168d38f3c7efd552c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-content-end-frame.json", + "original_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end-frame.json", + "public_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-before.xml", + "original_sha256": "3117439ddace740b6a95aa1e477ac516639834ca1ac85d738ace27acb72268a5", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before.xml", + "public_sha256": "3117439ddace740b6a95aa1e477ac516639834ca1ac85d738ace27acb72268a5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-before.png", + "original_sha256": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/settings-before.png", + "public_sha256": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/cancelled-caller-frame.json", + "original_sha256": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller-frame.json", + "public_sha256": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/returned-caller.xml", + "original_sha256": "f0af399e72c86482ab5a59d790110016a7ee68b31bcf0bff6678525bc6200e09", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller.xml", + "public_sha256": "f0af399e72c86482ab5a59d790110016a7ee68b31bcf0bff6678525bc6200e09", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/returned-caller.png", + "original_sha256": "c215489be8c9d68ed46de224092428f15bd986d941c6ac792b6c738c9489a64b", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/returned-caller.png", + "public_sha256": "c215489be8c9d68ed46de224092428f15bd986d941c6ac792b6c738c9489a64b", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-result-frame.json", + "original_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result-frame.json", + "public_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/equivalent-failure-ready.png", + "original_sha256": "0399f15f75d93f31d579ab5193b0dd3bbf30ec0ceb35018c4c460eaecaad5ba1", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/equivalent-failure-ready.png", + "public_sha256": "0399f15f75d93f31d579ab5193b0dd3bbf30ec0ceb35018c4c460eaecaad5ba1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/equivalent-failure-ready.xml", + "original_sha256": "813fe43a6c97df6a273313c4b6873df4a26d2fe965da959c93f426ea66fbfd61", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready.xml", + "public_sha256": "813fe43a6c97df6a273313c4b6873df4a26d2fe965da959c93f426ea66fbfd61", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-result.png", + "original_sha256": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/engine-result.png", + "public_sha256": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-result.xml", + "original_sha256": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result.xml", + "public_sha256": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/returned-caller-frame.json", + "original_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller-frame.json", + "public_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-returned-frame.json", + "original_sha256": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned-frame.json", + "public_sha256": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-returned.xml", + "original_sha256": "d96ba9f517f29bb6bbc7aa07119fd529ee694aafaf62a08bc7cfc6caf3bf14b9", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned.xml", + "public_sha256": "d96ba9f517f29bb6bbc7aa07119fd529ee694aafaf62a08bc7cfc6caf3bf14b9", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-returned.png", + "original_sha256": "acab6a2e572d65d9cd0d9f5e3f97ce29427f0cea6881e48edbc5995b59958b6a", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/settings-returned.png", + "public_sha256": "acab6a2e572d65d9cd0d9f5e3f97ce29427f0cea6881e48edbc5995b59958b6a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-content-end.xml", + "original_sha256": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end.xml", + "public_sha256": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-content-end.png", + "original_sha256": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "public": "docs/screenshots/webview-engine/audit-repair/legacy100/engine-content-end.png", + "public_sha256": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/equivalent-failure-ready-frame.json", + "original_sha256": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready-frame.json", + "public_sha256": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-before-frame.json", + "original_sha256": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before-frame.json", + "public_sha256": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/tests.log", + "original_sha256": "889eaab97a77a88b5b6ab2ddbdf9894f40d3cc2855be052405c027febf8b12e7", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/tests.log", + "public_sha256": "889eaab97a77a88b5b6ab2ddbdf9894f40d3cc2855be052405c027febf8b12e7", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-ready-frame.json", + "original_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready-frame.json", + "public_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-action-frame.json", + "original_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action-frame.json", + "public_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-ready.png", + "original_sha256": "877894ca539806e02eafef3deeefdee4aa33c9011ae88e4ef4d7d25708497d2d", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-ready.png", + "public_sha256": "877894ca539806e02eafef3deeefdee4aa33c9011ae88e4ef4d7d25708497d2d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-ready.xml", + "original_sha256": "c613e1da17091c71c5ba11eb1bbb871203222c0d467433a062673c1bda3a52cf", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready.xml", + "public_sha256": "c613e1da17091c71c5ba11eb1bbb871203222c0d467433a062673c1bda3a52cf", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/cancelled-caller.xml", + "original_sha256": "5a75a8e0651faa6b3f47f8ef2edca1aacbfbb920c6b226126d33b8755d1d6f1f", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller.xml", + "public_sha256": "5a75a8e0651faa6b3f47f8ef2edca1aacbfbb920c6b226126d33b8755d1d6f1f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-ready-frame.json", + "original_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready-frame.json", + "public_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/cancelled-caller.png", + "original_sha256": "f642bcf09c0df11602197bd21e02f3456b978227d3c2adf2189d2289758bdee2", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/cancelled-caller.png", + "public_sha256": "f642bcf09c0df11602197bd21e02f3456b978227d3c2adf2189d2289758bdee2", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-returned-frame.json", + "original_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned-frame.json", + "public_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-returned.png", + "original_sha256": "8ed14b384e58cc17c54a43a416db8a4d6ae3f8f5ef4bcb6f05adfa58dc850496", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-returned.png", + "public_sha256": "8ed14b384e58cc17c54a43a416db8a4d6ae3f8f5ef4bcb6f05adfa58dc850496", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-returned.xml", + "original_sha256": "0b905c278fda5e275514d05457bad92d3efaa34b4de09f7caec5d6fc779ae6be", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned.xml", + "public_sha256": "0b905c278fda5e275514d05457bad92d3efaa34b4de09f7caec5d6fc779ae6be", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/cancelled-caller-frame.json", + "original_sha256": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller-frame.json", + "public_sha256": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-ready.png", + "original_sha256": "5841376b1df371d1f0531cd63cc77e3a1bcffa8f95f7dc4780a811c89b2b5fa3", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-ready.png", + "public_sha256": "5841376b1df371d1f0531cd63cc77e3a1bcffa8f95f7dc4780a811c89b2b5fa3", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-ready.xml", + "original_sha256": "6974023eba9a3f9423f00ea795c49702b74452b479f4db58dd3b6e88b7154df0", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready.xml", + "public_sha256": "6974023eba9a3f9423f00ea795c49702b74452b479f4db58dd3b6e88b7154df0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-returned-frame.json", + "original_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned-frame.json", + "public_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-action.png", + "original_sha256": "46b1038ebdc45c159ac2e9c10c8047cdaa2911405c7ef2bbf69fa398529dbe50", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-action.png", + "public_sha256": "46b1038ebdc45c159ac2e9c10c8047cdaa2911405c7ef2bbf69fa398529dbe50", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-action.xml", + "original_sha256": "6c3ce2b6a12760b08fa7c138ce78bd903ee1e154d4d856834c016ec96cdc29d0", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action.xml", + "public_sha256": "6c3ce2b6a12760b08fa7c138ce78bd903ee1e154d4d856834c016ec96cdc29d0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-returned.png", + "original_sha256": "8c5899c415121fdc6b5c8940a07f15a1ac8a15bcdce55c4d57b81bccc9d83192", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-returned.png", + "public_sha256": "8c5899c415121fdc6b5c8940a07f15a1ac8a15bcdce55c4d57b81bccc9d83192", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-returned.xml", + "original_sha256": "ceb206787c78cc7e3ae0046dac2b77e206e65d132b4aa4f51ea2b4b5247778d7", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned.xml", + "public_sha256": "ceb206787c78cc7e3ae0046dac2b77e206e65d132b4aa4f51ea2b4b5247778d7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-action.png", + "original_sha256": "7e2added54bdc0366d5529c5600ab87c6923ec6c1ee4ba3fc5d8c05a5a9460a4", + "public": "docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-action.png", + "public_sha256": "7e2added54bdc0366d5529c5600ab87c6923ec6c1ee4ba3fc5d8c05a5a9460a4", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-action.xml", + "original_sha256": "e2d49648d9ba357dce8a2065e4d1fdd018d9552ce43775901bef048e5380fdf1", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action.xml", + "public_sha256": "e2d49648d9ba357dce8a2065e4d1fdd018d9552ce43775901bef048e5380fdf1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-action-frame.json", + "original_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action-frame.json", + "public_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/old-insensitive/tests.log", + "original_sha256": "a27ba80c1e89f5f672d3e3428b064529e6281ac4fca4ba68627451d0f72f3be8", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/tests.log", + "public_sha256": "a27ba80c1e89f5f672d3e3428b064529e6281ac4fca4ba68627451d0f72f3be8", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/tests.log", + "original_sha256": "46df32d3adfcad75b4fa64550ad88a7df9d791160f2895a1f02c32a06d744e40", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/tests.log", + "public_sha256": "46df32d3adfcad75b4fa64550ad88a7df9d791160f2895a1f02c32a06d744e40", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/failure-frame.json", + "original_sha256": "be31e49a79aa75fc5adc6cb8b9b752e8d18821b5f7d3a0e134cd3b3720386bde", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure-frame.json", + "public_sha256": "be31e49a79aa75fc5adc6cb8b9b752e8d18821b5f7d3a0e134cd3b3720386bde", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/failure.xml", + "original_sha256": "6555f4f888c34cb2c8b045161af020d9f0547249003b4d3607d118e34d6e4f03", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure.xml", + "public_sha256": "6555f4f888c34cb2c8b045161af020d9f0547249003b4d3607d118e34d6e4f03", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/failure.png", + "original_sha256": "ba620e23b5b5909cfb23511cad3c8046d324eefb62568bb6ed0a6a7e208881e4", + "public": "docs/screenshots/webview-engine/audit-repair/mutant-new-sensitive/failure.png", + "public_sha256": "ba620e23b5b5909cfb23511cad3c8046d324eefb62568bb6ed0a6a7e208881e4", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/identity.json", + "original_sha256": "1112290a8d49ed4d11a3e35f99cdb4c2e19317c7552b53ba869104b89c6255cb", + "public": "docs/validation/webview-engine/audit-repair/identity.json", + "public_sha256": "1112290a8d49ed4d11a3e35f99cdb4c2e19317c7552b53ba869104b89c6255cb", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/identity.json", + "original_sha256": "2ad09da08a5f4d13376eab7b1cd553aee362fb0c57e668e378dc5de447523555", + "public": "docs/validation/webview-engine/audit-repair/mutation-identity.json", + "public_sha256": "2ad09da08a5f4d13376eab7b1cd553aee362fb0c57e668e378dc5de447523555", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-controls.json", + "original_sha256": "af45348a4c842c140367c1ff7f895836bebaf47abd7527d014d9359aa8cc3001", + "public": "docs/validation/webview-engine/audit-repair/mutation-calibration.json", + "public_sha256": "af45348a4c842c140367c1ff7f895836bebaf47abd7527d014d9359aa8cc3001", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/post-control-binary-verification.json", + "original_sha256": "ce719645245b8207e5b0c1df071e0b421a3d06064e548f81ee7d9e42243002c4", + "public": "docs/validation/webview-engine/audit-repair/post-control-binary-verification.json", + "public_sha256": "ce719645245b8207e5b0c1df071e0b421a3d06064e548f81ee7d9e42243002c4", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/post-control-apk-payload-comparison.json", + "original_sha256": "11bae15a0eaf89a384aef313ce15ecf38cd966e35e87e8661f18bbe8704a8024", + "public": "docs/validation/webview-engine/audit-repair/post-control-apk-payload-comparison.json", + "public_sha256": "11bae15a0eaf89a384aef313ce15ecf38cd966e35e87e8661f18bbe8704a8024", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-harness-build-v1.log", + "original_sha256": "6f3c7aef9fa884b5c4dfa37d9216df9a32d17d52497215bb69cfa8a9b1e884b0", + "public": "docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v1.log", + "public_sha256": "dfda487e5ca032cc2e56caaf1f2e5741ddd8890068ee314abe3a49c0f2d39059", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-harness-build-v2.log", + "original_sha256": "d0f29fe8506d869db05a0599b35d8d813bbb0f2bd1faf8618b97495aaac56cb8", + "public": "docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v2.log", + "public_sha256": "d0f29fe8506d869db05a0599b35d8d813bbb0f2bd1faf8618b97495aaac56cb8", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-harness-build-v3.log", + "original_sha256": "598feb7b68210ac06d5af9f27b1a11962f7f8bdc1ac7325ff1e277ed585fd483", + "public": "docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v3.log", + "public_sha256": "598feb7b68210ac06d5af9f27b1a11962f7f8bdc1ac7325ff1e277ed585fd483", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-restored-build-v1.log", + "original_sha256": "2790bff113f440f64264c440ef6806b166aef26f47f09db7610147b22489fd3e", + "public": "docs/validation/webview-engine/audit-repair/checks/audit-repair-restored-build-v1.log", + "public_sha256": "2790bff113f440f64264c440ef6806b166aef26f47f09db7610147b22489fd3e", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-benchmark-harness-build-v1.log", + "original_sha256": "b423c6bad30d808971179b0aa84c446360883b95c89b57429dc70f463affc5d3", + "public": "docs/validation/webview-engine/audit-repair/checks/audit-repair-benchmark-harness-build-v1.log", + "public_sha256": "b423c6bad30d808971179b0aa84c446360883b95c89b57429dc70f463affc5d3", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/build.log", + "original_sha256": "732f2f806cb350c28a0505214f5bdfe8fcc2cab2c07c2a9b18d023daa0447c2a", + "public": "docs/validation/webview-engine/audit-repair/checks/mutation-build.log", + "public_sha256": "732f2f806cb350c28a0505214f5bdfe8fcc2cab2c07c2a9b18d023daa0447c2a", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "app/build/reports/lint-results-debug.xml", + "original_sha256": "582646afcedf4679af1b4f47a045dda8099113d57fee013f8b71f347f54332c2", + "public": "docs/validation/webview-engine/audit-repair/checks/lint-results-debug.xml", + "public_sha256": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/reports/lint-results-benchmark.xml", + "original_sha256": "582646afcedf4679af1b4f47a045dda8099113d57fee013f8b71f347f54332c2", + "public": "docs/validation/webview-engine/audit-repair/checks/lint-results-benchmark.xml", + "public_sha256": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/publish-repair.py", + "original_sha256": "b34dc80161cac0af278bb7fbc9611011c7f214474f04d7a8fb60200a1abdde19", + "public": "docs/validation/webview-engine/audit-repair/collectors/publish-repair.py", + "public_sha256": "b34dc80161cac0af278bb7fbc9611011c7f214474f04d7a8fb60200a1abdde19", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/build-guard-control.py", + "original_sha256": "1246bfc74a5da05ceec41cc76ee62b5b4652323ec028965ef67f46858b71f413", + "public": "docs/validation/webview-engine/audit-repair/collectors/build-guard-control.py", + "public_sha256": "dcbe53ea840ab4cc91ac70be934d107a5a80c597392f2dbf12c8bcc6f4f23612", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/run-guard-controls.py", + "original_sha256": "c185408d7bc789e9701450c6676f812f1c410750ec86c400e416b387b99bdc36", + "public": "docs/validation/webview-engine/audit-repair/collectors/run-guard-controls.py", + "public_sha256": "e45225faeeb67de9acc40fa29ad7d6de1c1b54163f39044c66249dc4a5a147d8", + "transform": "replace checkout/home with placeholders" + } +] diff --git a/docs/validation/webview-engine/audit-repair/capture-original-hashes.json b/docs/validation/webview-engine/audit-repair/capture-original-hashes.json new file mode 100644 index 00000000..3e6ad75c --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/capture-original-hashes.json @@ -0,0 +1,64 @@ +{ + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/cancelled-caller.xml": "221e06797fc398c8335a39e2dd2ba8675db581c3965ef8f81a194aef467fd966", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/cancelled-caller.png": "930e0bfcf2b787e2ff0592140ceb41e8fd645218ab4cf01bd56721161306ecfe", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-destination-frame.json": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "11c6c54b99b4f6cfe99e4c3d1d1f47aeddb74c2f95479a4f785c35aa1c636102", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-destination.xml": "0b8d9220e23fd2f9cbb81ac9f65806efa157fd4902d522fef30b8c5ae00be803", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-destination.png": "8673ebb15291182db47edcad30181ad0e4c167a93ccdf00168d38f3c7efd552c", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json": "97d65112b124768562593b11f94cf73d5073cbf39efe05104b80624eed68cdc5", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-before.xml": "3117439ddace740b6a95aa1e477ac516639834ca1ac85d738ace27acb72268a5", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-before.png": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/cancelled-caller-frame.json": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/returned-caller.xml": "f0af399e72c86482ab5a59d790110016a7ee68b31bcf0bff6678525bc6200e09", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/returned-caller.png": "c215489be8c9d68ed46de224092428f15bd986d941c6ac792b6c738c9489a64b", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "6abd7dd20dbcadbc569fd8b6245170e270d15af3c92942ad238593cf31ba3924", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/equivalent-failure-ready.png": "0399f15f75d93f31d579ab5193b0dd3bbf30ec0ceb35018c4c460eaecaad5ba1", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/equivalent-failure-ready.xml": "813fe43a6c97df6a273313c4b6873df4a26d2fe965da959c93f426ea66fbfd61", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "de06ea98b9c5a9915df8e4d8aaafff835990f82fa37c7f039fc71ca219b62629", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-result.png": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-result.xml": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-returned-frame.json": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-returned.xml": "d96ba9f517f29bb6bbc7aa07119fd529ee694aafaf62a08bc7cfc6caf3bf14b9", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-returned.png": "acab6a2e572d65d9cd0d9f5e3f97ce29427f0cea6881e48edbc5995b59958b6a", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json": "c917aa6150c089979ce2cd5b81b1440f1ea2cf5cb43d1423d506085484d50e50", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-content-end.xml": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/engine-content-end.png": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/equivalent-failure-ready-frame.json": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json": "fb70a0f9251f9083afd6b232921af6fd9743475a872477e1172dcea56ad20a29", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/settings-before-frame.json": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json": "3b612ffe2a5d184256353b3667b33ea884e39d180474aed52bb3fbf878d34cb1", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-ready.png": "877894ca539806e02eafef3deeefdee4aa33c9011ae88e4ef4d7d25708497d2d", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-ready.xml": "c613e1da17091c71c5ba11eb1bbb871203222c0d467433a062673c1bda3a52cf", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/cancelled-caller.xml": "5a75a8e0651faa6b3f47f8ef2edca1aacbfbb920c6b226126d33b8755d1d6f1f", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/cancelled-caller.png": "f642bcf09c0df11602197bd21e02f3456b978227d3c2adf2189d2289758bdee2", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "4ae147a3c447fbf2f7e5b1c5dd146777b4048885b3f762374946c3c26a9db4b9", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-returned.png": "8ed14b384e58cc17c54a43a416db8a4d6ae3f8f5ef4bcb6f05adfa58dc850496", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-returned.xml": "0b905c278fda5e275514d05457bad92d3efaa34b4de09f7caec5d6fc779ae6be", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/cancelled-caller-frame.json": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-ready.png": "5841376b1df371d1f0531cd63cc77e3a1bcffa8f95f7dc4780a811c89b2b5fa3", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-ready.xml": "6974023eba9a3f9423f00ea795c49702b74452b479f4db58dd3b6e88b7154df0", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-action.png": "46b1038ebdc45c159ac2e9c10c8047cdaa2911405c7ef2bbf69fa398529dbe50", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-action.xml": "6c3ce2b6a12760b08fa7c138ce78bd903ee1e154d4d856834c016ec96cdc29d0", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-returned.png": "8c5899c415121fdc6b5c8940a07f15a1ac8a15bcdce55c4d57b81bccc9d83192", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-returned.xml": "ceb206787c78cc7e3ae0046dac2b77e206e65d132b4aa4f51ea2b4b5247778d7", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "466d124add945e67d2a27fc8606e4a7bbdf68a36c2c464d46e3ee4febd0047f2", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-action.png": "7e2added54bdc0366d5529c5600ab87c6923ec6c1ee4ba3fc5d8c05a5a9460a4", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/grid-action.xml": "e2d49648d9ba357dce8a2065e4d1fdd018d9552ce43775901bef048e5380fdf1", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-modern-engine-publishes-list-and-runs-live-action.json": "38fe51bdf2ecf8e04561064e6458618aa06de976069519a2b26121abec8ab1c3", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json": "fe8d5144203cdd855f95536b25f284bd9d0d5d0b3bd68159e0ff6bfee6cd35df", + "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-modern-engine-publishes-grid-and-runs-live-action.json": "a5cb1c3d00a82dbd5bb1ba859ad9f4f3e900074f46f4a102b9edac2e578bd123", + "artifacts/webview-compatibility/audit-repair-v1/guard-control/old-insensitive/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "b0bbf4bf9728488dae820b65b5cec4c00df79a369dcd0190f669bf7c552a1025", + "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/failure-frame.json": "be31e49a79aa75fc5adc6cb8b9b752e8d18821b5f7d3a0e134cd3b3720386bde", + "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "d017da1b338f46961fed8b93bf6b2f7f67b62ed7ec8c071168293e2aecb486a5", + "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/failure.xml": "6555f4f888c34cb2c8b045161af020d9f0547249003b4d3607d118e34d6e4f03", + "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/failure.png": "ba620e23b5b5909cfb23511cad3c8046d324eefb62568bb6ed0a6a7e208881e4" +} diff --git a/docs/validation/webview-engine/audit-repair/checkpoint.json b/docs/validation/webview-engine/audit-repair/checkpoint.json new file mode 100644 index 00000000..2399b2b7 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checkpoint.json @@ -0,0 +1,99 @@ +{ + "public_files": { + "docs/validation/webview-engine/audit-repair/bindings.json": "c3299eeca3e62e083dba8cd85036793173dd787da9445a69e6f973850c421457", + "docs/validation/webview-engine/audit-repair/capture-original-hashes.json": "3064ac996f4e81f970ba96886932fe3b0dd4383db85a7be4ecab56d1ec030fd5", + "docs/validation/webview-engine/audit-repair/post-control-apk-payload-comparison.json": "11bae15a0eaf89a384aef313ce15ecf38cd966e35e87e8661f18bbe8704a8024", + "docs/validation/webview-engine/audit-repair/mutation-calibration.json": "af45348a4c842c140367c1ff7f895836bebaf47abd7527d014d9359aa8cc3001", + "docs/validation/webview-engine/audit-repair/test-source-boundary.json": "1951c64f3d5fb43ce798ff7037d13c00732b7fb1947f8551d6302f81726ea93d", + "docs/validation/webview-engine/audit-repair/identity.json": "1112290a8d49ed4d11a3e35f99cdb4c2e19317c7552b53ba869104b89c6255cb", + "docs/validation/webview-engine/audit-repair/matrix.json": "ba6dbba89f2c6c7d7d604d77de73016ab1dd30a67cf1da8af95e1d059813cfa4", + "docs/validation/webview-engine/audit-repair/post-control-binary-verification.json": "ce719645245b8207e5b0c1df071e0b421a3d06064e548f81ee7d9e42243002c4", + "docs/validation/webview-engine/audit-repair/mutation-identity.json": "2ad09da08a5f4d13376eab7b1cd553aee362fb0c57e668e378dc5de447523555", + "docs/validation/webview-engine/audit-repair/projections.json": "0844008cf483355fea4a380add09bf034c071f8f64c5dffaa7944b19ed1fdc3c", + "docs/validation/webview-engine/audit-repair/single-guard-mutation.diff": "2f8dddbce7cda67e0b52b847aca8b960843c4e810549afbbbaa088b9f77e105e", + "docs/validation/webview-engine/audit-repair/collectors/build-guard-control.py": "dcbe53ea840ab4cc91ac70be934d107a5a80c597392f2dbf12c8bcc6f4f23612", + "docs/validation/webview-engine/audit-repair/collectors/publish-repair.py": "b34dc80161cac0af278bb7fbc9611011c7f214474f04d7a8fb60200a1abdde19", + "docs/validation/webview-engine/audit-repair/collectors/run-guard-controls.py": "e45225faeeb67de9acc40fa29ad7d6de1c1b54163f39044c66249dc4a5a147d8", + "docs/validation/webview-engine/audit-repair/checks/lint-results-benchmark.xml": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "docs/validation/webview-engine/audit-repair/checks/mutation-build.log": "732f2f806cb350c28a0505214f5bdfe8fcc2cab2c07c2a9b18d023daa0447c2a", + "docs/validation/webview-engine/audit-repair/checks/audit-repair-restored-build-v1.log": "2790bff113f440f64264c440ef6806b166aef26f47f09db7610147b22489fd3e", + "docs/validation/webview-engine/audit-repair/checks/audit-repair-benchmark-harness-build-v1.log": "b423c6bad30d808971179b0aa84c446360883b95c89b57429dc70f463affc5d3", + "docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v1.log": "dfda487e5ca032cc2e56caaf1f2e5741ddd8890068ee314abe3a49c0f2d39059", + "docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v2.log": "d0f29fe8506d869db05a0599b35d8d813bbb0f2bd1faf8618b97495aaac56cb8", + "docs/validation/webview-engine/audit-repair/checks/lint-results-debug.xml": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v3.log": "598feb7b68210ac06d5af9f27b1a11962f7f8bdc1ac7325ff1e277ed585fd483", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/record.json": "657effb5f3699614599d71771ad10bbb5ee0fe07b168f7e03710da9310ffa5c0", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/tests.log": "a27ba80c1e89f5f672d3e3428b064529e6281ac4fca4ba68627451d0f72f3be8", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/record.json": "5a59984cbd1f36867f80d94111a7259ad3a9422c687f9806cf8b82e3c6fd3d97", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/tests.log": "889eaab97a77a88b5b6ab2ddbdf9894f40d3cc2855be052405c027febf8b12e7", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/record.json": "ad7e88293cd91a52cf0f8d637f5cc1c4b2cb868adf146e5b96b674182f48e981", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/tests.log": "8d95f81a833339d18d8583f8eca6842f4ded218314788e4377792a0a0512b9bc", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/record.json": "81a85c9122ccd0dc47861344b794968a92e7fa167b6d763adcb603abd6d09f02", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/tests.log": "46df32d3adfcad75b4fa64550ad88a7df9d791160f2895a1f02c32a06d744e40", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure-frame.json": "be31e49a79aa75fc5adc6cb8b9b752e8d18821b5f7d3a0e134cd3b3720386bde", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure.xml": "6555f4f888c34cb2c8b045161af020d9f0547249003b4d3607d118e34d6e4f03", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "eaa5c1533b5ce7ba2d2775458e3f2b98ae32520a1af1c3b74218e2cc34c524db", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller.xml": "221e06797fc398c8335a39e2dd2ba8675db581c3965ef8f81a194aef467fd966", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination-frame.json": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination.xml": "0b8d9220e23fd2f9cbb81ac9f65806efa157fd4902d522fef30b8c5ae00be803", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before.xml": "3117439ddace740b6a95aa1e477ac516639834ca1ac85d738ace27acb72268a5", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller-frame.json": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller.xml": "f0af399e72c86482ab5a59d790110016a7ee68b31bcf0bff6678525bc6200e09", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready.xml": "813fe43a6c97df6a273313c4b6873df4a26d2fe965da959c93f426ea66fbfd61", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result.xml": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned-frame.json": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned.xml": "d96ba9f517f29bb6bbc7aa07119fd529ee694aafaf62a08bc7cfc6caf3bf14b9", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end.xml": "73e606d4da6d3a5cc086685e1faf2db0e9bc02bdb68788e1ba7b26db7264ded6", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready-frame.json": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before-frame.json": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "7cd6077a0443c4b005a2d8fc61aa3fad34f7b9184b12564071b33b7b44269193", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json": "8bc8c53c022e507ea57c8d33177697991090b77470f3b5cd33461643a986e885", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "8caf4234ce0002c887061b6cf9944b686016eccbeab77d4bd49eaf778c12b698", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "720ad6cb641a41f0282141d2b1922568918ca827cd2f30d969e5db2c4369a55e", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json": "d3ad0df1ce62d9f4ab2b7f40043680c88ed80d26aa9430126630f66b4b0d4249", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json": "95d287a73a6d1d314bf4f87ec47faa4b08cc465bd3ec06029aa1ec2f280096a2", + "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json": "eb8d31e19536ad01d656743a302c97d35589442855a95c852b8fe4ed55bf0cc0", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready.xml": "c613e1da17091c71c5ba11eb1bbb871203222c0d467433a062673c1bda3a52cf", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller.xml": "5a75a8e0651faa6b3f47f8ef2edca1aacbfbb920c6b226126d33b8755d1d6f1f", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned.xml": "0b905c278fda5e275514d05457bad92d3efaa34b4de09f7caec5d6fc779ae6be", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller-frame.json": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready.xml": "6974023eba9a3f9423f00ea795c49702b74452b479f4db58dd3b6e88b7154df0", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action.xml": "6c3ce2b6a12760b08fa7c138ce78bd903ee1e154d4d856834c016ec96cdc29d0", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned.xml": "ceb206787c78cc7e3ae0046dac2b77e206e65d132b4aa4f51ea2b4b5247778d7", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action.xml": "e2d49648d9ba357dce8a2065e4d1fdd018d9552ce43775901bef048e5380fdf1", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "88c350479c1648c33a7177eee77a4296c020edd40f121f26fd7cee92e8a5c1fc", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "38bbb01bbd1e24021236748b5610acfbe7d443b3e5b24ed3e5f59c0c1872acc7", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json": "e6664805edc8f79735927921e8f865bac66c27b6263447f5b08d59c2ddeebcbf", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json": "0b8ef08e2d3a3f069b06cbd902102c05fed9616c46cd3861eaf2a612a3d4f7e8", + "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json": "351178b7b5be62be589baa2eaed7e076f4db28c18ccd1d632513162b0ab5624f", + "docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "356bd11ec3f23a17f104a412417855f6179c252f40ded3146ad32ee51b726542", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-ready.png": "877894ca539806e02eafef3deeefdee4aa33c9011ae88e4ef4d7d25708497d2d", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/cancelled-caller.png": "f642bcf09c0df11602197bd21e02f3456b978227d3c2adf2189d2289758bdee2", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-returned.png": "8ed14b384e58cc17c54a43a416db8a4d6ae3f8f5ef4bcb6f05adfa58dc850496", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-ready.png": "5841376b1df371d1f0531cd63cc77e3a1bcffa8f95f7dc4780a811c89b2b5fa3", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-action.png": "46b1038ebdc45c159ac2e9c10c8047cdaa2911405c7ef2bbf69fa398529dbe50", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/index-returned.png": "8c5899c415121fdc6b5c8940a07f15a1ac8a15bcdce55c4d57b81bccc9d83192", + "docs/screenshots/webview-engine/audit-repair/modern-tablet100/grid-action.png": "7e2added54bdc0366d5529c5600ab87c6923ec6c1ee4ba3fc5d8c05a5a9460a4", + "docs/screenshots/webview-engine/audit-repair/legacy100/cancelled-caller.png": "930e0bfcf2b787e2ff0592140ceb41e8fd645218ab4cf01bd56721161306ecfe", + "docs/screenshots/webview-engine/audit-repair/legacy100/settings-destination.png": "8673ebb15291182db47edcad30181ad0e4c167a93ccdf00168d38f3c7efd552c", + "docs/screenshots/webview-engine/audit-repair/legacy100/settings-before.png": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "docs/screenshots/webview-engine/audit-repair/legacy100/returned-caller.png": "c215489be8c9d68ed46de224092428f15bd986d941c6ac792b6c738c9489a64b", + "docs/screenshots/webview-engine/audit-repair/legacy100/equivalent-failure-ready.png": "0399f15f75d93f31d579ab5193b0dd3bbf30ec0ceb35018c4c460eaecaad5ba1", + "docs/screenshots/webview-engine/audit-repair/legacy100/engine-result.png": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "docs/screenshots/webview-engine/audit-repair/legacy100/settings-returned.png": "acab6a2e572d65d9cd0d9f5e3f97ce29427f0cea6881e48edbc5995b59958b6a", + "docs/screenshots/webview-engine/audit-repair/legacy100/engine-content-end.png": "16bf2a17952c6d188af0cd6033d5e3bae20e72e140b93760f649096440fa04bf", + "docs/screenshots/webview-engine/audit-repair/mutant-new-sensitive/failure.png": "ba620e23b5b5909cfb23511cad3c8046d324eefb62568bb6ed0a6a7e208881e4", + "docs/validation/webview-engine/README.md": "b562ef4e7ad2456e66d2e8a8dc2f9161abf7ac16da57f114596201cfeefebdfc" + }, + "source_head": "29a0a5a1c1af31314c4bf543295a0f2e9956dc55", + "scope": "Two strengthened whole cohorts plus separately classified mutation calibration; original checkpoint retained unchanged" +} diff --git a/docs/validation/webview-engine/audit-repair/checks/audit-repair-benchmark-harness-build-v1.log b/docs/validation/webview-engine/audit-repair/checks/audit-repair-benchmark-harness-build-v1.log new file mode 100644 index 00000000..8f901efa --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/audit-repair-benchmark-harness-build-v1.log @@ -0,0 +1,73 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:generateBenchmarkBuildConfig UP-TO-DATE +> Task :app:generateBenchmarkResources UP-TO-DATE +> Task :app:packageBenchmarkResources UP-TO-DATE +> Task :app:processBenchmarkNavigationResources UP-TO-DATE +> Task :app:parseBenchmarkLocalResources UP-TO-DATE +> Task :app:generateBenchmarkRFile UP-TO-DATE +> Task :app:compileBenchmarkKotlin UP-TO-DATE +> Task :app:javaPreCompileBenchmark UP-TO-DATE +> Task :app:compileBenchmarkJavaWithJavac UP-TO-DATE +> Task :app:checkBenchmarkAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkResources UP-TO-DATE +> Task :app:createBenchmarkCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksBenchmark UP-TO-DATE +> Task :app:processBenchmarkMainManifest UP-TO-DATE +> Task :app:processBenchmarkManifest UP-TO-DATE +> Task :app:processBenchmarkManifestForPackage UP-TO-DATE +> Task :app:processBenchmarkResources UP-TO-DATE +> Task :app:bundleBenchmarkClassesToCompileJar UP-TO-DATE +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkAndroidTestManifest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:packageBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseBenchmarkAndroidTestLocalResources UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmarkAndroidTest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:compressBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:desugarBenchmarkAndroidTestFileDependencies UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:mergeExtDexBenchmarkAndroidTest UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkNativeLibs UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest UP-TO-DATE +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:generateBenchmarkLintReportModel UP-TO-DATE +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:generateBenchmarkUnitTestLintModel UP-TO-DATE +> Task :app:lintAnalyzeBenchmark UP-TO-DATE +> Task :app:lintAnalyzeBenchmarkUnitTest UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestKotlin +> Task :app:compileBenchmarkAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:processBenchmarkAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJavaResource UP-TO-DATE +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmarkAndroidTest +> Task :app:lintReportBenchmark UP-TO-DATE +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 14s +61 actionable tasks: 7 executed, 54 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v1.log b/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v1.log new file mode 100644 index 00000000..57832b64 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v1.log @@ -0,0 +1,70 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest UP-TO-DATE +> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE + +> Task :app:compileDebugAndroidTestKotlin FAILED +e: file:///app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt:287:23 References to variables aren't supported yet + +FAILURE: Build failed with an exception. + +* What went wrong: +Execution failed for task ':app:compileDebugAndroidTestKotlin'. +> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction + > Compilation error. See log for more details + +* Try: +> Run with --stacktrace option to get the stack trace. +> Run with --info or --debug option to get more log output. +> Run with --scan to get full insights from a Build Scan (powered by Develocity). +> Get more help at https://help.gradle.org. + +BUILD FAILED in 1s +46 actionable tasks: 1 executed, 45 up-to-date diff --git a/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v2.log b/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v2.log new file mode 100644 index 00000000..9d3be586 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v2.log @@ -0,0 +1,64 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest UP-TO-DATE +> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:compileDebugAndroidTestKotlin +> Task :app:compileDebugAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest + +BUILD SUCCESSFUL in 1s +53 actionable tasks: 4 executed, 49 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v3.log b/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v3.log new file mode 100644 index 00000000..a32f3209 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/audit-repair-harness-build-v3.log @@ -0,0 +1,64 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest UP-TO-DATE +> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:compileDebugAndroidTestKotlin +> Task :app:compileDebugAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest + +BUILD SUCCESSFUL in 2s +53 actionable tasks: 4 executed, 49 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/audit-repair/checks/audit-repair-restored-build-v1.log b/docs/validation/webview-engine/audit-repair/checks/audit-repair-restored-build-v1.log new file mode 100644 index 00000000..45d0e3b2 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/audit-repair-restored-build-v1.log @@ -0,0 +1,94 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:generateDebugAssets UP-TO-DATE +> Task :app:mergeDebugAssets UP-TO-DATE +> Task :app:compressDebugAssets UP-TO-DATE +> Task :app:generateDebugGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebug UP-TO-DATE +> Task :app:mergeLibDexDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:stripDebugDebugSymbols UP-TO-DATE +> Task :app:validateSigningDebug UP-TO-DATE +> Task :app:writeDebugAppMetadata UP-TO-DATE +> Task :app:writeDebugSigningConfigVersions UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest UP-TO-DATE +> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:processDebugResources +> Task :app:compileDebugKotlin +> Task :app:compileDebugJavaWithJavac +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:mergeDebugJavaResource UP-TO-DATE +> Task :app:dexBuilderDebug +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:compileDebugAndroidTestKotlin UP-TO-DATE +> Task :app:compileDebugAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest UP-TO-DATE +> Task :app:mergeProjectDexDebugAndroidTest UP-TO-DATE +> Task :app:packageDebugAndroidTest UP-TO-DATE +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestLintModel +> Task :app:generateDebugLintReportModel UP-TO-DATE +> Task :app:generateDebugUnitTestLintModel UP-TO-DATE +> Task :app:lintAnalyzeDebug UP-TO-DATE +> Task :app:lintAnalyzeDebugUnitTest UP-TO-DATE +> Task :app:mergeProjectDexDebug +> Task :app:packageDebug +> Task :app:createDebugApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebug +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintReportDebug UP-TO-DATE +> Task :app:lintDebug + +BUILD SUCCESSFUL in 16s +79 actionable tasks: 15 executed, 64 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/audit-repair/checks/lint-results-benchmark.xml b/docs/validation/webview-engine/audit-repair/checks/lint-results-benchmark.xml new file mode 100644 index 00000000..fa4f5121 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/lint-results-benchmark.xml @@ -0,0 +1,902 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/audit-repair/checks/lint-results-debug.xml b/docs/validation/webview-engine/audit-repair/checks/lint-results-debug.xml new file mode 100644 index 00000000..fa4f5121 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/lint-results-debug.xml @@ -0,0 +1,902 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/audit-repair/checks/mutation-build.log b/docs/validation/webview-engine/audit-repair/checks/mutation-build.log new file mode 100644 index 00000000..74c37e6c --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/checks/mutation-build.log @@ -0,0 +1,47 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:generateDebugAssets UP-TO-DATE +> Task :app:mergeDebugAssets UP-TO-DATE +> Task :app:compressDebugAssets UP-TO-DATE +> Task :app:generateDebugGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebug UP-TO-DATE +> Task :app:mergeLibDexDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:stripDebugDebugSymbols UP-TO-DATE +> Task :app:validateSigningDebug UP-TO-DATE +> Task :app:writeDebugAppMetadata UP-TO-DATE +> Task :app:writeDebugSigningConfigVersions UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:processDebugResources +> Task :app:compileDebugKotlin +> Task :app:compileDebugJavaWithJavac +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:mergeDebugJavaResource UP-TO-DATE +> Task :app:dexBuilderDebug +> Task :app:mergeProjectDexDebug +> Task :app:packageDebug +> Task :app:createDebugApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebug + +BUILD SUCCESSFUL in 3s +38 actionable tasks: 12 executed, 26 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller-frame.json new file mode 100644 index 00000000..19eff240 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "cancelled-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller.xml new file mode 100644 index 00000000..aca547b2 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/cancelled-caller.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end-frame.json new file mode 100644 index 00000000..ad605bcb --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-content-end", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end.xml new file mode 100644 index 00000000..f7c79a20 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-content-end.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result-frame.json new file mode 100644 index 00000000..72734c38 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-result", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result.xml new file mode 100644 index 00000000..f7c79a20 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/engine-result.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready-frame.json new file mode 100644 index 00000000..59516e95 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "equivalent-failure-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready.xml new file mode 100644 index 00000000..51073b73 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/equivalent-failure-ready.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller-frame.json new file mode 100644 index 00000000..bad3ef32 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "returned-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller.xml new file mode 100644 index 00000000..dd4334cd --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/returned-caller.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before-frame.json new file mode 100644 index 00000000..b58eab76 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-before", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before.xml new file mode 100644 index 00000000..c01bd105 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-before.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination-frame.json new file mode 100644 index 00000000..2acaa351 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-destination", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination.xml new file mode 100644 index 00000000..983e4726 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-destination.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned-frame.json new file mode 100644 index 00000000..7d6f24a6 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned.xml b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned.xml new file mode 100644 index 00000000..5c69d072 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/captures/settings-returned.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json new file mode 100644 index 00000000..942b6377 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json @@ -0,0 +1,15 @@ +{ + "android_api": 26, + "api_probe_result": "Rejected(failure=MISSING_APIS, missingApis=[Array.prototype.at, Object.fromEntries, Object.hasOwn, globalThis])", + "case": "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "compile_body_executed": false, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "invalid_syntax_caught": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json new file mode 100644 index 00000000..3ac495f2 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json @@ -0,0 +1,18 @@ +{ + "android_api": 26, + "approved_control_scope": "The paired approved control runs on API36; this actual API26 engine cannot pass preflight", + "case": "bridgeCannotPublishOrReadHostApisBeforeApproval", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "owned_probe_file_exists": true, + "palette_preferences_restored": true, + "passed": true, + "preflight_bridge_render_rejected": true, + "preflight_host_api_rejected": true, + "preflight_response_ok": false, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "supported_probe_operation": "fs.exists" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json new file mode 100644 index 00000000..3fa9503f --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json @@ -0,0 +1,13 @@ +{ + "android_api": 26, + "case": "closingBeforePreflightFinishesRejectsLatePublication", + "closed_owner_remained_inactive": true, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json new file mode 100644 index 00000000..634cc406 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "fresh_recovery_actions": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "second_failure_scope": "Controlled native publication of an equivalent failure before recomposition; first failure used the actual legacy engine" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json new file mode 100644 index 00000000..d5cee357 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineOpensOnlyActualProviderSettingsAndReturns", + "explicit_settings_destination": "com.android.settings", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json new file mode 100644 index 00000000..be4a4453 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json @@ -0,0 +1,51 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "published_native_tree": false, + "runtime_error": "The JavaScript engine could not pass the startup check.", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "target_witnesses": [ + [ + "extension-engine-settings", + 910, + 126 + ], + [ + "extension-engine-return", + 910, + 126 + ] + ], + "text_setup": "Semantic scroll to each paragraph; pointer swipes establish sequential full-line reachability", + "text_witnesses": [ + { + "tag": "extension-engine-title", + "lines": 1, + "all_lines_reached": true + }, + { + "tag": "extension-engine-provider", + "lines": 1, + "all_lines_reached": true + }, + { + "tag": "extension-engine-explanation", + "lines": 2, + "all_lines_reached": true + }, + { + "tag": "extension-engine-guidance", + "lines": 4, + "all_lines_reached": true + } + ], + "time_to_result_ms": 709 +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json new file mode 100644 index 00000000..23aaafbf --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "replacement_not_closed": true, + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "stale_settings_launches": 0 +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/record.json b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/record.json new file mode 100644 index 00000000..5189a02b --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/record.json @@ -0,0 +1,64 @@ +{ + "api": 26, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "font_scale": 1.0, + "initialization_error": false, + "instrumentation_exit_code": 0, + "layout": "phone", + "methods": [ + "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "incompatibleEngineOpensOnlyActualProviderSettingsAndReturns", + "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "closingBeforePreflightFinishesRejectsLatePublication", + "bridgeCannotPublishOrReadHostApisBeforeApproval", + "replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks", + "equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition" + ], + "native_expected_outcome": true, + "original_font_scale": "null", + "original_geometry": { + "size": "Physical size: 1080x1920", + "density": "Physical density: 420" + }, + "passes": 7, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 58.0.3029.125)" + ], + "runner_sha256": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "test_apk_sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/legacy100/tests.log b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/tests.log new file mode 100644 index 00000000..cee8e9af --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/legacy100/tests.log @@ -0,0 +1,107 @@ +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=7 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=7 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 25.117 + +OK (7 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller-frame.json new file mode 100644 index 00000000..97aa5984 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "cancelled-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller.xml new file mode 100644 index 00000000..d4fdb620 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/cancelled-caller.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action-frame.json new file mode 100644 index 00000000..af67cea0 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action.xml new file mode 100644 index 00000000..405fcaa5 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-action.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready-frame.json new file mode 100644 index 00000000..06b897f0 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready.xml new file mode 100644 index 00000000..90e0e2bb --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-ready.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned-frame.json new file mode 100644 index 00000000..4a9b28e0 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned.xml new file mode 100644 index 00000000..932d37d4 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/grid-returned.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action-frame.json new file mode 100644 index 00000000..5331fc14 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action.xml new file mode 100644 index 00000000..7278aa05 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-action.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready-frame.json new file mode 100644 index 00000000..4f9ef866 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready.xml new file mode 100644 index 00000000..ac5a85ba --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-ready.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned-frame.json new file mode 100644 index 00000000..95879a09 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned.xml b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned.xml new file mode 100644 index 00000000..c9814308 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/captures/index-returned.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json new file mode 100644 index 00000000..65839f8e --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json @@ -0,0 +1,15 @@ +{ + "android_api": 36, + "api_probe_result": "Passed", + "case": "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "compile_body_executed": false, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "invalid_syntax_caught": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json new file mode 100644 index 00000000..e4411b48 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json @@ -0,0 +1,20 @@ +{ + "android_api": 36, + "approved_owned_file_exists": true, + "approved_response_ok": true, + "case": "bridgeCannotPublishOrReadHostApisBeforeApproval", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "owned_probe_file_exists": true, + "palette_preferences_restored": true, + "passed": true, + "preflight_bridge_render_rejected": true, + "preflight_host_api_rejected": true, + "preflight_response_ok": false, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "same_engine_bridge_operation_and_arguments": true, + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "supported_probe_operation": "fs.exists" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json new file mode 100644 index 00000000..959209c5 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json @@ -0,0 +1,13 @@ +{ + "android_api": 36, + "case": "closingBeforePreflightFinishesRejectsLatePublication", + "closed_owner_remained_inactive": true, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json new file mode 100644 index 00000000..315a2b33 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesGridAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json new file mode 100644 index 00000000..4a23f3ec --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesListAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/record.json b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/record.json new file mode 100644 index 00000000..63c4e005 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/record.json @@ -0,0 +1,78 @@ +{ + "api": 36, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "font_scale": 1.0, + "initialization_error": false, + "instrumentation_exit_code": 0, + "layout": "tablet", + "methods": [ + "modernEnginePublishesListAndRunsLiveAction", + "modernEnginePublishesGridAndRunsLiveAction", + "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "closingBeforePreflightFinishesRejectsLatePublication", + "bridgeCannotPublishOrReadHostApisBeforeApproval" + ], + "native_expected_outcome": true, + "original_font_scale": "1.0", + "original_geometry": { + "size": "Physical size: 1920x1200", + "density": "Physical density: 240" + }, + "passes": 5, + "preserved_file_count": 573, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 133.0.6943.137)" + ], + "runner_sha256": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "test_apk_sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/tests.log b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/tests.log new file mode 100644 index 00000000..e61d5851 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/tests.log @@ -0,0 +1,79 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 22.802 + +OK (5 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure-frame.json b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure-frame.json new file mode 100644 index 00000000..a28b9759 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "failure", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure.xml b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure.xml new file mode 100644 index 00000000..5562db5e --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/captures/failure.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json new file mode 100644 index 00000000..798c1344 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "case": "bridgeCannotPublishOrReadHostApisBeforeApproval", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "owned_probe_file_exists": true, + "palette_preferences_restored": true, + "preflight_response_ok": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "supported_probe_operation": "fs.exists" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/record.json b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/record.json new file mode 100644 index 00000000..b3dd7c26 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/record.json @@ -0,0 +1,74 @@ +{ + "api": 36, + "apk_sha256": "3ca7729b9bce2a2594ce513b087fb43661eaffe9db3632b45540a8acf794a147", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "completed": false, + "expected_negative": false, + "failures": 1, + "font_scale": 1.0, + "initialization_error": false, + "instrumentation_exit_code": 0, + "layout": "tablet", + "methods": [ + "bridgeCannotPublishOrReadHostApisBeforeApproval" + ], + "native_expected_outcome": false, + "original_font_scale": "1.0", + "original_geometry": { + "size": "Physical size: 1920x1200", + "density": "Physical density: 240" + }, + "passes": 0, + "preserved_file_count": 573, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 133.0.6943.137)" + ], + "runner_sha256": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "test_apk_sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/tests.log b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/tests.log new file mode 100644 index 00000000..1142c3c7 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/tests.log @@ -0,0 +1,86 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Supported fs.exists must remain blocked before approval + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.assertTrue(Assert.java:42) + at org.junit.Assert.assertFalse(Assert.java:65) + at dev.tinycast.android.WebViewRecoveryDeviceTest.bridgeCannotPublishOrReadHostApisBeforeApproval$lambda$40(WebViewRecoveryDeviceTest.kt:268) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda0.perform(D8$$SyntheticClass:0) + at androidx.test.core.app.ActivityScenario.lambda$onActivity$2$androidx-test-core-app-ActivityScenario(ActivityScenario.java:794) + at androidx.test.core.app.ActivityScenario$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:524) + at java.util.concurrent.FutureTask.run(FutureTask.java:317) + at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2616) + at android.os.Handler.handleCallback(Handler.java:995) + at android.os.Handler.dispatchMessage(Handler.java:103) + at android.os.Looper.loopOnce(Looper.java:248) + at android.os.Looper.loop(Looper.java:338) + at android.app.ActivityThread.main(ActivityThread.java:9067) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) + +INSTRUMENTATION_STATUS: stream= +Error in bridgeCannotPublishOrReadHostApisBeforeApproval(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.AssertionError: Supported fs.exists must remain blocked before approval + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.assertTrue(Assert.java:42) + at org.junit.Assert.assertFalse(Assert.java:65) + at dev.tinycast.android.WebViewRecoveryDeviceTest.bridgeCannotPublishOrReadHostApisBeforeApproval$lambda$40(WebViewRecoveryDeviceTest.kt:268) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda0.perform(D8$$SyntheticClass:0) + at androidx.test.core.app.ActivityScenario.lambda$onActivity$2$androidx-test-core-app-ActivityScenario(ActivityScenario.java:794) + at androidx.test.core.app.ActivityScenario$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:524) + at java.util.concurrent.FutureTask.run(FutureTask.java:317) + at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2616) + at android.os.Handler.handleCallback(Handler.java:995) + at android.os.Handler.dispatchMessage(Handler.java:103) + at android.os.Looper.loopOnce(Looper.java:248) + at android.os.Looper.loop(Looper.java:338) + at android.app.ActivityThread.main(ActivityThread.java:9067) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) + +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 5.308 +There was 1 failure: +1) bridgeCannotPublishOrReadHostApisBeforeApproval(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.AssertionError: Supported fs.exists must remain blocked before approval + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.assertTrue(Assert.java:42) + at org.junit.Assert.assertFalse(Assert.java:65) + at dev.tinycast.android.WebViewRecoveryDeviceTest.bridgeCannotPublishOrReadHostApisBeforeApproval$lambda$40(WebViewRecoveryDeviceTest.kt:268) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda0.perform(D8$$SyntheticClass:0) + at androidx.test.core.app.ActivityScenario.lambda$onActivity$2$androidx-test-core-app-ActivityScenario(ActivityScenario.java:794) + at androidx.test.core.app.ActivityScenario$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:524) + at java.util.concurrent.FutureTask.run(FutureTask.java:317) + at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2616) + at android.os.Handler.handleCallback(Handler.java:995) + at android.os.Handler.dispatchMessage(Handler.java:103) + at android.os.Looper.loopOnce(Looper.java:248) + at android.os.Looper.loop(Looper.java:338) + at android.app.ActivityThread.main(ActivityThread.java:9067) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json b/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json new file mode 100644 index 00000000..be36d7b9 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "case": "bridgeCannotPublishOrReadHostApisBeforeApproval", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "preflight_bridge_render_rejected": true, + "preflight_host_api_rejected": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/record.json b/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/record.json new file mode 100644 index 00000000..2d25386a --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/record.json @@ -0,0 +1,74 @@ +{ + "api": 36, + "apk_sha256": "3ca7729b9bce2a2594ce513b087fb43661eaffe9db3632b45540a8acf794a147", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "font_scale": 1.0, + "initialization_error": false, + "instrumentation_exit_code": 0, + "layout": "tablet", + "methods": [ + "bridgeCannotPublishOrReadHostApisBeforeApproval" + ], + "native_expected_outcome": true, + "original_font_scale": "1.0", + "original_geometry": { + "size": "Physical size: 1920x1200", + "density": "Physical density: 240" + }, + "passes": 1, + "preserved_file_count": 573, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 133.0.6943.137)" + ], + "runner_sha256": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e" +} diff --git a/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/tests.log b/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/tests.log new file mode 100644 index 00000000..211a2956 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 3.75 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/audit-repair/collectors/build-guard-control.py b/docs/validation/webview-engine/audit-repair/collectors/build-guard-control.py new file mode 100644 index 00000000..82812f39 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/collectors/build-guard-control.py @@ -0,0 +1,31 @@ +from pathlib import Path +import hashlib,json,os,subprocess +B=Path('artifacts/webview-compatibility/audit-repair-v1');C=B/'guard-control';C.mkdir(exist_ok=False) +P=Path('app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt') +sha=lambda d:hashlib.sha256(d).hexdigest() +original=P.read_bytes();expected=subprocess.check_output(['git','show','fec0a4bf1155c08c141606f92ae8fb1feab4bba0:'+str(P)]) +assert original==expected and not subprocess.check_output(['git','status','--porcelain']) +needle=b'check(authorized()) { "This command session has ended" }';replacement=b'check(active()) { "This command session has ended" }' +assert original.count(needle)==1 +mutated=original.replace(needle,replacement) +(C/'ExtensionRuntime.original.kt').write_bytes(original);(C/'ExtensionRuntime.mutated.kt').write_bytes(mutated) +paths=subprocess.check_output(['git','ls-files','app/src/main','app/build.gradle.kts','build.gradle.kts','settings.gradle.kts','gradle.properties','gradle'],text=True).splitlines() +r={'completed':False,'purpose':'Synthetic approval-guard regression control only; never a candidate','source_parent':subprocess.check_output(['git','rev-parse','HEAD'],text=True).strip(),'runtime_source':'fec0a4bf1155c08c141606f92ae8fb1feab4bba0','build_stamp':'local','single_source_mutation':{'path':str(P),'before_sha256':sha(original),'after_sha256':sha(mutated),'before':needle.decode(),'after':replacement.decode()},'main_source_hashes':{p:sha(Path(p).read_bytes()) for p in paths if Path(p).is_file()},'recipe':['./gradlew','-PdroidcastBuildCommit=local',':app:assembleDebug','--console=plain']} +r['main_source_hashes'][str(P)]=sha(mutated) +def save():(C/'identity.json').write_text(json.dumps(r,indent=2)+'\n') +save() +try: + P.write_bytes(mutated);r['source_mutation_applied']=True;save() + env=dict(os.environ,JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-21.0.12.1+1/Contents/Home',ANDROID_HOME='/Library/Android/sdk') + with (C/'build.log').open('xb') as log:result=subprocess.run(r['recipe'],stdout=log,stderr=subprocess.STDOUT,env=env,timeout=240) + r['build_exit_code']=result.returncode;save();assert result.returncode==0 + assert P.read_bytes()==mutated + apk=Path('app/build/outputs/apk/debug/app-debug.apk');(C/'app-debug.apk').write_bytes(apk.read_bytes());r['apk_sha256']=sha(apk.read_bytes()) + import zipfile + with zipfile.ZipFile(C/'app-debug.apk') as z:r['assets']={p:sha(z.read(p)) for p in z.namelist() if p.startswith('assets/')} + r['completed']=True +finally: + assert P.read_bytes() in (mutated,original),'Unexpected source modification; inspect before restoring' + P.write_bytes(original);r['source_restored_exactly']=P.read_bytes()==expected;save() +assert not subprocess.check_output(['git','diff','--',str(P)]) +print(json.dumps({k:r[k] for k in ['completed','apk_sha256','source_restored_exactly']})) diff --git a/docs/validation/webview-engine/audit-repair/collectors/publish-repair.py b/docs/validation/webview-engine/audit-repair/collectors/publish-repair.py new file mode 100644 index 00000000..0ca0bc59 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/collectors/publish-repair.py @@ -0,0 +1,70 @@ +from pathlib import Path +import json,hashlib,subprocess,difflib,zipfile +from xml.etree import ElementTree as E +B=Path('artifacts/webview-compatibility/audit-repair-v1');D=Path('docs/validation/webview-engine/audit-repair');S=Path('docs/screenshots/webview-engine/audit-repair');BASE=Path('docs/validation/webview-engine') +sha=lambda v:hashlib.sha256(v).hexdigest();read=lambda p:json.loads(Path(p).read_text()) +def require(v,m): + if not v:raise ValueError(m) +for n in ['legacy100','modern-tablet100']:require(read(B/n/'record.json')['completed'],'Incomplete repaired cohort') +require(read(B/'guard-controls.json')['completed'],'Incomplete mutation calibration') +require(not D.exists() and not S.exists(),'Repair publication already exists; inspect before modifying it') +D.mkdir(parents=True);S.mkdir(parents=True);bindings=[];projections=[] +def put(p,d,redact=False,xml=False): + raw=p.read_bytes();value=raw + if redact: + for a,b in [(str(Path.cwd()),''),(str(Path.home()),'')]: + if xml:b=b.replace('<','<').replace('>','>') + value=value.replace(a.encode(),b.encode()) + d.parent.mkdir(parents=True,exist_ok=True);d.write_bytes(value) + bindings.append({'original':str(p.resolve().relative_to(Path.cwd())),'original_sha256':sha(raw),'public':str(d),'public_sha256':sha(value),'transform':'replace checkout/home with escaped placeholders' if redact and xml else 'replace checkout/home with placeholders' if redact else 'identity'}) + if xml:E.fromstring(value) +record_keys=set('completed expected_negative runner_sha256 apk_sha256 test_apk_sha256 methods api font_scale layout cleanup provider_before original_geometry original_font_scale instrumentation_exit_code passes failures initialization_error native_expected_outcome preserved_file_count'.split()) +native_keys=set() +for row in read(BASE/'projections.json'): + if Path(row['original']).name.startswith('case-'):native_keys.update(row['keys']) +native_keys.update('supported_probe_operation owned_probe_file_exists preflight_response_ok approved_response_ok approved_owned_file_exists same_engine_bridge_operation_and_arguments approved_control_scope'.split()) +def project(p,d,keys): + r=read(p);v={k:r[k] for k in sorted(keys) if k in r};d.parent.mkdir(parents=True,exist_ok=True);d.write_text(json.dumps(v,indent=2)+'\n') + projections.append({'original':str(p),'original_sha256':sha(p.read_bytes()),'public':str(d),'public_sha256':sha(d.read_bytes()),'keys':sorted(v)}) + return v +roots={'legacy100':B/'legacy100','modern-tablet100':B/'modern-tablet100','mutant-old-insensitive':B/'guard-control/old-insensitive','mutant-new-sensitive':B/'guard-control/new-sensitive'} +capture_hashes={} +for n,root in roots.items(): + r=project(root/'record.json',D/'cohorts'/n/'record.json',record_keys) + require(all(x['passed'] for x in r['cleanup'].values()),'Restoration failed') + put(root/'tests.log',D/'cohorts'/n/'tests.log',redact=True) + for p in (root/'captures').iterdir(): + require(p.is_file() and p.suffix in ['.png','.xml','.json'],'Unexpected capture') + capture_hashes[str(p)]=sha(p.read_bytes()) + if p.name.startswith('case-'):project(p,D/'cohorts'/n/'cases'/p.name,native_keys) + else:put(p,S/n/p.name if p.suffix=='.png' else D/'cohorts'/n/'captures'/p.name,xml=p.suffix=='.xml') +# The earlier checkpoint remains immutable. Replace only its two entire +# affected cohorts in the current matrix; never relabel their old receipts. +matrix=read(BASE/'matrix.json') +for row in matrix: + n=row['cohort'] + if n in ['legacy100','modern-tablet100']: + r=read(B/n/'record.json');row.update(passes=r['passes'],junit_failures=r['failures'],cleanup_checks=len(r['cleanup']),app_sha256=r['apk_sha256'],test_apk_sha256=r['test_apk_sha256'],source='fresh strengthened harness',record=str(D/'cohorts'/n/'record.json')) + else:row.update(source='retained original scope, unaffected method bodies',record=str(BASE/'cohorts'/n/'record.json')) +(D/'matrix.json').write_text(json.dumps(matrix,indent=2)+'\n') +put(B/'identity.json',D/'identity.json');put(B/'guard-control/identity.json',D/'mutation-identity.json') +put(B/'guard-controls.json',D/'mutation-calibration.json');put(B/'post-control-binary-verification.json',D/'post-control-binary-verification.json');put(B/'post-control-apk-payload-comparison.json',D/'post-control-apk-payload-comparison.json') +identity=read(B/'identity.json') +for p,digest in identity['sources'].items():require(sha(subprocess.check_output(['git','show',identity['test_source']+':'+p]))==digest,'Frozen source mismatch') +P=Path('app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt');before=subprocess.check_output(['git','show','b417d94ab3932ae5775db22cbd5d55d802ea5e5b:'+str(P)]);after=P.read_bytes() +a=b' @Test fun bridgeCannotPublishOrReadHostApisBeforeApproval() {';b=b' @Test fun replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks() {' +require(before.split(a)[0]==after.split(a)[0] and before.split(b)[1]==after.split(b)[1],'Another test body changed') +comparison={'before_source':'b417d94ab3932ae5775db22cbd5d55d802ea5e5b','after_source':identity['test_source'],'before_sha256':sha(before),'after_sha256':sha(after),'prefix_and_suffix_outside_target_method_byte_identical':True,'production_sources_byte_identical_to':'fec0a4bf1155c08c141606f92ae8fb1feab4bba0'} +(D/'test-source-boundary.json').write_text(json.dumps(comparison,indent=2)+'\n') +C=B/'guard-control';original=(C/'ExtensionRuntime.original.kt').read_text();mutant=(C/'ExtensionRuntime.mutated.kt').read_text();delta=''.join(difflib.unified_diff(original.splitlines(keepends=True),mutant.splitlines(keepends=True),fromfile='candidate/ExtensionRuntime.kt',tofile='control/ExtensionRuntime.kt'));(D/'single-guard-mutation.diff').write_text(delta) +for n in ['audit-repair-harness-build-v1.log','audit-repair-harness-build-v2.log','audit-repair-harness-build-v3.log','audit-repair-restored-build-v1.log','audit-repair-benchmark-harness-build-v1.log']:put(Path('artifacts/webview-compatibility')/n,D/'checks'/n,redact=True) +put(C/'build.log',D/'checks/mutation-build.log',redact=True) +for v in ['debug','benchmark']:put(Path('app/build/reports/lint-results-'+v+'.xml'),D/'checks'/('lint-results-'+v+'.xml'),redact=True,xml=True) +for p in [Path(__file__),B/'build-guard-control.py',B/'run-guard-controls.py']:put(p,D/'collectors'/p.name,redact=True) +(D/'capture-original-hashes.json').write_text(json.dumps(capture_hashes,indent=2)+'\n');(D/'bindings.json').write_text(json.dumps(bindings,indent=2)+'\n');(D/'projections.json').write_text(json.dumps(projections,indent=2)+'\n') +readme=BASE/'README.md';readme.write_text('''# WebView evidence checkpoints\n\nThe original `checkpoint.json` and its 320 files retain their b417d94 identities. Its unsupported-operation preflight assertion was not sufficient to prove synchronous gate enforcement. The two affected original cohorts remain historical.\n\nUse [the repaired matrix](audit-repair/matrix.json) and [repair checkpoint](audit-repair/checkpoint.json) for current credit. The repair substitutes two newly completed whole cohorts, preserves unaffected outcomes at their original binaries, and separately records a deliberately regressed guard. The old test passes that mutant; the strengthened test fails its intended supported-operation assertion. Neither mutation result earns candidate-runtime credit.\n''') +for p in D.rglob('*.xml'):E.parse(p) +files={str(p):sha(p.read_bytes()) for root in [D,S] for p in root.rglob('*') if p.is_file()};files[str(readme)]=sha(readme.read_bytes()) +for p in files:require(str(Path.home()).encode() not in Path(p).read_bytes(),'Host path remains') +(D/'checkpoint.json').write_text(json.dumps({'public_files':files,'source_head':subprocess.check_output(['git','rev-parse','HEAD'],text=True).strip(),'scope':'Two strengthened whole cohorts plus separately classified mutation calibration; original checkpoint retained unchanged'},indent=2)+'\n') +print(json.dumps({'repair_public_files':len(files),'new_screenshots':len(list(S.rglob('*.png'))),'current_passes':sum(x['passes'] for x in matrix if not x['expected_negative']),'current_cohorts':sum(not x['expected_negative'] for x in matrix),'current_checks':sum(x['cleanup_checks'] for x in matrix),'mutation_checks':30})) diff --git a/docs/validation/webview-engine/audit-repair/collectors/run-guard-controls.py b/docs/validation/webview-engine/audit-repair/collectors/run-guard-controls.py new file mode 100644 index 00000000..90029bd8 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/collectors/run-guard-controls.py @@ -0,0 +1,28 @@ +from pathlib import Path +import json,os,re,subprocess,sys,hashlib +B=Path('artifacts/webview-compatibility/audit-repair-v1');C=B/'guard-control';identity=json.loads((C/'identity.json').read_text()) +assert identity['completed'] and identity['source_restored_exactly'] +assert hashlib.sha256((C/'app-debug.apk').read_bytes()).hexdigest()==identity['apk_sha256'] +P=Path('app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt');assert hashlib.sha256(P.read_bytes()).hexdigest()==identity['single_source_mutation']['before_sha256'] +result={'completed':False,'scope':'Counterfactual sync-guard regression only; no candidate/runtime passing credit','app_sha256':identity['apk_sha256'],'collector_sha256':hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),'cohorts':{}} +def save():(B/'guard-controls.json').write_text(json.dumps(result,indent=2)+'\n') +save() +for name,harness,insensitive in [('old-insensitive',Path('artifacts/webview-compatibility/candidate-v6/app-debug-androidTest.apk'),True),('new-sensitive',B/'app-debug-androidTest.apk',False)]: + out=C/name + command=[sys.executable,'scripts/test-webview-engine.py','--serial','emulator-5580','--avd','Tinycast_Tablet_API_36','--apk',str(C/'app-debug.apk'),'--test-apk',str(harness),'--output',str(out),'--cases','bridgeCannotPublishOrReadHostApisBeforeApproval','--font-scale','1','--layout','tablet'] + with (C/(name+'-host.log')).open('xb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk'),timeout=180) + record=json.loads((out/'record.json').read_text());log=(out/'tests.log').read_text();case=json.loads((out/'captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json').read_text()) + row={'runner_exit_code':r.returncode,'runner_completed':record['completed'],'passes':record['passes'],'failures':record['failures'],'cleanup_checks':len(record['cleanup']),'cleanup_passed':all(v['passed'] for v in record['cleanup'].values()),'test_apk_sha256':record['test_apk_sha256'],'initialization_error':record.get('initialization_error',False),'preserved_files':record['preserved_file_count']} + result['cohorts'][name]=row;save() + assert row['cleanup_passed'] and row['preserved_files']==573 and not row['initialization_error'] + assert record['apk_sha256']==identity['apk_sha256'] + if insensitive: + assert r.returncode==0 and record['completed'] and record['passes']==1 and record['failures']==0 and case['passed'] + row['insensitive_pass_on_regressed_guard']=True + else: + assert r.returncode!=0 and not record['completed'] and record['passes']==0 and record['failures']==1 + assert 'Supported fs.exists must remain blocked before approval' in log and 'NoClassDefFoundError' not in log + assert case['supported_probe_operation']=='fs.exists' and case['owned_probe_file_exists'] and case['preflight_response_ok'] is True + row['intended_supported_probe_assertion_failed']=True + save() +result['completed']=True;save();print(json.dumps(result)) diff --git a/docs/validation/webview-engine/audit-repair/identity.json b/docs/validation/webview-engine/audit-repair/identity.json new file mode 100644 index 00000000..b4d5a7fb --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/identity.json @@ -0,0 +1,255 @@ +{ + "app_source": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0", + "test_source": "29a0a5a1c1af31314c4bf543295a0f2e9956dc55", + "apks": { + "app-debug-androidTest.apk": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13", + "app-debug.apk": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "2190f43dca4d7a7eca162a7e34f46d6091cfd114d83a5e4509946c1b912ce76f", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "dd6ccf056187d184dd7fb6aa1eddeb76bd7037f4af21f749dbe379a7a2eeecde", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "36a9b4b35d22bc364ecb1f46d2d9f029e3807315a2d35d2fd231b2a86e8b49c8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "90a54967e1ab581bb6560cc837f833b005e57ecc5f306d9a228d933733722748", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + } +} diff --git a/docs/validation/webview-engine/audit-repair/matrix.json b/docs/validation/webview-engine/audit-repair/matrix.json new file mode 100644 index 00000000..c7894a50 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/matrix.json @@ -0,0 +1,112 @@ +[ + { + "cohort": "legacy100", + "passes": 7, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 10, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13", + "source": "fresh strengthened harness", + "record": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/record.json" + }, + { + "cohort": "legacy200", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 10, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/legacy200/record.json" + }, + { + "cohort": "modern-tablet100", + "passes": 5, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 15, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13", + "source": "fresh strengthened harness", + "record": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/record.json" + }, + { + "cohort": "modern-phone200", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 17, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/modern-phone200/record.json" + }, + { + "cohort": "modern-landscape200", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 17, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/modern-landscape200/record.json" + }, + { + "cohort": "review-lifecycle", + "passes": 5, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 18, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/review-lifecycle/record.json" + }, + { + "cohort": "handoff", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 18, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/handoff/record.json" + }, + { + "cohort": "paste", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 18, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/paste/record.json" + }, + { + "cohort": "legacy-common-positive", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 10, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/legacy-common-positive/record.json" + }, + { + "cohort": "legacy-common-negative", + "passes": 0, + "junit_failures": 1, + "expected_negative": true, + "cleanup_checks": 10, + "app_sha256": "b0fa0e302a63320b6e5ed163856756961b4480a1ce476f4cb6167be799535e54", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e", + "source": "retained original scope, unaffected method bodies", + "record": "docs/validation/webview-engine/cohorts/legacy-common-negative/record.json" + } +] diff --git a/docs/validation/webview-engine/audit-repair/mutation-calibration.json b/docs/validation/webview-engine/audit-repair/mutation-calibration.json new file mode 100644 index 00000000..4afb4aaa --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/mutation-calibration.json @@ -0,0 +1,32 @@ +{ + "completed": true, + "scope": "Counterfactual sync-guard regression only; no candidate/runtime passing credit", + "app_sha256": "3ca7729b9bce2a2594ce513b087fb43661eaffe9db3632b45540a8acf794a147", + "collector_sha256": "c185408d7bc789e9701450c6676f812f1c410750ec86c400e416b387b99bdc36", + "cohorts": { + "old-insensitive": { + "runner_exit_code": 0, + "runner_completed": true, + "passes": 1, + "failures": 0, + "cleanup_checks": 15, + "cleanup_passed": true, + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e", + "initialization_error": false, + "preserved_files": 573, + "insensitive_pass_on_regressed_guard": true + }, + "new-sensitive": { + "runner_exit_code": 1, + "runner_completed": false, + "passes": 0, + "failures": 1, + "cleanup_checks": 15, + "cleanup_passed": true, + "test_apk_sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13", + "initialization_error": false, + "preserved_files": 573, + "intended_supported_probe_assertion_failed": true + } + } +} diff --git a/docs/validation/webview-engine/audit-repair/mutation-identity.json b/docs/validation/webview-engine/audit-repair/mutation-identity.json new file mode 100644 index 00000000..ffe4b811 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/mutation-identity.json @@ -0,0 +1,146 @@ +{ + "completed": true, + "purpose": "Synthetic approval-guard regression control only; never a candidate", + "source_parent": "29a0a5a1c1af31314c4bf543295a0f2e9956dc55", + "runtime_source": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0", + "build_stamp": "local", + "single_source_mutation": { + "path": "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt", + "before_sha256": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "after_sha256": "1ee9a7f729cc6e4e03b2135a38092c317139f6d954f4857976976c0a8b117359", + "before": "check(authorized()) { \"This command session has ended\" }", + "after": "check(active()) { \"This command session has ended\" }" + }, + "main_source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "36a9b4b35d22bc364ecb1f46d2d9f029e3807315a2d35d2fd231b2a86e8b49c8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "1ee9a7f729cc6e4e03b2135a38092c317139f6d954f4857976976c0a8b117359", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "recipe": [ + "./gradlew", + "-PdroidcastBuildCommit=local", + ":app:assembleDebug", + "--console=plain" + ], + "source_mutation_applied": true, + "build_exit_code": 0, + "apk_sha256": "3ca7729b9bce2a2594ce513b087fb43661eaffe9db3632b45540a8acf794a147", + "assets": { + "assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5" + }, + "source_restored_exactly": true +} diff --git a/docs/validation/webview-engine/audit-repair/post-control-apk-payload-comparison.json b/docs/validation/webview-engine/audit-repair/post-control-apk-payload-comparison.json new file mode 100644 index 00000000..3a9540e7 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/post-control-apk-payload-comparison.json @@ -0,0 +1,9 @@ +{ + "candidate_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "unused_rebuild_sha256": "5daa4f10081586741d6c7a731bfeec8ae98f2c7dd21094da8e9e16a79c51391e", + "changed_uncompressed_entries": [], + "added_entries": [], + "removed_entries": [], + "rebuild_not_device_executed": true, + "no_binary_equivalence_assumed": true +} diff --git a/docs/validation/webview-engine/audit-repair/post-control-binary-verification.json b/docs/validation/webview-engine/audit-repair/post-control-binary-verification.json new file mode 100644 index 00000000..e359b7f2 --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/post-control-binary-verification.json @@ -0,0 +1,14 @@ +{ + "completed": true, + "source_restored_exactly": true, + "outputs": { + "app-debug.apk": { + "sha256": "5daa4f10081586741d6c7a731bfeec8ae98f2c7dd21094da8e9e16a79c51391e", + "equals_frozen": false + }, + "app-debug-androidTest.apk": { + "sha256": "1e450e764acb313da8250430653c3b2ab9f90492e4a8abefb58f39a4b5966f13", + "equals_frozen": true + } + } +} diff --git a/docs/validation/webview-engine/audit-repair/projections.json b/docs/validation/webview-engine/audit-repair/projections.json new file mode 100644 index 00000000..cac3dcac --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/projections.json @@ -0,0 +1,404 @@ +[ + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/record.json", + "original_sha256": "4fb582bc78c4e7dfb034527360ae1eadc809c75b7631f85a2e82106efd988a8b", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/record.json", + "public_sha256": "ad7e88293cd91a52cf0f8d637f5cc1c4b2cb868adf146e5b96b674182f48e981", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "font_scale", + "initialization_error", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "original_sha256": "11c6c54b99b4f6cfe99e4c3d1d1f47aeddb74c2f95479a4f785c35aa1c636102", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "public_sha256": "7cd6077a0443c4b005a2d8fc61aa3fad34f7b9184b12564071b33b7b44269193", + "keys": [ + "android_api", + "api_probe_result", + "case", + "compile_body_executed", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "invalid_syntax_caught", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json", + "original_sha256": "97d65112b124768562593b11f94cf73d5073cbf39efe05104b80624eed68cdc5", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json", + "public_sha256": "8bc8c53c022e507ea57c8d33177697991090b77470f3b5cd33461643a986e885", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "replacement_not_closed", + "scope", + "stale_settings_launches" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "original_sha256": "6abd7dd20dbcadbc569fd8b6245170e270d15af3c92942ad238593cf31ba3924", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "public_sha256": "8caf4234ce0002c887061b6cf9944b686016eccbeab77d4bd49eaf778c12b698", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "published_native_tree", + "runtime_error", + "scope", + "target_witnesses", + "text_setup", + "text_witnesses", + "time_to_result_ms" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "original_sha256": "de06ea98b9c5a9915df8e4d8aaafff835990f82fa37c7f039fc71ca219b62629", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "public_sha256": "720ad6cb641a41f0282141d2b1922568918ca827cd2f30d969e5db2c4369a55e", + "keys": [ + "android_api", + "approved_control_scope", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "owned_probe_file_exists", + "palette_preferences_restored", + "passed", + "preflight_bridge_render_rejected", + "preflight_host_api_rejected", + "preflight_response_ok", + "provider", + "provider_version", + "scope", + "supported_probe_operation" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json", + "original_sha256": "c917aa6150c089979ce2cd5b81b1440f1ea2cf5cb43d1423d506085484d50e50", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json", + "public_sha256": "d3ad0df1ce62d9f4ab2b7f40043680c88ed80d26aa9430126630f66b4b0d4249", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "fresh_recovery_actions", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope", + "second_failure_scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json", + "original_sha256": "fb70a0f9251f9083afd6b232921af6fd9743475a872477e1172dcea56ad20a29", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json", + "public_sha256": "95d287a73a6d1d314bf4f87ec47faa4b08cc465bd3ec06029aa1ec2f280096a2", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "explicit_settings_destination", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/legacy100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json", + "original_sha256": "3b612ffe2a5d184256353b3667b33ea884e39d180474aed52bb3fbf878d34cb1", + "public": "docs/validation/webview-engine/audit-repair/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json", + "public_sha256": "eb8d31e19536ad01d656743a302c97d35589442855a95c852b8fe4ed55bf0cc0", + "keys": [ + "android_api", + "case", + "closed_owner_remained_inactive", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/record.json", + "original_sha256": "98d138a70f4383a33d0fb699569ec7a19d22f8ae00efdbcf85cbc522d9d7f6ec", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/record.json", + "public_sha256": "5a59984cbd1f36867f80d94111a7259ad3a9422c687f9806cf8b82e3c6fd3d97", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "font_scale", + "initialization_error", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "preserved_file_count", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "original_sha256": "4ae147a3c447fbf2f7e5b1c5dd146777b4048885b3f762374946c3c26a9db4b9", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "public_sha256": "88c350479c1648c33a7177eee77a4296c020edd40f121f26fd7cee92e8a5c1fc", + "keys": [ + "android_api", + "api_probe_result", + "case", + "compile_body_executed", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "invalid_syntax_caught", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "original_sha256": "466d124add945e67d2a27fc8606e4a7bbdf68a36c2c464d46e3ee4febd0047f2", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "public_sha256": "38bbb01bbd1e24021236748b5610acfbe7d443b3e5b24ed3e5f59c0c1872acc7", + "keys": [ + "android_api", + "approved_owned_file_exists", + "approved_response_ok", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "owned_probe_file_exists", + "palette_preferences_restored", + "passed", + "preflight_bridge_render_rejected", + "preflight_host_api_rejected", + "preflight_response_ok", + "provider", + "provider_version", + "same_engine_bridge_operation_and_arguments", + "scope", + "supported_probe_operation" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-modern-engine-publishes-list-and-runs-live-action.json", + "original_sha256": "38fe51bdf2ecf8e04561064e6458618aa06de976069519a2b26121abec8ab1c3", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json", + "public_sha256": "e6664805edc8f79735927921e8f865bac66c27b6263447f5b08d59c2ddeebcbf", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json", + "original_sha256": "fe8d5144203cdd855f95536b25f284bd9d0d5d0b3bd68159e0ff6bfee6cd35df", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json", + "public_sha256": "0b8ef08e2d3a3f069b06cbd902102c05fed9616c46cd3861eaf2a612a3d4f7e8", + "keys": [ + "android_api", + "case", + "closed_owner_remained_inactive", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/modern-tablet100/captures/case-modern-engine-publishes-grid-and-runs-live-action.json", + "original_sha256": "a5cb1c3d00a82dbd5bb1ba859ad9f4f3e900074f46f4a102b9edac2e578bd123", + "public": "docs/validation/webview-engine/audit-repair/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json", + "public_sha256": "351178b7b5be62be589baa2eaed7e076f4db28c18ccd1d632513162b0ab5624f", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/old-insensitive/record.json", + "original_sha256": "c100b40e6722847acd64320d3c9e4b81403178283ed81945cd9f9d48991db9a1", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/record.json", + "public_sha256": "657effb5f3699614599d71771ad10bbb5ee0fe07b168f7e03710da9310ffa5c0", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "font_scale", + "initialization_error", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "preserved_file_count", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/old-insensitive/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "original_sha256": "b0bbf4bf9728488dae820b65b5cec4c00df79a369dcd0190f669bf7c552a1025", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-old-insensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "public_sha256": "356bd11ec3f23a17f104a412417855f6179c252f40ded3146ad32ee51b726542", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "preflight_bridge_render_rejected", + "preflight_host_api_rejected", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/record.json", + "original_sha256": "c906d8f1b01cc5ecc9728e905f846ed05ac4aa8d55d80bb326fc687f25371fb3", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/record.json", + "public_sha256": "81a85c9122ccd0dc47861344b794968a92e7fa167b6d763adcb603abd6d09f02", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "font_scale", + "initialization_error", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "preserved_file_count", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/audit-repair-v1/guard-control/new-sensitive/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "original_sha256": "d017da1b338f46961fed8b93bf6b2f7f67b62ed7ec8c071168293e2aecb486a5", + "public": "docs/validation/webview-engine/audit-repair/cohorts/mutant-new-sensitive/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "public_sha256": "eaa5c1533b5ce7ba2d2775458e3f2b98ae32520a1af1c3b74218e2cc34c524db", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "owned_probe_file_exists", + "palette_preferences_restored", + "preflight_response_ok", + "provider", + "provider_version", + "scope", + "supported_probe_operation" + ] + } +] diff --git a/docs/validation/webview-engine/audit-repair/single-guard-mutation.diff b/docs/validation/webview-engine/audit-repair/single-guard-mutation.diff new file mode 100644 index 00000000..a1a0b46a --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/single-guard-mutation.diff @@ -0,0 +1,11 @@ +--- candidate/ExtensionRuntime.kt ++++ control/ExtensionRuntime.kt +@@ -238,7 +238,7 @@ + } + } + @JavascriptInterface fun invokeSync(api: String, method: String, raw: String): String = try { +- check(authorized()) { "This command session has ended" } ++ check(active()) { "This command session has ended" } + JSONObject().put("ok", true).put("value", syncCall(api, method, JSONArray(raw)) ?: JSONObject.NULL).toString() + } catch (e: Throwable) { + post { catalog.releaseText(textContext.owner) } diff --git a/docs/validation/webview-engine/audit-repair/test-source-boundary.json b/docs/validation/webview-engine/audit-repair/test-source-boundary.json new file mode 100644 index 00000000..a6d908ec --- /dev/null +++ b/docs/validation/webview-engine/audit-repair/test-source-boundary.json @@ -0,0 +1,8 @@ +{ + "before_source": "b417d94ab3932ae5775db22cbd5d55d802ea5e5b", + "after_source": "29a0a5a1c1af31314c4bf543295a0f2e9956dc55", + "before_sha256": "2243287970c4fd8a9a5df85d9583b754958d87f03384622f9984917470327c48", + "after_sha256": "dd6ccf056187d184dd7fb6aa1eddeb76bd7037f4af21f749dbe379a7a2eeecde", + "prefix_and_suffix_outside_target_method_byte_identical": true, + "production_sources_byte_identical_to": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0" +} diff --git a/docs/validation/webview-engine/bindings.json b/docs/validation/webview-engine/bindings.json new file mode 100644 index 00000000..c5b1e997 --- /dev/null +++ b/docs/validation/webview-engine/bindings.json @@ -0,0 +1,1892 @@ +[ + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/tests.log", + "original_sha256": "de9393bdba11060fba3c2093336bf5359fe90462072a0e2e97390815a677a505", + "public": "docs/validation/webview-engine/cohorts/legacy100/tests.log", + "public_sha256": "de9393bdba11060fba3c2093336bf5359fe90462072a0e2e97390815a677a505", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/cancelled-caller-frame.json", + "original_sha256": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller-frame.json", + "public_sha256": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/cancelled-caller.png", + "original_sha256": "d88dd45591560ffcc38f1007bb95be10801c0663cd55612d208d016a9535a0cc", + "public": "docs/screenshots/webview-engine/legacy100/cancelled-caller.png", + "public_sha256": "d88dd45591560ffcc38f1007bb95be10801c0663cd55612d208d016a9535a0cc", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/cancelled-caller.xml", + "original_sha256": "e4cda8872bf99ee0aaa58fc21c652cf2e678a862840d23562c47faab89ae0c50", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller.xml", + "public_sha256": "e4cda8872bf99ee0aaa58fc21c652cf2e678a862840d23562c47faab89ae0c50", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-content-end-frame.json", + "original_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end-frame.json", + "public_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-content-end.png", + "original_sha256": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "public": "docs/screenshots/webview-engine/legacy100/engine-content-end.png", + "public_sha256": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-content-end.xml", + "original_sha256": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end.xml", + "public_sha256": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-result-frame.json", + "original_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/engine-result-frame.json", + "public_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-result.png", + "original_sha256": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "public": "docs/screenshots/webview-engine/legacy100/engine-result.png", + "public_sha256": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-result.xml", + "original_sha256": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/engine-result.xml", + "public_sha256": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/equivalent-failure-ready-frame.json", + "original_sha256": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready-frame.json", + "public_sha256": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/equivalent-failure-ready.png", + "original_sha256": "7dc348e17e6e1dfcfda52fc43980afa0550bfe62c9c37cb23a16021c300e2a70", + "public": "docs/screenshots/webview-engine/legacy100/equivalent-failure-ready.png", + "public_sha256": "7dc348e17e6e1dfcfda52fc43980afa0550bfe62c9c37cb23a16021c300e2a70", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/equivalent-failure-ready.xml", + "original_sha256": "ff4d50abc1521516735a243367b05e3f3f50d3205dbd438b3f8bab43e1e8fd9e", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready.xml", + "public_sha256": "ff4d50abc1521516735a243367b05e3f3f50d3205dbd438b3f8bab43e1e8fd9e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/returned-caller-frame.json", + "original_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller-frame.json", + "public_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/returned-caller.png", + "original_sha256": "6897cb03102fa7b5f339bcb029c8c276bb0d0cf59e89eba314e339d478730ff1", + "public": "docs/screenshots/webview-engine/legacy100/returned-caller.png", + "public_sha256": "6897cb03102fa7b5f339bcb029c8c276bb0d0cf59e89eba314e339d478730ff1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/returned-caller.xml", + "original_sha256": "6f377b28131b59c4b5c5d97645976fd7cdf895151341806243dc164ee2ae50ce", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller.xml", + "public_sha256": "6f377b28131b59c4b5c5d97645976fd7cdf895151341806243dc164ee2ae50ce", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-before-frame.json", + "original_sha256": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/settings-before-frame.json", + "public_sha256": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-before.png", + "original_sha256": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "public": "docs/screenshots/webview-engine/legacy100/settings-before.png", + "public_sha256": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-before.xml", + "original_sha256": "85dc53eaf4242cc42c7400f29c888ad7648e6a38644b13ab88f9c3a1b58cfbe0", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/settings-before.xml", + "public_sha256": "85dc53eaf4242cc42c7400f29c888ad7648e6a38644b13ab88f9c3a1b58cfbe0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-destination-frame.json", + "original_sha256": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination-frame.json", + "public_sha256": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-destination.png", + "original_sha256": "b9a660c45cc8558cfb3cc4a96a864782c7fa6ef6a824b1bcd7ab97e740665cba", + "public": "docs/screenshots/webview-engine/legacy100/settings-destination.png", + "public_sha256": "b9a660c45cc8558cfb3cc4a96a864782c7fa6ef6a824b1bcd7ab97e740665cba", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-destination.xml", + "original_sha256": "53d746ab5468ee4c8476e9804526d7aeacb22d394b960a8d5345789cb391da4d", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination.xml", + "public_sha256": "53d746ab5468ee4c8476e9804526d7aeacb22d394b960a8d5345789cb391da4d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-returned-frame.json", + "original_sha256": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned-frame.json", + "public_sha256": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-returned.png", + "original_sha256": "4986a43f08bbff2c08291bf88fa7c92d80750bba03d63db579401e514e4ac10d", + "public": "docs/screenshots/webview-engine/legacy100/settings-returned.png", + "public_sha256": "4986a43f08bbff2c08291bf88fa7c92d80750bba03d63db579401e514e4ac10d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-returned.xml", + "original_sha256": "87c55949845dc0f253c7b3c02a3c52d447db45fef605b4d065b48286486145bd", + "public": "docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned.xml", + "public_sha256": "87c55949845dc0f253c7b3c02a3c52d447db45fef605b4d065b48286486145bd", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/tests.log", + "original_sha256": "6de326c355448953d55bc13a04ce63b7746095d88d54abc7c5ad069038e38541", + "public": "docs/validation/webview-engine/cohorts/legacy200/tests.log", + "public_sha256": "6de326c355448953d55bc13a04ce63b7746095d88d54abc7c5ad069038e38541", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-content-end-frame.json", + "original_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end-frame.json", + "public_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-content-end.png", + "original_sha256": "8b2a952da451c4b7a3dd28f88bf6afc571744a3b9b7579b690c84eb48874aae9", + "public": "docs/screenshots/webview-engine/legacy200/engine-content-end.png", + "public_sha256": "8b2a952da451c4b7a3dd28f88bf6afc571744a3b9b7579b690c84eb48874aae9", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-content-end.xml", + "original_sha256": "50d7800ef809e1927cc2265dabe07690c86f5facffd9a625eafb26606d5eab6b", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end.xml", + "public_sha256": "50d7800ef809e1927cc2265dabe07690c86f5facffd9a625eafb26606d5eab6b", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-result-frame.json", + "original_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/engine-result-frame.json", + "public_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-result.png", + "original_sha256": "a7d80ec7416327aff6cf6441f2344782f8a051b70d805e2b8992aa8fe0ab64b1", + "public": "docs/screenshots/webview-engine/legacy200/engine-result.png", + "public_sha256": "a7d80ec7416327aff6cf6441f2344782f8a051b70d805e2b8992aa8fe0ab64b1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-result.xml", + "original_sha256": "c7cc8bb5294ef891400f326e91171ff871e7764e4b5ad58d011aa942959e4423", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/engine-result.xml", + "public_sha256": "c7cc8bb5294ef891400f326e91171ff871e7764e4b5ad58d011aa942959e4423", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/returned-caller-frame.json", + "original_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller-frame.json", + "public_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/returned-caller.png", + "original_sha256": "9933a6dcc0ceb10bdf027a64f919faebd032d36eaf87ebfbc3be7dfe4c1d70f6", + "public": "docs/screenshots/webview-engine/legacy200/returned-caller.png", + "public_sha256": "9933a6dcc0ceb10bdf027a64f919faebd032d36eaf87ebfbc3be7dfe4c1d70f6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/returned-caller.xml", + "original_sha256": "637bfde86e077957869fee312146176cedea5ed24e58adae010eba21f42c132e", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller.xml", + "public_sha256": "637bfde86e077957869fee312146176cedea5ed24e58adae010eba21f42c132e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-before-frame.json", + "original_sha256": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/settings-before-frame.json", + "public_sha256": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-before.png", + "original_sha256": "38c8acb7af23e9de1d684016f194d9946f9b0f73d7e34ef164270e7ebf67f431", + "public": "docs/screenshots/webview-engine/legacy200/settings-before.png", + "public_sha256": "38c8acb7af23e9de1d684016f194d9946f9b0f73d7e34ef164270e7ebf67f431", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-before.xml", + "original_sha256": "3ec0255562bf8d0521b211e1a726b3d2611fd57e4d0c743499125be5debbe43a", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/settings-before.xml", + "public_sha256": "3ec0255562bf8d0521b211e1a726b3d2611fd57e4d0c743499125be5debbe43a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-destination-frame.json", + "original_sha256": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination-frame.json", + "public_sha256": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-destination.png", + "original_sha256": "a27c30f0f92f2c64caab830c9095b5489435f60f3bfdea6a05a1607b90b5a727", + "public": "docs/screenshots/webview-engine/legacy200/settings-destination.png", + "public_sha256": "a27c30f0f92f2c64caab830c9095b5489435f60f3bfdea6a05a1607b90b5a727", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-destination.xml", + "original_sha256": "907e52972fe9a5eaa501de39c47fc405899041916c98f7eb40a2f508b40849c1", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination.xml", + "public_sha256": "907e52972fe9a5eaa501de39c47fc405899041916c98f7eb40a2f508b40849c1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-returned-frame.json", + "original_sha256": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned-frame.json", + "public_sha256": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-returned.png", + "original_sha256": "41bd8855f8ed5a586e2a1177604068beddb069b62b20f5cff9c5eab973b8d79e", + "public": "docs/screenshots/webview-engine/legacy200/settings-returned.png", + "public_sha256": "41bd8855f8ed5a586e2a1177604068beddb069b62b20f5cff9c5eab973b8d79e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-returned.xml", + "original_sha256": "4d69e931558513e73f363e87c7b266fe7fe8220b7dd82a4d63b78d016589d37c", + "public": "docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned.xml", + "public_sha256": "4d69e931558513e73f363e87c7b266fe7fe8220b7dd82a4d63b78d016589d37c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/tests.log", + "original_sha256": "1c943b07c045b179f064c0269d7b954481dd09346a729040332475acb03e2a95", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/tests.log", + "public_sha256": "1c943b07c045b179f064c0269d7b954481dd09346a729040332475acb03e2a95", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/cancelled-caller-frame.json", + "original_sha256": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller-frame.json", + "public_sha256": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/cancelled-caller.png", + "original_sha256": "2c2947ea2f9f2de0c804b74bbc8fb436efb21bfff76b639ac2708d753cb83bd9", + "public": "docs/screenshots/webview-engine/modern-tablet100/cancelled-caller.png", + "public_sha256": "2c2947ea2f9f2de0c804b74bbc8fb436efb21bfff76b639ac2708d753cb83bd9", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/cancelled-caller.xml", + "original_sha256": "0fa66c0d6150de84650afdea64bffeaea57243b24593426f1de1d8b6f961d0ae", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller.xml", + "public_sha256": "0fa66c0d6150de84650afdea64bffeaea57243b24593426f1de1d8b6f961d0ae", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-action-frame.json", + "original_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action-frame.json", + "public_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-action.png", + "original_sha256": "e589c57f78f3f008531af87cb5c5a7e41b567fe12c568b87c323574d29b82d9a", + "public": "docs/screenshots/webview-engine/modern-tablet100/grid-action.png", + "public_sha256": "e589c57f78f3f008531af87cb5c5a7e41b567fe12c568b87c323574d29b82d9a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-action.xml", + "original_sha256": "691ec075b883325a1c26065a37c1f90263f4b83eafe738436f6fef3d443538ad", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action.xml", + "public_sha256": "691ec075b883325a1c26065a37c1f90263f4b83eafe738436f6fef3d443538ad", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-ready-frame.json", + "original_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready-frame.json", + "public_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-ready.png", + "original_sha256": "4000555e2fb013b55d678efa11dfe62a67633f2eee2bd2d68b385179f4ca7f7f", + "public": "docs/screenshots/webview-engine/modern-tablet100/grid-ready.png", + "public_sha256": "4000555e2fb013b55d678efa11dfe62a67633f2eee2bd2d68b385179f4ca7f7f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-ready.xml", + "original_sha256": "c84e25ac075792d3b3ce8286180abd80b73395165c4dacbb7c7cc9a31c640c80", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready.xml", + "public_sha256": "c84e25ac075792d3b3ce8286180abd80b73395165c4dacbb7c7cc9a31c640c80", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-returned-frame.json", + "original_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned-frame.json", + "public_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-returned.png", + "original_sha256": "fb27453caf5c0ce3df1ae5721170c37cb6910df8bb28cd6ea1c4ef038e7954b8", + "public": "docs/screenshots/webview-engine/modern-tablet100/grid-returned.png", + "public_sha256": "fb27453caf5c0ce3df1ae5721170c37cb6910df8bb28cd6ea1c4ef038e7954b8", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-returned.xml", + "original_sha256": "bfcbc0b0ccb34ec08fe68dcba0b182641ad75a83d9dda16ddd757ee41a31af2e", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned.xml", + "public_sha256": "bfcbc0b0ccb34ec08fe68dcba0b182641ad75a83d9dda16ddd757ee41a31af2e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-action-frame.json", + "original_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action-frame.json", + "public_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-action.png", + "original_sha256": "22973ca816c02f03aa8161cea1a6ff302a4e27ed3a8d0e5cad40b41bfde3d6e9", + "public": "docs/screenshots/webview-engine/modern-tablet100/index-action.png", + "public_sha256": "22973ca816c02f03aa8161cea1a6ff302a4e27ed3a8d0e5cad40b41bfde3d6e9", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-action.xml", + "original_sha256": "54b855c566b281ebf8f6962198f2387052141055f5f29bceb2c5479297e756db", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action.xml", + "public_sha256": "54b855c566b281ebf8f6962198f2387052141055f5f29bceb2c5479297e756db", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-ready-frame.json", + "original_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready-frame.json", + "public_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-ready.png", + "original_sha256": "9700e26789709414955c4a2b6ce44923a9efcee9b7bdc7e661b75c69ff93d016", + "public": "docs/screenshots/webview-engine/modern-tablet100/index-ready.png", + "public_sha256": "9700e26789709414955c4a2b6ce44923a9efcee9b7bdc7e661b75c69ff93d016", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-ready.xml", + "original_sha256": "1078fe0987c5a3eaca42913c68b7ca8a060e16a15614a0c85efeeb88bfdc67d7", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready.xml", + "public_sha256": "1078fe0987c5a3eaca42913c68b7ca8a060e16a15614a0c85efeeb88bfdc67d7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-returned-frame.json", + "original_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned-frame.json", + "public_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-returned.png", + "original_sha256": "4065cfe0d3cfe7d878d8a57c49ff5cfd373abf3f31dd94c7c5c5410b7fd979e2", + "public": "docs/screenshots/webview-engine/modern-tablet100/index-returned.png", + "public_sha256": "4065cfe0d3cfe7d878d8a57c49ff5cfd373abf3f31dd94c7c5c5410b7fd979e2", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-returned.xml", + "original_sha256": "3be7a65d160f5ddbf741d565fd325c095435070665a645f573e4b6a8f6a682f8", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned.xml", + "public_sha256": "3be7a65d160f5ddbf741d565fd325c095435070665a645f573e4b6a8f6a682f8", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/tests.log", + "original_sha256": "eb4ab0b12dd90732b66cfa48cb83e4ea9f5b51df76468a17f097ec822de2a9f2", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/tests.log", + "public_sha256": "eb4ab0b12dd90732b66cfa48cb83e4ea9f5b51df76468a17f097ec822de2a9f2", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-action-frame.json", + "original_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action-frame.json", + "public_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-action.png", + "original_sha256": "bc31772126525a3da768ff7ca8ee4069068513674e3e2e45f28206f1a8ea6d2e", + "public": "docs/screenshots/webview-engine/modern-phone200/grid-action.png", + "public_sha256": "bc31772126525a3da768ff7ca8ee4069068513674e3e2e45f28206f1a8ea6d2e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-action.xml", + "original_sha256": "f265899988038baa5b07efb6300e789ae972afd9f760f6cba29d4f05fd9adcd7", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action.xml", + "public_sha256": "f265899988038baa5b07efb6300e789ae972afd9f760f6cba29d4f05fd9adcd7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-ready-frame.json", + "original_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready-frame.json", + "public_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-ready.png", + "original_sha256": "c6f3d15354476e3343c818c0bbeec7d1919050c0ae3d3f769f603e52689bd37f", + "public": "docs/screenshots/webview-engine/modern-phone200/grid-ready.png", + "public_sha256": "c6f3d15354476e3343c818c0bbeec7d1919050c0ae3d3f769f603e52689bd37f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-ready.xml", + "original_sha256": "814b7c3075b75480c063e1dbafb1615c0a67dfd6c163b47267cceb3a2440fd68", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready.xml", + "public_sha256": "814b7c3075b75480c063e1dbafb1615c0a67dfd6c163b47267cceb3a2440fd68", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-returned-frame.json", + "original_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned-frame.json", + "public_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-returned.png", + "original_sha256": "3c6bd7a65f5f27526cdf1700d69616153d16e0c9ea6c623c59c4cd15a1137e5a", + "public": "docs/screenshots/webview-engine/modern-phone200/grid-returned.png", + "public_sha256": "3c6bd7a65f5f27526cdf1700d69616153d16e0c9ea6c623c59c4cd15a1137e5a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-returned.xml", + "original_sha256": "c44c10bf36350f3c752e288bac98a7a777f8e99ad1cf72f47407add255c50a9b", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned.xml", + "public_sha256": "c44c10bf36350f3c752e288bac98a7a777f8e99ad1cf72f47407add255c50a9b", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-action-frame.json", + "original_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action-frame.json", + "public_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-action.png", + "original_sha256": "ab1cf4b8353df8d861ebe94a445265a820103593064ae27c073d2af7bc85a74d", + "public": "docs/screenshots/webview-engine/modern-phone200/index-action.png", + "public_sha256": "ab1cf4b8353df8d861ebe94a445265a820103593064ae27c073d2af7bc85a74d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-action.xml", + "original_sha256": "77de345a9a3cef3031ebfc3c31a3969a5f00ff00202c07db7781dfe98d04e93b", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action.xml", + "public_sha256": "77de345a9a3cef3031ebfc3c31a3969a5f00ff00202c07db7781dfe98d04e93b", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-ready-frame.json", + "original_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready-frame.json", + "public_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-ready.png", + "original_sha256": "29b0c2f5ab7f9cbc999f8b410e604a34f132a9028d5b014f1792a08098c8041a", + "public": "docs/screenshots/webview-engine/modern-phone200/index-ready.png", + "public_sha256": "29b0c2f5ab7f9cbc999f8b410e604a34f132a9028d5b014f1792a08098c8041a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-ready.xml", + "original_sha256": "527337fa118406dda30e3b34f9f795496625569e3c40b5c03f5226570f093023", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready.xml", + "public_sha256": "527337fa118406dda30e3b34f9f795496625569e3c40b5c03f5226570f093023", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-returned-frame.json", + "original_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned-frame.json", + "public_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-returned.png", + "original_sha256": "20d90b982e0a5578af0d2afa1caa9d3cd91f50ccb81790b4d594c267aa321808", + "public": "docs/screenshots/webview-engine/modern-phone200/index-returned.png", + "public_sha256": "20d90b982e0a5578af0d2afa1caa9d3cd91f50ccb81790b4d594c267aa321808", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-returned.xml", + "original_sha256": "c404699f48a4b89ac705c5242f0d0b458a3281fce46c315343605ffb0e0b1e6e", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned.xml", + "public_sha256": "c404699f48a4b89ac705c5242f0d0b458a3281fce46c315343605ffb0e0b1e6e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/tests.log", + "original_sha256": "3c66113778381fb7d92e873238ed97cbb21201edca2be896a7c5ad56b5ecb774", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/tests.log", + "public_sha256": "3c66113778381fb7d92e873238ed97cbb21201edca2be896a7c5ad56b5ecb774", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-action-frame.json", + "original_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action-frame.json", + "public_sha256": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-action.png", + "original_sha256": "43be585ec64c1b38789bf29ec6ee6525ffaf428631867cd7dd668006f78ec12f", + "public": "docs/screenshots/webview-engine/modern-landscape200/grid-action.png", + "public_sha256": "43be585ec64c1b38789bf29ec6ee6525ffaf428631867cd7dd668006f78ec12f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-action.xml", + "original_sha256": "08cef980814d25771375d53676c00cf47ccc94f0823da3cdfe68c85daa5ea927", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action.xml", + "public_sha256": "08cef980814d25771375d53676c00cf47ccc94f0823da3cdfe68c85daa5ea927", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-ready-frame.json", + "original_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready-frame.json", + "public_sha256": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-ready.png", + "original_sha256": "8234d629b85ffec36418ef84006fc6530d685fa687401b5d765648f272669d9d", + "public": "docs/screenshots/webview-engine/modern-landscape200/grid-ready.png", + "public_sha256": "8234d629b85ffec36418ef84006fc6530d685fa687401b5d765648f272669d9d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-ready.xml", + "original_sha256": "d682b0381ff28f0ca21dfc8f83fc51af26415ddee3565987bc1eff76e18bcb34", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready.xml", + "public_sha256": "d682b0381ff28f0ca21dfc8f83fc51af26415ddee3565987bc1eff76e18bcb34", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-returned-frame.json", + "original_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned-frame.json", + "public_sha256": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-returned.png", + "original_sha256": "8e579c4517c17ca4da14d4fb34cf2fb4b3f270a3a0e09ee35fed446d98568980", + "public": "docs/screenshots/webview-engine/modern-landscape200/grid-returned.png", + "public_sha256": "8e579c4517c17ca4da14d4fb34cf2fb4b3f270a3a0e09ee35fed446d98568980", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-returned.xml", + "original_sha256": "2e97a1c31726d3318c20027585231cc6ed463c6c3236fea4325b8475be8d2bb7", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned.xml", + "public_sha256": "2e97a1c31726d3318c20027585231cc6ed463c6c3236fea4325b8475be8d2bb7", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-action-frame.json", + "original_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action-frame.json", + "public_sha256": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-action.png", + "original_sha256": "57608b419ddcec22285f0e5462c05556f4d0ffeb7352555910e7d9bc7f004b78", + "public": "docs/screenshots/webview-engine/modern-landscape200/index-action.png", + "public_sha256": "57608b419ddcec22285f0e5462c05556f4d0ffeb7352555910e7d9bc7f004b78", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-action.xml", + "original_sha256": "8f52818a85649779027eb3fee58be645b7b0290f6ae66b562908b5af7bac9294", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action.xml", + "public_sha256": "8f52818a85649779027eb3fee58be645b7b0290f6ae66b562908b5af7bac9294", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-ready-frame.json", + "original_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready-frame.json", + "public_sha256": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-ready.png", + "original_sha256": "5c7b1710fed5a8cc3f2f43d8665b455d9adc0dc4d3c4cdc4b8713365ec9b2916", + "public": "docs/screenshots/webview-engine/modern-landscape200/index-ready.png", + "public_sha256": "5c7b1710fed5a8cc3f2f43d8665b455d9adc0dc4d3c4cdc4b8713365ec9b2916", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-ready.xml", + "original_sha256": "c5c85d6b3c62b5bba6e4724310fc8bcfc2e23debdd10d6776e1478757e06558a", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready.xml", + "public_sha256": "c5c85d6b3c62b5bba6e4724310fc8bcfc2e23debdd10d6776e1478757e06558a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-returned-frame.json", + "original_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned-frame.json", + "public_sha256": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-returned.png", + "original_sha256": "821a8c24d78be36d29e21dd6b58baa24b7492db361d05dc7caf96faa3f8b0b57", + "public": "docs/screenshots/webview-engine/modern-landscape200/index-returned.png", + "public_sha256": "821a8c24d78be36d29e21dd6b58baa24b7492db361d05dc7caf96faa3f8b0b57", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-returned.xml", + "original_sha256": "696e89af8f3e481ffe7318180f70b3bde293f8841a29dd77855932b06c682aee", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned.xml", + "public_sha256": "696e89af8f3e481ffe7318180f70b3bde293f8841a29dd77855932b06c682aee", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/tests.log", + "original_sha256": "a1b96867f9572804e032189e717fb9c94d122179802976762daba6e1d9812b14", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/tests.log", + "public_sha256": "a1b96867f9572804e032189e717fb9c94d122179802976762daba6e1d9812b14", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json", + "original_sha256": "e291b2bb6228faf6a662154e4e8ea2376812a0a945ac5bbe0db42dcfbda8c316", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json", + "public_sha256": "e291b2bb6228faf6a662154e4e8ea2376812a0a945ac5bbe0db42dcfbda8c316", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png", + "original_sha256": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png", + "public_sha256": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml", + "original_sha256": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml", + "public_sha256": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json", + "original_sha256": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json", + "public_sha256": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png", + "original_sha256": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png", + "public_sha256": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml", + "original_sha256": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml", + "public_sha256": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json", + "original_sha256": "b60970c88bb471c96f9ba4a2d7c755be802787105885d4e9c656d42603adacaa", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json", + "public_sha256": "b60970c88bb471c96f9ba4a2d7c755be802787105885d4e9c656d42603adacaa", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png", + "original_sha256": "464ac58602350ea64b5a35ffc9acf76c58ab3d1184a863af140a7c7698ddcef3", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png", + "public_sha256": "464ac58602350ea64b5a35ffc9acf76c58ab3d1184a863af140a7c7698ddcef3", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml", + "original_sha256": "bc071780913bc03bde8bd844944d0d402e92115edb2956d0ea62a98ca93b2cad", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml", + "public_sha256": "bc071780913bc03bde8bd844944d0d402e92115edb2956d0ea62a98ca93b2cad", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json", + "original_sha256": "0b7e99fc831f36c0d346ae9e54ae9e163c0150e5bd0520718b068b6815d08f36", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json", + "public_sha256": "0b7e99fc831f36c0d346ae9e54ae9e163c0150e5bd0520718b068b6815d08f36", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png", + "original_sha256": "29397810e669eb3219be0f3b283d336fd57f306096e1becf12dd8982e68a523d", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png", + "public_sha256": "29397810e669eb3219be0f3b283d336fd57f306096e1becf12dd8982e68a523d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml", + "original_sha256": "b816ba5e348dd2b7966098da1304e8c39b1dea3014c3ddd689268d235cbbf8d0", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml", + "public_sha256": "b816ba5e348dd2b7966098da1304e8c39b1dea3014c3ddd689268d235cbbf8d0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json", + "original_sha256": "dcda984651e6dcddca79b4776dd9fc8235291821417ad3b109f45f37b94e0a15", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json", + "public_sha256": "dcda984651e6dcddca79b4776dd9fc8235291821417ad3b109f45f37b94e0a15", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png", + "original_sha256": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png", + "public_sha256": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml", + "original_sha256": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml", + "public_sha256": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json", + "original_sha256": "60c0c159c9e36b1a542ba5778673a034c91d347f8a8aad59b1623d6b382b4715", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json", + "public_sha256": "60c0c159c9e36b1a542ba5778673a034c91d347f8a8aad59b1623d6b382b4715", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png", + "original_sha256": "33fd1e69f24f1058989dc82ec26197d8e52d6d96a5fad03afa08e1141aea4f0b", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png", + "public_sha256": "33fd1e69f24f1058989dc82ec26197d8e52d6d96a5fad03afa08e1141aea4f0b", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml", + "original_sha256": "32ffb6a0a5145772c51575c00344a681f947370cf61542b964d708321e93e08a", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml", + "public_sha256": "32ffb6a0a5145772c51575c00344a681f947370cf61542b964d708321e93e08a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json", + "original_sha256": "5b03454166f2f06c9db84891704d3b48666b0528cf6f3037467027edf37aaad6", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json", + "public_sha256": "5b03454166f2f06c9db84891704d3b48666b0528cf6f3037467027edf37aaad6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png", + "original_sha256": "90129176c987dfb1f3272b6ad23f1011de6ab8c3351c29bff2086cd75901a4fd", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png", + "public_sha256": "90129176c987dfb1f3272b6ad23f1011de6ab8c3351c29bff2086cd75901a4fd", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml", + "original_sha256": "87335bddd6bc8c02a64301bd2d6edd793122e4b68984c6f011e095872b3d7e80", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml", + "public_sha256": "87335bddd6bc8c02a64301bd2d6edd793122e4b68984c6f011e095872b3d7e80", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json", + "original_sha256": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json", + "public_sha256": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png", + "original_sha256": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png", + "public_sha256": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml", + "original_sha256": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml", + "public_sha256": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json", + "original_sha256": "9eeea03503affe7cbe65913e35b0f5833913c1e5b02cec5b8bbb41fd2b2c565c", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json", + "public_sha256": "9eeea03503affe7cbe65913e35b0f5833913c1e5b02cec5b8bbb41fd2b2c565c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png", + "original_sha256": "052c337a968b9f2509273fce9af52e2e643dba2235e1a9667b5fdf03e981508c", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png", + "public_sha256": "052c337a968b9f2509273fce9af52e2e643dba2235e1a9667b5fdf03e981508c", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml", + "original_sha256": "d559c7c01010bb7431740415d0624e66202f69c1f8f4be21b47147619289accd", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml", + "public_sha256": "d559c7c01010bb7431740415d0624e66202f69c1f8f4be21b47147619289accd", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json", + "original_sha256": "2f8d654d925fd6bebafb5766ec96ecf4ad0da2cdfc099d0deca5f11d26246a67", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json", + "public_sha256": "2f8d654d925fd6bebafb5766ec96ecf4ad0da2cdfc099d0deca5f11d26246a67", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png", + "original_sha256": "46dd48ac53a4fc51bc1ecc6994cf5600d99bbbf16c85beed5981d04ff116cec6", + "public": "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png", + "public_sha256": "46dd48ac53a4fc51bc1ecc6994cf5600d99bbbf16c85beed5981d04ff116cec6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml", + "original_sha256": "84ffa70a65cf76891ff784453a75965ce71aa9fabba64c514faaaec10ea41504", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml", + "public_sha256": "84ffa70a65cf76891ff784453a75965ce71aa9fabba64c514faaaec10ea41504", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/tests.log", + "original_sha256": "7ed331758e62199b2cf4dd3f5f5ed0766c834aa90652be69c45592d3abf9d59a", + "public": "docs/validation/webview-engine/cohorts/handoff/tests.log", + "public_sha256": "7ed331758e62199b2cf4dd3f5f5ed0766c834aa90652be69c45592d3abf9d59a", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json", + "original_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json", + "public_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png", + "original_sha256": "319bbb25075c26f724cce56f3ce127cabf35e624cac2377c714640b7a4f3e599", + "public": "docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png", + "public_sha256": "319bbb25075c26f724cce56f3ce127cabf35e624cac2377c714640b7a4f3e599", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml", + "original_sha256": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml", + "public_sha256": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json", + "original_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json", + "public_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png", + "original_sha256": "fc702ff019f066639ea9227b14bafea7203db528ae108ed54db4df0d3aafec12", + "public": "docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png", + "public_sha256": "fc702ff019f066639ea9227b14bafea7203db528ae108ed54db4df0d3aafec12", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml", + "original_sha256": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml", + "public_sha256": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json", + "original_sha256": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json", + "public_sha256": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png", + "original_sha256": "db2e7236ea85f62c1fe21c2c81db9bd220159f48ef999783425e20d7380997dc", + "public": "docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png", + "public_sha256": "db2e7236ea85f62c1fe21c2c81db9bd220159f48ef999783425e20d7380997dc", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml", + "original_sha256": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml", + "public_sha256": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "original_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "public_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "original_sha256": "5b139131eb408b49fc98312428a731bdfc3c4bc5aa19578b99e3a163cff017ef", + "public": "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "public_sha256": "5b139131eb408b49fc98312428a731bdfc3c4bc5aa19578b99e3a163cff017ef", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "original_sha256": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "public_sha256": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "164c7bd5bb9b06d7772925e970571ff016c13d24e8cd3270982f8aebee7dd421", + "public": "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public_sha256": "164c7bd5bb9b06d7772925e970571ff016c13d24e8cd3270982f8aebee7dd421", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public_sha256": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json", + "original_sha256": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json", + "public_sha256": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png", + "original_sha256": "4d5d758906310c363a4b4d8154b42c7efbc3bdede13cacc439f81a4e6061a460", + "public": "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png", + "public_sha256": "4d5d758906310c363a4b4d8154b42c7efbc3bdede13cacc439f81a4e6061a460", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml", + "original_sha256": "5efee3a46f7ce56906bf13af97204ab8e76da06c573f0a2aa4f27013cd5345e2", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml", + "public_sha256": "5efee3a46f7ce56906bf13af97204ab8e76da06c573f0a2aa4f27013cd5345e2", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json", + "original_sha256": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json", + "public_sha256": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png", + "original_sha256": "f307e0907ff3a9c875061da4239fb3ec3a5155db1242608c542fe73a472d1f4f", + "public": "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png", + "public_sha256": "f307e0907ff3a9c875061da4239fb3ec3a5155db1242608c542fe73a472d1f4f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml", + "original_sha256": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "public": "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml", + "public_sha256": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/tests.log", + "original_sha256": "a27551bc516e385fd9e24c6e4b09162dd2f3cc5b3adb6b5e37743c53d4cee253", + "public": "docs/validation/webview-engine/cohorts/paste/tests.log", + "public_sha256": "a27551bc516e385fd9e24c6e4b09162dd2f3cc5b3adb6b5e37743c53d4cee253", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json", + "original_sha256": "eb8ac3a6e086d7651b48223e5d5c6632924cc97ea8ae82708f5e4a626794ffc0", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json", + "public_sha256": "eb8ac3a6e086d7651b48223e5d5c6632924cc97ea8ae82708f5e4a626794ffc0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.png", + "original_sha256": "e584c9827f2ec7a72ab843c3f2566db50532fa3af99a0c214712a1c9a8484739", + "public": "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-caller-return.png", + "public_sha256": "e584c9827f2ec7a72ab843c3f2566db50532fa3af99a0c214712a1c9a8484739", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml", + "original_sha256": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml", + "public_sha256": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json", + "original_sha256": "89b0aca48a5bdf1313f4b645ab6f584a6b690a994717375cd584e708dbfef72e", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json", + "public_sha256": "89b0aca48a5bdf1313f4b645ab6f584a6b690a994717375cd584e708dbfef72e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png", + "original_sha256": "1bb32facfc66683fe1f961511e8fb0caa016affc692cb0b27b50b62a3a7b02ac", + "public": "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png", + "public_sha256": "1bb32facfc66683fe1f961511e8fb0caa016affc692cb0b27b50b62a3a7b02ac", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml", + "original_sha256": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml", + "public_sha256": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json", + "original_sha256": "fda333d66587dba3377b9fb09cc088a253428d7fb656345c670ac6759de3403d", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json", + "public_sha256": "fda333d66587dba3377b9fb09cc088a253428d7fb656345c670ac6759de3403d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png", + "original_sha256": "dede39f7c3c3592e248878f9e552bc6d22bcf875e897049de4ac8c98f16ba7b8", + "public": "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png", + "public_sha256": "dede39f7c3c3592e248878f9e552bc6d22bcf875e897049de4ac8c98f16ba7b8", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml", + "original_sha256": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml", + "public_sha256": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json", + "original_sha256": "703b4c05dde56a42c23e6c8f282391b647c24ac0f26ff3c5390208e3fcf1def5", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json", + "public_sha256": "703b4c05dde56a42c23e6c8f282391b647c24ac0f26ff3c5390208e3fcf1def5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png", + "original_sha256": "6f979107d103e1dd7d59ec970cb15ada4bcf241eed8be694dec336d5d5722fae", + "public": "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png", + "public_sha256": "6f979107d103e1dd7d59ec970cb15ada4bcf241eed8be694dec336d5d5722fae", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml", + "original_sha256": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml", + "public_sha256": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json", + "original_sha256": "59d045dc4f699a627d4eb654f4fce358259fab5506f242a136352571d19de00d", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json", + "public_sha256": "59d045dc4f699a627d4eb654f4fce358259fab5506f242a136352571d19de00d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png", + "original_sha256": "a6140a3bdf7a1296107de2d5107aded31cefd812217885556129a8d31c4ec0eb", + "public": "docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png", + "public_sha256": "a6140a3bdf7a1296107de2d5107aded31cefd812217885556129a8d31c4ec0eb", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml", + "original_sha256": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml", + "public_sha256": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json", + "original_sha256": "ba3d6b3e3023d474128401b17976d081cfa7574ff20f7b7298cfd85b65ae32e0", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json", + "public_sha256": "ba3d6b3e3023d474128401b17976d081cfa7574ff20f7b7298cfd85b65ae32e0", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png", + "original_sha256": "b3411610b5536d6c1043dc8ca7b9b8ba8c673837d0030bc52e1ab0ad385dd5c2", + "public": "docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png", + "public_sha256": "b3411610b5536d6c1043dc8ca7b9b8ba8c673837d0030bc52e1ab0ad385dd5c2", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml", + "original_sha256": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "public": "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml", + "public_sha256": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/tests.log", + "original_sha256": "611f99292ef593a0b04a63b5c740d5590cd329ad650a4d7de92da882f33a65a5", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/tests.log", + "public_sha256": "611f99292ef593a0b04a63b5c740d5590cd329ad650a4d7de92da882f33a65a5", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-content-end-frame.json", + "original_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end-frame.json", + "public_sha256": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-content-end.png", + "original_sha256": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "public": "docs/screenshots/webview-engine/legacy-common-positive/engine-content-end.png", + "public_sha256": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-content-end.xml", + "original_sha256": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end.xml", + "public_sha256": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-result-frame.json", + "original_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result-frame.json", + "public_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-result.png", + "original_sha256": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "public": "docs/screenshots/webview-engine/legacy-common-positive/engine-result.png", + "public_sha256": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-result.xml", + "original_sha256": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result.xml", + "public_sha256": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/equivalent-failure-ready-frame.json", + "original_sha256": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready-frame.json", + "public_sha256": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/equivalent-failure-ready.png", + "original_sha256": "381c102227b6c7714ae52513debf6257576587b2ea3c0f90642f377667c833a6", + "public": "docs/screenshots/webview-engine/legacy-common-positive/equivalent-failure-ready.png", + "public_sha256": "381c102227b6c7714ae52513debf6257576587b2ea3c0f90642f377667c833a6", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/equivalent-failure-ready.xml", + "original_sha256": "d0952fe3eff5c75f652466265c3479e7399d5a54110556fb1403281b5846410f", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready.xml", + "public_sha256": "d0952fe3eff5c75f652466265c3479e7399d5a54110556fb1403281b5846410f", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/returned-caller-frame.json", + "original_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller-frame.json", + "public_sha256": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/returned-caller.png", + "original_sha256": "3e0a565cbe21426df52a4b376108a18cf8a7e136d8d8c0b9ef4772ed8fcbe540", + "public": "docs/screenshots/webview-engine/legacy-common-positive/returned-caller.png", + "public_sha256": "3e0a565cbe21426df52a4b376108a18cf8a7e136d8d8c0b9ef4772ed8fcbe540", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/returned-caller.xml", + "original_sha256": "bd3db63da202f2c77555c8eb2c60dc359c6841a346e3321625f4e057e24d930a", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller.xml", + "public_sha256": "bd3db63da202f2c77555c8eb2c60dc359c6841a346e3321625f4e057e24d930a", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/tests.log", + "original_sha256": "f633d9651de8eb3ef7083c8f24306819f38eca94c36db2d1cefc2252f574bad2", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/tests.log", + "public_sha256": "f633d9651de8eb3ef7083c8f24306819f38eca94c36db2d1cefc2252f574bad2", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/engine-result-frame.json", + "original_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result-frame.json", + "public_sha256": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/engine-result.png", + "original_sha256": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "public": "docs/screenshots/webview-engine/legacy-common-negative/engine-result.png", + "public_sha256": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/engine-result.xml", + "original_sha256": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result.xml", + "public_sha256": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/failure-frame.json", + "original_sha256": "63b60b6e7a444f6c83d5c48a59b48f4286ad2a03e001616e74d97e76747155bd", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure-frame.json", + "public_sha256": "63b60b6e7a444f6c83d5c48a59b48f4286ad2a03e001616e74d97e76747155bd", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/failure.png", + "original_sha256": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "public": "docs/screenshots/webview-engine/legacy-common-negative/failure.png", + "public_sha256": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/failure.xml", + "original_sha256": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure.xml", + "public_sha256": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/unused-stamp-build/identity.json", + "original_sha256": "3c45fd7d2835023a4fe1873ca1fa8268e450022225f81cd987ec3f05a94a49c9", + "public": "docs/validation/webview-engine/identities/unused-stamp-build.json", + "public_sha256": "3c45fd7d2835023a4fe1873ca1fa8268e450022225f81cd987ec3f05a94a49c9", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/candidate-v1/identity.json", + "original_sha256": "1005c20cad73ccd7ef65ebb2457216f1c8841f18c0e2b05ab90c70fc5ae64c42", + "public": "docs/validation/webview-engine/identities/candidate-v1.json", + "public_sha256": "1005c20cad73ccd7ef65ebb2457216f1c8841f18c0e2b05ab90c70fc5ae64c42", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/candidate-v2/identity.json", + "original_sha256": "d9fae41e3cff668ad8cd20a5b0008b95b07dc895ff3beca2a64b8d3425f0a052", + "public": "docs/validation/webview-engine/identities/candidate-v2.json", + "public_sha256": "d9fae41e3cff668ad8cd20a5b0008b95b07dc895ff3beca2a64b8d3425f0a052", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/candidate-v3/identity.json", + "original_sha256": "3c82eeecd557d0b01912788878541ab58a8e2a2603b970bfa2cbd8d1eadde00d", + "public": "docs/validation/webview-engine/identities/candidate-v3.json", + "public_sha256": "3c82eeecd557d0b01912788878541ab58a8e2a2603b970bfa2cbd8d1eadde00d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/candidate-v4/identity.json", + "original_sha256": "9cfe0e214ab61de0ca2ce511f7af132cba1874a697e2f573f1d48ac5d438a1a5", + "public": "docs/validation/webview-engine/identities/candidate-v4.json", + "public_sha256": "9cfe0e214ab61de0ca2ce511f7af132cba1874a697e2f573f1d48ac5d438a1a5", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/candidate-v5/identity.json", + "original_sha256": "21a500de3384b7946553d45c343d9f5ade3e48b0e3966edd3c5a3a39f706414d", + "public": "docs/validation/webview-engine/identities/candidate-v5.json", + "public_sha256": "21a500de3384b7946553d45c343d9f5ade3e48b0e3966edd3c5a3a39f706414d", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/candidate-v6/identity.json", + "original_sha256": "3fdf810390c58b7b4ef49f66c88d35805fd8ba72baa6b01087a802ac1086086e", + "public": "docs/validation/webview-engine/identities/candidate-v6.json", + "public_sha256": "3fdf810390c58b7b4ef49f66c88d35805fd8ba72baa6b01087a802ac1086086e", + "transform": "identity" + }, + { + "original": "artifacts/webview-compatibility/final-runtime-build-v2.log", + "original_sha256": "c8228acbf62416279c440d98445c95a15b3f651cd409df1973c1b6456c779ba4", + "public": "docs/validation/webview-engine/checks/final-runtime-build-v2.log", + "public_sha256": "87bd9e0549d79f7d65debbbba8b1ad4b10123488bb2aca8f684352717e04176e", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-harness-build-v3.log", + "original_sha256": "5e7094d93d4d624a1fa0211c218de2f07a820f4726f7989489216a472a001e26", + "public": "docs/validation/webview-engine/checks/final-harness-build-v3.log", + "public_sha256": "0441ba573aa12a7d0c51c3d9c9b496c3ac515cea3e13b7d618c7c0859f236e8f", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-harness-build-v4.log", + "original_sha256": "d466fe43ef848d772fcaa642422f21881d718dbc34c124517bd4cf1bf3668641", + "public": "docs/validation/webview-engine/checks/final-harness-build-v4.log", + "public_sha256": "d466fe43ef848d772fcaa642422f21881d718dbc34c124517bd4cf1bf3668641", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-harness-build-v5.log", + "original_sha256": "e5651316711398489c8ad725d850fb3222e0e4eb752ceb1789a48d9980068075", + "public": "docs/validation/webview-engine/checks/final-harness-build-v5.log", + "public_sha256": "e5651316711398489c8ad725d850fb3222e0e4eb752ceb1789a48d9980068075", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-benchmark-build-v2.log", + "original_sha256": "0d7135e3fbe1bf8bb5275f5a5c62de370df8376fb208c5523c66ab9a06b10436", + "public": "docs/validation/webview-engine/checks/final-benchmark-build-v2.log", + "public_sha256": "f9b0f28b638b4c444f31b6b779ea8a777c31b90d3659b72294263129eb211af0", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-benchmark-harness-build-v3.log", + "original_sha256": "224aad89c7dcfd89bcb26b77d3ee5cd681bbc19cb1f3e7a6ccdcf3a3aef6ba7e", + "public": "docs/validation/webview-engine/checks/final-benchmark-harness-build-v3.log", + "public_sha256": "224aad89c7dcfd89bcb26b77d3ee5cd681bbc19cb1f3e7a6ccdcf3a3aef6ba7e", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/python-final-v4.log", + "original_sha256": "9e32fdbbdf86708e4d5c7f146df4209367da623cd53c0b532a8282d7289cd80e", + "public": "docs/validation/webview-engine/checks/python-final-v4.log", + "public_sha256": "9e32fdbbdf86708e4d5c7f146df4209367da623cd53c0b532a8282d7289cd80e", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/python-optimized-final-v4.log", + "original_sha256": "cd63e1b5d4c9d26335a63e8b8ffa21abd47fec9c1f632962ac26c7361a351915", + "public": "docs/validation/webview-engine/checks/python-optimized-final-v4.log", + "public_sha256": "cd63e1b5d4c9d26335a63e8b8ffa21abd47fec9c1f632962ac26c7361a351915", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.BackupPlannerTest.xml", + "original_sha256": "e67b80e2d2f7ec631d3750c71b04ad478371fe382cc0e5b5edd215c9989621a6", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml", + "public_sha256": "e67b80e2d2f7ec631d3750c71b04ad478371fe382cc0e5b5edd215c9989621a6", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.CalculatorActionsTest.xml", + "original_sha256": "146e466adc8e64c0bf04ae510002e4f9357ca43ed0f19df4bdf20a03afd1f41a", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml", + "public_sha256": "146e466adc8e64c0bf04ae510002e4f9357ca43ed0f19df4bdf20a03afd1f41a", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.CommandEngineTest.xml", + "original_sha256": "4c0b90cb7b21884be34035a924ab2e31028fa24710288ddc39bb64f5c9aaa28d", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml", + "public_sha256": "4c0b90cb7b21884be34035a924ab2e31028fa24710288ddc39bb64f5c9aaa28d", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.EmojiCatalogTest.xml", + "original_sha256": "f338a68f7f8368d836eff8909ffbe79b50147456aac01d5718fe06c404d31c3f", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml", + "public_sha256": "f338a68f7f8368d836eff8909ffbe79b50147456aac01d5718fe06c404d31c3f", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml", + "original_sha256": "d91fe424ad5deffe11c6140329eb5e5352d9c07cc1acee44922e1e6a4a9c9aeb", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml", + "public_sha256": "d91fe424ad5deffe11c6140329eb5e5352d9c07cc1acee44922e1e6a4a9c9aeb", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml", + "original_sha256": "a6f7db1098709beacb9c1adb0c42ac09f9d567ed33c52b3f8f1279334e1d789b", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml", + "public_sha256": "a6f7db1098709beacb9c1adb0c42ac09f9d567ed33c52b3f8f1279334e1d789b", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionEngineCompatibilityTest.xml", + "original_sha256": "709c8b8a3c54157fb70b8641885bf862cc2ddae76a5807119f43641f412f3975", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionEngineCompatibilityTest.xml", + "public_sha256": "709c8b8a3c54157fb70b8641885bf862cc2ddae76a5807119f43641f412f3975", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionFormContractTest.xml", + "original_sha256": "dbb6526f11eb4ce9c6fd517052184f27fb3735140487a74bde21a7da52a1dc48", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml", + "public_sha256": "dbb6526f11eb4ce9c6fd517052184f27fb3735140487a74bde21a7da52a1dc48", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml", + "original_sha256": "5f88ff2603a3e8ba776e03d804a5d19a6d83893c5345f584ff2e12256d9300ad", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml", + "public_sha256": "5f88ff2603a3e8ba776e03d804a5d19a6d83893c5345f584ff2e12256d9300ad", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml", + "original_sha256": "963eee5c51bf29c99e29499042a9b4c48590f9f226eb2426a46f182301a23d1f", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml", + "public_sha256": "963eee5c51bf29c99e29499042a9b4c48590f9f226eb2426a46f182301a23d1f", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml", + "original_sha256": "bf90eb958ad180728c257ae23e1b35a8b673e18ade292afcf9666eb7da01f783", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml", + "public_sha256": "bf90eb958ad180728c257ae23e1b35a8b673e18ade292afcf9666eb7da01f783", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml", + "original_sha256": "613904205c60e0bbf54da33ab40cccc75045e5dbd7ce7db1fd4b63e83c0ea0f8", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml", + "public_sha256": "613904205c60e0bbf54da33ab40cccc75045e5dbd7ce7db1fd4b63e83c0ea0f8", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionGridContractTest.xml", + "original_sha256": "5b6c4e0595c43f7283e4f42ba531975a94a79c21ba76171242fcff664410e7dc", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml", + "public_sha256": "5b6c4e0595c43f7283e4f42ba531975a94a79c21ba76171242fcff664410e7dc", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml", + "original_sha256": "43c7814e71673c2fd1b7e0b343b9c405ba2db90b4b2b3081143f26bf80ce6dd8", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml", + "public_sha256": "43c7814e71673c2fd1b7e0b343b9c405ba2db90b4b2b3081143f26bf80ce6dd8", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionHttpTest.xml", + "original_sha256": "0ba0294bd3862fca26c2a81469027d6fe5c55850b56d783337fffbb0c2ed03e8", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml", + "public_sha256": "0ba0294bd3862fca26c2a81469027d6fe5c55850b56d783337fffbb0c2ed03e8", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml", + "original_sha256": "7f09aab2aa72cadff2b31834a04af1c6acb0121bd95b9b8fde81430847cbe5bc", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml", + "public_sha256": "7f09aab2aa72cadff2b31834a04af1c6acb0121bd95b9b8fde81430847cbe5bc", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml", + "original_sha256": "6a0488d0962cf0b30a2f54ad53a4681d7c48df941afb49f803e323b88d0af66b", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml", + "public_sha256": "6a0488d0962cf0b30a2f54ad53a4681d7c48df941afb49f803e323b88d0af66b", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionPasteCopyTest.xml", + "original_sha256": "7cbc54154c5a5822ffd08e73c700fe69dafa4567f8943c4e90331ebe68d8cfd9", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPasteCopyTest.xml", + "public_sha256": "7cbc54154c5a5822ffd08e73c700fe69dafa4567f8943c4e90331ebe68d8cfd9", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionPayloadIdentityTest.xml", + "original_sha256": "220744bd45d51e975354d159532298819bc1f561503c5a6d4683235b639279a8", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPayloadIdentityTest.xml", + "public_sha256": "220744bd45d51e975354d159532298819bc1f561503c5a6d4683235b639279a8", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml", + "original_sha256": "388180f17e77bcbc733c636162f738f85d54d95f75c6cab73dd0c50452037c3d", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml", + "public_sha256": "388180f17e77bcbc733c636162f738f85d54d95f75c6cab73dd0c50452037c3d", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionWorkflowEvidenceTest.xml", + "original_sha256": "fff730fd61c8d03384a5595ff3ee2fc9056a252367460ce88689ea34f7ada613", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowEvidenceTest.xml", + "public_sha256": "fff730fd61c8d03384a5595ff3ee2fc9056a252367460ce88689ea34f7ada613", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ExtensionWorkflowInspectionTest.xml", + "original_sha256": "05e399fe74cfdbe1203fda501592ad113f3a65fe66d00dc0aff365fc6030c625", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowInspectionTest.xml", + "public_sha256": "05e399fe74cfdbe1203fda501592ad113f3a65fe66d00dc0aff365fc6030c625", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml", + "original_sha256": "0a9134989f447496b1857ff200e55c50ac9d3510f819125e1d2c01595d76a7ed", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml", + "public_sha256": "0a9134989f447496b1857ff200e55c50ac9d3510f819125e1d2c01595d76a7ed", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.FolderIndexTest.xml", + "original_sha256": "dce362509906b61157332dc951435cd44ba1675282b7090928cc99510deee1fd", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml", + "public_sha256": "dce362509906b61157332dc951435cd44ba1675282b7090928cc99510deee1fd", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ModifierTapTest.xml", + "original_sha256": "4667817ada1ca798b2d9a92208afaf5cd70f83a8dcc4d403990ffd250ea91129", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml", + "public_sha256": "4667817ada1ca798b2d9a92208afaf5cd70f83a8dcc4d403990ffd250ea91129", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml", + "original_sha256": "4a0648636c024de1e3f19711074bf53c1f3fdab2dfe11805c51f9bf0cdc97bd0", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml", + "public_sha256": "4a0648636c024de1e3f19711074bf53c1f3fdab2dfe11805c51f9bf0cdc97bd0", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml", + "original_sha256": "1471b206494b5cb5dd5ae281ae9406dac66d556614b65326ef74829ece43f912", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml", + "public_sha256": "1471b206494b5cb5dd5ae281ae9406dac66d556614b65326ef74829ece43f912", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ReviewedTextInputTest.xml", + "original_sha256": "101ee0e9a9c33e710196e6829fb3569b8c68bf51ebe4c7bfb277cbfb22dac4cb", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml", + "public_sha256": "101ee0e9a9c33e710196e6829fb3569b8c68bf51ebe4c7bfb277cbfb22dac4cb", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ShortcutReadinessTest.xml", + "original_sha256": "7d7e70c6975ccfde7941bfb60b3c11135b586d49a8bdb14a41452520b17c70ba", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml", + "public_sha256": "7d7e70c6975ccfde7941bfb60b3c11135b586d49a8bdb14a41452520b17c70ba", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.ShortcutTest.xml", + "original_sha256": "7b2498c5aacada21886a9b6f7f54aaa92243057076202d5ea04a654febda9e52", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutTest.xml", + "public_sha256": "7b2498c5aacada21886a9b6f7f54aaa92243057076202d5ea04a654febda9e52", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.SystemSettingsTest.xml", + "original_sha256": "27ea896e14c65a9a9b908967136dd05cb132ba7da48c6d86c5948ce979700671", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml", + "public_sha256": "27ea896e14c65a9a9b908967136dd05cb132ba7da48c6d86c5948ce979700671", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.TinycastGridParityTest.xml", + "original_sha256": "c9823b4bd7df418d6f1f405c216d58858ee78f4226147c9760441336f0b81a7e", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml", + "public_sha256": "c9823b4bd7df418d6f1f405c216d58858ee78f4226147c9760441336f0b81a7e", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.UpdatePolicyTest.xml", + "original_sha256": "d88f79c21a73699c03da1d7c9724029054fb49e875b33a13c2ae3e6ac2486634", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml", + "public_sha256": "d88f79c21a73699c03da1d7c9724029054fb49e875b33a13c2ae3e6ac2486634", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.WeakValueTokensTest.xml", + "original_sha256": "5dd1a89209518a87484f1ed1220759625f6af2f867fa8e8a55097417672a7186", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml", + "public_sha256": "5dd1a89209518a87484f1ed1220759625f6af2f867fa8e8a55097417672a7186", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml", + "original_sha256": "32a564096b0b012f6a5714ed18ddb5d64feb0d49d6ff4c6b7fd309ee7d227757", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml", + "public_sha256": "32a564096b0b012f6a5714ed18ddb5d64feb0d49d6ff4c6b7fd309ee7d227757", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml", + "original_sha256": "d1c053f3c42236bfd467a227931040795661be5cb3a196e469a713f6351d2e30", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml", + "public_sha256": "d1c053f3c42236bfd467a227931040795661be5cb3a196e469a713f6351d2e30", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/test-results/testDebugUnitTest/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml", + "original_sha256": "1062c8c3af9b2c9bdec94671a740c38a2c73b54406d6bc20426edb946abfdd1a", + "public": "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml", + "public_sha256": "1062c8c3af9b2c9bdec94671a740c38a2c73b54406d6bc20426edb946abfdd1a", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/reports/lint-results-debug.xml", + "original_sha256": "582646afcedf4679af1b4f47a045dda8099113d57fee013f8b71f347f54332c2", + "public": "docs/validation/webview-engine/checks/lint-results-debug.xml", + "public_sha256": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "app/build/reports/lint-results-benchmark.xml", + "original_sha256": "582646afcedf4679af1b4f47a045dda8099113d57fee013f8b71f347f54332c2", + "public": "docs/validation/webview-engine/checks/lint-results-benchmark.xml", + "public_sha256": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "transform": "replace checkout/home with escaped placeholders" + }, + { + "original": "artifacts/webview-compatibility/legacy-before/tests.log", + "original_sha256": "cd835ee3f8e475e49cd0530fb2a1a971bb75650e9b103510df7fd5580e8806da", + "public": "docs/validation/webview-engine/history/legacy-before/tests.log", + "public_sha256": "cd835ee3f8e475e49cd0530fb2a1a971bb75650e9b103510df7fd5580e8806da", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/legacy-candidate-v2/tests.log", + "original_sha256": "805cc85f7ef90f4b201b93bd58f44e77dc2ef62884f3dc98740c3285cee83256", + "public": "docs/validation/webview-engine/history/legacy-candidate-v2/tests.log", + "public_sha256": "805cc85f7ef90f4b201b93bd58f44e77dc2ef62884f3dc98740c3285cee83256", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/modern-tablet-v1/tests.log", + "original_sha256": "01e6ef4d2fc100e317f86f23b4a4666596f4ec6383ff94bb97808a1909ddb0b1", + "public": "docs/validation/webview-engine/history/modern-tablet-v1/tests.log", + "public_sha256": "01e6ef4d2fc100e317f86f23b4a4666596f4ec6383ff94bb97808a1909ddb0b1", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/legacy-final100-v1/tests.log", + "original_sha256": "d7f6f7bb956025693c6706449ecc40effee450d0abd98149caf29a813632000d", + "public": "docs/validation/webview-engine/history/legacy-final100-v1/tests.log", + "public_sha256": "d7f6f7bb956025693c6706449ecc40effee450d0abd98149caf29a813632000d", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/modern-tablet-final100-v1/tests.log", + "original_sha256": "f515d36772e2f0437ae8a9ee79f81bb26cfec803f1365c783ade19aae0fb28d3", + "public": "docs/validation/webview-engine/history/modern-tablet-final100-v1/tests.log", + "public_sha256": "f515d36772e2f0437ae8a9ee79f81bb26cfec803f1365c783ade19aae0fb28d3", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/legacy-final200-v1/tests.log", + "original_sha256": "c26e6f1cfce05baf7f03d5efdd57071e02bcda3d915afe00e1494ceef21698fd", + "public": "docs/validation/webview-engine/history/legacy-final200-v1/tests.log", + "public_sha256": "c26e6f1cfce05baf7f03d5efdd57071e02bcda3d915afe00e1494ceef21698fd", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/modern-phone-final200-v1/tests.log", + "original_sha256": "12cee1e2f4cbac5d2dc19c276103f4504ec22289ff4565e6297501f43f50a788", + "public": "docs/validation/webview-engine/history/modern-phone-final200-v1/tests.log", + "public_sha256": "12cee1e2f4cbac5d2dc19c276103f4504ec22289ff4565e6297501f43f50a788", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/legacy-final200-v2/tests.log", + "original_sha256": "be67c01975660eb862fa6fd48813afb15a8d1d46f8145b81baa06b9784705369", + "public": "docs/validation/webview-engine/history/legacy-final200-v2/tests.log", + "public_sha256": "be67c01975660eb862fa6fd48813afb15a8d1d46f8145b81baa06b9784705369", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/modern-phone-final200-v2/tests.log", + "original_sha256": "9f99658440778d8b94156649f52621aa53c576448db8c9641fbdc899425ef487", + "public": "docs/validation/webview-engine/history/modern-phone-final200-v2/tests.log", + "public_sha256": "9f99658440778d8b94156649f52621aa53c576448db8c9641fbdc899425ef487", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/legacy-old-control-v3/tests.log", + "original_sha256": "b8bb6b9631e4961e44eb98235563e75920bebf1a1ca8083ceb3efa14f8d87ca8", + "public": "docs/validation/webview-engine/history/legacy-old-control-v3/tests.log", + "public_sha256": "b8bb6b9631e4961e44eb98235563e75920bebf1a1ca8083ceb3efa14f8d87ca8", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/modern-landscape-final200-v1/tests.log", + "original_sha256": "eab955a84f74010576ade922fe9d30bbe6c6c9236c5eae13d1f4fb9e02b00c64", + "public": "docs/validation/webview-engine/history/modern-landscape-final200-v1/tests.log", + "public_sha256": "eab955a84f74010576ade922fe9d30bbe6c6c9236c5eae13d1f4fb9e02b00c64", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v4/legacy100/tests.log", + "original_sha256": "9f31b8c07f2c59d9afd1c54e854e69fd1edaa2a0629c47d5acdd4e7cd5e4386d", + "public": "docs/validation/webview-engine/history/final-v4/legacy100/tests.log", + "public_sha256": "9f31b8c07f2c59d9afd1c54e854e69fd1edaa2a0629c47d5acdd4e7cd5e4386d", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy-old-control/tests.log", + "original_sha256": "c58fcd34a4c9e36e6601d4b9a9428869f0d1f65666a0a4e2e58c07d4e8da25d9", + "public": "docs/validation/webview-engine/history/final-v5/legacy-old-control/tests.log", + "public_sha256": "c58fcd34a4c9e36e6601d4b9a9428869f0d1f65666a0a4e2e58c07d4e8da25d9", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v1/review-lifecycle/tests.log", + "original_sha256": "0864f7f88b26a0df0fcee7cf7fa6dfc560f1cc1559641cac1b2c73e1681c5119", + "public": "docs/validation/webview-engine/history/shared-regressions-v1/review-lifecycle/tests.log", + "public_sha256": "0864f7f88b26a0df0fcee7cf7fa6dfc560f1cc1559641cac1b2c73e1681c5119", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v1/handoff/tests.log", + "original_sha256": "e049471f9c078147d38583e18ffe94ee539bf8aff4dc79bf7f50fa739edec318", + "public": "docs/validation/webview-engine/history/shared-regressions-v1/handoff/tests.log", + "public_sha256": "e049471f9c078147d38583e18ffe94ee539bf8aff4dc79bf7f50fa739edec318", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v1/paste/tests.log", + "original_sha256": "f82383da38f5ee1d63771ba1690996b19292b953cead7ae765116ea62bd10c68", + "public": "docs/validation/webview-engine/history/shared-regressions-v1/paste/tests.log", + "public_sha256": "f82383da38f5ee1d63771ba1690996b19292b953cead7ae765116ea62bd10c68", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/publish-validation-v1.py", + "original_sha256": "c85d13fb8fef6d2e3a3cdbcc05d5300a1d7b3b2e1c24bcda0d51efd11bb18cdf", + "public": "docs/validation/webview-engine/collectors/publish-validation-v1.py", + "public_sha256": "c85d13fb8fef6d2e3a3cdbcc05d5300a1d7b3b2e1c24bcda0d51efd11bb18cdf", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/run-shared-regressions-v2.py", + "original_sha256": "4f98c89eb0f6ecb980e0425e01842f16ac0638646af075f51e67c40b81ae1b6d", + "public": "docs/validation/webview-engine/collectors/run-shared-regressions-v2.py", + "public_sha256": "8751f75565c9b878525c9088bbb82d63ccff310bda37114821d76b8a091de83a", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/run-final-legacy-v5.py", + "original_sha256": "f7e0a96dd34787685bd0dd3842a1f57e4af7fd0ac194dd0bce255e63629a3247", + "public": "docs/validation/webview-engine/collectors/run-final-legacy-v5.py", + "public_sha256": "ed0ad756abeca2c28d549d27e3d7305dff731a194f73f07eff608b40b28ee46d", + "transform": "replace checkout/home with placeholders" + }, + { + "original": "artifacts/webview-compatibility/run-final-modern-v4.py", + "original_sha256": "21b7063c92ed7085404c7a3d00bd2840ffbf6f11e297f77bf5924ad03395db6a", + "public": "docs/validation/webview-engine/collectors/run-final-modern-v4.py", + "public_sha256": "f057e2b7be7b4959f936c29e4996c5b4a994008a7e817ffe0bf6bfc5aa7019fd", + "transform": "replace checkout/home with placeholders" + } +] diff --git a/docs/validation/webview-engine/capture-original-hashes.json b/docs/validation/webview-engine/capture-original-hashes.json new file mode 100644 index 00000000..70637fe5 --- /dev/null +++ b/docs/validation/webview-engine/capture-original-hashes.json @@ -0,0 +1,218 @@ +{ + "artifacts/webview-compatibility/final-v5/legacy100/captures/cancelled-caller-frame.json": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "artifacts/webview-compatibility/final-v5/legacy100/captures/cancelled-caller.png": "d88dd45591560ffcc38f1007bb95be10801c0663cd55612d208d016a9535a0cc", + "artifacts/webview-compatibility/final-v5/legacy100/captures/cancelled-caller.xml": "e4cda8872bf99ee0aaa58fc21c652cf2e678a862840d23562c47faab89ae0c50", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "11c6c54b99b4f6cfe99e4c3d1d1f47aeddb74c2f95479a4f785c35aa1c636102", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "c155c5b4bad97c350d9ccccbe0eacbb2c7f3dde717732d20a0d1eaeffe1b63a5", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json": "3b612ffe2a5d184256353b3667b33ea884e39d180474aed52bb3fbf878d34cb1", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json": "c917aa6150c089979ce2cd5b81b1440f1ea2cf5cb43d1423d506085484d50e50", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json": "fb70a0f9251f9083afd6b232921af6fd9743475a872477e1172dcea56ad20a29", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "c6dd40c01219f580e2c93d6fa66b19acccc9b3510cbd3d30f4c6c7faf72716c2", + "artifacts/webview-compatibility/final-v5/legacy100/captures/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json": "97d65112b124768562593b11f94cf73d5073cbf39efe05104b80624eed68cdc5", + "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-content-end.png": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-content-end.xml": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-result.png": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "artifacts/webview-compatibility/final-v5/legacy100/captures/engine-result.xml": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "artifacts/webview-compatibility/final-v5/legacy100/captures/equivalent-failure-ready-frame.json": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "artifacts/webview-compatibility/final-v5/legacy100/captures/equivalent-failure-ready.png": "7dc348e17e6e1dfcfda52fc43980afa0550bfe62c9c37cb23a16021c300e2a70", + "artifacts/webview-compatibility/final-v5/legacy100/captures/equivalent-failure-ready.xml": "ff4d50abc1521516735a243367b05e3f3f50d3205dbd438b3f8bab43e1e8fd9e", + "artifacts/webview-compatibility/final-v5/legacy100/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "artifacts/webview-compatibility/final-v5/legacy100/captures/returned-caller.png": "6897cb03102fa7b5f339bcb029c8c276bb0d0cf59e89eba314e339d478730ff1", + "artifacts/webview-compatibility/final-v5/legacy100/captures/returned-caller.xml": "6f377b28131b59c4b5c5d97645976fd7cdf895151341806243dc164ee2ae50ce", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-before-frame.json": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-before.png": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-before.xml": "85dc53eaf4242cc42c7400f29c888ad7648e6a38644b13ab88f9c3a1b58cfbe0", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-destination-frame.json": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-destination.png": "b9a660c45cc8558cfb3cc4a96a864782c7fa6ef6a824b1bcd7ab97e740665cba", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-destination.xml": "53d746ab5468ee4c8476e9804526d7aeacb22d394b960a8d5345789cb391da4d", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-returned-frame.json": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-returned.png": "4986a43f08bbff2c08291bf88fa7c92d80750bba03d63db579401e514e4ac10d", + "artifacts/webview-compatibility/final-v5/legacy100/captures/settings-returned.xml": "87c55949845dc0f253c7b3c02a3c52d447db45fef605b4d065b48286486145bd", + "artifacts/webview-compatibility/final-v5/legacy200/captures/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json": "0dfe8faeeac0c168f952abffa3db869d55a10871c47a2e92528c7214e176b53f", + "artifacts/webview-compatibility/final-v5/legacy200/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "360b52bf44ffdd972f09fdb1761c46a3a21a2748fae063f9200b64057f12ee48", + "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-content-end.png": "8b2a952da451c4b7a3dd28f88bf6afc571744a3b9b7579b690c84eb48874aae9", + "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-content-end.xml": "50d7800ef809e1927cc2265dabe07690c86f5facffd9a625eafb26606d5eab6b", + "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-result.png": "a7d80ec7416327aff6cf6441f2344782f8a051b70d805e2b8992aa8fe0ab64b1", + "artifacts/webview-compatibility/final-v5/legacy200/captures/engine-result.xml": "c7cc8bb5294ef891400f326e91171ff871e7764e4b5ad58d011aa942959e4423", + "artifacts/webview-compatibility/final-v5/legacy200/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "artifacts/webview-compatibility/final-v5/legacy200/captures/returned-caller.png": "9933a6dcc0ceb10bdf027a64f919faebd032d36eaf87ebfbc3be7dfe4c1d70f6", + "artifacts/webview-compatibility/final-v5/legacy200/captures/returned-caller.xml": "637bfde86e077957869fee312146176cedea5ed24e58adae010eba21f42c132e", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-before-frame.json": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-before.png": "38c8acb7af23e9de1d684016f194d9946f9b0f73d7e34ef164270e7ebf67f431", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-before.xml": "3ec0255562bf8d0521b211e1a726b3d2611fd57e4d0c743499125be5debbe43a", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-destination-frame.json": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-destination.png": "a27c30f0f92f2c64caab830c9095b5489435f60f3bfdea6a05a1607b90b5a727", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-destination.xml": "907e52972fe9a5eaa501de39c47fc405899041916c98f7eb40a2f508b40849c1", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-returned-frame.json": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-returned.png": "41bd8855f8ed5a586e2a1177604068beddb069b62b20f5cff9c5eab973b8d79e", + "artifacts/webview-compatibility/final-v5/legacy200/captures/settings-returned.xml": "4d69e931558513e73f363e87c7b266fe7fe8220b7dd82a4d63b78d016589d37c", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/cancelled-caller-frame.json": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/cancelled-caller.png": "2c2947ea2f9f2de0c804b74bbc8fb436efb21bfff76b639ac2708d753cb83bd9", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/cancelled-caller.xml": "0fa66c0d6150de84650afdea64bffeaea57243b24593426f1de1d8b6f961d0ae", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "4ae147a3c447fbf2f7e5b1c5dd146777b4048885b3f762374946c3c26a9db4b9", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "b0bbf4bf9728488dae820b65b5cec4c00df79a369dcd0190f669bf7c552a1025", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json": "fe8d5144203cdd855f95536b25f284bd9d0d5d0b3bd68159e0ff6bfee6cd35df", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-modern-engine-publishes-grid-and-runs-live-action.json": "a5cb1c3d00a82dbd5bb1ba859ad9f4f3e900074f46f4a102b9edac2e578bd123", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-modern-engine-publishes-list-and-runs-live-action.json": "38fe51bdf2ecf8e04561064e6458618aa06de976069519a2b26121abec8ab1c3", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-action.png": "e589c57f78f3f008531af87cb5c5a7e41b567fe12c568b87c323574d29b82d9a", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-action.xml": "691ec075b883325a1c26065a37c1f90263f4b83eafe738436f6fef3d443538ad", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-ready.png": "4000555e2fb013b55d678efa11dfe62a67633f2eee2bd2d68b385179f4ca7f7f", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-ready.xml": "c84e25ac075792d3b3ce8286180abd80b73395165c4dacbb7c7cc9a31c640c80", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-returned.png": "fb27453caf5c0ce3df1ae5721170c37cb6910df8bb28cd6ea1c4ef038e7954b8", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/grid-returned.xml": "bfcbc0b0ccb34ec08fe68dcba0b182641ad75a83d9dda16ddd757ee41a31af2e", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-action.png": "22973ca816c02f03aa8161cea1a6ff302a4e27ed3a8d0e5cad40b41bfde3d6e9", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-action.xml": "54b855c566b281ebf8f6962198f2387052141055f5f29bceb2c5479297e756db", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-ready.png": "9700e26789709414955c4a2b6ce44923a9efcee9b7bdc7e661b75c69ff93d016", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-ready.xml": "1078fe0987c5a3eaca42913c68b7ca8a060e16a15614a0c85efeeb88bfdc67d7", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-returned.png": "4065cfe0d3cfe7d878d8a57c49ff5cfd373abf3f31dd94c7c5c5410b7fd979e2", + "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/index-returned.xml": "3be7a65d160f5ddbf741d565fd325c095435070665a645f573e4b6a8f6a682f8", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/case-modern-engine-publishes-grid-and-runs-live-action.json": "e29e2bedb87c2e9e9ee6242d5890d40621bdefa822ebb81f5c1d3521b00e42df", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/case-modern-engine-publishes-list-and-runs-live-action.json": "bb8ae5726829690ec8ece985b934050e2de8bbdf4ef0366344c923f19f58bdbe", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-action.png": "bc31772126525a3da768ff7ca8ee4069068513674e3e2e45f28206f1a8ea6d2e", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-action.xml": "f265899988038baa5b07efb6300e789ae972afd9f760f6cba29d4f05fd9adcd7", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-ready.png": "c6f3d15354476e3343c818c0bbeec7d1919050c0ae3d3f769f603e52689bd37f", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-ready.xml": "814b7c3075b75480c063e1dbafb1615c0a67dfd6c163b47267cceb3a2440fd68", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-returned.png": "3c6bd7a65f5f27526cdf1700d69616153d16e0c9ea6c623c59c4cd15a1137e5a", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/grid-returned.xml": "c44c10bf36350f3c752e288bac98a7a777f8e99ad1cf72f47407add255c50a9b", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-action.png": "ab1cf4b8353df8d861ebe94a445265a820103593064ae27c073d2af7bc85a74d", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-action.xml": "77de345a9a3cef3031ebfc3c31a3969a5f00ff00202c07db7781dfe98d04e93b", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-ready.png": "29b0c2f5ab7f9cbc999f8b410e604a34f132a9028d5b014f1792a08098c8041a", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-ready.xml": "527337fa118406dda30e3b34f9f795496625569e3c40b5c03f5226570f093023", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-returned.png": "20d90b982e0a5578af0d2afa1caa9d3cd91f50ccb81790b4d594c267aa321808", + "artifacts/webview-compatibility/final-v4/modern-phone200/captures/index-returned.xml": "c404699f48a4b89ac705c5242f0d0b458a3281fce46c315343605ffb0e0b1e6e", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/case-modern-engine-publishes-grid-and-runs-live-action.json": "e29e2bedb87c2e9e9ee6242d5890d40621bdefa822ebb81f5c1d3521b00e42df", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/case-modern-engine-publishes-list-and-runs-live-action.json": "bb8ae5726829690ec8ece985b934050e2de8bbdf4ef0366344c923f19f58bdbe", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-action.png": "43be585ec64c1b38789bf29ec6ee6525ffaf428631867cd7dd668006f78ec12f", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-action.xml": "08cef980814d25771375d53676c00cf47ccc94f0823da3cdfe68c85daa5ea927", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-ready.png": "8234d629b85ffec36418ef84006fc6530d685fa687401b5d765648f272669d9d", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-ready.xml": "d682b0381ff28f0ca21dfc8f83fc51af26415ddee3565987bc1eff76e18bcb34", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-returned.png": "8e579c4517c17ca4da14d4fb34cf2fb4b3f270a3a0e09ee35fed446d98568980", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/grid-returned.xml": "2e97a1c31726d3318c20027585231cc6ed463c6c3236fea4325b8475be8d2bb7", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-action.png": "57608b419ddcec22285f0e5462c05556f4d0ffeb7352555910e7d9bc7f004b78", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-action.xml": "8f52818a85649779027eb3fee58be645b7b0290f6ae66b562908b5af7bac9294", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-ready.png": "5c7b1710fed5a8cc3f2f43d8665b455d9adc0dc4d3c4cdc4b8713365ec9b2916", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-ready.xml": "c5c85d6b3c62b5bba6e4724310fc8bcfc2e23debdd10d6776e1478757e06558a", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-returned.png": "821a8c24d78be36d29e21dd6b58baa24b7492db361d05dc7caf96faa3f8b0b57", + "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/index-returned.xml": "696e89af8f3e481ffe7318180f70b3bde293f8841a29dd77855932b06c682aee", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json": "e291b2bb6228faf6a662154e4e8ea2376812a0a945ac5bbe0db42dcfbda8c316", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json": "6b7894a39b395f79151f7d90b3216404af0bd28ebb1c017ca370677d67d9e324", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json": "b60970c88bb471c96f9ba4a2d7c755be802787105885d4e9c656d42603adacaa", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png": "464ac58602350ea64b5a35ffc9acf76c58ab3d1184a863af140a7c7698ddcef3", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml": "bc071780913bc03bde8bd844944d0d402e92115edb2956d0ea62a98ca93b2cad", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json": "580c9c274cd4711f2d68befe9ceab4b99064b29cc4dff4037f1cc90d7d9071cd", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json": "0b7e99fc831f36c0d346ae9e54ae9e163c0150e5bd0520718b068b6815d08f36", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png": "29397810e669eb3219be0f3b283d336fd57f306096e1becf12dd8982e68a523d", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml": "b816ba5e348dd2b7966098da1304e8c39b1dea3014c3ddd689268d235cbbf8d0", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json": "ce0541a8de2f32cc54fd4488204b82d5de246ba09866f587d3a84693f5b7e621", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json": "63e0bc888a893f149c4b72525bb31646d082f2dfdea5545c43bb8bd0852ffa61", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json": "dcda984651e6dcddca79b4776dd9fc8235291821417ad3b109f45f37b94e0a15", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json": "60c0c159c9e36b1a542ba5778673a034c91d347f8a8aad59b1623d6b382b4715", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png": "33fd1e69f24f1058989dc82ec26197d8e52d6d96a5fad03afa08e1141aea4f0b", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml": "32ffb6a0a5145772c51575c00344a681f947370cf61542b964d708321e93e08a", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json": "5b03454166f2f06c9db84891704d3b48666b0528cf6f3037467027edf37aaad6", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png": "90129176c987dfb1f3272b6ad23f1011de6ab8c3351c29bff2086cd75901a4fd", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml": "87335bddd6bc8c02a64301bd2d6edd793122e4b68984c6f011e095872b3d7e80", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json": "9eeea03503affe7cbe65913e35b0f5833913c1e5b02cec5b8bbb41fd2b2c565c", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png": "052c337a968b9f2509273fce9af52e2e643dba2235e1a9667b5fdf03e981508c", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml": "d559c7c01010bb7431740415d0624e66202f69c1f8f4be21b47147619289accd", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json": "1024f1ebb63617b7b7e5df5758dbf3d61857b3c4b44e64df5192efa11f2cedc9", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json": "2f8d654d925fd6bebafb5766ec96ecf4ad0da2cdfc099d0deca5f11d26246a67", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png": "46dd48ac53a4fc51bc1ecc6994cf5600d99bbbf16c85beed5981d04ff116cec6", + "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml": "84ffa70a65cf76891ff784453a75965ce71aa9fabba64c514faaaec10ea41504", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "319bbb25075c26f724cce56f3ce127cabf35e624cac2377c714640b7a4f3e599", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "fc702ff019f066639ea9227b14bafea7203db528ae108ed54db4df0d3aafec12", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "db2e7236ea85f62c1fe21c2c81db9bd220159f48ef999783425e20d7380997dc", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "a183c44000d1176a3c3926d23f4f00c1aaed843ff7232646d1182fd2652f2cb9", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "5b139131eb408b49fc98312428a731bdfc3c4bc5aa19578b99e3a163cff017ef", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "164c7bd5bb9b06d7772925e970571ff016c13d24e8cd3270982f8aebee7dd421", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "4d5d758906310c363a4b4d8154b42c7efbc3bdede13cacc439f81a4e6061a460", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "5efee3a46f7ce56906bf13af97204ab8e76da06c573f0a2aa4f27013cd5345e2", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "f307e0907ff3a9c875061da4239fb3ec3a5155db1242608c542fe73a472d1f4f", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "c7572a0d3030b1a79ba5b4838950bf58996690d5f061a024ac65fa554c5b768e", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json": "eb8ac3a6e086d7651b48223e5d5c6632924cc97ea8ae82708f5e4a626794ffc0", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.png": "e584c9827f2ec7a72ab843c3f2566db50532fa3af99a0c214712a1c9a8484739", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json": "89b0aca48a5bdf1313f4b645ab6f584a6b690a994717375cd584e708dbfef72e", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png": "1bb32facfc66683fe1f961511e8fb0caa016affc692cb0b27b50b62a3a7b02ac", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json": "fda333d66587dba3377b9fb09cc088a253428d7fb656345c670ac6759de3403d", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png": "dede39f7c3c3592e248878f9e552bc6d22bcf875e897049de4ac8c98f16ba7b8", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-record.json": "ebdf3b17edb2a88858ae072db7a2a093c7572e25e0d5395f5a7d21122bdc9417", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json": "703b4c05dde56a42c23e6c8f282391b647c24ac0f26ff3c5390208e3fcf1def5", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png": "6f979107d103e1dd7d59ec970cb15ada4bcf241eed8be694dec336d5d5722fae", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json": "59d045dc4f699a627d4eb654f4fce358259fab5506f242a136352571d19de00d", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png": "a6140a3bdf7a1296107de2d5107aded31cefd812217885556129a8d31c4ec0eb", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json": "ba3d6b3e3023d474128401b17976d081cfa7574ff20f7b7298cfd85b65ae32e0", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png": "b3411610b5536d6c1043dc8ca7b9b8ba8c673837d0030bc52e1ab0ad385dd5c2", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-record.json": "83ee1f1b2959e4c2f27b0706f2b132455617fa311a13a98fe839ab2035866a1d", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json": "c917aa6150c089979ce2cd5b81b1440f1ea2cf5cb43d1423d506085484d50e50", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "a29c878eb65439ab5bdeef9ea539f2a944a9add83fa9816b57aa7990e4e5a12c", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-content-end.png": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-content-end.xml": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-result.png": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/engine-result.xml": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/equivalent-failure-ready-frame.json": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/equivalent-failure-ready.png": "381c102227b6c7714ae52513debf6257576587b2ea3c0f90642f377667c833a6", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/equivalent-failure-ready.xml": "d0952fe3eff5c75f652466265c3479e7399d5a54110556fb1403281b5846410f", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/returned-caller.png": "3e0a565cbe21426df52a4b376108a18cf8a7e136d8d8c0b9ef4772ed8fcbe540", + "artifacts/webview-compatibility/final-v6/legacy-positive/captures/returned-caller.xml": "bd3db63da202f2c77555c8eb2c60dc359c6841a346e3321625f4e057e24d930a", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "a970aaaac6892fcad4c8fda89f12b02ce4947917d43cca3fa7429fbdef2f2512", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/engine-result.png": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/engine-result.xml": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/failure-frame.json": "63b60b6e7a444f6c83d5c48a59b48f4286ad2a03e001616e74d97e76747155bd", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/failure.png": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/failure.xml": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165" +} diff --git a/docs/validation/webview-engine/checkpoint.json b/docs/validation/webview-engine/checkpoint.json new file mode 100644 index 00000000..d101e927 --- /dev/null +++ b/docs/validation/webview-engine/checkpoint.json @@ -0,0 +1,326 @@ +{ + "scope": "Recorded emulator observations and source/binary bindings; no broad parity certification", + "public_files": { + "docs/validation/webview-engine/shared-preservation.json": "d140e272b8b29857dfe4c1a386fe221f1788d880f2cde914bc6ffb60d45f2f96", + "docs/validation/webview-engine/bindings.json": "eaa7df0e6e9e149ab62f00afc13c06de44e9c358a2ab38738535d8c2f35d0011", + "docs/validation/webview-engine/capture-original-hashes.json": "8dc60d83d224d27edc134b6b031fa8ba03d7f1a5046cb68153a8dfb9e8947d0a", + "docs/validation/webview-engine/matrix.json": "fc65e20c3b3eec55fcba7d64af8c0af5ca3dc92edbd87836bcdd0624fd1b4cdb", + "docs/validation/webview-engine/historical-attempts.json": "7b057363274cee9267d8084eb412cde107758f042271aec19ec58886273d9329", + "docs/validation/webview-engine/projections.json": "e99b51958c2cf5b02fb5ee8567b58da28c0ecc335924be83a4889a5671d58752", + "docs/validation/webview-engine/collectors/publish-validation-v1.py": "c85d13fb8fef6d2e3a3cdbcc05d5300a1d7b3b2e1c24bcda0d51efd11bb18cdf", + "docs/validation/webview-engine/collectors/run-final-modern-v4.py": "f057e2b7be7b4959f936c29e4996c5b4a994008a7e817ffe0bf6bfc5aa7019fd", + "docs/validation/webview-engine/collectors/run-shared-regressions-v2.py": "8751f75565c9b878525c9088bbb82d63ccff310bda37114821d76b8a091de83a", + "docs/validation/webview-engine/collectors/run-final-legacy-v5.py": "ed0ad756abeca2c28d549d27e3d7305dff731a194f73f07eff608b40b28ee46d", + "docs/validation/webview-engine/checks/python-optimized-final-v4.log": "cd63e1b5d4c9d26335a63e8b8ffa21abd47fec9c1f632962ac26c7361a351915", + "docs/validation/webview-engine/checks/lint-results-benchmark.xml": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "docs/validation/webview-engine/checks/python-final-v4.log": "9e32fdbbdf86708e4d5c7f146df4209367da623cd53c0b532a8282d7289cd80e", + "docs/validation/webview-engine/checks/final-benchmark-harness-build-v3.log": "224aad89c7dcfd89bcb26b77d3ee5cd681bbc19cb1f3e7a6ccdcf3a3aef6ba7e", + "docs/validation/webview-engine/checks/lint-results-debug.xml": "1beb4077ae2dbb1852acab60801c1d7a06f2f346f32ff56f5246bbb9148d672c", + "docs/validation/webview-engine/checks/final-harness-build-v3.log": "0441ba573aa12a7d0c51c3d9c9b496c3ac515cea3e13b7d618c7c0859f236e8f", + "docs/validation/webview-engine/checks/final-runtime-build-v2.log": "87bd9e0549d79f7d65debbbba8b1ad4b10123488bb2aca8f684352717e04176e", + "docs/validation/webview-engine/checks/final-harness-build-v5.log": "e5651316711398489c8ad725d850fb3222e0e4eb752ceb1789a48d9980068075", + "docs/validation/webview-engine/checks/final-harness-build-v4.log": "d466fe43ef848d772fcaa642422f21881d718dbc34c124517bd4cf1bf3668641", + "docs/validation/webview-engine/checks/final-benchmark-build-v2.log": "f9b0f28b638b4c444f31b6b779ea8a777c31b90d3659b72294263129eb211af0", + "docs/validation/webview-engine/identities/candidate-v1.json": "1005c20cad73ccd7ef65ebb2457216f1c8841f18c0e2b05ab90c70fc5ae64c42", + "docs/validation/webview-engine/identities/candidate-v6.json": "3fdf810390c58b7b4ef49f66c88d35805fd8ba72baa6b01087a802ac1086086e", + "docs/validation/webview-engine/identities/candidate-v4.json": "9cfe0e214ab61de0ca2ce511f7af132cba1874a697e2f573f1d48ac5d438a1a5", + "docs/validation/webview-engine/identities/candidate-v5.json": "21a500de3384b7946553d45c343d9f5ade3e48b0e3966edd3c5a3a39f706414d", + "docs/validation/webview-engine/identities/candidate-v2.json": "d9fae41e3cff668ad8cd20a5b0008b95b07dc895ff3beca2a64b8d3425f0a052", + "docs/validation/webview-engine/identities/unused-stamp-build.json": "3c45fd7d2835023a4fe1873ca1fa8268e450022225f81cd987ec3f05a94a49c9", + "docs/validation/webview-engine/identities/candidate-v3.json": "3c82eeecd557d0b01912788878541ab58a8e2a2603b970bfa2cbd8d1eadde00d", + "docs/validation/webview-engine/history/legacy-final100-v1/tests.log": "d7f6f7bb956025693c6706449ecc40effee450d0abd98149caf29a813632000d", + "docs/validation/webview-engine/history/modern-tablet-v1/tests.log": "01e6ef4d2fc100e317f86f23b4a4666596f4ec6383ff94bb97808a1909ddb0b1", + "docs/validation/webview-engine/history/modern-tablet-v1/separate-recovery.json": "fcdfbd7553f66ef0ffc67c106eeb801e3e2b84f43bc7de50581faa22a6292a77", + "docs/validation/webview-engine/history/modern-phone-final200-v1/tests.log": "12cee1e2f4cbac5d2dc19c276103f4504ec22289ff4565e6297501f43f50a788", + "docs/validation/webview-engine/history/legacy-candidate-v2/tests.log": "805cc85f7ef90f4b201b93bd58f44e77dc2ef62884f3dc98740c3285cee83256", + "docs/validation/webview-engine/history/legacy-final200-v2/tests.log": "be67c01975660eb862fa6fd48813afb15a8d1d46f8145b81baa06b9784705369", + "docs/validation/webview-engine/history/modern-landscape-final200-v1/tests.log": "eab955a84f74010576ade922fe9d30bbe6c6c9236c5eae13d1f4fb9e02b00c64", + "docs/validation/webview-engine/history/modern-tablet-final100-v1/tests.log": "f515d36772e2f0437ae8a9ee79f81bb26cfec803f1365c783ade19aae0fb28d3", + "docs/validation/webview-engine/history/legacy-old-control-v3/tests.log": "b8bb6b9631e4961e44eb98235563e75920bebf1a1ca8083ceb3efa14f8d87ca8", + "docs/validation/webview-engine/history/modern-phone-final200-v2/tests.log": "9f99658440778d8b94156649f52621aa53c576448db8c9641fbdc899425ef487", + "docs/validation/webview-engine/history/legacy-candidate-v1/separate-setup-recovery.json": "4dfb0eecd2ae56e758c9a354d5524091057b4b1f18e9a9693be7d710ad607b0f", + "docs/validation/webview-engine/history/legacy-final200-v1/tests.log": "c26e6f1cfce05baf7f03d5efdd57071e02bcda3d915afe00e1494ceef21698fd", + "docs/validation/webview-engine/history/legacy-final200-v1/separate-font-recovery.json": "a3ac92e86d0eb1cd6b6dd2d6c27fd7f0a7ccdd417518678797fa827fb576e3ca", + "docs/validation/webview-engine/history/legacy-before/tests.log": "cd835ee3f8e475e49cd0530fb2a1a971bb75650e9b103510df7fd5580e8806da", + "docs/validation/webview-engine/history/legacy-before/separate-recovery.json": "5dd5ffafd56fbb0c6fdf1a41ec80cf54426004a34f08bf45dca6937a43e335b7", + "docs/validation/webview-engine/history/final-v4/legacy100/tests.log": "9f31b8c07f2c59d9afd1c54e854e69fd1edaa2a0629c47d5acdd4e7cd5e4386d", + "docs/validation/webview-engine/history/final-v5/legacy-old-control/tests.log": "c58fcd34a4c9e36e6601d4b9a9428869f0d1f65666a0a4e2e58c07d4e8da25d9", + "docs/validation/webview-engine/history/shared-regressions-v1/review-lifecycle/tests.log": "0864f7f88b26a0df0fcee7cf7fa6dfc560f1cc1559641cac1b2c73e1681c5119", + "docs/validation/webview-engine/history/shared-regressions-v1/handoff/tests.log": "e049471f9c078147d38583e18ffe94ee539bf8aff4dc79bf7f50fa739edec318", + "docs/validation/webview-engine/history/shared-regressions-v1/paste/tests.log": "f82383da38f5ee1d63771ba1690996b19292b953cead7ae765116ea62bd10c68", + "docs/validation/webview-engine/cohorts/review-lifecycle/record.json": "ad03960c89bbad660a2e411b4ffcad2c08c446db741e14a016ce86afbc5d41ea", + "docs/validation/webview-engine/cohorts/review-lifecycle/tests.log": "a1b96867f9572804e032189e717fb9c94d122179802976762daba6e1d9812b14", + "docs/validation/webview-engine/cohorts/modern-landscape200/record.json": "e0c48f46eb9cd0c2234a126739af13d38974f90a2e76efb771c5b38d2cdb2641", + "docs/validation/webview-engine/cohorts/modern-landscape200/tests.log": "3c66113778381fb7d92e873238ed97cbb21201edca2be896a7c5ad56b5ecb774", + "docs/validation/webview-engine/cohorts/handoff/record.json": "11ca6ca9b070a57f37d9bb870b464aa90830e92e2334e29c6d10cdb673ba26f5", + "docs/validation/webview-engine/cohorts/handoff/tests.log": "7ed331758e62199b2cf4dd3f5f5ed0766c834aa90652be69c45592d3abf9d59a", + "docs/validation/webview-engine/cohorts/legacy200/record.json": "3073ebb2a0d9a9a97da8ee6d213882f82892f4fc33f7061d37db108ce98ed503", + "docs/validation/webview-engine/cohorts/legacy200/tests.log": "6de326c355448953d55bc13a04ce63b7746095d88d54abc7c5ad069038e38541", + "docs/validation/webview-engine/cohorts/modern-tablet100/record.json": "3a3a4fce0e22a3bda69fa2d913087d97c5ff92e0fd4763c57528b9ffb938cb53", + "docs/validation/webview-engine/cohorts/modern-tablet100/tests.log": "1c943b07c045b179f064c0269d7b954481dd09346a729040332475acb03e2a95", + "docs/validation/webview-engine/cohorts/legacy-common-positive/record.json": "8ff6df448a248d15b8d8f949f90cb0d068015a3ceb51fe714e9090d9bab19338", + "docs/validation/webview-engine/cohorts/legacy-common-positive/tests.log": "611f99292ef593a0b04a63b5c740d5590cd329ad650a4d7de92da882f33a65a5", + "docs/validation/webview-engine/cohorts/modern-phone200/record.json": "db30e15618221ddad745e5e9980811a233db97487649de7b8533170951ffe5eb", + "docs/validation/webview-engine/cohorts/modern-phone200/tests.log": "eb4ab0b12dd90732b66cfa48cb83e4ea9f5b51df76468a17f097ec822de2a9f2", + "docs/validation/webview-engine/cohorts/legacy100/record.json": "8624cbb7f623233892d59973f1428434913725b39dc1814a1a8104e5c51f1dfb", + "docs/validation/webview-engine/cohorts/legacy100/tests.log": "de9393bdba11060fba3c2093336bf5359fe90462072a0e2e97390815a677a505", + "docs/validation/webview-engine/cohorts/legacy-common-negative/record.json": "16582b83e29a84738ab6314863c5b6195865b350e55000c37d04842ebb3a5b81", + "docs/validation/webview-engine/cohorts/legacy-common-negative/tests.log": "f633d9651de8eb3ef7083c8f24306819f38eca94c36db2d1cefc2252f574bad2", + "docs/validation/webview-engine/cohorts/paste/record.json": "cc9278ef5b24a71f37fd4905c222d2becbf21fe4ffbabcc4ce4e93ce2b9df8e2", + "docs/validation/webview-engine/cohorts/paste/tests.log": "a27551bc516e385fd9e24c6e4b09162dd2f3cc5b3adb6b5e37743c53d4cee253", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json": "eb8ac3a6e086d7651b48223e5d5c6632924cc97ea8ae82708f5e4a626794ffc0", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json": "89b0aca48a5bdf1313f4b645ab6f584a6b690a994717375cd584e708dbfef72e", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json": "fda333d66587dba3377b9fb09cc088a253428d7fb656345c670ac6759de3403d", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json": "703b4c05dde56a42c23e6c8f282391b647c24ac0f26ff3c5390208e3fcf1def5", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json": "59d045dc4f699a627d4eb654f4fce358259fab5506f242a136352571d19de00d", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json": "ba3d6b3e3023d474128401b17976d081cfa7574ff20f7b7298cfd85b65ae32e0", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml": "225e7944ad11faab8957f1c6ce0b0e63acbfb92dbf16aa87635318a4c4f3d259", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml": "953d7291a2e89a0396cf1ec39a587e949949ed377e2a655352ffc6fc4f587f93", + "docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml": "8e60d6ff259e425adb6ff2dd062656c0f6460b79741532314971026ccb191a5f", + "docs/validation/webview-engine/cohorts/paste/cases/pastecopy-returnandescapecancelwithoutcopy-record.json": "68470db9421abc1f6218913ab93801f37f799f5b1e16950c5f983b7d2b866e75", + "docs/validation/webview-engine/cohorts/paste/cases/pastecopy-pointercopyisexactonceandreturns-record.json": "216e8d82101a4c789fddd31af8c72a56a68c9513663023e43f15f56ff5a82761", + "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure-frame.json": "63b60b6e7a444f6c83d5c48a59b48f4286ad2a03e001616e74d97e76747155bd", + "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result.xml": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure.xml": "7074dfef35e730872645df6b60da5a2329b27dbf115352be8680089850362165", + "docs/validation/webview-engine/cohorts/legacy-common-negative/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "b658676338dd2eecb98e3d8eae8398fe52cfac57562eab112314f673eb7d3d38", + "docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller.xml": "e4cda8872bf99ee0aaa58fc21c652cf2e678a862840d23562c47faab89ae0c50", + "docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination-frame.json": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination.xml": "53d746ab5468ee4c8476e9804526d7aeacb22d394b960a8d5345789cb391da4d", + "docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "docs/validation/webview-engine/cohorts/legacy100/captures/settings-before.xml": "85dc53eaf4242cc42c7400f29c888ad7648e6a38644b13ab88f9c3a1b58cfbe0", + "docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller-frame.json": "02b7ad80ba3d98ac3e67cb3a3653fae456b872f52d32e648a0095fe9fdb19bdb", + "docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller.xml": "6f377b28131b59c4b5c5d97645976fd7cdf895151341806243dc164ee2ae50ce", + "docs/validation/webview-engine/cohorts/legacy100/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready.xml": "ff4d50abc1521516735a243367b05e3f3f50d3205dbd438b3f8bab43e1e8fd9e", + "docs/validation/webview-engine/cohorts/legacy100/captures/engine-result.xml": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned-frame.json": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned.xml": "87c55949845dc0f253c7b3c02a3c52d447db45fef605b4d065b48286486145bd", + "docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end.xml": "f050810bba5ef8880ea71b17a1a2ffa80700c72132910ca72947ffa27b2c3bc4", + "docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready-frame.json": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "docs/validation/webview-engine/cohorts/legacy100/captures/settings-before-frame.json": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "7cd6077a0443c4b005a2d8fc61aa3fad34f7b9184b12564071b33b7b44269193", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json": "8bc8c53c022e507ea57c8d33177697991090b77470f3b5cd33461643a986e885", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "c044bac5b57eba8bd008779c8274553ee9137eba768f3180d2305d44e8715d03", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "196f989afed168d25c3b1e0db1977d258107f2407c6e1b76751bb397987cabf2", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json": "d3ad0df1ce62d9f4ab2b7f40043680c88ed80d26aa9430126630f66b4b0d4249", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json": "95d287a73a6d1d314bf4f87ec47faa4b08cc465bd3ec06029aa1ec2f280096a2", + "docs/validation/webview-engine/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json": "eb8d31e19536ad01d656743a302c97d35589442855a95c852b8fe4ed55bf0cc0", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready.xml": "814b7c3075b75480c063e1dbafb1615c0a67dfd6c163b47267cceb3a2440fd68", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned.xml": "c44c10bf36350f3c752e288bac98a7a777f8e99ad1cf72f47407add255c50a9b", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready.xml": "527337fa118406dda30e3b34f9f795496625569e3c40b5c03f5226570f093023", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action.xml": "77de345a9a3cef3031ebfc3c31a3969a5f00ff00202c07db7781dfe98d04e93b", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned.xml": "c404699f48a4b89ac705c5242f0d0b458a3281fce46c315343605ffb0e0b1e6e", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action.xml": "f265899988038baa5b07efb6300e789ae972afd9f760f6cba29d4f05fd9adcd7", + "docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-list-and-runs-live-action.json": "f081e382edd51f4987295db01f60ad3cb52e147e91eff9da4bd8f28eb9fc4759", + "docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json": "4c0962c51ac6868838687a1b05890064de518a8faae4d5c652d08a8d306d2ab6", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller.xml": "bd3db63da202f2c77555c8eb2c60dc359c6841a346e3321625f4e057e24d930a", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready.xml": "d0952fe3eff5c75f652466265c3479e7399d5a54110556fb1403281b5846410f", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result.xml": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end.xml": "8d58c5bcfb361ab7b371d8e15ed928712b1efe84a837e4cc116f68a1f6785259", + "docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready-frame.json": "dde57b9d4d4a88377d9fba4d60551f87d078d8bedd0121b1562ed1e245b67c8f", + "docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "56da8f3e1685a39ea879281aa6483ea633fe172437b94ca4a3860c259a75fbd5", + "docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json": "d3ad0df1ce62d9f4ab2b7f40043680c88ed80d26aa9430126630f66b4b0d4249", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready.xml": "c84e25ac075792d3b3ce8286180abd80b73395165c4dacbb7c7cc9a31c640c80", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller.xml": "0fa66c0d6150de84650afdea64bffeaea57243b24593426f1de1d8b6f961d0ae", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned.xml": "bfcbc0b0ccb34ec08fe68dcba0b182641ad75a83d9dda16ddd757ee41a31af2e", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller-frame.json": "0e20a9e56f6a3eb5d9e56c9f3ef6a523e975e11d0a037aa2fa43b851263146c7", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready.xml": "1078fe0987c5a3eaca42913c68b7ca8a060e16a15614a0c85efeeb88bfdc67d7", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action.xml": "54b855c566b281ebf8f6962198f2387052141055f5f29bceb2c5479297e756db", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned.xml": "3be7a65d160f5ddbf741d565fd325c095435070665a645f573e4b6a8f6a682f8", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action.xml": "691ec075b883325a1c26065a37c1f90263f4b83eafe738436f6fef3d443538ad", + "docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json": "88c350479c1648c33a7177eee77a4296c020edd40f121f26fd7cee92e8a5c1fc", + "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json": "356bd11ec3f23a17f104a412417855f6179c252f40ded3146ad32ee51b726542", + "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json": "e6664805edc8f79735927921e8f865bac66c27b6263447f5b08d59c2ddeebcbf", + "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json": "0b8ef08e2d3a3f069b06cbd902102c05fed9616c46cd3861eaf2a612a3d4f7e8", + "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json": "351178b7b5be62be589baa2eaed7e076f4db28c18ccd1d632513162b0ab5624f", + "docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination-frame.json": "575e68b8379dd5b8951b4cb9c1b818b8b6e117c3daf8139f808469f37565a8d7", + "docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination.xml": "907e52972fe9a5eaa501de39c47fc405899041916c98f7eb40a2f508b40849c1", + "docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end-frame.json": "43243221b1ec2f99b1aaf60f5bd59bd6a619bf5f74745809e5b10e3f574cc6d1", + "docs/validation/webview-engine/cohorts/legacy200/captures/settings-before.xml": "3ec0255562bf8d0521b211e1a726b3d2611fd57e4d0c743499125be5debbe43a", + "docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller.xml": "637bfde86e077957869fee312146176cedea5ed24e58adae010eba21f42c132e", + "docs/validation/webview-engine/cohorts/legacy200/captures/engine-result-frame.json": "4e4e1de577cfcd64917ea34f9bb5e78997b38ef94f6cd88480af804841e27c17", + "docs/validation/webview-engine/cohorts/legacy200/captures/engine-result.xml": "c7cc8bb5294ef891400f326e91171ff871e7764e4b5ad58d011aa942959e4423", + "docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller-frame.json": "6b264382a67809164bb10a3b468082d678347461f18345239b4b145b379c4f20", + "docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned-frame.json": "4997c1d31636d842966cdc7a3d9d80f27b72ba4cc36dde67c1dfd8c89950ac84", + "docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned.xml": "4d69e931558513e73f363e87c7b266fe7fe8220b7dd82a4d63b78d016589d37c", + "docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end.xml": "50d7800ef809e1927cc2265dabe07690c86f5facffd9a625eafb26606d5eab6b", + "docs/validation/webview-engine/cohorts/legacy200/captures/settings-before-frame.json": "dc7aa4aeb6d5af9944ba9384efc4f840a936519205d2a4917d93f009e42da2ed", + "docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json": "ae0afbad68195cb64b6d4c1ecd94979de234c523f378cde361aab4e811262a44", + "docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json": "f7520370a2f2ff69363650d8715d1c188c7ae9b59843441e9991ac7736c71e73", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "5efee3a46f7ce56906bf13af97204ab8e76da06c573f0a2aa4f27013cd5345e2", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "3cfe6cf506ec637ed9ef0cfdeeeab645b29e3150b529fe8270f36aef3e2deca1", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "dcbe266611789eae7e8d7eb39da7921514d8229a4061089fa282b5f09eb1aa2a", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "537a0a430c0be8859c4b706d766f75fc3f7f98d2b127416ecf79e911b78f7f15", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "docs/validation/webview-engine/cohorts/handoff/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "0b79d6ab0a53d9d811184b76177ec3fe19c34e7abadad5dec0d25368d7384627", + "docs/validation/webview-engine/cohorts/handoff/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "ca5ff2788586239ca5fef955270b552c131e9f54aa26b36e1e2b2f4998814fe0", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready-frame.json": "fedc62799b63465e16ed416d10c954e59e4f815f9bcfb50077dc314f050f825c", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action-frame.json": "334aac636c74a998d78a8bb68aa0ce97fa62fc722b549a1b56ce1a6eafb071d5", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready.xml": "d682b0381ff28f0ca21dfc8f83fc51af26415ddee3565987bc1eff76e18bcb34", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready-frame.json": "a8894301507f18f7308c2832bcb5e3daabc01f979ceff5f3f7bdc9d7b2937393", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned-frame.json": "cd526654bf15e85756d24def5392bbef5ee7e33feba53cf1dbc21809696eab14", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned.xml": "2e97a1c31726d3318c20027585231cc6ed463c6c3236fea4325b8475be8d2bb7", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready.xml": "c5c85d6b3c62b5bba6e4724310fc8bcfc2e23debdd10d6776e1478757e06558a", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned-frame.json": "90ca0702e3a340ab61eec629eec492930bbe74833220d05b7cb38612ec1ee7a6", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action.xml": "8f52818a85649779027eb3fee58be645b7b0290f6ae66b562908b5af7bac9294", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned.xml": "696e89af8f3e481ffe7318180f70b3bde293f8841a29dd77855932b06c682aee", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action.xml": "08cef980814d25771375d53676c00cf47ccc94f0823da3cdfe68c85daa5ea927", + "docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action-frame.json": "7ba813fa124c79aa676d36d65b169081c5b752c6944605ed76cdafb427b94e31", + "docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-list-and-runs-live-action.json": "f081e382edd51f4987295db01f60ad3cb52e147e91eff9da4bd8f28eb9fc4759", + "docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json": "4c0962c51ac6868838687a1b05890064de518a8faae4d5c652d08a8d306d2ab6", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json": "b60970c88bb471c96f9ba4a2d7c755be802787105885d4e9c656d42603adacaa", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml": "87335bddd6bc8c02a64301bd2d6edd793122e4b68984c6f011e095872b3d7e80", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json": "2f8d654d925fd6bebafb5766ec96ecf4ad0da2cdfc099d0deca5f11d26246a67", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml": "7250d6607b7d02c13758cfb6dde440d9f96d04eca2e6b5366c55d580f768625a", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json": "60c0c159c9e36b1a542ba5778673a034c91d347f8a8aad59b1623d6b382b4715", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json": "dcda984651e6dcddca79b4776dd9fc8235291821417ad3b109f45f37b94e0a15", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json": "e291b2bb6228faf6a662154e4e8ea2376812a0a945ac5bbe0db42dcfbda8c316", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml": "c6143e174440216285e539c05c22ce3344238c1873a05fc5469555bbae4af76a", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml": "bc071780913bc03bde8bd844944d0d402e92115edb2956d0ea62a98ca93b2cad", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json": "0b7e99fc831f36c0d346ae9e54ae9e163c0150e5bd0520718b068b6815d08f36", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml": "84ffa70a65cf76891ff784453a75965ce71aa9fabba64c514faaaec10ea41504", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml": "32ffb6a0a5145772c51575c00344a681f947370cf61542b964d708321e93e08a", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml": "b816ba5e348dd2b7966098da1304e8c39b1dea3014c3ddd689268d235cbbf8d0", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json": "9eeea03503affe7cbe65913e35b0f5833913c1e5b02cec5b8bbb41fd2b2c565c", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json": "5b03454166f2f06c9db84891704d3b48666b0528cf6f3037467027edf37aaad6", + "docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml": "d559c7c01010bb7431740415d0624e66202f69c1f8f4be21b47147619289accd", + "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json": "d1139d3eba7f340978abe19f7cc043358f54bd69208b43c5b7cbcb97bd238cbf", + "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json": "4b1e3d64d0ddf5d754d10f0f070df16c89e67dd2cb8f1b334a5f599892b45413", + "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json": "3897b0d5bfedef1e592f4df6ce52f257ee1cdbad17e8938b587bcf27538a5f5d", + "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json": "f7884fd7ede730bda2daddcaf8abee0b6e23da2e52d42b22a538807e80a09b2f", + "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json": "6c4a632304c040280f2bf6aa6d5cc1ac54bc1e4b960eda84a75c5f87d9ccbdf8", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml": "1471b206494b5cb5dd5ae281ae9406dac66d556614b65326ef74829ece43f912", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml": "5f88ff2603a3e8ba776e03d804a5d19a6d83893c5345f584ff2e12256d9300ad", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPayloadIdentityTest.xml": "220744bd45d51e975354d159532298819bc1f561503c5a6d4683235b639279a8", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml": "388180f17e77bcbc733c636162f738f85d54d95f75c6cab73dd0c50452037c3d", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml": "bf90eb958ad180728c257ae23e1b35a8b673e18ade292afcf9666eb7da01f783", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml": "7f09aab2aa72cadff2b31834a04af1c6acb0121bd95b9b8fde81430847cbe5bc", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPasteCopyTest.xml": "7cbc54154c5a5822ffd08e73c700fe69dafa4567f8943c4e90331ebe68d8cfd9", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml": "7d7e70c6975ccfde7941bfb60b3c11135b586d49a8bdb14a41452520b17c70ba", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml": "a6f7db1098709beacb9c1adb0c42ac09f9d567ed33c52b3f8f1279334e1d789b", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowEvidenceTest.xml": "fff730fd61c8d03384a5595ff3ee2fc9056a252367460ce88689ea34f7ada613", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml": "32a564096b0b012f6a5714ed18ddb5d64feb0d49d6ff4c6b7fd309ee7d227757", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml": "f338a68f7f8368d836eff8909ffbe79b50147456aac01d5718fe06c404d31c3f", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml": "27ea896e14c65a9a9b908967136dd05cb132ba7da48c6d86c5948ce979700671", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml": "5b6c4e0595c43f7283e4f42ba531975a94a79c21ba76171242fcff664410e7dc", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml": "d91fe424ad5deffe11c6140329eb5e5352d9c07cc1acee44922e1e6a4a9c9aeb", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml": "613904205c60e0bbf54da33ab40cccc75045e5dbd7ce7db1fd4b63e83c0ea0f8", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml": "101ee0e9a9c33e710196e6829fb3569b8c68bf51ebe4c7bfb277cbfb22dac4cb", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml": "4667817ada1ca798b2d9a92208afaf5cd70f83a8dcc4d403990ffd250ea91129", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml": "dbb6526f11eb4ce9c6fd517052184f27fb3735140487a74bde21a7da52a1dc48", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutTest.xml": "7b2498c5aacada21886a9b6f7f54aaa92243057076202d5ea04a654febda9e52", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowInspectionTest.xml": "05e399fe74cfdbe1203fda501592ad113f3a65fe66d00dc0aff365fc6030c625", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml": "4a0648636c024de1e3f19711074bf53c1f3fdab2dfe11805c51f9bf0cdc97bd0", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml": "146e466adc8e64c0bf04ae510002e4f9357ca43ed0f19df4bdf20a03afd1f41a", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml": "e67b80e2d2f7ec631d3750c71b04ad478371fe382cc0e5b5edd215c9989621a6", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml": "43c7814e71673c2fd1b7e0b343b9c405ba2db90b4b2b3081143f26bf80ce6dd8", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml": "0a9134989f447496b1857ff200e55c50ac9d3510f819125e1d2c01595d76a7ed", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionEngineCompatibilityTest.xml": "709c8b8a3c54157fb70b8641885bf862cc2ddae76a5807119f43641f412f3975", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml": "963eee5c51bf29c99e29499042a9b4c48590f9f226eb2426a46f182301a23d1f", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml": "d88f79c21a73699c03da1d7c9724029054fb49e875b33a13c2ae3e6ac2486634", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml": "5dd1a89209518a87484f1ed1220759625f6af2f867fa8e8a55097417672a7186", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml": "6a0488d0962cf0b30a2f54ad53a4681d7c48df941afb49f803e323b88d0af66b", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml": "1062c8c3af9b2c9bdec94671a740c38a2c73b54406d6bc20426edb946abfdd1a", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml": "4c0b90cb7b21884be34035a924ab2e31028fa24710288ddc39bb64f5c9aaa28d", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml": "0ba0294bd3862fca26c2a81469027d6fe5c55850b56d783337fffbb0c2ed03e8", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml": "dce362509906b61157332dc951435cd44ba1675282b7090928cc99510deee1fd", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml": "c9823b4bd7df418d6f1f405c216d58858ee78f4226147c9760441336f0b81a7e", + "docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml": "d1c053f3c42236bfd467a227931040795661be5cb3a196e469a713f6351d2e30", + "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png": "90129176c987dfb1f3272b6ad23f1011de6ab8c3351c29bff2086cd75901a4fd", + "docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png": "3425a02437a2c54eb23b3524483c162dea85ce3d8a69eafbe2e205d4dcc630e3", + "docs/screenshots/webview-engine/review-lifecycle/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png": "74a8b831ab4936d63b34e61cd8dc64b28bf0b34d178d30340da5723ed22c538f", + "docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.png": "464ac58602350ea64b5a35ffc9acf76c58ab3d1184a863af140a7c7698ddcef3", + "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png": "46dd48ac53a4fc51bc1ecc6994cf5600d99bbbf16c85beed5981d04ff116cec6", + "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png": "33fd1e69f24f1058989dc82ec26197d8e52d6d96a5fad03afa08e1141aea4f0b", + "docs/screenshots/webview-engine/review-lifecycle/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.png": "29397810e669eb3219be0f3b283d336fd57f306096e1becf12dd8982e68a523d", + "docs/screenshots/webview-engine/review-lifecycle/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png": "052c337a968b9f2509273fce9af52e2e643dba2235e1a9667b5fdf03e981508c", + "docs/screenshots/webview-engine/modern-landscape200/grid-ready.png": "8234d629b85ffec36418ef84006fc6530d685fa687401b5d765648f272669d9d", + "docs/screenshots/webview-engine/modern-landscape200/grid-returned.png": "8e579c4517c17ca4da14d4fb34cf2fb4b3f270a3a0e09ee35fed446d98568980", + "docs/screenshots/webview-engine/modern-landscape200/index-ready.png": "5c7b1710fed5a8cc3f2f43d8665b455d9adc0dc4d3c4cdc4b8713365ec9b2916", + "docs/screenshots/webview-engine/modern-landscape200/index-action.png": "57608b419ddcec22285f0e5462c05556f4d0ffeb7352555910e7d9bc7f004b78", + "docs/screenshots/webview-engine/modern-landscape200/index-returned.png": "821a8c24d78be36d29e21dd6b58baa24b7492db361d05dc7caf96faa3f8b0b57", + "docs/screenshots/webview-engine/modern-landscape200/grid-action.png": "43be585ec64c1b38789bf29ec6ee6525ffaf428631867cd7dd668006f78ec12f", + "docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "319bbb25075c26f724cce56f3ce127cabf35e624cac2377c714640b7a4f3e599", + "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "4d5d758906310c363a4b4d8154b42c7efbc3bdede13cacc439f81a4e6061a460", + "docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "db2e7236ea85f62c1fe21c2c81db9bd220159f48ef999783425e20d7380997dc", + "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "f307e0907ff3a9c875061da4239fb3ec3a5155db1242608c542fe73a472d1f4f", + "docs/screenshots/webview-engine/handoff/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "fc702ff019f066639ea9227b14bafea7203db528ae108ed54db4df0d3aafec12", + "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "164c7bd5bb9b06d7772925e970571ff016c13d24e8cd3270982f8aebee7dd421", + "docs/screenshots/webview-engine/handoff/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "5b139131eb408b49fc98312428a731bdfc3c4bc5aa19578b99e3a163cff017ef", + "docs/screenshots/webview-engine/legacy200/settings-destination.png": "a27c30f0f92f2c64caab830c9095b5489435f60f3bfdea6a05a1607b90b5a727", + "docs/screenshots/webview-engine/legacy200/settings-before.png": "38c8acb7af23e9de1d684016f194d9946f9b0f73d7e34ef164270e7ebf67f431", + "docs/screenshots/webview-engine/legacy200/returned-caller.png": "9933a6dcc0ceb10bdf027a64f919faebd032d36eaf87ebfbc3be7dfe4c1d70f6", + "docs/screenshots/webview-engine/legacy200/engine-result.png": "a7d80ec7416327aff6cf6441f2344782f8a051b70d805e2b8992aa8fe0ab64b1", + "docs/screenshots/webview-engine/legacy200/settings-returned.png": "41bd8855f8ed5a586e2a1177604068beddb069b62b20f5cff9c5eab973b8d79e", + "docs/screenshots/webview-engine/legacy200/engine-content-end.png": "8b2a952da451c4b7a3dd28f88bf6afc571744a3b9b7579b690c84eb48874aae9", + "docs/screenshots/webview-engine/modern-tablet100/grid-ready.png": "4000555e2fb013b55d678efa11dfe62a67633f2eee2bd2d68b385179f4ca7f7f", + "docs/screenshots/webview-engine/modern-tablet100/cancelled-caller.png": "2c2947ea2f9f2de0c804b74bbc8fb436efb21bfff76b639ac2708d753cb83bd9", + "docs/screenshots/webview-engine/modern-tablet100/grid-returned.png": "fb27453caf5c0ce3df1ae5721170c37cb6910df8bb28cd6ea1c4ef038e7954b8", + "docs/screenshots/webview-engine/modern-tablet100/index-ready.png": "9700e26789709414955c4a2b6ce44923a9efcee9b7bdc7e661b75c69ff93d016", + "docs/screenshots/webview-engine/modern-tablet100/index-action.png": "22973ca816c02f03aa8161cea1a6ff302a4e27ed3a8d0e5cad40b41bfde3d6e9", + "docs/screenshots/webview-engine/modern-tablet100/index-returned.png": "4065cfe0d3cfe7d878d8a57c49ff5cfd373abf3f31dd94c7c5c5410b7fd979e2", + "docs/screenshots/webview-engine/modern-tablet100/grid-action.png": "e589c57f78f3f008531af87cb5c5a7e41b567fe12c568b87c323574d29b82d9a", + "docs/screenshots/webview-engine/legacy-common-positive/returned-caller.png": "3e0a565cbe21426df52a4b376108a18cf8a7e136d8d8c0b9ef4772ed8fcbe540", + "docs/screenshots/webview-engine/legacy-common-positive/equivalent-failure-ready.png": "381c102227b6c7714ae52513debf6257576587b2ea3c0f90642f377667c833a6", + "docs/screenshots/webview-engine/legacy-common-positive/engine-result.png": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "docs/screenshots/webview-engine/legacy-common-positive/engine-content-end.png": "91d34337441e9fad2c526a325b69097f81c89b69b59b483f68e0cea7e7079d24", + "docs/screenshots/webview-engine/modern-phone200/grid-ready.png": "c6f3d15354476e3343c818c0bbeec7d1919050c0ae3d3f769f603e52689bd37f", + "docs/screenshots/webview-engine/modern-phone200/grid-returned.png": "3c6bd7a65f5f27526cdf1700d69616153d16e0c9ea6c623c59c4cd15a1137e5a", + "docs/screenshots/webview-engine/modern-phone200/index-ready.png": "29b0c2f5ab7f9cbc999f8b410e604a34f132a9028d5b014f1792a08098c8041a", + "docs/screenshots/webview-engine/modern-phone200/index-action.png": "ab1cf4b8353df8d861ebe94a445265a820103593064ae27c073d2af7bc85a74d", + "docs/screenshots/webview-engine/modern-phone200/index-returned.png": "20d90b982e0a5578af0d2afa1caa9d3cd91f50ccb81790b4d594c267aa321808", + "docs/screenshots/webview-engine/modern-phone200/grid-action.png": "bc31772126525a3da768ff7ca8ee4069068513674e3e2e45f28206f1a8ea6d2e", + "docs/screenshots/webview-engine/legacy100/cancelled-caller.png": "d88dd45591560ffcc38f1007bb95be10801c0663cd55612d208d016a9535a0cc", + "docs/screenshots/webview-engine/legacy100/settings-destination.png": "b9a660c45cc8558cfb3cc4a96a864782c7fa6ef6a824b1bcd7ab97e740665cba", + "docs/screenshots/webview-engine/legacy100/settings-before.png": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "docs/screenshots/webview-engine/legacy100/returned-caller.png": "6897cb03102fa7b5f339bcb029c8c276bb0d0cf59e89eba314e339d478730ff1", + "docs/screenshots/webview-engine/legacy100/equivalent-failure-ready.png": "7dc348e17e6e1dfcfda52fc43980afa0550bfe62c9c37cb23a16021c300e2a70", + "docs/screenshots/webview-engine/legacy100/engine-result.png": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "docs/screenshots/webview-engine/legacy100/settings-returned.png": "4986a43f08bbff2c08291bf88fa7c92d80750bba03d63db579401e514e4ac10d", + "docs/screenshots/webview-engine/legacy100/engine-content-end.png": "aa40bb9ed62bcf1460e3224bbc0e532e44d54824e74e74a11dc919d17f423252", + "docs/screenshots/webview-engine/legacy-common-negative/engine-result.png": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "docs/screenshots/webview-engine/legacy-common-negative/failure.png": "f6b3974fa67ddee3ef3f7a7fa7d45cdab38b165e1aac389c418503c213f4acc1", + "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.png": "6f979107d103e1dd7d59ec970cb15ada4bcf241eed8be694dec336d5d5722fae", + "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.png": "dede39f7c3c3592e248878f9e552bc6d22bcf875e897049de4ac8c98f16ba7b8", + "docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.png": "a6140a3bdf7a1296107de2d5107aded31cefd812217885556129a8d31c4ec0eb", + "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.png": "1bb32facfc66683fe1f961511e8fb0caa016affc692cb0b27b50b62a3a7b02ac", + "docs/screenshots/webview-engine/paste/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.png": "b3411610b5536d6c1043dc8ca7b9b8ba8c673837d0030bc52e1ab0ad385dd5c2", + "docs/screenshots/webview-engine/paste/pastecopy-pointercopyisexactonceandreturns-caller-return.png": "e584c9827f2ec7a72ab843c3f2566db50532fa3af99a0c214712a1c9a8484739" + }, + "source_head": "0328732e731b7f2fcb071e8169ec9b52ca8b745e" +} diff --git a/docs/validation/webview-engine/checks/final-benchmark-build-v2.log b/docs/validation/webview-engine/checks/final-benchmark-build-v2.log new file mode 100644 index 00000000..e0fe98a3 --- /dev/null +++ b/docs/validation/webview-engine/checks/final-benchmark-build-v2.log @@ -0,0 +1,115 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkNativeLibs UP-TO-DATE +> Task :app:stripBenchmarkDebugSymbols UP-TO-DATE +> Task :app:extractBenchmarkNativeSymbolTables UP-TO-DATE +> Task :app:mergeBenchmarkNativeDebugMetadata NO-SOURCE +> Task :app:mergeBenchmarkArtProfile UP-TO-DATE +> Task :app:desugarBenchmarkFileDependencies UP-TO-DATE +> Task :app:generateBenchmarkBuildConfig +> Task :app:generateBenchmarkResources UP-TO-DATE +> Task :app:packageBenchmarkResources UP-TO-DATE +> Task :app:processBenchmarkNavigationResources +> Task :app:parseBenchmarkLocalResources UP-TO-DATE +> Task :app:generateBenchmarkRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmark UP-TO-DATE +> Task :app:checkBenchmarkAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkResources UP-TO-DATE +> Task :app:createBenchmarkCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksBenchmark +> Task :app:processBenchmarkMainManifest +> Task :app:processBenchmarkManifest +> Task :app:checkBenchmarkDuplicateClasses UP-TO-DATE +> Task :app:mergeBenchmarkStartupProfile UP-TO-DATE +> Task :app:mergeExtDexBenchmark UP-TO-DATE +> Task :app:generateBenchmarkAssets UP-TO-DATE +> Task :app:mergeBenchmarkAssets UP-TO-DATE +> Task :app:compressBenchmarkAssets UP-TO-DATE +> Task :app:extractBenchmarkVersionControlInfo UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:collectBenchmarkDependencies UP-TO-DATE +> Task :app:sdkBenchmarkDependencyData UP-TO-DATE +> Task :app:validateSigningBenchmark UP-TO-DATE +> Task :app:writeBenchmarkAppMetadata UP-TO-DATE +> Task :app:writeBenchmarkSigningConfigVersions UP-TO-DATE +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkAndroidTestManifest +> Task :app:generateBenchmarkAndroidTestBuildConfig +> Task :app:generateBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:packageBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestNavigationResources +> Task :app:parseBenchmarkAndroidTestLocalResources UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmarkAndroidTest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:compressBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:desugarBenchmarkAndroidTestFileDependencies UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:mergeExtDexBenchmarkAndroidTest UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest UP-TO-DATE +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:processBenchmarkManifestForPackage +> Task :app:processBenchmarkResources +> Task :app:optimizeBenchmarkResources + +> Task :app:compileBenchmarkKotlin +w: file:///app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:215:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:229:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkJavaWithJavac +> Task :app:dexBuilderBenchmark +> Task :app:mergeBenchmarkGlobalSynthetics UP-TO-DATE +> Task :app:generateBenchmarkLintVitalReportModel +> Task :app:processBenchmarkJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkJavaResource UP-TO-DATE +> Task :app:generateBenchmarkLintReportModel +> Task :app:bundleBenchmarkClassesToCompileJar +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:generateBenchmarkUnitTestLintModel + +> Task :app:compileBenchmarkAndroidTestKotlin +w: file:///app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkAndroidTestJavaWithJavac +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:processBenchmarkAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJavaResource UP-TO-DATE +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmarkAndroidTest +> Task :app:mergeDexBenchmark +> Task :app:compileBenchmarkArtProfile +> Task :app:lintAnalyzeBenchmarkUnitTest +> Task :app:lintVitalAnalyzeBenchmark +> Task :app:lintVitalReportBenchmark SKIPPED +> Task :app:lintVitalBenchmark SKIPPED +> Task :app:packageBenchmark +> Task :app:createBenchmarkApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmark +> Task :app:lintAnalyzeBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmark + +> Task :app:lintReportBenchmark +Wrote HTML report to file:///app/build/reports/lint-results-benchmark.html + +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 56s +87 actionable tasks: 33 executed, 54 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/checks/final-benchmark-harness-build-v3.log b/docs/validation/webview-engine/checks/final-benchmark-harness-build-v3.log new file mode 100644 index 00000000..ab236e0e --- /dev/null +++ b/docs/validation/webview-engine/checks/final-benchmark-harness-build-v3.log @@ -0,0 +1,73 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:generateBenchmarkBuildConfig UP-TO-DATE +> Task :app:generateBenchmarkResources UP-TO-DATE +> Task :app:packageBenchmarkResources UP-TO-DATE +> Task :app:processBenchmarkNavigationResources UP-TO-DATE +> Task :app:parseBenchmarkLocalResources UP-TO-DATE +> Task :app:generateBenchmarkRFile UP-TO-DATE +> Task :app:compileBenchmarkKotlin UP-TO-DATE +> Task :app:javaPreCompileBenchmark UP-TO-DATE +> Task :app:compileBenchmarkJavaWithJavac UP-TO-DATE +> Task :app:checkBenchmarkAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkResources UP-TO-DATE +> Task :app:createBenchmarkCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksBenchmark UP-TO-DATE +> Task :app:processBenchmarkMainManifest UP-TO-DATE +> Task :app:processBenchmarkManifest UP-TO-DATE +> Task :app:processBenchmarkManifestForPackage UP-TO-DATE +> Task :app:processBenchmarkResources UP-TO-DATE +> Task :app:bundleBenchmarkClassesToCompileJar UP-TO-DATE +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkAndroidTestManifest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:packageBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseBenchmarkAndroidTestLocalResources UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmarkAndroidTest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:compressBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:desugarBenchmarkAndroidTestFileDependencies UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:mergeExtDexBenchmarkAndroidTest UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkNativeLibs UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest UP-TO-DATE +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:generateBenchmarkLintReportModel UP-TO-DATE +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:generateBenchmarkUnitTestLintModel UP-TO-DATE +> Task :app:lintAnalyzeBenchmark UP-TO-DATE +> Task :app:lintAnalyzeBenchmarkUnitTest UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestKotlin +> Task :app:compileBenchmarkAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:processBenchmarkAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJavaResource UP-TO-DATE +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmarkAndroidTest +> Task :app:lintReportBenchmark UP-TO-DATE +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 12s +61 actionable tasks: 7 executed, 54 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/checks/final-harness-build-v3.log b/docs/validation/webview-engine/checks/final-harness-build-v3.log new file mode 100644 index 00000000..27060dba --- /dev/null +++ b/docs/validation/webview-engine/checks/final-harness-build-v3.log @@ -0,0 +1,101 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:generateDebugAssets UP-TO-DATE +> Task :app:mergeDebugAssets UP-TO-DATE +> Task :app:compressDebugAssets UP-TO-DATE +> Task :app:generateDebugGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebug UP-TO-DATE +> Task :app:mergeLibDexDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:stripDebugDebugSymbols UP-TO-DATE +> Task :app:validateSigningDebug UP-TO-DATE +> Task :app:writeDebugAppMetadata UP-TO-DATE +> Task :app:writeDebugSigningConfigVersions UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:processDebugResources +> Task :app:compileDebugKotlin +> Task :app:compileDebugJavaWithJavac +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:mergeDebugJavaResource UP-TO-DATE +> Task :app:dexBuilderDebug +> Task :app:generateDebugLintReportModel +> Task :app:bundleDebugClassesToCompileJar +> Task :app:generateDebugAndroidTestLintModel +> Task :app:generateDebugUnitTestLintModel +> Task :app:mergeProjectDexDebug +> Task :app:packageDebug +> Task :app:createDebugApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebug + +> Task :app:compileDebugAndroidTestKotlin +w: file:///app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest +> Task :app:lintAnalyzeDebugUnitTest +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintAnalyzeDebug + +> Task :app:lintReportDebug +Wrote HTML report to file:///app/build/reports/lint-results-debug.html + +> Task :app:lintDebug + +BUILD SUCCESSFUL in 39s +79 actionable tasks: 29 executed, 50 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/checks/final-harness-build-v4.log b/docs/validation/webview-engine/checks/final-harness-build-v4.log new file mode 100644 index 00000000..9df021e5 --- /dev/null +++ b/docs/validation/webview-engine/checks/final-harness-build-v4.log @@ -0,0 +1,74 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest UP-TO-DATE +> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:generateDebugAndroidTestLintModel +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:generateDebugLintReportModel UP-TO-DATE +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:generateDebugUnitTestLintModel UP-TO-DATE +> Task :app:lintAnalyzeDebug UP-TO-DATE +> Task :app:lintAnalyzeDebugUnitTest UP-TO-DATE +> Task :app:compileDebugAndroidTestKotlin +> Task :app:compileDebugAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintReportDebug UP-TO-DATE +> Task :app:lintDebug + +BUILD SUCCESSFUL in 15s +62 actionable tasks: 7 executed, 55 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/checks/final-harness-build-v5.log b/docs/validation/webview-engine/checks/final-harness-build-v5.log new file mode 100644 index 00000000..ce831574 --- /dev/null +++ b/docs/validation/webview-engine/checks/final-harness-build-v5.log @@ -0,0 +1,74 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest UP-TO-DATE +> Task :app:generateDebugAndroidTestBuildConfig UP-TO-DATE +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:generateDebugAndroidTestLintModel +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:generateDebugLintReportModel UP-TO-DATE +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:generateDebugUnitTestLintModel UP-TO-DATE +> Task :app:lintAnalyzeDebug UP-TO-DATE +> Task :app:lintAnalyzeDebugUnitTest UP-TO-DATE +> Task :app:compileDebugAndroidTestKotlin +> Task :app:compileDebugAndroidTestJavaWithJavac UP-TO-DATE +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintReportDebug UP-TO-DATE +> Task :app:lintDebug + +BUILD SUCCESSFUL in 12s +62 actionable tasks: 7 executed, 55 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/checks/final-runtime-build-v2.log b/docs/validation/webview-engine/checks/final-runtime-build-v2.log new file mode 100644 index 00000000..fbb5e7dc --- /dev/null +++ b/docs/validation/webview-engine/checks/final-runtime-build-v2.log @@ -0,0 +1,111 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE +> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE +> Task :app:generateDebugAssets UP-TO-DATE +> Task :app:mergeDebugAssets UP-TO-DATE +> Task :app:compressDebugAssets UP-TO-DATE +> Task :app:generateDebugGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebug UP-TO-DATE +> Task :app:mergeLibDexDebug UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:stripDebugDebugSymbols UP-TO-DATE +> Task :app:validateSigningDebug UP-TO-DATE +> Task :app:writeDebugAppMetadata UP-TO-DATE +> Task :app:writeDebugSigningConfigVersions UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:processDebugResources + +> Task :app:compileDebugKotlin +w: file:///app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:215:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:229:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugJavaWithJavac +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:mergeDebugJavaResource UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar +> Task :app:bundleDebugClassesToRuntimeJar +> Task :app:dexBuilderDebug +> Task :app:compileDebugUnitTestKotlin +> Task :app:generateDebugAndroidTestLintModel +> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE +> Task :app:processDebugUnitTestJavaRes UP-TO-DATE + +> Task :app:compileDebugAndroidTestKotlin +w: file:///app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:mergeProjectDexDebug +> Task :app:testDebugUnitTest +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:generateDebugLintReportModel +> Task :app:generateDebugUnitTestLintModel +> Task :app:packageDebug +> Task :app:createDebugApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebug +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest +> Task :app:lintAnalyzeDebugUnitTest +> Task :app:lintAnalyzeDebug +> Task :app:lintAnalyzeDebugAndroidTest + +> Task :app:lintReportDebug +Wrote HTML report to file:///app/build/reports/lint-results-debug.html + +> Task :app:lintDebug + +BUILD SUCCESSFUL in 1m 3s +84 actionable tasks: 32 executed, 52 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml new file mode 100644 index 00000000..8701159d --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml new file mode 100644 index 00000000..251bd4de --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml new file mode 100644 index 00000000..cde72bbe --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml new file mode 100644 index 00000000..fcdbd055 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml new file mode 100644 index 00000000..0f5233a1 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml new file mode 100644 index 00000000..6bf74840 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionEngineCompatibilityTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionEngineCompatibilityTest.xml new file mode 100644 index 00000000..09d09445 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionEngineCompatibilityTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml new file mode 100644 index 00000000..f84b9a32 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml new file mode 100644 index 00000000..096037e1 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml new file mode 100644 index 00000000..69c786b0 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml new file mode 100644 index 00000000..5ca64d6b --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml new file mode 100644 index 00000000..609772c8 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml new file mode 100644 index 00000000..a1c30cfb --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml new file mode 100644 index 00000000..c0ca2d56 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml new file mode 100644 index 00000000..ef08bfed --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml new file mode 100644 index 00000000..1d7a218d --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml new file mode 100644 index 00000000..00e7bbd3 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPasteCopyTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPasteCopyTest.xml new file mode 100644 index 00000000..f8b7483f --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPasteCopyTest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPayloadIdentityTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPayloadIdentityTest.xml new file mode 100644 index 00000000..3084813a --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionPayloadIdentityTest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml new file mode 100644 index 00000000..5ccd2239 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowEvidenceTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowEvidenceTest.xml new file mode 100644 index 00000000..392ea299 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowEvidenceTest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowInspectionTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowInspectionTest.xml new file mode 100644 index 00000000..2f9da07e --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ExtensionWorkflowInspectionTest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml new file mode 100644 index 00000000..b3437380 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml new file mode 100644 index 00000000..301e77ac --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml new file mode 100644 index 00000000..d46c72af --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml new file mode 100644 index 00000000..a18a905f --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml new file mode 100644 index 00000000..e8199df1 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml new file mode 100644 index 00000000..e75c9c81 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml new file mode 100644 index 00000000..9bd8d120 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutTest.xml new file mode 100644 index 00000000..1a50be34 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.ShortcutTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml new file mode 100644 index 00000000..ef0cdb02 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml new file mode 100644 index 00000000..5dd9d6cf --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml new file mode 100644 index 00000000..1d0d185f --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml new file mode 100644 index 00000000..3c3483cd --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml new file mode 100644 index 00000000..16ef4209 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml new file mode 100644 index 00000000..08c5a450 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml new file mode 100644 index 00000000..ee045938 --- /dev/null +++ b/docs/validation/webview-engine/checks/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/lint-results-benchmark.xml b/docs/validation/webview-engine/checks/lint-results-benchmark.xml new file mode 100644 index 00000000..fa4f5121 --- /dev/null +++ b/docs/validation/webview-engine/checks/lint-results-benchmark.xml @@ -0,0 +1,902 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/lint-results-debug.xml b/docs/validation/webview-engine/checks/lint-results-debug.xml new file mode 100644 index 00000000..fa4f5121 --- /dev/null +++ b/docs/validation/webview-engine/checks/lint-results-debug.xml @@ -0,0 +1,902 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/webview-engine/checks/python-final-v4.log b/docs/validation/webview-engine/checks/python-final-v4.log new file mode 100644 index 00000000..cb6d953b --- /dev/null +++ b/docs/validation/webview-engine/checks/python-final-v4.log @@ -0,0 +1,6 @@ +............................................................................................................................ +---------------------------------------------------------------------- +Ran 124 tests in 17.678s + +OK +{"all_directories_attempted": false, "declared_commands": 0, "directory_count": 2, "independently_anchored_manifests": 0, "manifest_discovery_complete": false, "manifests_read": 0, "not_yet_inspected": 2, "retrieval_or_manifest_errors": 0, "runtime_tested_commands": 0, "runtime_untested_commands": 0} diff --git a/docs/validation/webview-engine/checks/python-optimized-final-v4.log b/docs/validation/webview-engine/checks/python-optimized-final-v4.log new file mode 100644 index 00000000..3acbb3fc --- /dev/null +++ b/docs/validation/webview-engine/checks/python-optimized-final-v4.log @@ -0,0 +1,6 @@ +............................................................................................................................ +---------------------------------------------------------------------- +Ran 124 tests in 20.142s + +OK +{"all_directories_attempted": false, "declared_commands": 0, "directory_count": 2, "independently_anchored_manifests": 0, "manifest_discovery_complete": false, "manifests_read": 0, "not_yet_inspected": 2, "retrieval_or_manifest_errors": 0, "runtime_tested_commands": 0, "runtime_untested_commands": 0} diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json new file mode 100644 index 00000000..cb7bf091 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "caller-return", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml new file mode 100644 index 00000000..c8f4c1c9 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json new file mode 100644 index 00000000..633fa27f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-after-queued-callbacks", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml new file mode 100644 index 00000000..b0a94026 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json new file mode 100644 index 00000000..4b94168e --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "parent-before-queued-handoff", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml new file mode 100644 index 00000000..389eb86d --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json new file mode 100644 index 00000000..cb7bf091 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "caller-return", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml new file mode 100644 index 00000000..c8f4c1c9 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..6f04e9cf --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..b0a94026 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json new file mode 100644 index 00000000..bec00490 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "exact-context-copy", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml new file mode 100644 index 00000000..d68edf5a --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json new file mode 100644 index 00000000..3445558a --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "parent-ready", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml new file mode 100644 index 00000000..389eb86d --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/handoff/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json b/docs/validation/webview-engine/cohorts/handoff/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json new file mode 100644 index 00000000..e5627e3a --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json @@ -0,0 +1,39 @@ +{ + "clipboard_restoration_scope": "Independent host/test-UID durable recovery; this class does not retain or publish the original clipboard", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "fixture_parent_sha256": "89173122097eb113c83d73b1a94ac3208fe6c5bea790029b6d5ef5aa9a61da2d", + "font_scale": 1, + "height_dp": 800, + "launcher_query_preserved": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "one_transfer_before_native_composition": true, + "owned_data_removed": true, + "passed": true, + "paused_parent_probe": { + "attempted": 1, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "preexisting_installations_and_data_preserved": true, + "protocol_setup": "Compose frame clock paused for the logical handoff/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "scope": "Owned JavaScript/native handoff probes; no Store, service, physical-typing or broad parity credit", + "width_dp": 1280 +} diff --git a/docs/validation/webview-engine/cohorts/handoff/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/webview-engine/cohorts/handoff/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..25d8bb06 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,52 @@ +{ + "child_raw_grant_absent": true, + "clipboard_restoration_scope": "Independent host/test-UID durable recovery; this class does not retain or publish the original clipboard", + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "fixture_parent_sha256": "89173122097eb113c83d73b1a94ac3208fe6c5bea790029b6d5ef5aa9a61da2d", + "font_scale": 1, + "height_dp": 800, + "launcher_query_preserved": true, + "owned_data_removed": true, + "passed": true, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1044, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "preexisting_installations_and_data_preserved": true, + "scope": "Owned JavaScript/native handoff probes; no Store, service, physical-typing or broad parity credit", + "width_dp": 1280 +} diff --git a/docs/validation/webview-engine/cohorts/handoff/record.json b/docs/validation/webview-engine/cohorts/handoff/record.json new file mode 100644 index 00000000..b5e92204 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/record.json @@ -0,0 +1,71 @@ +{ + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy,dev.tinycast.android.ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition", + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + }, + "completed": true, + "expected": 2, + "font_scale": 1.0, + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "layout": "tablet", + "original_font_scale": "1.0", + "passes": 2, + "runner_sha256": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "tests_completed": true +} diff --git a/docs/validation/webview-engine/cohorts/handoff/tests.log b/docs/validation/webview-engine/cohorts/handoff/tests.log new file mode 100644 index 00000000..86b602d4 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/handoff/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 23.337 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result-frame.json b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result-frame.json new file mode 100644 index 00000000..72734c38 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-result", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result.xml b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result.xml new file mode 100644 index 00000000..4fc256a0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/engine-result.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure-frame.json b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure-frame.json new file mode 100644 index 00000000..1e87d3f0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "failure", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure.xml b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure.xml new file mode 100644 index 00000000..4fc256a0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/captures/failure.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json b/docs/validation/webview-engine/cohorts/legacy-common-negative/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json new file mode 100644 index 00000000..5ee73367 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "published_native_tree": false, + "runtime_error": "ReferenceError: __tinycast is not defined\n at :1:7", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "time_to_result_ms": 1268 +} diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/record.json b/docs/validation/webview-engine/cohorts/legacy-common-negative/record.json new file mode 100644 index 00000000..8b1effa1 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/record.json @@ -0,0 +1,64 @@ +{ + "api": 26, + "apk_sha256": "b0fa0e302a63320b6e5ed163856756961b4480a1ce476f4cb6167be799535e54", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "completed": true, + "expected_negative": true, + "failures": 1, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "f54a6d6e4986991a6a9095bd2d31a66425d37a37d875562f1c49c063047e1bc2" + }, + "font_scale": 1.0, + "initialization_error": false, + "instrumentation_exit_code": 0, + "layout": "phone", + "methods": [ + "incompatibleEngineShowsNativeRecoveryWithoutDispatch" + ], + "native_expected_outcome": true, + "original_font_scale": "null", + "original_geometry": { + "size": "Physical size: 1080x1920", + "density": "Physical density: 420" + }, + "passes": 0, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 58.0.3029.125)" + ], + "runner_sha256": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e" +} diff --git a/docs/validation/webview-engine/cohorts/legacy-common-negative/tests.log b/docs/validation/webview-engine/cohorts/legacy-common-negative/tests.log new file mode 100644 index 00000000..09bbc217 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-negative/tests.log @@ -0,0 +1,53 @@ +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +Error in incompatibleEngineShowsNativeRecoveryWithoutDispatch(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:133) + +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:133) + +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 3.936 +There was 1 failure: +1) incompatibleEngineShowsNativeRecoveryWithoutDispatch(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:133) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end-frame.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end-frame.json new file mode 100644 index 00000000..ad605bcb --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-content-end", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end.xml b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end.xml new file mode 100644 index 00000000..44809c3e --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-content-end.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result-frame.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result-frame.json new file mode 100644 index 00000000..72734c38 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-result", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result.xml b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result.xml new file mode 100644 index 00000000..44809c3e --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/engine-result.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready-frame.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready-frame.json new file mode 100644 index 00000000..59516e95 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "equivalent-failure-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready.xml b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready.xml new file mode 100644 index 00000000..40f4fb37 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/equivalent-failure-ready.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller-frame.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller-frame.json new file mode 100644 index 00000000..bad3ef32 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "returned-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller.xml b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller.xml new file mode 100644 index 00000000..d68a9b8f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/captures/returned-caller.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json new file mode 100644 index 00000000..634cc406 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "fresh_recovery_actions": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "second_failure_scope": "Controlled native publication of an equivalent failure before recomposition; first failure used the actual legacy engine" +} diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json new file mode 100644 index 00000000..cc4fce84 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json @@ -0,0 +1,51 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "published_native_tree": false, + "runtime_error": "The JavaScript engine could not pass the startup check.", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "target_witnesses": [ + [ + "extension-engine-settings", + 910, + 126 + ], + [ + "extension-engine-return", + 910, + 126 + ] + ], + "text_setup": "Semantic scroll to each paragraph; pointer swipes establish sequential full-line reachability", + "text_witnesses": [ + { + "tag": "extension-engine-title", + "lines": 1, + "all_lines_reached": true + }, + { + "tag": "extension-engine-provider", + "lines": 1, + "all_lines_reached": true + }, + { + "tag": "extension-engine-explanation", + "lines": 2, + "all_lines_reached": true + }, + { + "tag": "extension-engine-guidance", + "lines": 4, + "all_lines_reached": true + } + ], + "time_to_result_ms": 495 +} diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/record.json b/docs/validation/webview-engine/cohorts/legacy-common-positive/record.json new file mode 100644 index 00000000..96938f42 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/record.json @@ -0,0 +1,65 @@ +{ + "api": 26, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "edf583bb9c5b15259871a38f8cb8f262b84a2809d9d8aa76f3c7272300b415c3" + }, + "font_scale": 1.0, + "initialization_error": false, + "instrumentation_exit_code": 0, + "layout": "phone", + "methods": [ + "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition" + ], + "native_expected_outcome": true, + "original_font_scale": "null", + "original_geometry": { + "size": "Physical size: 1080x1920", + "density": "Physical density: 420" + }, + "passes": 2, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 58.0.3029.125)" + ], + "runner_sha256": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e" +} diff --git a/docs/validation/webview-engine/cohorts/legacy-common-positive/tests.log b/docs/validation/webview-engine/cohorts/legacy-common-positive/tests.log new file mode 100644 index 00000000..bb7879b9 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy-common-positive/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.981 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller-frame.json new file mode 100644 index 00000000..19eff240 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "cancelled-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller.xml new file mode 100644 index 00000000..c6147236 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/cancelled-caller.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end-frame.json new file mode 100644 index 00000000..ad605bcb --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-content-end", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end.xml new file mode 100644 index 00000000..5222513c --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-content-end.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/engine-result-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-result-frame.json new file mode 100644 index 00000000..72734c38 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-result-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-result", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/engine-result.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-result.xml new file mode 100644 index 00000000..5222513c --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/engine-result.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready-frame.json new file mode 100644 index 00000000..59516e95 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "equivalent-failure-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready.xml new file mode 100644 index 00000000..8cf3c08f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/equivalent-failure-ready.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller-frame.json new file mode 100644 index 00000000..bad3ef32 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "returned-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller.xml new file mode 100644 index 00000000..97e7ad2a --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/returned-caller.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/settings-before-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-before-frame.json new file mode 100644 index 00000000..b58eab76 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-before-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-before", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/settings-before.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-before.xml new file mode 100644 index 00000000..864ca50c --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-before.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination-frame.json new file mode 100644 index 00000000..2acaa351 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-destination", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination.xml new file mode 100644 index 00000000..5721dcd7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-destination.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned-frame.json b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned-frame.json new file mode 100644 index 00000000..7d6f24a6 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned.xml b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned.xml new file mode 100644 index 00000000..dfead052 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/captures/settings-returned.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json new file mode 100644 index 00000000..942b6377 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json @@ -0,0 +1,15 @@ +{ + "android_api": 26, + "api_probe_result": "Rejected(failure=MISSING_APIS, missingApis=[Array.prototype.at, Object.fromEntries, Object.hasOwn, globalThis])", + "case": "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "compile_body_executed": false, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "invalid_syntax_caught": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json new file mode 100644 index 00000000..41327191 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "bridgeCannotPublishOrReadHostApisBeforeApproval", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "preflight_bridge_render_rejected": true, + "preflight_host_api_rejected": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json new file mode 100644 index 00000000..3fa9503f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json @@ -0,0 +1,13 @@ +{ + "android_api": 26, + "case": "closingBeforePreflightFinishesRejectsLatePublication", + "closed_owner_remained_inactive": true, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json new file mode 100644 index 00000000..634cc406 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "fresh_recovery_actions": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "second_failure_scope": "Controlled native publication of an equivalent failure before recomposition; first failure used the actual legacy engine" +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json new file mode 100644 index 00000000..d5cee357 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineOpensOnlyActualProviderSettingsAndReturns", + "explicit_settings_destination": "com.android.settings", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json new file mode 100644 index 00000000..4481291f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json @@ -0,0 +1,51 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "published_native_tree": false, + "runtime_error": "The JavaScript engine could not pass the startup check.", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "target_witnesses": [ + [ + "extension-engine-settings", + 910, + 126 + ], + [ + "extension-engine-return", + 910, + 126 + ] + ], + "text_setup": "Semantic scroll to each paragraph; pointer swipes establish sequential full-line reachability", + "text_witnesses": [ + { + "tag": "extension-engine-title", + "lines": 1, + "all_lines_reached": true + }, + { + "tag": "extension-engine-provider", + "lines": 1, + "all_lines_reached": true + }, + { + "tag": "extension-engine-explanation", + "lines": 2, + "all_lines_reached": true + }, + { + "tag": "extension-engine-guidance", + "lines": 4, + "all_lines_reached": true + } + ], + "time_to_result_ms": 607 +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json b/docs/validation/webview-engine/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json new file mode 100644 index 00000000..23aaafbf --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "case": "replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "replacement_not_closed": true, + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "stale_settings_launches": 0 +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/record.json b/docs/validation/webview-engine/cohorts/legacy100/record.json new file mode 100644 index 00000000..72127019 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/record.json @@ -0,0 +1,69 @@ +{ + "api": 26, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "9d3db6a730837c191536f05dc45bccc8f1051139677892c55c3f3fb619599e18" + }, + "font_scale": 1.0, + "instrumentation_exit_code": 0, + "layout": "phone", + "methods": [ + "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "incompatibleEngineOpensOnlyActualProviderSettingsAndReturns", + "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "closingBeforePreflightFinishesRejectsLatePublication", + "bridgeCannotPublishOrReadHostApisBeforeApproval", + "replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks", + "equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition" + ], + "native_expected_outcome": true, + "original_font_scale": "null", + "original_geometry": { + "size": "Physical size: 1080x1920", + "density": "Physical density: 420" + }, + "passes": 7, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 58.0.3029.125)" + ], + "runner_sha256": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "test_apk_sha256": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747" +} diff --git a/docs/validation/webview-engine/cohorts/legacy100/tests.log b/docs/validation/webview-engine/cohorts/legacy100/tests.log new file mode 100644 index 00000000..cb50ed4f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy100/tests.log @@ -0,0 +1,107 @@ +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=7 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=7 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 33.422 + +OK (7 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end-frame.json b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end-frame.json new file mode 100644 index 00000000..ad605bcb --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-content-end", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end.xml b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end.xml new file mode 100644 index 00000000..5b9e76e5 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-content-end.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/engine-result-frame.json b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-result-frame.json new file mode 100644 index 00000000..72734c38 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-result-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "engine-result", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/engine-result.xml b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-result.xml new file mode 100644 index 00000000..298c6219 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/engine-result.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller-frame.json b/docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller-frame.json new file mode 100644 index 00000000..bad3ef32 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "returned-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller.xml b/docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller.xml new file mode 100644 index 00000000..caaafade --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/returned-caller.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/settings-before-frame.json b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-before-frame.json new file mode 100644 index 00000000..b58eab76 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-before-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-before", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/settings-before.xml b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-before.xml new file mode 100644 index 00000000..e193dfa7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-before.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination-frame.json b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination-frame.json new file mode 100644 index 00000000..2acaa351 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-destination", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination.xml b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination.xml new file mode 100644 index 00000000..df4b09d6 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-destination.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned-frame.json b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned-frame.json new file mode 100644 index 00000000..7d6f24a6 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "settings-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 26, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned.xml b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned.xml new file mode 100644 index 00000000..5c8ae178 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/captures/settings-returned.xml @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json b/docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json new file mode 100644 index 00000000..b59db098 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json @@ -0,0 +1,14 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineOpensOnlyActualProviderSettingsAndReturns", + "explicit_settings_destination": "com.android.settings", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 2, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json b/docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json new file mode 100644 index 00000000..d531df3b --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json @@ -0,0 +1,51 @@ +{ + "android_api": 26, + "caller_query_restored": true, + "case": "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 2, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "58.0.3029.125", + "published_native_tree": false, + "runtime_error": "The JavaScript engine could not pass the startup check.", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit", + "target_witnesses": [ + [ + "extension-engine-settings", + 910, + 140 + ], + [ + "extension-engine-return", + 910, + 140 + ] + ], + "text_setup": "Semantic scroll to each paragraph; pointer swipes establish sequential full-line reachability", + "text_witnesses": [ + { + "tag": "extension-engine-title", + "lines": 2, + "all_lines_reached": true + }, + { + "tag": "extension-engine-provider", + "lines": 2, + "all_lines_reached": true + }, + { + "tag": "extension-engine-explanation", + "lines": 4, + "all_lines_reached": true + }, + { + "tag": "extension-engine-guidance", + "lines": 9, + "all_lines_reached": true + } + ], + "time_to_result_ms": 491 +} diff --git a/docs/validation/webview-engine/cohorts/legacy200/record.json b/docs/validation/webview-engine/cohorts/legacy200/record.json new file mode 100644 index 00000000..df26b292 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/record.json @@ -0,0 +1,64 @@ +{ + "api": 26, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "81edf05ae8a320fa5f814776d600e7abd8fc61461dac08c3cf485a5302882889" + }, + "font_scale": 2.0, + "instrumentation_exit_code": 0, + "layout": "phone", + "methods": [ + "incompatibleEngineShowsNativeRecoveryWithoutDispatch", + "incompatibleEngineOpensOnlyActualProviderSettingsAndReturns" + ], + "native_expected_outcome": true, + "original_font_scale": "null", + "original_geometry": { + "size": "Physical size: 1080x1920", + "density": "Physical density: 420" + }, + "passes": 2, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 58.0.3029.125)" + ], + "runner_sha256": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "test_apk_sha256": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747" +} diff --git a/docs/validation/webview-engine/cohorts/legacy200/tests.log b/docs/validation/webview-engine/cohorts/legacy200/tests.log new file mode 100644 index 00000000..484a4faf --- /dev/null +++ b/docs/validation/webview-engine/cohorts/legacy200/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 13.93 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action-frame.json b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action-frame.json new file mode 100644 index 00000000..af67cea0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action.xml b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action.xml new file mode 100644 index 00000000..2831bd81 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-action.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready-frame.json b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready-frame.json new file mode 100644 index 00000000..06b897f0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready.xml b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready.xml new file mode 100644 index 00000000..8a34f7ca --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-ready.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned-frame.json b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned-frame.json new file mode 100644 index 00000000..4a9b28e0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned.xml b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned.xml new file mode 100644 index 00000000..cef643d5 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/grid-returned.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action-frame.json b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action-frame.json new file mode 100644 index 00000000..5331fc14 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action.xml b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action.xml new file mode 100644 index 00000000..3b441e7c --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-action.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready-frame.json b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready-frame.json new file mode 100644 index 00000000..4f9ef866 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready.xml b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready.xml new file mode 100644 index 00000000..173048d3 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-ready.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned-frame.json b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned-frame.json new file mode 100644 index 00000000..95879a09 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned.xml b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned.xml new file mode 100644 index 00000000..7d28ee8a --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/captures/index-returned.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json b/docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json new file mode 100644 index 00000000..ca94f5a7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesGridAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 2, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-list-and-runs-live-action.json b/docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-list-and-runs-live-action.json new file mode 100644 index 00000000..580412e3 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-list-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesListAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 2, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/record.json b/docs/validation/webview-engine/cohorts/modern-landscape200/record.json new file mode 100644 index 00000000..22ce8021 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/record.json @@ -0,0 +1,86 @@ +{ + "api": 36, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "restore-size": { + "passed": true + }, + "restore-density": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "f984e662bbe20c137ec6cb029ad9e3f7740e3e55ffc057273ff081fab0021168" + }, + "font_scale": 2.0, + "instrumentation_exit_code": 0, + "layout": "landscape", + "methods": [ + "modernEnginePublishesListAndRunsLiveAction", + "modernEnginePublishesGridAndRunsLiveAction" + ], + "native_expected_outcome": true, + "original_font_scale": "1.0", + "original_geometry": { + "size": "Physical size: 1920x1200", + "density": "Physical density: 240" + }, + "passes": 2, + "preserved_file_count": 573, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 133.0.6943.137)" + ], + "runner_sha256": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" +} diff --git a/docs/validation/webview-engine/cohorts/modern-landscape200/tests.log b/docs/validation/webview-engine/cohorts/modern-landscape200/tests.log new file mode 100644 index 00000000..b1889793 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-landscape200/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 11.39 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action-frame.json b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action-frame.json new file mode 100644 index 00000000..af67cea0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action.xml b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action.xml new file mode 100644 index 00000000..0356c8d4 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-action.xml @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready-frame.json b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready-frame.json new file mode 100644 index 00000000..06b897f0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready.xml b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready.xml new file mode 100644 index 00000000..50917d8d --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-ready.xml @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned-frame.json b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned-frame.json new file mode 100644 index 00000000..4a9b28e0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned.xml b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned.xml new file mode 100644 index 00000000..33a3c98a --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/grid-returned.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action-frame.json b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action-frame.json new file mode 100644 index 00000000..5331fc14 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action.xml b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action.xml new file mode 100644 index 00000000..bd42bf2e --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-action.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready-frame.json b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready-frame.json new file mode 100644 index 00000000..4f9ef866 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready.xml b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready.xml new file mode 100644 index 00000000..2a1c437f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-ready.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned-frame.json b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned-frame.json new file mode 100644 index 00000000..95879a09 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned.xml b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned.xml new file mode 100644 index 00000000..bd8a591f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/captures/index-returned.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json b/docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json new file mode 100644 index 00000000..ca94f5a7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesGridAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 2, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-list-and-runs-live-action.json b/docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-list-and-runs-live-action.json new file mode 100644 index 00000000..580412e3 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-list-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesListAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 2, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/record.json b/docs/validation/webview-engine/cohorts/modern-phone200/record.json new file mode 100644 index 00000000..9cc0b2bd --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/record.json @@ -0,0 +1,86 @@ +{ + "api": 36, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "restore-size": { + "passed": true + }, + "restore-density": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "f314794f60f287efb9ede4055255ca7421e354c2265c400700367dba634279f2" + }, + "font_scale": 2.0, + "instrumentation_exit_code": 0, + "layout": "phone", + "methods": [ + "modernEnginePublishesListAndRunsLiveAction", + "modernEnginePublishesGridAndRunsLiveAction" + ], + "native_expected_outcome": true, + "original_font_scale": "1.0", + "original_geometry": { + "size": "Physical size: 1920x1200", + "density": "Physical density: 240" + }, + "passes": 2, + "preserved_file_count": 573, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 133.0.6943.137)" + ], + "runner_sha256": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" +} diff --git a/docs/validation/webview-engine/cohorts/modern-phone200/tests.log b/docs/validation/webview-engine/cohorts/modern-phone200/tests.log new file mode 100644 index 00000000..651d03b6 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-phone200/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 10.621 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller-frame.json new file mode 100644 index 00000000..97aa5984 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "cancelled-caller", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller.xml new file mode 100644 index 00000000..a02344db --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/cancelled-caller.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action-frame.json new file mode 100644 index 00000000..af67cea0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action.xml new file mode 100644 index 00000000..4aaa4bd0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-action.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready-frame.json new file mode 100644 index 00000000..06b897f0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready.xml new file mode 100644 index 00000000..fd750fc1 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-ready.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned-frame.json new file mode 100644 index 00000000..4a9b28e0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "grid-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned.xml new file mode 100644 index 00000000..f2cfe34b --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/grid-returned.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action-frame.json new file mode 100644 index 00000000..5331fc14 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-action", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action.xml new file mode 100644 index 00000000..91f38854 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-action.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready-frame.json new file mode 100644 index 00000000..4f9ef866 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-ready", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready.xml new file mode 100644 index 00000000..eadde6bc --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-ready.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned-frame.json b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned-frame.json new file mode 100644 index 00000000..95879a09 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned-frame.json @@ -0,0 +1,6 @@ +{ + "phase": "index-returned", + "synchronization": "Compose idle and two UI frames; accessibility cache reset where supported; hierarchy before PNG; XML geometry is not a visibility witness on API26", + "api": 36, + "scope": "Owned parser\/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned.xml b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned.xml new file mode 100644 index 00000000..4d59b5d1 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/captures/index-returned.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json new file mode 100644 index 00000000..65839f8e --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json @@ -0,0 +1,15 @@ +{ + "android_api": 36, + "api_probe_result": "Passed", + "case": "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "compile_body_executed": false, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "invalid_syntax_caught": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json new file mode 100644 index 00000000..be36d7b9 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "case": "bridgeCannotPublishOrReadHostApisBeforeApproval", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "preflight_bridge_render_rejected": true, + "preflight_host_api_rejected": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json new file mode 100644 index 00000000..959209c5 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json @@ -0,0 +1,13 @@ +{ + "android_api": 36, + "case": "closingBeforePreflightFinishesRejectsLatePublication", + "closed_owner_remained_inactive": true, + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json new file mode 100644 index 00000000..315a2b33 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesGridAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json new file mode 100644 index 00000000..4a23f3ec --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json @@ -0,0 +1,14 @@ +{ + "android_api": 36, + "caller_query_restored": true, + "case": "modernEnginePublishesListAndRunsLiveAction", + "fixture_bytecode_scope": "ES5 owned List/Grid; local React-state action only; no preferences, storage, clipboard or networking", + "fixture_cleanup_owner": "Host retains ownership until evidence is pulled and registered paths are removed", + "font_scale": 1, + "live_action_published": true, + "palette_preferences_restored": true, + "passed": true, + "provider": "com.google.android.webview", + "provider_version": "133.0.6943.137", + "scope": "Owned parser/engine boundary and native recovery; no Store, service, clipboard or Android8 execution-parity credit" +} diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/record.json b/docs/validation/webview-engine/cohorts/modern-tablet100/record.json new file mode 100644 index 00000000..3b49d7bd --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/record.json @@ -0,0 +1,83 @@ +{ + "api": 36, + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "completed": true, + "expected_negative": false, + "failures": 0, + "fixture_sha256": { + "index.js": "7aaeebc691bfeb4f05ee8635a933371e0fb56560543990b8764e58a831304d88", + "grid.js": "599e2e7f5c9f881cd225fe486bb839d06c5bccb4544c1a6ecf2e2b922edd3460", + "package.json": "a9b64efc0931622cf70e289cf1f28d126db05570b7a70ae179e219bede863219", + ".tinycast-store.json": "5ded6ac853a42b91e09a7de3e20d44cb7f30c76b7dc08d3bacf87f6c945bce36" + }, + "font_scale": 1.0, + "instrumentation_exit_code": 0, + "layout": "tablet", + "methods": [ + "modernEnginePublishesListAndRunsLiveAction", + "modernEnginePublishesGridAndRunsLiveAction", + "actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax", + "closingBeforePreflightFinishesRejectsLatePublication", + "bridgeCannotPublishOrReadHostApisBeforeApproval" + ], + "native_expected_outcome": true, + "original_font_scale": "1.0", + "original_geometry": { + "size": "Physical size: 1920x1200", + "density": "Physical density: 240" + }, + "passes": 5, + "preserved_file_count": 573, + "provider_before": [ + "Current WebView package (name, version): (com.google.android.webview, 133.0.6943.137)" + ], + "runner_sha256": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" +} diff --git a/docs/validation/webview-engine/cohorts/modern-tablet100/tests.log b/docs/validation/webview-engine/cohorts/modern-tablet100/tests.log new file mode 100644 index 00000000..aa98b1e2 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/modern-tablet100/tests.log @@ -0,0 +1,79 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 24.833 + +OK (5 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json new file mode 100644 index 00000000..4ba61116 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "caller-return", + "scope": "Owned JavaScript\/native paste\/Copy protocols; no service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml new file mode 100644 index 00000000..364b2d06 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-caller-return.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json new file mode 100644 index 00000000..f6bb2fa8 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "duplicate-sentinel-preserved", + "scope": "Owned JavaScript\/native paste\/Copy protocols; no service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml new file mode 100644 index 00000000..c29294ec --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-duplicate-sentinel-preserved.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json new file mode 100644 index 00000000..12275a47 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "pending-before-copy", + "scope": "Owned JavaScript\/native paste\/Copy protocols; no service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml new file mode 100644 index 00000000..bcc09dbb --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-pending-before-copy.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json new file mode 100644 index 00000000..c691cdec --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "unicode-exact-copy", + "scope": "Owned JavaScript\/native paste\/Copy protocols; no service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml new file mode 100644 index 00000000..c29294ec --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-pointercopyisexactonceandreturns-unicode-exact-copy.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json new file mode 100644 index 00000000..f7125562 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "cancelled-caller", + "scope": "Owned JavaScript\/native paste\/Copy protocols; no service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml new file mode 100644 index 00000000..364b2d06 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-cancelled-caller.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json new file mode 100644 index 00000000..f57d2062 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "pending-before-return", + "scope": "Owned JavaScript\/native paste\/Copy protocols; no service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml new file mode 100644 index 00000000..bcc09dbb --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/captures/pastecopy-returnandescapecancelwithoutcopy-pending-before-return.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/paste/cases/pastecopy-pointercopyisexactonceandreturns-record.json b/docs/validation/webview-engine/cohorts/paste/cases/pastecopy-pointercopyisexactonceandreturns-record.json new file mode 100644 index 00000000..86da9385 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/cases/pastecopy-pointercopyisexactonceandreturns-record.json @@ -0,0 +1,51 @@ +{ + "clipboard_restoration_scope": "Independent host/test-UID durable recovery; this class does not retain or publish the original clipboard", + "copy_exact": true, + "duplicate_after_copy_rejected": true, + "duplicate_probe_setup": "After the real exact Copy, a separate owned sentinel is written; retained callbacks must leave it unchanged. Listener notifications are diagnostics, not native write counts.", + "fixture_manifest_sha256": "31eaca8f22c4b4072b6070709585431958fe125d322eeec1dab3c4c6d7d06ab2", + "fixture_parent_sha256": "9017ee80e4139cbbe46890b1f1bd1292b3b1c9bf3bce4512151f8898337293b8", + "font_scale": 1, + "height_dp": 800, + "launcher_query_preserved": true, + "owned_data_removed": true, + "passed": true, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1084, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-paste-copy", + "bounds": [ + 428, + 848, + 951, + 920 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-paste-return", + "bounds": [ + 428, + 848, + 1493, + 920 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "preexisting_installations_and_data_preserved": true, + "scope": "Owned JavaScript/native paste/Copy protocols; no service, physical-typing or broad parity credit", + "width_dp": 1280 +} diff --git a/docs/validation/webview-engine/cohorts/paste/cases/pastecopy-returnandescapecancelwithoutcopy-record.json b/docs/validation/webview-engine/cohorts/paste/cases/pastecopy-returnandescapecancelwithoutcopy-record.json new file mode 100644 index 00000000..7fbf203d --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/cases/pastecopy-returnandescapecancelwithoutcopy-record.json @@ -0,0 +1,48 @@ +{ + "clipboard_restoration_scope": "Independent host/test-UID durable recovery; this class does not retain or publish the original clipboard", + "fixture_manifest_sha256": "31eaca8f22c4b4072b6070709585431958fe125d322eeec1dab3c4c6d7d06ab2", + "fixture_parent_sha256": "9017ee80e4139cbbe46890b1f1bd1292b3b1c9bf3bce4512151f8898337293b8", + "font_scale": 1, + "height_dp": 800, + "owned_data_removed": true, + "passed": true, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1084, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-paste-return", + "bounds": [ + 969, + 848, + 1493, + 920 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1084, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "preexisting_installations_and_data_preserved": true, + "return_and_escape_cancelled_without_copy": true, + "scope": "Owned JavaScript/native paste/Copy protocols; no service, physical-typing or broad parity credit", + "width_dp": 1280 +} diff --git a/docs/validation/webview-engine/cohorts/paste/record.json b/docs/validation/webview-engine/cohorts/paste/record.json new file mode 100644 index 00000000..77cf729f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/record.json @@ -0,0 +1,71 @@ +{ + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "classes": "dev.tinycast.android.ExtensionPasteCopyDeviceTest#pointerCopyIsExactOnceAndReturns,dev.tinycast.android.ExtensionPasteCopyDeviceTest#returnAndEscapeCancelWithoutCopy", + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + }, + "completed": true, + "expected": 2, + "font_scale": 1.0, + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "layout": "tablet", + "original_font_scale": "1.0", + "passes": 2, + "runner_sha256": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "tests_completed": true +} diff --git a/docs/validation/webview-engine/cohorts/paste/tests.log b/docs/validation/webview-engine/cohorts/paste/tests.log new file mode 100644 index 00000000..af75bde4 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/paste/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionPasteCopyDeviceTest: +INSTRUMENTATION_STATUS: test=pointerCopyIsExactOnceAndReturns +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=pointerCopyIsExactOnceAndReturns +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=returnAndEscapeCancelWithoutCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=returnAndEscapeCancelWithoutCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 26.52 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json new file mode 100644 index 00000000..c572e07c --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "cancelled-return", + "external_caller": true, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml new file mode 100644 index 00000000..7e36edfc --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json new file mode 100644 index 00000000..0a48ebd7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "entry", + "external_caller": false, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml new file mode 100644 index 00000000..2fb1ef60 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json new file mode 100644 index 00000000..03539271 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed-frame.json @@ -0,0 +1,7 @@ +{ + "scope": "Controlled Activity\/runtime ownership probes using an owned JavaScript fixture; not a Store compatibility result", + "phase": "completed", + "launch_epoch": 1, + "route": "extension-run", + "synchronization": "Committed native\/Compose state, hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml new file mode 100644 index 00000000..58d81704 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-completed.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json new file mode 100644 index 00000000..5caa9225 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error-frame.json @@ -0,0 +1,7 @@ +{ + "scope": "Controlled Activity\/runtime ownership probes using an owned JavaScript fixture; not a Store compatibility result", + "phase": "async-host-error", + "launch_epoch": 1, + "route": "extension-run", + "synchronization": "Committed native\/Compose state, hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml new file mode 100644 index 00000000..d225b5bd --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-async-host-error.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json new file mode 100644 index 00000000..56da6738 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "caller", + "external_caller": true, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml new file mode 100644 index 00000000..7e36edfc --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json new file mode 100644 index 00000000..2270dfad --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "chosen", + "external_caller": false, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml new file mode 100644 index 00000000..a2f58de7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json new file mode 100644 index 00000000..c6234e79 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "copied", + "external_caller": false, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml new file mode 100644 index 00000000..886ff330 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json new file mode 100644 index 00000000..0a48ebd7 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "entry", + "external_caller": false, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml new file mode 100644 index 00000000..2fb1ef60 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json new file mode 100644 index 00000000..b94f158e --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "formatted", + "external_caller": false, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml new file mode 100644 index 00000000..b65a0455 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json new file mode 100644 index 00000000..8b26e69d --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "return", + "external_caller": true, + "font_scale": 1, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml new file mode 100644 index 00000000..261e3a45 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json new file mode 100644 index 00000000..d8f6f85f --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json @@ -0,0 +1,15 @@ +{ + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "cancelled_before_run": true, + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "external_caller_uses_separate_package_and_uid": true, + "font_scale": 1, + "height_dp": 800, + "owned_data_removed": true, + "passed": true, + "preexisting_installations_and_data_preserved": true, + "preview_no_execution_and_clipboard_unchanged": true, + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "width_dp": 1280 +} diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json new file mode 100644 index 00000000..6e17c5d6 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json @@ -0,0 +1,9 @@ +{ + "font_scale": 1, + "no_view_completion_released_input": true, + "owned_data_removed": true, + "passed": true, + "preexisting_installations_and_data_preserved": true, + "scope": "Controlled Activity/runtime ownership probes using an owned JavaScript fixture; not a Store compatibility result", + "view_probe_sha256": "22064be5286d746ab1e4d73b5ebab32fc2ef15faff2e2a586aff310a7d983e8a" +} diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json new file mode 100644 index 00000000..37e18d2c --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json @@ -0,0 +1,9 @@ +{ + "async_and_sync_host_api_rejections_released_input": true, + "font_scale": 1, + "owned_data_removed": true, + "passed": true, + "preexisting_installations_and_data_preserved": true, + "scope": "Controlled Activity/runtime ownership probes using an owned JavaScript fixture; not a Store compatibility result", + "view_probe_sha256": "22064be5286d746ab1e4d73b5ebab32fc2ef15faff2e2a586aff310a7d983e8a" +} diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json new file mode 100644 index 00000000..d6d4ac08 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json @@ -0,0 +1,10 @@ +{ + "font_scale": 1, + "live_write_and_publication_controls_succeeded": true, + "owned_data_removed": true, + "passed": true, + "preexisting_installations_and_data_preserved": true, + "scope": "Controlled Activity/runtime ownership probes using an owned JavaScript fixture; not a Store compatibility result", + "stale_write_render_error_depth_and_close_blocked": true, + "view_probe_sha256": "22064be5286d746ab1e4d73b5ebab32fc2ef15faff2e2a586aff310a7d983e8a" +} diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json new file mode 100644 index 00000000..05c286a0 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json @@ -0,0 +1,21 @@ +{ + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "clipboard_unchanged_until_copy": true, + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "exact_unicode_output_copied": true, + "executed_command": "formatSelectionAndShow", + "external_caller_uses_separate_package_and_uid": true, + "font_scale": 1, + "height_dp": 800, + "native_code_monospace": true, + "native_format_contract_started": true, + "owned_data_removed": true, + "passed": true, + "preexisting_installations_and_data_preserved": true, + "preview_no_execution_and_clipboard_unchanged": true, + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "returned_to_external_caller": true, + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "source_text_and_selection_unchanged": true, + "width_dp": 1280 +} diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/record.json b/docs/validation/webview-engine/cohorts/review-lifecycle/record.json new file mode 100644 index 00000000..09765566 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/record.json @@ -0,0 +1,71 @@ +{ + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns,dev.tinycast.android.ReviewedTextDeviceTest#cancelBeforeRunReturnsWithoutExecutingOrSaving,dev.tinycast.android.ReviewedTextLifecycleDeviceTest#staleRuntimeCannotPublishOrWriteAfterReplacement,dev.tinycast.android.ReviewedTextLifecycleDeviceTest#rejectedAsyncAndSyncHostCallsReleaseApprovedInput,dev.tinycast.android.ReviewedTextLifecycleDeviceTest#noViewCompletionReleasesItsApprovedInput", + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + }, + "completed": true, + "expected": 5, + "font_scale": 1.0, + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "layout": "tablet", + "original_font_scale": "1.0", + "passes": 5, + "runner_sha256": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "tests_completed": true +} diff --git a/docs/validation/webview-engine/cohorts/review-lifecycle/tests.log b/docs/validation/webview-engine/cohorts/review-lifecycle/tests.log new file mode 100644 index 00000000..f89a59b8 --- /dev/null +++ b/docs/validation/webview-engine/cohorts/review-lifecycle/tests.log @@ -0,0 +1,80 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextLifecycleDeviceTest: +INSTRUMENTATION_STATUS: test=staleRuntimeCannotPublishOrWriteAfterReplacement +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=staleRuntimeCannotPublishOrWriteAfterReplacement +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=rejectedAsyncAndSyncHostCallsReleaseApprovedInput +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=rejectedAsyncAndSyncHostCallsReleaseApprovedInput +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=noViewCompletionReleasesItsApprovedInput +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=noViewCompletionReleasesItsApprovedInput +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 27.533 + +OK (5 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/collectors/publish-validation-v1.py b/docs/validation/webview-engine/collectors/publish-validation-v1.py new file mode 100644 index 00000000..1e1b1f99 --- /dev/null +++ b/docs/validation/webview-engine/collectors/publish-validation-v1.py @@ -0,0 +1,90 @@ +from pathlib import Path +import hashlib,json,re,shutil,subprocess +from xml.etree import ElementTree as ET +B=Path('artifacts/webview-compatibility');D=Path('docs/validation/webview-engine');S=Path('docs/screenshots/webview-engine') +sha=lambda b:hashlib.sha256(b).hexdigest() +read=lambda p:json.loads(Path(p).read_text()) +def require(v,m): + if not v:raise ValueError(m) +roots={'legacy100':B/'final-v5/legacy100','legacy200':B/'final-v5/legacy200','modern-tablet100':B/'final-v4/modern-tablet100','modern-phone200':B/'final-v4/modern-phone200','modern-landscape200':B/'final-v4/modern-landscape200','review-lifecycle':B/'shared-regressions-v2/review-lifecycle','handoff':B/'shared-regressions-v2/handoff','paste':B/'shared-regressions-v2/paste','legacy-common-positive':B/'final-v6/legacy-positive','legacy-common-negative':B/'final-v6/legacy-old-control'} +for name,root in roots.items(): + r=read(root/'record.json');require(r['completed'],name+' is incomplete') + require(all(v['passed'] for v in r['cleanup'].values()),name+' restoration failed') +require(read(B/'shared-regressions-v2/record.json')['completed'],'Outer preservation incomplete') +require(not D.exists() and not S.exists(),'Publication already exists; inspect before changing it') +D.mkdir(parents=True);S.mkdir(parents=True) +bindings=[];projections=[] +def put(source,destination,xml=False,redact=False): + original=source.read_bytes();value=original + if redact: + for old,new in [(str(Path.cwd()),''),(str(Path.home()),'')]: + if xml:new=new.replace('<','<').replace('>','>') + value=value.replace(old.encode(),new.encode()) + destination.parent.mkdir(parents=True,exist_ok=True);destination.write_bytes(value) + bindings.append({'original':str(source.resolve().relative_to(Path.cwd())),'original_sha256':sha(original),'public':str(destination),'public_sha256':sha(value),'transform':'replace checkout/home with escaped placeholders' if redact and xml else 'replace checkout/home with placeholders' if redact else 'identity'}) + if xml:ET.fromstring(value) + return destination +record_keys={'completed','expected_negative','runner_sha256','apk_sha256','test_apk_sha256','methods','api','font_scale','layout','cleanup','provider_before','original_geometry','original_font_scale','fixture_sha256','instrumentation_exit_code','passes','failures','initialization_error','native_expected_outcome','preserved_file_count','tests_completed','tests_completed','expected','classes','test_filter','installed_apks_match'} +case_keys=set('scope case passed android_api provider provider_version font_scale time_to_result_ms runtime_error published_native_tree caller_query_restored explicit_settings_destination compile_body_executed invalid_syntax_caught api_probe_result live_action_published closed_owner_remained_inactive preflight_bridge_render_rejected preflight_host_api_rejected stale_settings_launches replacement_not_closed second_failure_scope fresh_recovery_actions palette_preferences_restored fixture_cleanup_owner target_witnesses text_witnesses text_setup fixture_bytecode_scope width_dp height_dp launcher_query_preserved obsolete_host_and_chrome_callbacks_rejected one_transfer_before_native_composition owned_data_removed preexisting_installations_and_data_preserved protocol_setup context_argument_fallback_values_verified copy_exact child_raw_grant_absent duplicate_after_copy_rejected duplicate_probe_setup return_and_escape_cancelled_without_copy cancelled_before_run external_caller_uses_separate_package_and_uid preview_no_execution_and_clipboard_unchanged no_view_completion_released_input async_and_sync_host_api_rejections_released_input live_write_and_publication_controls_succeeded stale_write_render_error_depth_and_close_blocked clipboard_unchanged_until_copy exact_unicode_output_copied executed_command returned_to_external_caller source_text_and_selection_unchanged native_code_monospace native_format_contract_started archive_sha256 command_sha256 probe_command_sha256 fixture_child_sha256 fixture_manifest_sha256 fixture_parent_sha256 view_probe_sha256 clipboard_restoration_scope pointer_taps paused_parent_probe'.split()) +def project(source,destination,keys): + value=read(source);payload={k:value[k] for k in sorted(keys) if k in value};destination.parent.mkdir(parents=True,exist_ok=True);destination.write_text(json.dumps(payload,indent=2)+'\n') + projections.append({'original':str(source.resolve().relative_to(Path.cwd())),'original_sha256':sha(source.read_bytes()),'public':str(destination),'public_sha256':sha(destination.read_bytes()),'keys':sorted(payload)}) + return payload +matrix=[];capture_hashes={} +for name,root in roots.items(): + r=project(root/'record.json',D/'cohorts'/name/'record.json',record_keys) + put(root/'tests.log',D/'cohorts'/name/'tests.log',redact=True) + matrix.append({'cohort':name,'passes':r.get('passes'),'junit_failures':r.get('failures',0),'expected_negative':r.get('expected_negative',False),'cleanup_checks':len(r['cleanup']),'app_sha256':r['apk_sha256'],'test_apk_sha256':r['test_apk_sha256']}) + for p in sorted((root/'captures').iterdir()): + require(p.is_file() and p.suffix in ('.png','.xml','.json'),'Unexpected capture file') + capture_hashes[str(p)]=sha(p.read_bytes()) + if p.name.startswith('case-') or p.name.endswith('-record.json'): + project(p,D/'cohorts'/name/'cases'/p.name,case_keys) + else: + target=(S/name/p.name) if p.suffix=='.png' else (D/'cohorts'/name/'captures'/p.name) + put(p,target,xml=p.suffix=='.xml') +# Preserve all source identities; each names its own compiled cohort. +put(B/'unused-stamp-build/identity.json',D/'identities/unused-stamp-build.json') +for version in ['v1','v2','v3','v4','v5','v6']: + p=B/('candidate-'+version)/'identity.json' + if p.exists():put(p,D/'identities'/('candidate-'+version+'.json')) +for version in ['v4','v5','v6']: + identity=read(B/('candidate-'+version)/'identity.json') + for path,digest in identity['sources'].items(): + data=subprocess.check_output(['git','show',identity['test_source']+':'+path]);require(sha(data)==digest,'Frozen source mismatch: '+path) +for name in ['final-runtime-build-v2.log','final-harness-build-v3.log','final-harness-build-v4.log','final-harness-build-v5.log','final-benchmark-build-v2.log','final-benchmark-harness-build-v3.log','python-final-v4.log','python-optimized-final-v4.log']: + put(B/name,D/'checks'/name,redact=True) +for p in sorted(Path('app/build/test-results/testDebugUnitTest').glob('TEST-*.xml')):put(p,D/'checks/jvm'/p.name,xml=True,redact=True) +for variant in ['debug','benchmark']:put(Path('app/build/reports/lint-results-'+variant+'.xml'),D/'checks'/('lint-results-'+variant+'.xml'),xml=True,redact=True) +shared=read(B/'shared-regressions-v2/record.json');(D/'shared-preservation.json').write_text(json.dumps({k:shared[k] for k in ['completed','app_sha256','test_apk_sha256','collector_sha256','cohorts','restoration','preserved_files']},indent=2)+'\n') +# Historical outcomes are retained separately, including initialization failures. +attempt_roots=[B/'legacy-before',B/'legacy-candidate-v1',B/'legacy-candidate-v2',B/'modern-tablet-v1',B/'legacy-final100-v1',B/'modern-tablet-final100-v1',B/'legacy-final200-v1',B/'modern-phone-final200-v1',B/'legacy-final200-v2',B/'modern-phone-final200-v2',B/'legacy-old-control-v3',B/'modern-landscape-final200-v1',B/'final-v4/legacy100',B/'final-v5/legacy-old-control'] +attempt_roots += [B/'shared-regressions-v1'/name for name in ['review-lifecycle','handoff','paste']] +history=[] +for root in attempt_roots: + p=root/'record.json' + if not p.exists():p=root/'run-record.json' + r=read(p);log=(root/'tests.log').read_text() if (root/'tests.log').exists() else '' + init='INSTRUMENTATION_STATUS: test=initializationError' in log + row={'attempt':str(root.relative_to(B)),'completed':r.get('completed',False),'junit_passes':len(re.findall(r'^INSTRUMENTATION_STATUS_CODE: 0$',log,re.M)),'junit_failures':len(re.findall(r'^INSTRUMENTATION_STATUS_CODE: -2$',log,re.M)),'initialization_failure':init,'native_cases_reaching_execution':0 if init else len(re.findall(r'^INSTRUMENTATION_STATUS_CODE: (?:0|-2)$',log,re.M)),'record_sha256':sha(p.read_bytes()),'test_log_sha256':sha((root/'tests.log').read_bytes()) if log else None,'apk_sha256':r.get('apk_sha256'),'test_apk_sha256':r.get('test_apk_sha256'),'cleanup':r.get('cleanup',{}),'final_credit':False} + history.append(row);put(root/'tests.log',D/'history'/root.relative_to(B)/'tests.log',redact=True) if log else None + for recovery in root.glob('*recovery.json'): + if recovery.name.startswith('private'): + continue + safe=read(recovery) + (D/'history'/root.relative_to(B)).mkdir(parents=True,exist_ok=True) + project(recovery,D/'history'/root.relative_to(B)/recovery.name,set('completed original_outer_run_still_failed original_junit_passes original_passes original_failures original_run_record_sha256 checks preserved_files native_executions reason'.split())) +(D/'historical-attempts.json').write_text(json.dumps(history,indent=2)+'\n') +(D/'matrix.json').write_text(json.dumps(matrix,indent=2)+'\n') +(D/'capture-original-hashes.json').write_text(json.dumps(capture_hashes,indent=2)+'\n') +# Collector copies have no host paths or private inputs; retained source hashes +# bind the executed local originals to these declared redactions. +for p in [Path(__file__),B/'run-shared-regressions-v2.py',B/'run-final-legacy-v5.py',B/'run-final-modern-v4.py']: + put(p,D/'collectors'/p.name,redact=True) +(D/'bindings.json').write_text(json.dumps(bindings,indent=2)+'\n');(D/'projections.json').write_text(json.dumps(projections,indent=2)+'\n') +for p in D.rglob('*.xml'):ET.parse(p) +for p in list(D.rglob('*'))+list(S.rglob('*')): + if p.is_file():require(str(Path.home()).encode() not in p.read_bytes(),'Unredacted host path: '+str(p)) +files={str(p):sha(p.read_bytes()) for root in [D,S] for p in root.rglob('*') if p.is_file()} +(D/'checkpoint.json').write_text(json.dumps({'scope':'Recorded emulator observations and source/binary bindings; no broad parity certification','public_files':files,'source_head':subprocess.check_output(['git','rev-parse','HEAD'],text=True).strip()},indent=2)+'\n') +print(json.dumps({'passes':sum(r['passes'] for r in matrix if not r['expected_negative']),'positive_cohorts':sum(not r['expected_negative'] for r in matrix),'negative_failures':sum(r['junit_failures'] for r in matrix if r['expected_negative']),'cleanup_checks':sum(r['cleanup_checks'] for r in matrix),'screenshots':sum(1 for p in S.rglob('*.png')),'public_files':len(files)})) diff --git a/docs/validation/webview-engine/collectors/run-final-legacy-v5.py b/docs/validation/webview-engine/collectors/run-final-legacy-v5.py new file mode 100644 index 00000000..511f7d05 --- /dev/null +++ b/docs/validation/webview-engine/collectors/run-final-legacy-v5.py @@ -0,0 +1,10 @@ +from pathlib import Path +import json,os,subprocess,sys +base=Path('artifacts/webview-compatibility');ident=json.loads((base/'candidate-v5/identity.json').read_text());root=base/'final-v5';root.mkdir(exist_ok=True) +core='incompatibleEngineShowsNativeRecoveryWithoutDispatch,incompatibleEngineOpensOnlyActualProviderSettingsAndReturns,actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax,closingBeforePreflightFinishesRejectsLatePublication,bridgeCannotPublishOrReadHostApisBeforeApproval,replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks,equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition' +old=Path('/.t3/scratch/droidcast-compatibility-view-27caf3/artifacts/compatibility-view/ux-repair-v6/candidate/app-debug.apk') +for name,cases,font,apk,negative in [('legacy100',core,1,base/'candidate-v5/app-debug.apk',False),('legacy200',','.join(core.split(',')[:2]),2,base/'candidate-v5/app-debug.apk',False),('legacy-old-control','incompatibleEngineShowsNativeRecoveryWithoutDispatch',1,old,True)]: + command=[sys.executable,'scripts/test-webview-engine.py','--serial','emulator-5598','--avd','Droidcast_WebView_API26_27caf3','--apk',str(apk),'--test-apk',str(base/'candidate-v5/app-debug-androidTest.apk'),'--output',str(root/name),'--cases',cases,'--font-scale',str(font),'--layout','phone']+(['--expected-negative'] if negative else []) + with (root/(name+'-host.log')).open('xb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk')) + if r.returncode:raise SystemExit('Inspect failed cohort '+name) + print(name,'completed',flush=True) diff --git a/docs/validation/webview-engine/collectors/run-final-modern-v4.py b/docs/validation/webview-engine/collectors/run-final-modern-v4.py new file mode 100644 index 00000000..05b85b1b --- /dev/null +++ b/docs/validation/webview-engine/collectors/run-final-modern-v4.py @@ -0,0 +1,12 @@ +from pathlib import Path +import os,subprocess,sys +base=Path('artifacts/webview-compatibility');root=base/'final-v4';root.mkdir(exist_ok=True) +core='modernEnginePublishesListAndRunsLiveAction,modernEnginePublishesGridAndRunsLiveAction,actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax,closingBeforePreflightFinishesRejectsLatePublication,bridgeCannotPublishOrReadHostApisBeforeApproval' +for name,cases,font,layout in [('modern-tablet100',core,1,'tablet'),('modern-phone200',','.join(core.split(',')[:2]),2,'phone'),('modern-landscape200',','.join(core.split(',')[:2]),2,'landscape')]: + command=[sys.executable,'scripts/test-webview-engine.py','--serial','emulator-5580','--avd','Tinycast_Tablet_API_36','--apk',str(base/'candidate-v4/app-debug.apk'),'--test-apk',str(base/'candidate-v4/app-debug-androidTest.apk'),'--output',str(root/name),'--cases',cases,'--font-scale',str(font),'--layout',layout] + with (root/(name+'-host.log')).open('xb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk')) + if r.returncode:raise SystemExit('Inspect failed cohort '+name) + print(name,'completed',flush=True) +with (base/'shared-regressions-v2-host.log').open('xb') as log:r=subprocess.run([sys.executable,str(base/'run-shared-regressions-v2.py')],stdout=log,stderr=subprocess.STDOUT) +if r.returncode:raise SystemExit('Inspect shared regression failure') +print('shared regressions completed',flush=True) diff --git a/docs/validation/webview-engine/collectors/run-shared-regressions-v2.py b/docs/validation/webview-engine/collectors/run-shared-regressions-v2.py new file mode 100644 index 00000000..3b884383 --- /dev/null +++ b/docs/validation/webview-engine/collectors/run-shared-regressions-v2.py @@ -0,0 +1,56 @@ +from pathlib import Path +import hashlib,importlib.util,json,os,subprocess,sys,uuid +sys.path.insert(0,'scripts');s=importlib.util.spec_from_file_location('engine_runner','scripts/test-webview-engine.py');m=importlib.util.module_from_spec(s);s.loader.exec_module(m) +b=Path('artifacts/webview-compatibility');out=b/'shared-regressions-v2';app='dev.tinycast.android';test=app+'.test';lease='files/webview-regression-lease' +A=['/Library/Android/sdk/platform-tools/adb','-s','emulator-5580'] +def raw(*args,data=None):return subprocess.check_output(A+list(args),input=data,stderr=subprocess.STDOUT,timeout=120) +def text(*args):return raw(*args).decode().strip() +def sha(data):return hashlib.sha256(data).hexdigest() +def require(v,msg): + if not v:raise ValueError(msg) +require(text('emu','avd','name').splitlines()[0]=='Tinycast_Tablet_API_36' and text('shell','id').startswith('uid=2000('),'Owned modern AVD only') +require('ActiveInstrumentation{' not in text('shell','dumpsys','activity','processes'),'Active instrumentation') +require(not text('shell','run-as',app,'find','files','-maxdepth','1','-name','*lease*'),'A recovery owner remains') +apk=b/'candidate-v4/app-debug.apk';harness=b/'candidate-v4/app-debug-androidTest.apk';ident=json.loads((b/'candidate-v4/identity.json').read_text()) +for p in [apk,harness]:require(sha(p.read_bytes())==ident['apks'][p.name],'APK changed') +archive=Path('/.t3/scratch/droidcast-command-catalog-27caf3/artifacts/extension-catalog/representative-001-bundles-v1/archives/223987eaca2c894e37ada9e087669f260cda79d6a3b88ff11463f429cc952e6a.zip');require(sha(archive.read_bytes())=='fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58','Frozen formatter changed') +require('Override' not in text('shell','wm','size')+text('shell','wm','density'),'Geometry owned elsewhere') +out.mkdir(exist_ok=False,mode=0o700);owner={'kind':'webview-regression-v1','nonce':uuid.uuid4().hex} +(out/'private-owner.json').write_text(json.dumps(owner));(out/'private-owner.json').chmod(0o600) +r={'completed':False,'app_sha256':sha(apk.read_bytes()),'test_apk_sha256':sha(harness.read_bytes()),'collector_sha256':sha(Path(__file__).read_bytes()),'cohorts':{},'restoration':{}} +def save():(out/'record.json').write_text(json.dumps(r,indent=2)+'\n') +save();raw('shell','run-as',app,'mkdir',lease);raw('shell','run-as',app,'tee',lease+'/owner.json',data=json.dumps(owner).encode()) +def owned():require(json.loads(raw('exec-out','run-as',app,'cat',lease+'/owner.json'))==owner,'Owner changed') +for pkg in [test,app]:raw('shell','am','force-stop',pkg) +originals={} +for pkg in [app,test]: + data=raw('exec-out','cat',text('shell','pm','path',pkg).removeprefix('package:'));p=out/('private-original-'+pkg+'.apk');p.write_bytes(data);p.chmod(0o600);originals[pkg]=(p,sha(data)) +data=raw('exec-out','run-as',app,'tar','-cf','-','files','shared_prefs');(out/'private-data-before.tar').write_bytes(data);(out/'private-data-before.tar').chmod(0o600) +before=m.archive_files(data);fingerprints=lambda d:{p:sha(v) for p,v in d.items() if not p.startswith(lease+'/')};before_hashes=fingerprints(before) +groups={ + 'review-lifecycle':['ReviewedTextDeviceTest#selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns','ReviewedTextDeviceTest#cancelBeforeRunReturnsWithoutExecutingOrSaving','ReviewedTextLifecycleDeviceTest#staleRuntimeCannotPublishOrWriteAfterReplacement','ReviewedTextLifecycleDeviceTest#rejectedAsyncAndSyncHostCallsReleaseApprovedInput','ReviewedTextLifecycleDeviceTest#noViewCompletionReleasesItsApprovedInput'], + 'handoff':['ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy','ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition'], + 'paste':['ExtensionPasteCopyDeviceTest#pointerCopyIsExactOnceAndReturns','ExtensionPasteCopyDeviceTest#returnAndEscapeCancelWithoutCopy']} +try: + for name,methods in groups.items(): + owned();r['pending_cohort']=name;save() + command=[sys.executable,'scripts/test-reviewed-text-input.py','--serial','emulator-5580','--avd','Tinycast_Tablet_API_36','--layout','tablet','--font-scale','1','--output',str(out/name),'--apk',str(apk),'--test-apk',str(harness),'--json-archive',str(archive),'--classes',','.join('dev.tinycast.android.'+x for x in methods),'--expected',str(len(methods))] + with (out/(name+'-host.log')).open('xb') as log:result=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk'),timeout=700) + receipt=json.loads((out/name/'record.json').read_text());r['cohorts'][name]={'exit_code':result.returncode,'completed':receipt['completed'],'passes':receipt.get('passes'),'cleanup_checks':len(receipt['cleanup']),'cleanup_passed':all(v['passed'] for v in receipt['cleanup'].values())};save() + require(result.returncode==0 and receipt['completed'] and receipt['passes']==len(methods),'Native regression failed') + r['pending_cohort']=None +finally: + owned();require('ActiveInstrumentation{' not in text('shell','dumpsys','activity','processes'),'Retain owner under active instrumentation') + for pkg in [test,app]:raw('shell','am','force-stop',pkg) + require(not text('shell','run-as',app,'find','files','-maxdepth','1','-name','reviewed-text*lease*'),'Inner recovery owner retained') + profile=before.get('files/profileInstalled') + if profile is None:raw('shell','run-as',app,'rm','-f','files/profileInstalled') + else:raw('shell','run-as',app,'tee','files/profileInstalled',data=profile) + require(fingerprints(m.archive_files(raw('exec-out','run-as',app,'tar','-cf','-','files','shared_prefs')))==before_hashes,'Original data/evidence changed') + r['restoration']['original_files_and_evidence']=True;r['preserved_files']=len(before_hashes);save() + for pkg,(path,expected) in originals.items(): + raw('install','-r','-t',str(path));require(sha(raw('exec-out','cat',text('shell','pm','path',pkg).removeprefix('package:')))==expected,'Original binary changed') + r['restoration']['original_apks']=True;require(text('shell','id').startswith('uid=2000('),'adbd changed');r['restoration']['unprivileged']=True + owned();raw('shell','run-as',app,'rm','-rf',lease);r['restoration']['release_after_verification']=True + r['completed']=len(r['cohorts'])==len(groups) and all(v['completed'] for v in r['cohorts'].values());save() +print(json.dumps(r)) diff --git a/docs/validation/webview-engine/historical-attempts.json b/docs/validation/webview-engine/historical-attempts.json new file mode 100644 index 00000000..571826b4 --- /dev/null +++ b/docs/validation/webview-engine/historical-attempts.json @@ -0,0 +1,845 @@ +[ + { + "attempt": "legacy-before", + "completed": false, + "junit_passes": 0, + "junit_failures": 1, + "initialization_failure": false, + "native_cases_reaching_execution": 1, + "record_sha256": "a613ef441aaada35345f63e9b4863d10e72416d5800d1da4011f2b263ad0c13f", + "test_log_sha256": "cd835ee3f8e475e49cd0530fb2a1a971bb75650e9b103510df7fd5580e8806da", + "apk_sha256": "b0fa0e302a63320b6e5ed163856756961b4480a1ce476f4cb6167be799535e54", + "test_apk_sha256": "37b1e384bb40e3cf64f49fc81a667482b6eb8e7cddcfc81710a73a713eb4cfaa", + "cleanup": {}, + "final_credit": false + }, + { + "attempt": "legacy-candidate-v1", + "completed": false, + "junit_passes": 0, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 0, + "record_sha256": "377e7f2eba79b2aeaf3889c51211a05c84c6681b0ec262a23a41018dd489d936", + "test_log_sha256": null, + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "c2ff5ee34018ae91e69eeea905bf0fbb6b613ca8d2eb9a3453b137b43b764905", + "cleanup": {}, + "final_credit": false + }, + { + "attempt": "legacy-candidate-v2", + "completed": false, + "junit_passes": 3, + "junit_failures": 1, + "initialization_failure": false, + "native_cases_reaching_execution": 4, + "record_sha256": "9e27badbae87053df4ae5fef9aeabc6b8eb11203d5fc1927a979ec7ca5a9c2fc", + "test_log_sha256": "805cc85f7ef90f4b201b93bd58f44e77dc2ef62884f3dc98740c3285cee83256", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "c2ff5ee34018ae91e69eeea905bf0fbb6b613ca8d2eb9a3453b137b43b764905", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "modern-tablet-v1", + "completed": false, + "junit_passes": 2, + "junit_failures": 2, + "initialization_failure": false, + "native_cases_reaching_execution": 4, + "record_sha256": "17868a056c4f9c285939ab01cd5efaae134c43cf440cde269769b13d94a7808a", + "test_log_sha256": "01e6ef4d2fc100e317f86f23b4a4666596f4ec6383ff94bb97808a1909ddb0b1", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "c2ff5ee34018ae91e69eeea905bf0fbb6b613ca8d2eb9a3453b137b43b764905", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": false, + "error_type": "ValueError" + }, + "verify-unprivileged": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "legacy-final100-v1", + "completed": true, + "junit_passes": 6, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 6, + "record_sha256": "e5561c8fcbf247e7478e276d773a951daa2eb6beae25820e9d8aaaaf95ec29c6", + "test_log_sha256": "d7f6f7bb956025693c6706449ecc40effee450d0abd98149caf29a813632000d", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "b8fd10cdb574c718ba4378462899a0e76f64cd288531cda89efc40a2fe28185d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "modern-tablet-final100-v1", + "completed": true, + "junit_passes": 5, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 5, + "record_sha256": "86b7b70cf0756cc7182cb140e2933da79c033fbfdd4ec1242f20467fd70663ae", + "test_log_sha256": "f515d36772e2f0437ae8a9ee79f81bb26cfec803f1365c783ade19aae0fb28d3", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "b8fd10cdb574c718ba4378462899a0e76f64cd288531cda89efc40a2fe28185d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "legacy-final200-v1", + "completed": false, + "junit_passes": 2, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "9cbb150099fc11c556ca1dd8416185defb75e7ba01bf593511a2f1a4e304be21", + "test_log_sha256": "c26e6f1cfce05baf7f03d5efdd57071e02bcda3d915afe00e1494ceef21698fd", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "b8fd10cdb574c718ba4378462899a0e76f64cd288531cda89efc40a2fe28185d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": false, + "error_type": "ValueError" + }, + "verify-unprivileged": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "modern-phone-final200-v1", + "completed": false, + "junit_passes": 0, + "junit_failures": 2, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "9650f7e36e8370ffd1da91d91579d134b0d031ca4dd7b6ec81194be18dd1c3c7", + "test_log_sha256": "12cee1e2f4cbac5d2dc19c276103f4504ec22289ff4565e6297501f43f50a788", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "b8fd10cdb574c718ba4378462899a0e76f64cd288531cda89efc40a2fe28185d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "restore-size": { + "passed": true + }, + "restore-density": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "legacy-final200-v2", + "completed": true, + "junit_passes": 2, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "bb5d315854695981a3608994f4ee8712882b337f6714c8b9cbaf84fd62fc8b5a", + "test_log_sha256": "be67c01975660eb862fa6fd48813afb15a8d1d46f8145b81baa06b9784705369", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "modern-phone-final200-v2", + "completed": true, + "junit_passes": 2, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "9c6b85a16462e2e14423be2321cd505ac3c17b232e5f72c90e31024600edde63", + "test_log_sha256": "9f99658440778d8b94156649f52621aa53c576448db8c9641fbdc899425ef487", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "restore-size": { + "passed": true + }, + "restore-density": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "legacy-old-control-v3", + "completed": true, + "junit_passes": 0, + "junit_failures": 1, + "initialization_failure": false, + "native_cases_reaching_execution": 1, + "record_sha256": "84f59de5499ce3577f344fc84858fd3873c15618faccf8f462a099ace4a30076", + "test_log_sha256": "b8bb6b9631e4961e44eb98235563e75920bebf1a1ca8083ceb3efa14f8d87ca8", + "apk_sha256": "b0fa0e302a63320b6e5ed163856756961b4480a1ce476f4cb6167be799535e54", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "modern-landscape-final200-v1", + "completed": true, + "junit_passes": 2, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "a611eb8662bc3b409a2ed8dab0e200eb5e8f74f485e39f3ccee1c4e8f5e811d1", + "test_log_sha256": "eab955a84f74010576ade922fe9d30bbe6c6c9236c5eae13d1f4fb9e02b00c64", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "palette-bytes": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "restore-size": { + "passed": true + }, + "restore-density": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "profile-installer-marker": { + "passed": true + }, + "installed-data-and-evidence": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-binary-dev.tinycast.android": { + "passed": true + }, + "verify-binary-dev.tinycast.android": { + "passed": true + }, + "restore-binary-dev.tinycast.android.test": { + "passed": true + }, + "verify-binary-dev.tinycast.android.test": { + "passed": true + }, + "release-owner-last": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "final-v4/legacy100", + "completed": false, + "junit_passes": 6, + "junit_failures": 1, + "initialization_failure": false, + "native_cases_reaching_execution": 7, + "record_sha256": "fb20edb22d33607d126778476b7576f7826fec4c1f52e3b4d946b902d8095f19", + "test_log_sha256": "9f31b8c07f2c59d9afd1c54e854e69fd1edaa2a0629c47d5acdd4e7cd5e4386d", + "apk_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "final-v5/legacy-old-control", + "completed": false, + "junit_passes": 0, + "junit_failures": 1, + "initialization_failure": true, + "native_cases_reaching_execution": 0, + "record_sha256": "75bdedc063c4897b3808dbcc49ce640502f43a58f3e506781de338a9b8854e08", + "test_log_sha256": "c58fcd34a4c9e36e6601d4b9a9428869f0d1f65666a0a4e2e58c07d4e8da25d9", + "apk_sha256": "b0fa0e302a63320b6e5ed163856756961b4480a1ce476f4cb6167be799535e54", + "test_apk_sha256": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747", + "cleanup": { + "idle-owned-instrumentation": { + "passed": true + }, + "stop-dev.tinycast.android.test": { + "passed": true + }, + "stop-dev.tinycast.android": { + "passed": true + }, + "owned-paths": { + "passed": true + }, + "restore-font": { + "passed": true + }, + "verify-settings": { + "passed": true + }, + "verify-unprivileged": { + "passed": true + }, + "restore-absence-dev.tinycast.android.test": { + "passed": true + }, + "restore-absence-dev.tinycast.android": { + "passed": true + }, + "verify-initial-package-absence": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "shared-regressions-v1/review-lifecycle", + "completed": true, + "junit_passes": 5, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 5, + "record_sha256": "bd43fead888dde74a77e3047aa93d8acac8ebbf45c83c7fb2d606dddec2bf9c0", + "test_log_sha256": "0864f7f88b26a0df0fcee7cf7fa6dfc560f1cc1559641cac1b2c73e1681c5119", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "shared-regressions-v1/handoff", + "completed": true, + "junit_passes": 2, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "7a54aca692cf2a893345c35506e96d5511e22d14d5bb26a3493fe8fb318b9236", + "test_log_sha256": "e049471f9c078147d38583e18ffe94ee539bf8aff4dc79bf7f50fa739edec318", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + }, + "final_credit": false + }, + { + "attempt": "shared-regressions-v1/paste", + "completed": true, + "junit_passes": 2, + "junit_failures": 0, + "initialization_failure": false, + "native_cases_reaching_execution": 2, + "record_sha256": "28965e9a8642905f9c0205d6073383e0b9d6ce0b87e986eda6999a10da9fb6d4", + "test_log_sha256": "f82383da38f5ee1d63771ba1690996b19292b953cead7ae765116ea62bd10c68", + "apk_sha256": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "test_apk_sha256": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + }, + "final_credit": false + } +] diff --git a/docs/validation/webview-engine/history/final-v4/legacy100/tests.log b/docs/validation/webview-engine/history/final-v4/legacy100/tests.log new file mode 100644 index 00000000..523e2de4 --- /dev/null +++ b/docs/validation/webview-engine/history/final-v4/legacy100/tests.log @@ -0,0 +1,167 @@ +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +Error in equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.AssertionError + at org.junit.Assert.fail(Assert.java:87) + at org.junit.Assert.assertTrue(Assert.java:42) + at org.junit.Assert.assertTrue(Assert.java:53) + at dev.tinycast.android.WebViewRecoveryDeviceTest.equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition$lambda$52(WebViewRecoveryDeviceTest.kt:303) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda37.perform(D8$$SyntheticClass:0) + at androidx.test.core.app.ActivityScenario.lambda$onActivity$2$androidx-test-core-app-ActivityScenario(ActivityScenario.java:794) + at androidx.test.core.app.ActivityScenario$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2092) + at android.os.Handler.handleCallback(Handler.java:789) + at android.os.Handler.dispatchMessage(Handler.java:98) + at android.os.Looper.loop(Looper.java:164) + at android.app.ActivityThread.main(ActivityThread.java:6541) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) + +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError + at org.junit.Assert.fail(Assert.java:87) + at org.junit.Assert.assertTrue(Assert.java:42) + at org.junit.Assert.assertTrue(Assert.java:53) + at dev.tinycast.android.WebViewRecoveryDeviceTest.equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition$lambda$52(WebViewRecoveryDeviceTest.kt:303) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda37.perform(D8$$SyntheticClass:0) + at androidx.test.core.app.ActivityScenario.lambda$onActivity$2$androidx-test-core-app-ActivityScenario(ActivityScenario.java:794) + at androidx.test.core.app.ActivityScenario$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2092) + at android.os.Handler.handleCallback(Handler.java:789) + at android.os.Handler.dispatchMessage(Handler.java:98) + at android.os.Looper.loop(Looper.java:164) + at android.app.ActivityThread.main(ActivityThread.java:6541) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) + +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=7 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=7 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=7 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 25.75 +There was 1 failure: +1) equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.AssertionError + at org.junit.Assert.fail(Assert.java:87) + at org.junit.Assert.assertTrue(Assert.java:42) + at org.junit.Assert.assertTrue(Assert.java:53) + at dev.tinycast.android.WebViewRecoveryDeviceTest.equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition$lambda$52(WebViewRecoveryDeviceTest.kt:303) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda37.perform(D8$$SyntheticClass:0) + at androidx.test.core.app.ActivityScenario.lambda$onActivity$2$androidx-test-core-app-ActivityScenario(ActivityScenario.java:794) + at androidx.test.core.app.ActivityScenario$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:0) + at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457) + at java.util.concurrent.FutureTask.run(FutureTask.java:266) + at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:2092) + at android.os.Handler.handleCallback(Handler.java:789) + at android.os.Handler.dispatchMessage(Handler.java:98) + at android.os.Looper.loop(Looper.java:164) + at android.app.ActivityThread.main(ActivityThread.java:6541) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) + +FAILURES!!! +Tests run: 7, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/final-v5/legacy-old-control/tests.log b/docs/validation/webview-engine/history/final-v5/legacy-old-control/tests.log new file mode 100644 index 00000000..a8c102a6 --- /dev/null +++ b/docs/validation/webview-engine/history/final-v5/legacy-old-control/tests.log @@ -0,0 +1,122 @@ +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=initializationError +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +Error in initializationError(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner + + + at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:129) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:121) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82) + at androidx.test.ext.junit.runners.AndroidJUnit4.(AndroidJUnit4.java:56) + ... 14 trimmed +Caused by: java.lang.reflect.InvocationTargetException + at java.lang.reflect.Constructor.newInstance0(Native Method) + at java.lang.reflect.Constructor.newInstance(Constructor.java:334) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:112) + ... 17 more +Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ldev/tinycast/android/extensions/ExtensionEngineProblem; + at java.lang.reflect.Executable.getParameterTypesInternal(Native Method) + at java.lang.reflect.Method.getParameterTypes(Method.java:179) + at java.lang.Class.getDeclaredMethods(Class.java:1881) + at org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54) + at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:65) + at org.junit.runners.model.TestClass.(TestClass.java:57) + at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:111) + at org.junit.runners.ParentRunner.(ParentRunner.java:91) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:74) + at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.(AndroidJUnit4ClassRunner.java:50) + at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.(AndroidJUnit4ClassRunner.java:55) + ... 20 more +Caused by: java.lang.ClassNotFoundException: Didn't find class "dev.tinycast.android.extensions.ExtensionEngineProblem" on path: DexPathList[[zip file "/data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/base.apk", zip file "/data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/base.apk"],nativeLibraryDirectories=[/data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/lib/arm64, /data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/lib/arm64, /data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/base.apk!/lib/arm64-v8a, /data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] + at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) + at java.lang.ClassLoader.loadClass(ClassLoader.java:379) + at java.lang.ClassLoader.loadClass(ClassLoader.java:312) + ... 31 more + +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=initializationError +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: stack=java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner + + + at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:129) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:121) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82) + at androidx.test.ext.junit.runners.AndroidJUnit4.(AndroidJUnit4.java:56) + ... 14 trimmed +Caused by: java.lang.reflect.InvocationTargetException + at java.lang.reflect.Constructor.newInstance0(Native Method) + at java.lang.reflect.Constructor.newInstance(Constructor.java:334) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:112) + ... 17 more +Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ldev/tinycast/android/extensions/ExtensionEngineProblem; + at java.lang.reflect.Executable.getParameterTypesInternal(Native Method) + at java.lang.reflect.Method.getParameterTypes(Method.java:179) + at java.lang.Class.getDeclaredMethods(Class.java:1881) + at org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54) + at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:65) + at org.junit.runners.model.TestClass.(TestClass.java:57) + at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:111) + at org.junit.runners.ParentRunner.(ParentRunner.java:91) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:74) + at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.(AndroidJUnit4ClassRunner.java:50) + at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.(AndroidJUnit4ClassRunner.java:55) + ... 20 more +Caused by: java.lang.ClassNotFoundException: Didn't find class "dev.tinycast.android.extensions.ExtensionEngineProblem" on path: DexPathList[[zip file "/data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/base.apk", zip file "/data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/base.apk"],nativeLibraryDirectories=[/data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/lib/arm64, /data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/lib/arm64, /data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/base.apk!/lib/arm64-v8a, /data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] + at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) + at java.lang.ClassLoader.loadClass(ClassLoader.java:379) + at java.lang.ClassLoader.loadClass(ClassLoader.java:312) + ... 31 more + +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 0.007 +There was 1 failure: +1) initializationError(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner + + + at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:129) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:121) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82) + at androidx.test.ext.junit.runners.AndroidJUnit4.(AndroidJUnit4.java:56) + ... 14 trimmed +Caused by: java.lang.reflect.InvocationTargetException + at java.lang.reflect.Constructor.newInstance0(Native Method) + at java.lang.reflect.Constructor.newInstance(Constructor.java:334) + at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:112) + ... 17 more +Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ldev/tinycast/android/extensions/ExtensionEngineProblem; + at java.lang.reflect.Executable.getParameterTypesInternal(Native Method) + at java.lang.reflect.Method.getParameterTypes(Method.java:179) + at java.lang.Class.getDeclaredMethods(Class.java:1881) + at org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54) + at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:65) + at org.junit.runners.model.TestClass.(TestClass.java:57) + at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:111) + at org.junit.runners.ParentRunner.(ParentRunner.java:91) + at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:74) + at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.(AndroidJUnit4ClassRunner.java:50) + at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.(AndroidJUnit4ClassRunner.java:55) + ... 20 more +Caused by: java.lang.ClassNotFoundException: Didn't find class "dev.tinycast.android.extensions.ExtensionEngineProblem" on path: DexPathList[[zip file "/data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/base.apk", zip file "/data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/base.apk"],nativeLibraryDirectories=[/data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/lib/arm64, /data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/lib/arm64, /data/app/dev.tinycast.android.test-68TQfs_9ePLpB-eCxlh-3Q==/base.apk!/lib/arm64-v8a, /data/app/dev.tinycast.android-LwWDcfe1kUr-zYvRc4cjiA==/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] + at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) + at java.lang.ClassLoader.loadClass(ClassLoader.java:379) + at java.lang.ClassLoader.loadClass(ClassLoader.java:312) + ... 31 more + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/legacy-before/separate-recovery.json b/docs/validation/webview-engine/history/legacy-before/separate-recovery.json new file mode 100644 index 00000000..459506aa --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-before/separate-recovery.json @@ -0,0 +1,12 @@ +{ + "checks": { + "native_palette_preferences_restored": true, + "all_raw_evidence_copied_byte_identically": true, + "all_registered_paths_absent": true, + "both_initial_package_absences_restored": true, + "adbd_remains_unprivileged": true + }, + "completed": true, + "original_outer_run_still_failed": true, + "original_run_record_sha256": "a613ef441aaada35345f63e9b4863d10e72416d5800d1da4011f2b263ad0c13f" +} diff --git a/docs/validation/webview-engine/history/legacy-before/tests.log b/docs/validation/webview-engine/history/legacy-before/tests.log new file mode 100644 index 00000000..fc2a145e --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-before/tests.log @@ -0,0 +1,53 @@ +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +Error in incompatibleEngineShowsNativeRecoveryWithoutDispatch(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:82) + +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:82) + +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 4.301 +There was 1 failure: +1) incompatibleEngineShowsNativeRecoveryWithoutDispatch(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:82) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/legacy-candidate-v1/separate-setup-recovery.json b/docs/validation/webview-engine/history/legacy-candidate-v1/separate-setup-recovery.json new file mode 100644 index 00000000..82ab1306 --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-candidate-v1/separate-setup-recovery.json @@ -0,0 +1,14 @@ +{ + "checks": { + "exact_installed_apks_verified": true, + "no_app_data_or_instrumentation_created": true, + "original_geometry_and_font_unchanged": true, + "both_initial_package_absences_restored": true, + "adbd_unprivileged": true + }, + "completed": true, + "native_executions": 0, + "original_outer_run_still_failed": true, + "original_run_record_sha256": "377e7f2eba79b2aeaf3889c51211a05c84c6681b0ec262a23a41018dd489d936", + "reason": "Fresh application files parent absent before lease claim; no fixture, settings or instrumentation mutation occurred" +} diff --git a/docs/validation/webview-engine/history/legacy-candidate-v2/tests.log b/docs/validation/webview-engine/history/legacy-candidate-v2/tests.log new file mode 100644 index 00000000..2ee16393 --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-candidate-v2/tests.log @@ -0,0 +1,107 @@ +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +Error in actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {13863c3} called on null, FYI main Looper is Looper (main, tid 2) {13863c3}) + at android.webkit.WebView.checkThread(WebView.java:2486) + at android.webkit.WebView.getProgress(WebView.java:1481) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax$lambda$20(WebViewRecoveryDeviceTest.kt:129) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:434) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(WebViewRecoveryDeviceTest.kt:129) + ... 56 trimmed +Caused by: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {13863c3} called on null, FYI main Looper is Looper (main, tid 2) {13863c3}) + at android.webkit.WebView.checkThread(WebView.java:2476) + ... 63 more + +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: stack=java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {13863c3} called on null, FYI main Looper is Looper (main, tid 2) {13863c3}) + at android.webkit.WebView.checkThread(WebView.java:2486) + at android.webkit.WebView.getProgress(WebView.java:1481) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax$lambda$20(WebViewRecoveryDeviceTest.kt:129) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:434) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(WebViewRecoveryDeviceTest.kt:129) + ... 56 trimmed +Caused by: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {13863c3} called on null, FYI main Looper is Looper (main, tid 2) {13863c3}) + at android.webkit.WebView.checkThread(WebView.java:2476) + ... 63 more + +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 39.838 +There was 1 failure: +1) actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {13863c3} called on null, FYI main Looper is Looper (main, tid 2) {13863c3}) + at android.webkit.WebView.checkThread(WebView.java:2486) + at android.webkit.WebView.getProgress(WebView.java:1481) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax$lambda$20(WebViewRecoveryDeviceTest.kt:129) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:434) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(WebViewRecoveryDeviceTest.kt:129) + ... 56 trimmed +Caused by: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {13863c3} called on null, FYI main Looper is Looper (main, tid 2) {13863c3}) + at android.webkit.WebView.checkThread(WebView.java:2476) + ... 63 more + +FAILURES!!! +Tests run: 4, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/legacy-final100-v1/tests.log b/docs/validation/webview-engine/history/legacy-final100-v1/tests.log new file mode 100644 index 00000000..af49b278 --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-final100-v1/tests.log @@ -0,0 +1,93 @@ +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=6 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=6 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 21.67 + +OK (6 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/legacy-final200-v1/separate-font-recovery.json b/docs/validation/webview-engine/history/legacy-final200-v1/separate-font-recovery.json new file mode 100644 index 00000000..091c07ad --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-final200-v1/separate-font-recovery.json @@ -0,0 +1,13 @@ +{ + "checks": { + "original_raw_font_absence_stable_eight_observations": true, + "geometry_unchanged": true, + "owned_apks_verified": true, + "initial_package_absences_restored": true, + "adbd_unprivileged": true + }, + "completed": true, + "original_junit_passes": 2, + "original_outer_run_still_failed": true, + "original_run_record_sha256": "9cbb150099fc11c556ca1dd8416185defb75e7ba01bf593511a2f1a4e304be21" +} diff --git a/docs/validation/webview-engine/history/legacy-final200-v1/tests.log b/docs/validation/webview-engine/history/legacy-final200-v1/tests.log new file mode 100644 index 00000000..ed39b3f2 --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-final200-v1/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 14.673 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/legacy-final200-v2/tests.log b/docs/validation/webview-engine/history/legacy-final200-v2/tests.log new file mode 100644 index 00000000..6faca7d1 --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-final200-v2/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineOpensOnlyActualProviderSettingsAndReturns +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 15.732 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/legacy-old-control-v3/tests.log b/docs/validation/webview-engine/history/legacy-old-control-v3/tests.log new file mode 100644 index 00000000..57bf8de4 --- /dev/null +++ b/docs/validation/webview-engine/history/legacy-old-control-v3/tests.log @@ -0,0 +1,53 @@ +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +Error in incompatibleEngineShowsNativeRecoveryWithoutDispatch(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:133) + +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: test=incompatibleEngineShowsNativeRecoveryWithoutDispatch +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:133) + +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 3.335 +There was 1 failure: +1) incompatibleEngineShowsNativeRecoveryWithoutDispatch(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but could not find any node that satisfies: (TestTag = 'extension-engine-problem') + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.incompatibleEngineShowsNativeRecoveryWithoutDispatch(WebViewRecoveryDeviceTest.kt:133) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/modern-landscape-final200-v1/tests.log b/docs/validation/webview-engine/history/modern-landscape-final200-v1/tests.log new file mode 100644 index 00000000..78ba6bc7 --- /dev/null +++ b/docs/validation/webview-engine/history/modern-landscape-final200-v1/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 11.782 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/modern-phone-final200-v1/tests.log b/docs/validation/webview-engine/history/modern-phone-final200-v1/tests.log new file mode 100644 index 00000000..8532a782 --- /dev/null +++ b/docs/validation/webview-engine/history/modern-phone-final200-v1/tests.log @@ -0,0 +1,77 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stack=androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 10000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:215) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesGridAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:222) + +INSTRUMENTATION_STATUS: stream= +Error in modernEnginePublishesGridAndRunsLiveAction(dev.tinycast.android.WebViewRecoveryDeviceTest): +androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 10000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:215) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesGridAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:222) + +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stack=androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 10000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:215) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesListAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:221) + +INSTRUMENTATION_STATUS: stream= +Error in modernEnginePublishesListAndRunsLiveAction(dev.tinycast.android.WebViewRecoveryDeviceTest): +androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 10000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:215) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesListAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:221) + +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 31.886 +There were 2 failures: +1) modernEnginePublishesGridAndRunsLiveAction(dev.tinycast.android.WebViewRecoveryDeviceTest) +androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 10000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:215) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesGridAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:222) +2) modernEnginePublishesListAndRunsLiveAction(dev.tinycast.android.WebViewRecoveryDeviceTest) +androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 10000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:215) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesListAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:221) + +FAILURES!!! +Tests run: 2, Failures: 2 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/modern-phone-final200-v2/tests.log b/docs/validation/webview-engine/history/modern-phone-final200-v2/tests.log new file mode 100644 index 00000000..e6a72288 --- /dev/null +++ b/docs/validation/webview-engine/history/modern-phone-final200-v2/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 12.951 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/modern-tablet-final100-v1/tests.log b/docs/validation/webview-engine/history/modern-tablet-final100-v1/tests.log new file mode 100644 index 00000000..611f9465 --- /dev/null +++ b/docs/validation/webview-engine/history/modern-tablet-final100-v1/tests.log @@ -0,0 +1,79 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=bridgeCannotPublishOrReadHostApisBeforeApproval +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 23.385 + +OK (5 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/modern-tablet-v1/separate-recovery.json b/docs/validation/webview-engine/history/modern-tablet-v1/separate-recovery.json new file mode 100644 index 00000000..db69cc12 --- /dev/null +++ b/docs/validation/webview-engine/history/modern-tablet-v1/separate-recovery.json @@ -0,0 +1,17 @@ +{ + "checks": { + "only_profile_installer_marker_differed": true, + "original_profile_marker_restored_exactly": true, + "all_original_files_and_evidence_match": true, + "original_geometry_and_font_restored": true, + "both_original_apks_restored": true, + "adbd_unprivileged": true, + "lease_released_after_verification": true + }, + "completed": true, + "original_failures": 2, + "original_outer_run_still_failed": true, + "original_passes": 2, + "original_run_record_sha256": "17868a056c4f9c285939ab01cd5efaae134c43cf440cde269769b13d94a7808a", + "preserved_files": 573 +} diff --git a/docs/validation/webview-engine/history/modern-tablet-v1/tests.log b/docs/validation/webview-engine/history/modern-tablet-v1/tests.log new file mode 100644 index 00000000..c1579e70 --- /dev/null +++ b/docs/validation/webview-engine/history/modern-tablet-v1/tests.log @@ -0,0 +1,174 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.WebViewRecoveryDeviceTest: +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but found '2' nodes that satisfy: (Text + EditableText contains 'Owned grid row one' (ignoreCase: false)) +Nodes found: +1) Node #148 at (l=422.0, t=378.0, r=680.0, b=669.0)px, Tag: 'extension-grid-cell-0' +Selected = 'true' +ContentDescription = '[Owned grid row one]' +Focused = 'false' +Text = '[No preview, Owned grid row one]' +Actions = [OnClick, RequestFocus, SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult] +MergeDescendants = 'true' +2) Node #129 at (l=422.0, t=909.0, r=576.0, b=932.0)px, Tag: 'extension-grid-selected' +Text = '[Owned grid row one]' +Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult] +Has 2 siblings + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:152) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesGridAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:166) + +INSTRUMENTATION_STATUS: stream= +Error in modernEnginePublishesGridAndRunsLiveAction(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but found '2' nodes that satisfy: (Text + EditableText contains 'Owned grid row one' (ignoreCase: false)) +Nodes found: +1) Node #148 at (l=422.0, t=378.0, r=680.0, b=669.0)px, Tag: 'extension-grid-cell-0' +Selected = 'true' +ContentDescription = '[Owned grid row one]' +Focused = 'false' +Text = '[No preview, Owned grid row one]' +Actions = [OnClick, RequestFocus, SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult] +MergeDescendants = 'true' +2) Node #129 at (l=422.0, t=909.0, r=576.0, b=932.0)px, Tag: 'extension-grid-selected' +Text = '[Owned grid row one]' +Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult] +Has 2 siblings + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:152) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesGridAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:166) + +INSTRUMENTATION_STATUS: test=modernEnginePublishesGridAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=closingBeforePreflightFinishesRejectsLatePublication +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stack=java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {186faa5} called on null, FYI main Looper is Looper (main, tid 2) {186faa5}) + at android.webkit.WebView.checkThread(WebView.java:2665) + at android.webkit.WebView.getProgress(WebView.java:1340) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax$lambda$20(WebViewRecoveryDeviceTest.kt:129) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:434) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(WebViewRecoveryDeviceTest.kt:129) + ... 56 trimmed +Caused by: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {186faa5} called on null, FYI main Looper is Looper (main, tid 2) {186faa5}) + at android.webkit.WebView.checkThread(WebView.java:2660) + ... 63 more + +INSTRUMENTATION_STATUS: stream= +Error in actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(dev.tinycast.android.WebViewRecoveryDeviceTest): +java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {186faa5} called on null, FYI main Looper is Looper (main, tid 2) {186faa5}) + at android.webkit.WebView.checkThread(WebView.java:2665) + at android.webkit.WebView.getProgress(WebView.java:1340) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax$lambda$20(WebViewRecoveryDeviceTest.kt:129) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:434) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(WebViewRecoveryDeviceTest.kt:129) + ... 56 trimmed +Caused by: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {186faa5} called on null, FYI main Looper is Looper (main, tid 2) {186faa5}) + at android.webkit.WebView.checkThread(WebView.java:2660) + ... 63 more + +INSTRUMENTATION_STATUS: test=actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.WebViewRecoveryDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=modernEnginePublishesListAndRunsLiveAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 33.622 +There were 2 failures: +1) modernEnginePublishesGridAndRunsLiveAction(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.AssertionError: Failed: assertExists. +Reason: Expected exactly '1' node but found '2' nodes that satisfy: (Text + EditableText contains 'Owned grid row one' (ignoreCase: false)) +Nodes found: +1) Node #148 at (l=422.0, t=378.0, r=680.0, b=669.0)px, Tag: 'extension-grid-cell-0' +Selected = 'true' +ContentDescription = '[Owned grid row one]' +Focused = 'false' +Text = '[No preview, Owned grid row one]' +Actions = [OnClick, RequestFocus, SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult] +MergeDescendants = 'true' +2) Node #129 at (l=422.0, t=909.0, r=576.0, b=932.0)px, Tag: 'extension-grid-selected' +Text = '[Owned grid row one]' +Actions = [SetTextSubstitution, ShowTextSubstitution, ClearTextSubstitution, GetTextLayoutResult] +Has 2 siblings + + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow(SemanticsNodeInteraction.kt:178) + at androidx.compose.ui.test.SemanticsNodeInteraction.fetchOneOrThrow$default(SemanticsNodeInteraction.kt:150) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists(SemanticsNodeInteraction.kt:125) + at androidx.compose.ui.test.SemanticsNodeInteraction.assertExists$default(SemanticsNodeInteraction.kt:124) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernCommand(WebViewRecoveryDeviceTest.kt:152) + at dev.tinycast.android.WebViewRecoveryDeviceTest.modernEnginePublishesGridAndRunsLiveAction(WebViewRecoveryDeviceTest.kt:166) +2) actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(dev.tinycast.android.WebViewRecoveryDeviceTest) +java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {186faa5} called on null, FYI main Looper is Looper (main, tid 2) {186faa5}) + at android.webkit.WebView.checkThread(WebView.java:2665) + at android.webkit.WebView.getProgress(WebView.java:1340) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax$lambda$20(WebViewRecoveryDeviceTest.kt:129) + at dev.tinycast.android.WebViewRecoveryDeviceTest$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:434) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.WebViewRecoveryDeviceTest.actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax(WebViewRecoveryDeviceTest.kt:129) + ... 56 trimmed +Caused by: java.lang.Throwable: A WebView method was called on thread 'Instr: androidx.test.runner.AndroidJUnitRunner'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {186faa5} called on null, FYI main Looper is Looper (main, tid 2) {186faa5}) + at android.webkit.WebView.checkThread(WebView.java:2660) + ... 63 more + +FAILURES!!! +Tests run: 4, Failures: 2 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/shared-regressions-v1/handoff/tests.log b/docs/validation/webview-engine/history/shared-regressions-v1/handoff/tests.log new file mode 100644 index 00000000..6b965511 --- /dev/null +++ b/docs/validation/webview-engine/history/shared-regressions-v1/handoff/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 16.346 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/shared-regressions-v1/paste/tests.log b/docs/validation/webview-engine/history/shared-regressions-v1/paste/tests.log new file mode 100644 index 00000000..898c0bec --- /dev/null +++ b/docs/validation/webview-engine/history/shared-regressions-v1/paste/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionPasteCopyDeviceTest: +INSTRUMENTATION_STATUS: test=pointerCopyIsExactOnceAndReturns +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=pointerCopyIsExactOnceAndReturns +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=returnAndEscapeCancelWithoutCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionPasteCopyDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=returnAndEscapeCancelWithoutCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 17.745 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/history/shared-regressions-v1/review-lifecycle/tests.log b/docs/validation/webview-engine/history/shared-regressions-v1/review-lifecycle/tests.log new file mode 100644 index 00000000..7911a4ec --- /dev/null +++ b/docs/validation/webview-engine/history/shared-regressions-v1/review-lifecycle/tests.log @@ -0,0 +1,80 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextLifecycleDeviceTest: +INSTRUMENTATION_STATUS: test=staleRuntimeCannotPublishOrWriteAfterReplacement +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=staleRuntimeCannotPublishOrWriteAfterReplacement +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=rejectedAsyncAndSyncHostCallsReleaseApprovedInput +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=rejectedAsyncAndSyncHostCallsReleaseApprovedInput +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=noViewCompletionReleasesItsApprovedInput +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextLifecycleDeviceTest +INSTRUMENTATION_STATUS: current=5 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=5 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=noViewCompletionReleasesItsApprovedInput +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 26.992 + +OK (5 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/webview-engine/identities/candidate-v1.json b/docs/validation/webview-engine/identities/candidate-v1.json new file mode 100644 index 00000000..c5eb5e11 --- /dev/null +++ b/docs/validation/webview-engine/identities/candidate-v1.json @@ -0,0 +1,268 @@ +{ + "source": "bd80077480b2a032ef9593f8b616586c9b61301b", + "base": "8ff8f4d032ee351626fbfcbd6d5998e32e9577b4", + "apks": { + "app-debug.apk": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d", + "app-debug-androidTest.apk": "c2ff5ee34018ae91e69eeea905bf0fbb6b613ca8d2eb9a3453b137b43b764905" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "1e1339ba9f0b81f9938673884d851b97ad98b7fee2b4d2988f5a61910169ce68", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "cca29b959d059df551a1768ad4c4b491304d278b7eef1ca889caa4f4ae8bf209", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "10e22bed39617dab019215b0517f940a652df4fae5e083d388c7eba3a21435a3", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "a2fa463733ee3ace9299a73cf0739fcdbdc989a892db6d52b0732f94da7551dc", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + }, + "assets": { + "COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6" + } +} diff --git a/docs/validation/webview-engine/identities/candidate-v2.json b/docs/validation/webview-engine/identities/candidate-v2.json new file mode 100644 index 00000000..d0923f73 --- /dev/null +++ b/docs/validation/webview-engine/identities/candidate-v2.json @@ -0,0 +1,256 @@ +{ + "app_source": "bd80077480b2a032ef9593f8b616586c9b61301b", + "test_source": "c69e8d7dd40d513109395dd4a95a90a9f79136b5", + "collector_source": "136f73d8a904151bddf15a7369000356a55e8670", + "apks": { + "app-debug-androidTest.apk": "b8fd10cdb574c718ba4378462899a0e76f64cd288531cda89efc40a2fe28185d", + "app-debug.apk": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "0d9edb74b085bf5acb0f8f5e8891c9e058126124003c06aa9eb861ee12dca316", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "cca29b959d059df551a1768ad4c4b491304d278b7eef1ca889caa4f4ae8bf209", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "aa5f9145f85df5a0cc13492c32389b1c0b27c8e476a2a5ec39774081761670b3", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "90a54967e1ab581bb6560cc837f833b005e57ecc5f306d9a228d933733722748", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + } +} diff --git a/docs/validation/webview-engine/identities/candidate-v3.json b/docs/validation/webview-engine/identities/candidate-v3.json new file mode 100644 index 00000000..00df454d --- /dev/null +++ b/docs/validation/webview-engine/identities/candidate-v3.json @@ -0,0 +1,256 @@ +{ + "app_source": "bd80077480b2a032ef9593f8b616586c9b61301b", + "test_source": "04636ed99c3dd5e3d688bcc83470058cf4515b27", + "collector_source": "04636ed99c3dd5e3d688bcc83470058cf4515b27", + "apks": { + "app-debug-androidTest.apk": "77a9e271c93253d701340cab188cf269ac0a0f5cc2375b1e9a88dfa72f338e4d", + "app-debug.apk": "7b5306e9029c4c431a2d3c79c744c14d8c6f30218f841dfba28bd732170e0b9d" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "2190f43dca4d7a7eca162a7e34f46d6091cfd114d83a5e4509946c1b912ce76f", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "34a8d54cf91a68802b348d746f0fd93cdf4d5af71dafc29fe06d327b91e0b8fc", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "cca29b959d059df551a1768ad4c4b491304d278b7eef1ca889caa4f4ae8bf209", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "52064ee1c7b650e58b5ae0bfb23de82a8fad02b933efccbbf34c4757a6d07f31", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "90a54967e1ab581bb6560cc837f833b005e57ecc5f306d9a228d933733722748", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + } +} diff --git a/docs/validation/webview-engine/identities/candidate-v4.json b/docs/validation/webview-engine/identities/candidate-v4.json new file mode 100644 index 00000000..f4e146df --- /dev/null +++ b/docs/validation/webview-engine/identities/candidate-v4.json @@ -0,0 +1,269 @@ +{ + "app_source": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0", + "test_source": "302f5e3aebcad59abbbfd37e3bf34d57633aa627", + "collector_source": "302f5e3aebcad59abbbfd37e3bf34d57633aa627", + "apks": { + "app-debug.apk": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "app-debug-androidTest.apk": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "2190f43dca4d7a7eca162a7e34f46d6091cfd114d83a5e4509946c1b912ce76f", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "fc4468462dae6b324929ce26335c7d728bd6234e572faee5d9a4256a28a41e65", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "36a9b4b35d22bc364ecb1f46d2d9f029e3807315a2d35d2fd231b2a86e8b49c8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "90a54967e1ab581bb6560cc837f833b005e57ecc5f306d9a228d933733722748", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + }, + "assets": { + "COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6" + } +} diff --git a/docs/validation/webview-engine/identities/candidate-v5.json b/docs/validation/webview-engine/identities/candidate-v5.json new file mode 100644 index 00000000..d70bf3fa --- /dev/null +++ b/docs/validation/webview-engine/identities/candidate-v5.json @@ -0,0 +1,256 @@ +{ + "app_source": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0", + "test_source": "5ff271abae6ba3ef42248be95fc94ceb9eae76f5", + "collector_source": "5ff271abae6ba3ef42248be95fc94ceb9eae76f5", + "apks": { + "app-debug-androidTest.apk": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747", + "app-debug.apk": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "2190f43dca4d7a7eca162a7e34f46d6091cfd114d83a5e4509946c1b912ce76f", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "71bf84d615f36c1eea92029fac08c1e77c9377bd8a6d6223a68f4b96ebaa1e1f", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "36a9b4b35d22bc364ecb1f46d2d9f029e3807315a2d35d2fd231b2a86e8b49c8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "fe8ca2d04ac69d36e63a619385dabac4ba3c82c638d5c4cfb0e725feb5235a95", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "90a54967e1ab581bb6560cc837f833b005e57ecc5f306d9a228d933733722748", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + } +} diff --git a/docs/validation/webview-engine/identities/candidate-v6.json b/docs/validation/webview-engine/identities/candidate-v6.json new file mode 100644 index 00000000..dc56152e --- /dev/null +++ b/docs/validation/webview-engine/identities/candidate-v6.json @@ -0,0 +1,256 @@ +{ + "app_source": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0", + "test_source": "0328732e731b7f2fcb071e8169ec9b52ca8b745e", + "collector_source": "0328732e731b7f2fcb071e8169ec9b52ca8b745e", + "apks": { + "app-debug-androidTest.apk": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e", + "app-debug.apk": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71" + }, + "sources": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/assets/owned-detail-fixture.js": "873d3f25f95271029e31779b0920b5955a2908a820a07652b58efa21a2358cfd", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionPasteCopyDeviceTest.kt": "7bdd8e876153d4d46357402eab58cf89c0e8885823d21894c70882ed55b1da8e", + "app/src/androidTest/java/dev/tinycast/android/ExtensionRecordedTestsDeviceTest.kt": "1aa11011270b01a235bb052c6063da7eb5f7f726a7bb19f79aa54e7b8aa4ca42", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "31040a9d92e7e60d8026dda7119a9f7eedd2127ea6f50bfb308849f56b6fc0ac", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "2190f43dca4d7a7eca162a7e34f46d6091cfd114d83a5e4509946c1b912ce76f", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/androidTest/java/dev/tinycast/android/WebViewRecoveryDeviceTest.kt": "2243287970c4fd8a9a5df85d9583b754958d87f03384622f9984917470327c48", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/assets/extension-workflow-evidence-v1.json": "4e8adc22b7887996140190a999f1c7272556f2dd379d219c88e276e48aea0fa5", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "9863a9646617cb0024ccfe6758b8030ce528b15dfdd1f6073f96637257f6ab29", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "4427ae6610fcf75bc8f7ddeec9b869ab5b6698c9042280f9f0efff7ea3422e1e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineCompatibility.kt": "36a9b4b35d22bc364ecb1f46d2d9f029e3807315a2d35d2fd231b2a86e8b49c8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEngineUi.kt": "6972248240f701edcc038ce70428dfd1a716e40894d616918469af3270aaa9cb", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPasteCopy.kt": "3ee4dfbb356c6ec02f50d8d525ca805c0d21468f49529b002e054ff9c03c71b8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionPayloadIdentity.kt": "66037b60818bc4941f58551e6c1401c18641a6da43f9f2477db9c9f7838e29f0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "8df6a1a357a7133ce451930cc174b7382d70db75906724358ae40db664f6402e", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "009e3b23953be18ae09c76a849dd6ce3943dff6b4f2d4b40d846385044851b3f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowEvidence.kt": "98f65f5dbe1578b11fbb20d80f477a63b03659f7b11b1a7a6f526a4d6fe94379", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowInspection.kt": "650fdb495d2e1e0ab5331fe8c517baaaffcfe7d15e7f56b5b3f6247a650d01ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionWorkflowUi.kt": "93e9af8898ccce7fa1ab8169f08926b1d9fa95ba5657c517d7224f9356488c3d", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionEngineCompatibilityTest.kt": "af9e76d4f6e7a6f193603f2db0169c95c7aadaca842d430c6178874f62840b1f", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionPasteCopyTest.kt": "582ebddff12c96a504dd12a502ca851fc5d037e92f1d3ce98240eb162002b3bc", + "app/src/test/java/dev/tinycast/android/ExtensionPayloadIdentityTest.kt": "f59183b3224aab2923d9eb1ae598d1fa5cd2598b9ba80fc9a0db135005ae4e04", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowEvidenceTest.kt": "cf1589d69a498166b5a5fddd45135cf5b8575ec1d42f13ed4e2927b062b966fd", + "app/src/test/java/dev/tinycast/android/ExtensionWorkflowInspectionTest.kt": "043617c0cb943d76ebcdb5d0cc5bcdcda300069827b9b87a7425a16d084c1255", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "app/src/test/resources/commonmark-0.31.2.NOTICE": "610241b963a1a958c9465d99ec3f5778e7c6ef7251f9e119fed4c306b51641de", + "app/src/test/resources/commonmark-0.31.2.tsv": "dc27be954caac0ed8961299ca581a62aa4c68312091e68e52ab1e2bfe6aa5f5f", + "app/src/test/resources/extension-payload-identities-v1.json": "e451cf6b8efa208708db43dcb3a0545db1e73c610b72f488203fb4f147a490ab", + "app/src/test/resources/tinycast-grid-navigation.tsv": "da620f314fc39300beb7a11436715809ac1a9fd230fa4640c7f4f9c34b69aaf7", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle/wrapper/gradle-wrapper.jar": "55243ef57851f12b070ad14f7f5bb8302daceeebc5bce5ece5fa6edb23e1145c", + "gradle/wrapper/gradle-wrapper.properties": "13287ffad6cf3064056ddad80d95b855132348930b2dc6c91490588c55b3ac7d", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/modifier-test-input.c": "859cd4f868c0739124384652eb05dcff09f67bd65933c6546ec828adaf4f8756", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "4e9ab25f0b1bce00277d0dde5a37a29ab8cbbdb9900699c5bdfd9cfa4b9bb248", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/test-webview-engine.py": "b9047681411e1d3e4272ce401357f47a551b67df4a970d44ca34a9500f6ac863", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a3d489fe141be669374ecd0b3a6231afc5efdf4abfc6a74f7d25efec4e67038c", + "scripts/tests/test_webview_engine_runner.py": "90a54967e1ab581bb6560cc837f833b005e57ecc5f306d9a228d933733722748", + "scripts/verify-recorded-workflow-catalog.py": "fc0ec3b595b3a892238a4e0cc19b79ca092e8dcbe3e4af1d261e4874f984c2d5" + } +} diff --git a/docs/validation/webview-engine/identities/unused-stamp-build.json b/docs/validation/webview-engine/identities/unused-stamp-build.json new file mode 100644 index 00000000..773c673b --- /dev/null +++ b/docs/validation/webview-engine/identities/unused-stamp-build.json @@ -0,0 +1,10 @@ +{ + "never_installed_or_executed": true, + "incorrect_build_stamp": "fec0a4bf8d0e3dc694f4d8255748de79610b13e8", + "expected_runtime_source": "fec0a4bf1155c08c141606f92ae8fb1feab4bba0", + "source_head": "302f5e3aebcad59abbbfd37e3bf34d57633aa627", + "apks": { + "app-debug.apk": "bce8e0ce909c25eaedc268435cd29d671d6fba49db00c298cf6d90bd3eadd1c7", + "app-debug-androidTest.apk": "3a1115a1311bf06326a1103e168e8229242921b23c589f649edc05c6935ffd19" + } +} diff --git a/docs/validation/webview-engine/matrix.json b/docs/validation/webview-engine/matrix.json new file mode 100644 index 00000000..3654dc3d --- /dev/null +++ b/docs/validation/webview-engine/matrix.json @@ -0,0 +1,92 @@ +[ + { + "cohort": "legacy100", + "passes": 7, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 10, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747" + }, + { + "cohort": "legacy200", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 10, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "40edc44f917313720e71f92ccf2540397f68ee3c06d0a9b61634a24a8c583747" + }, + { + "cohort": "modern-tablet100", + "passes": 5, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 15, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + { + "cohort": "modern-phone200", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 17, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + { + "cohort": "modern-landscape200", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 17, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + { + "cohort": "review-lifecycle", + "passes": 5, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 18, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + { + "cohort": "handoff", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 18, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + { + "cohort": "paste", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 18, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c" + }, + { + "cohort": "legacy-common-positive", + "passes": 2, + "junit_failures": 0, + "expected_negative": false, + "cleanup_checks": 10, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e" + }, + { + "cohort": "legacy-common-negative", + "passes": 0, + "junit_failures": 1, + "expected_negative": true, + "cleanup_checks": 10, + "app_sha256": "b0fa0e302a63320b6e5ed163856756961b4480a1ce476f4cb6167be799535e54", + "test_apk_sha256": "29f7f69d61ab3038e64de4efc74e99facfcd98430d89172f870375c2675d163e" + } +] diff --git a/docs/validation/webview-engine/projections.json b/docs/validation/webview-engine/projections.json new file mode 100644 index 00000000..fada224a --- /dev/null +++ b/docs/validation/webview-engine/projections.json @@ -0,0 +1,930 @@ +[ + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/record.json", + "original_sha256": "8a7b268c5f49ab8dbb7c82d08df99a080a9e88582e0a2f8d07325ec98d363972", + "public": "docs/validation/webview-engine/cohorts/legacy100/record.json", + "public_sha256": "8624cbb7f623233892d59973f1428434913725b39dc1814a1a8104e5c51f1dfb", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "original_sha256": "11c6c54b99b4f6cfe99e4c3d1d1f47aeddb74c2f95479a4f785c35aa1c636102", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "public_sha256": "7cd6077a0443c4b005a2d8fc61aa3fad34f7b9184b12564071b33b7b44269193", + "keys": [ + "android_api", + "api_probe_result", + "case", + "compile_body_executed", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "invalid_syntax_caught", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "original_sha256": "c155c5b4bad97c350d9ccccbe0eacbb2c7f3dde717732d20a0d1eaeffe1b63a5", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "public_sha256": "196f989afed168d25c3b1e0db1977d258107f2407c6e1b76751bb397987cabf2", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "preflight_bridge_render_rejected", + "preflight_host_api_rejected", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json", + "original_sha256": "3b612ffe2a5d184256353b3667b33ea884e39d180474aed52bb3fbf878d34cb1", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json", + "public_sha256": "eb8d31e19536ad01d656743a302c97d35589442855a95c852b8fe4ed55bf0cc0", + "keys": [ + "android_api", + "case", + "closed_owner_remained_inactive", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json", + "original_sha256": "c917aa6150c089979ce2cd5b81b1440f1ea2cf5cb43d1423d506085484d50e50", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json", + "public_sha256": "d3ad0df1ce62d9f4ab2b7f40043680c88ed80d26aa9430126630f66b4b0d4249", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "fresh_recovery_actions", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope", + "second_failure_scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json", + "original_sha256": "fb70a0f9251f9083afd6b232921af6fd9743475a872477e1172dcea56ad20a29", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json", + "public_sha256": "95d287a73a6d1d314bf4f87ec47faa4b08cc465bd3ec06029aa1ec2f280096a2", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "explicit_settings_destination", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "original_sha256": "c6dd40c01219f580e2c93d6fa66b19acccc9b3510cbd3d30f4c6c7faf72716c2", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "public_sha256": "c044bac5b57eba8bd008779c8274553ee9137eba768f3180d2305d44e8715d03", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "published_native_tree", + "runtime_error", + "scope", + "target_witnesses", + "text_setup", + "text_witnesses", + "time_to_result_ms" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy100/captures/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json", + "original_sha256": "97d65112b124768562593b11f94cf73d5073cbf39efe05104b80624eed68cdc5", + "public": "docs/validation/webview-engine/cohorts/legacy100/cases/case-replaced-recovery-rejects-retained-settings-and-return-callbacks.json", + "public_sha256": "8bc8c53c022e507ea57c8d33177697991090b77470f3b5cd33461643a986e885", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "replacement_not_closed", + "scope", + "stale_settings_launches" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/record.json", + "original_sha256": "0c33da581b0a1655bd21df978b7a2ad09c67c7606d9cbffb528652069b163a08", + "public": "docs/validation/webview-engine/cohorts/legacy200/record.json", + "public_sha256": "3073ebb2a0d9a9a97da8ee6d213882f82892f4fc33f7061d37db108ce98ed503", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json", + "original_sha256": "0dfe8faeeac0c168f952abffa3db869d55a10871c47a2e92528c7214e176b53f", + "public": "docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-opens-only-actual-provider-settings-and-returns.json", + "public_sha256": "f7520370a2f2ff69363650d8715d1c188c7ae9b59843441e9991ac7736c71e73", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "explicit_settings_destination", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v5/legacy200/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "original_sha256": "360b52bf44ffdd972f09fdb1761c46a3a21a2748fae063f9200b64057f12ee48", + "public": "docs/validation/webview-engine/cohorts/legacy200/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "public_sha256": "ae0afbad68195cb64b6d4c1ecd94979de234c523f378cde361aab4e811262a44", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "published_native_tree", + "runtime_error", + "scope", + "target_witnesses", + "text_setup", + "text_witnesses", + "time_to_result_ms" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/record.json", + "original_sha256": "b950d35729b1eb567cd8fd5b2347ed9a45d8b41d70a1c0241bb8c3450b756079", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/record.json", + "public_sha256": "3a3a4fce0e22a3bda69fa2d913087d97c5ff92e0fd4763c57528b9ffb938cb53", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "preserved_file_count", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "original_sha256": "4ae147a3c447fbf2f7e5b1c5dd146777b4048885b3f762374946c3c26a9db4b9", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-actual-provider-parses-probe-without-running-its-body-and-rejects-syntax.json", + "public_sha256": "88c350479c1648c33a7177eee77a4296c020edd40f121f26fd7cee92e8a5c1fc", + "keys": [ + "android_api", + "api_probe_result", + "case", + "compile_body_executed", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "invalid_syntax_caught", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "original_sha256": "b0bbf4bf9728488dae820b65b5cec4c00df79a369dcd0190f669bf7c552a1025", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-bridge-cannot-publish-or-read-host-apis-before-approval.json", + "public_sha256": "356bd11ec3f23a17f104a412417855f6179c252f40ded3146ad32ee51b726542", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "preflight_bridge_render_rejected", + "preflight_host_api_rejected", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-closing-before-preflight-finishes-rejects-late-publication.json", + "original_sha256": "fe8d5144203cdd855f95536b25f284bd9d0d5d0b3bd68159e0ff6bfee6cd35df", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-closing-before-preflight-finishes-rejects-late-publication.json", + "public_sha256": "0b8ef08e2d3a3f069b06cbd902102c05fed9616c46cd3861eaf2a612a3d4f7e8", + "keys": [ + "android_api", + "case", + "closed_owner_remained_inactive", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-modern-engine-publishes-grid-and-runs-live-action.json", + "original_sha256": "a5cb1c3d00a82dbd5bb1ba859ad9f4f3e900074f46f4a102b9edac2e578bd123", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-grid-and-runs-live-action.json", + "public_sha256": "351178b7b5be62be589baa2eaed7e076f4db28c18ccd1d632513162b0ab5624f", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-tablet100/captures/case-modern-engine-publishes-list-and-runs-live-action.json", + "original_sha256": "38fe51bdf2ecf8e04561064e6458618aa06de976069519a2b26121abec8ab1c3", + "public": "docs/validation/webview-engine/cohorts/modern-tablet100/cases/case-modern-engine-publishes-list-and-runs-live-action.json", + "public_sha256": "e6664805edc8f79735927921e8f865bac66c27b6263447f5b08d59c2ddeebcbf", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/record.json", + "original_sha256": "0276d2dd6fb054af54914468d2e95eeedbaf092607fb09fd9ca1dda170385bd3", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/record.json", + "public_sha256": "db30e15618221ddad745e5e9980811a233db97487649de7b8533170951ffe5eb", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "preserved_file_count", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/case-modern-engine-publishes-grid-and-runs-live-action.json", + "original_sha256": "e29e2bedb87c2e9e9ee6242d5890d40621bdefa822ebb81f5c1d3521b00e42df", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json", + "public_sha256": "4c0962c51ac6868838687a1b05890064de518a8faae4d5c652d08a8d306d2ab6", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-phone200/captures/case-modern-engine-publishes-list-and-runs-live-action.json", + "original_sha256": "bb8ae5726829690ec8ece985b934050e2de8bbdf4ef0366344c923f19f58bdbe", + "public": "docs/validation/webview-engine/cohorts/modern-phone200/cases/case-modern-engine-publishes-list-and-runs-live-action.json", + "public_sha256": "f081e382edd51f4987295db01f60ad3cb52e147e91eff9da4bd8f28eb9fc4759", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/record.json", + "original_sha256": "f8e531051f71d2f0fd85d04f7da88cb409b225145071b5b2ee9bc1ece93c0eac", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/record.json", + "public_sha256": "e0c48f46eb9cd0c2234a126739af13d38974f90a2e76efb771c5b38d2cdb2641", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "preserved_file_count", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/case-modern-engine-publishes-grid-and-runs-live-action.json", + "original_sha256": "e29e2bedb87c2e9e9ee6242d5890d40621bdefa822ebb81f5c1d3521b00e42df", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-grid-and-runs-live-action.json", + "public_sha256": "4c0962c51ac6868838687a1b05890064de518a8faae4d5c652d08a8d306d2ab6", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v4/modern-landscape200/captures/case-modern-engine-publishes-list-and-runs-live-action.json", + "original_sha256": "bb8ae5726829690ec8ece985b934050e2de8bbdf4ef0366344c923f19f58bdbe", + "public": "docs/validation/webview-engine/cohorts/modern-landscape200/cases/case-modern-engine-publishes-list-and-runs-live-action.json", + "public_sha256": "f081e382edd51f4987295db01f60ad3cb52e147e91eff9da4bd8f28eb9fc4759", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "live_action_published", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/record.json", + "original_sha256": "198fb863f5dc81b96307c73ae9830edd9cfd2a0a02177465d3ed6a6dffccd004", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/record.json", + "public_sha256": "ad03960c89bbad660a2e411b4ffcad2c08c446db741e14a016ce86afbc5d41ea", + "keys": [ + "apk_sha256", + "classes", + "cleanup", + "completed", + "expected", + "font_scale", + "installed_apks_match", + "instrumentation_exit_code", + "layout", + "original_font_scale", + "passes", + "runner_sha256", + "test_apk_sha256", + "tests_completed" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json", + "original_sha256": "6b7894a39b395f79151f7d90b3216404af0bd28ebb1c017ca370677d67d9e324", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json", + "public_sha256": "d1139d3eba7f340978abe19f7cc043358f54bd69208b43c5b7cbcb97bd238cbf", + "keys": [ + "archive_sha256", + "cancelled_before_run", + "command_sha256", + "external_caller_uses_separate_package_and_uid", + "font_scale", + "height_dp", + "owned_data_removed", + "passed", + "preexisting_installations_and_data_preserved", + "preview_no_execution_and_clipboard_unchanged", + "probe_command_sha256", + "scope", + "width_dp" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json", + "original_sha256": "580c9c274cd4711f2d68befe9ceab4b99064b29cc4dff4037f1cc90d7d9071cd", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-noviewcompletionreleasesitsapprovedinput-record.json", + "public_sha256": "3897b0d5bfedef1e592f4df6ce52f257ee1cdbad17e8938b587bcf27538a5f5d", + "keys": [ + "font_scale", + "no_view_completion_released_input", + "owned_data_removed", + "passed", + "preexisting_installations_and_data_preserved", + "scope", + "view_probe_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json", + "original_sha256": "ce0541a8de2f32cc54fd4488204b82d5de246ba09866f587d3a84693f5b7e621", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-rejectedasyncandsynchostcallsreleaseapprovedinput-record.json", + "public_sha256": "6c4a632304c040280f2bf6aa6d5cc1ac54bc1e4b960eda84a75c5f87d9ccbdf8", + "keys": [ + "async_and_sync_host_api_rejections_released_input", + "font_scale", + "owned_data_removed", + "passed", + "preexisting_installations_and_data_preserved", + "scope", + "view_probe_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json", + "original_sha256": "63e0bc888a893f149c4b72525bb31646d082f2dfdea5545c43bb8bd0852ffa61", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-lifecycle-staleruntimecannotpublishorwriteafterreplacement-record.json", + "public_sha256": "f7884fd7ede730bda2daddcaf8abee0b6e23da2e52d42b22a538807e80a09b2f", + "keys": [ + "font_scale", + "live_write_and_publication_controls_succeeded", + "owned_data_removed", + "passed", + "preexisting_installations_and_data_preserved", + "scope", + "stale_write_render_error_depth_and_close_blocked", + "view_probe_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/review-lifecycle/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json", + "original_sha256": "1024f1ebb63617b7b7e5df5758dbf3d61857b3c4b44e64df5192efa11f2cedc9", + "public": "docs/validation/webview-engine/cohorts/review-lifecycle/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json", + "public_sha256": "4b1e3d64d0ddf5d754d10f0f070df16c89e67dd2cb8f1b334a5f599892b45413", + "keys": [ + "archive_sha256", + "clipboard_unchanged_until_copy", + "command_sha256", + "exact_unicode_output_copied", + "executed_command", + "external_caller_uses_separate_package_and_uid", + "font_scale", + "height_dp", + "native_code_monospace", + "native_format_contract_started", + "owned_data_removed", + "passed", + "preexisting_installations_and_data_preserved", + "preview_no_execution_and_clipboard_unchanged", + "probe_command_sha256", + "returned_to_external_caller", + "scope", + "source_text_and_selection_unchanged", + "width_dp" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/record.json", + "original_sha256": "828a1201a1aae1177ae9e46814dbaed3e0051934495f74d03631f7bd6be10e62", + "public": "docs/validation/webview-engine/cohorts/handoff/record.json", + "public_sha256": "11ca6ca9b070a57f37d9bb870b464aa90830e92e2334e29c6d10cdb673ba26f5", + "keys": [ + "apk_sha256", + "classes", + "cleanup", + "completed", + "expected", + "font_scale", + "installed_apks_match", + "instrumentation_exit_code", + "layout", + "original_font_scale", + "passes", + "runner_sha256", + "test_apk_sha256", + "tests_completed" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "original_sha256": "a183c44000d1176a3c3926d23f4f00c1aaed843ff7232646d1182fd2652f2cb9", + "public": "docs/validation/webview-engine/cohorts/handoff/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "public_sha256": "0b79d6ab0a53d9d811184b76177ec3fe19c34e7abadad5dec0d25368d7384627", + "keys": [ + "clipboard_restoration_scope", + "fixture_child_sha256", + "fixture_manifest_sha256", + "fixture_parent_sha256", + "font_scale", + "height_dp", + "launcher_query_preserved", + "obsolete_host_and_chrome_callbacks_rejected", + "one_transfer_before_native_composition", + "owned_data_removed", + "passed", + "paused_parent_probe", + "pointer_taps", + "preexisting_installations_and_data_preserved", + "protocol_setup", + "scope", + "width_dp" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/handoff/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "c7572a0d3030b1a79ba5b4838950bf58996690d5f061a024ac65fa554c5b768e", + "public": "docs/validation/webview-engine/cohorts/handoff/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public_sha256": "ca5ff2788586239ca5fef955270b552c131e9f54aa26b36e1e2b2f4998814fe0", + "keys": [ + "child_raw_grant_absent", + "clipboard_restoration_scope", + "context_argument_fallback_values_verified", + "copy_exact", + "fixture_child_sha256", + "fixture_manifest_sha256", + "fixture_parent_sha256", + "font_scale", + "height_dp", + "launcher_query_preserved", + "owned_data_removed", + "passed", + "pointer_taps", + "preexisting_installations_and_data_preserved", + "scope", + "width_dp" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/record.json", + "original_sha256": "01a271189c33821149a9bf4c2b5c2bd525c570808cb76edbfe9bd74e2f7de716", + "public": "docs/validation/webview-engine/cohorts/paste/record.json", + "public_sha256": "cc9278ef5b24a71f37fd4905c222d2becbf21fe4ffbabcc4ce4e93ce2b9df8e2", + "keys": [ + "apk_sha256", + "classes", + "cleanup", + "completed", + "expected", + "font_scale", + "installed_apks_match", + "instrumentation_exit_code", + "layout", + "original_font_scale", + "passes", + "runner_sha256", + "test_apk_sha256", + "tests_completed" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-pointercopyisexactonceandreturns-record.json", + "original_sha256": "ebdf3b17edb2a88858ae072db7a2a093c7572e25e0d5395f5a7d21122bdc9417", + "public": "docs/validation/webview-engine/cohorts/paste/cases/pastecopy-pointercopyisexactonceandreturns-record.json", + "public_sha256": "216e8d82101a4c789fddd31af8c72a56a68c9513663023e43f15f56ff5a82761", + "keys": [ + "clipboard_restoration_scope", + "copy_exact", + "duplicate_after_copy_rejected", + "duplicate_probe_setup", + "fixture_manifest_sha256", + "fixture_parent_sha256", + "font_scale", + "height_dp", + "launcher_query_preserved", + "owned_data_removed", + "passed", + "pointer_taps", + "preexisting_installations_and_data_preserved", + "scope", + "width_dp" + ] + }, + { + "original": "artifacts/webview-compatibility/shared-regressions-v2/paste/captures/pastecopy-returnandescapecancelwithoutcopy-record.json", + "original_sha256": "83ee1f1b2959e4c2f27b0706f2b132455617fa311a13a98fe839ab2035866a1d", + "public": "docs/validation/webview-engine/cohorts/paste/cases/pastecopy-returnandescapecancelwithoutcopy-record.json", + "public_sha256": "68470db9421abc1f6218913ab93801f37f799f5b1e16950c5f983b7d2b866e75", + "keys": [ + "clipboard_restoration_scope", + "fixture_manifest_sha256", + "fixture_parent_sha256", + "font_scale", + "height_dp", + "owned_data_removed", + "passed", + "pointer_taps", + "preexisting_installations_and_data_preserved", + "return_and_escape_cancelled_without_copy", + "scope", + "width_dp" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/record.json", + "original_sha256": "60a65c702ea08f39e342ac52c128ae0026c17e302c8a35cbd2c266be109bb61a", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/record.json", + "public_sha256": "8ff6df448a248d15b8d8f949f90cb0d068015a3ceb51fe714e9090d9bab19338", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "initialization_error", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json", + "original_sha256": "c917aa6150c089979ce2cd5b81b1440f1ea2cf5cb43d1423d506085484d50e50", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-equivalent-failure-gets-fresh-recovery-actions-before-recomposition.json", + "public_sha256": "d3ad0df1ce62d9f4ab2b7f40043680c88ed80d26aa9430126630f66b4b0d4249", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "fresh_recovery_actions", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "scope", + "second_failure_scope" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-positive/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "original_sha256": "a29c878eb65439ab5bdeef9ea539f2a944a9add83fa9816b57aa7990e4e5a12c", + "public": "docs/validation/webview-engine/cohorts/legacy-common-positive/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "public_sha256": "56da8f3e1685a39ea879281aa6483ea633fe172437b94ca4a3860c259a75fbd5", + "keys": [ + "android_api", + "caller_query_restored", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "passed", + "provider", + "provider_version", + "published_native_tree", + "runtime_error", + "scope", + "target_witnesses", + "text_setup", + "text_witnesses", + "time_to_result_ms" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/record.json", + "original_sha256": "600ab415a6c0f2d04644855d906de06523616de2011d9bc0aa9a2eb6e1851cb0", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/record.json", + "public_sha256": "16582b83e29a84738ab6314863c5b6195865b350e55000c37d04842ebb3a5b81", + "keys": [ + "api", + "apk_sha256", + "cleanup", + "completed", + "expected_negative", + "failures", + "fixture_sha256", + "font_scale", + "initialization_error", + "instrumentation_exit_code", + "layout", + "methods", + "native_expected_outcome", + "original_font_scale", + "original_geometry", + "passes", + "provider_before", + "runner_sha256", + "test_apk_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/final-v6/legacy-old-control/captures/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "original_sha256": "a970aaaac6892fcad4c8fda89f12b02ce4947917d43cca3fa7429fbdef2f2512", + "public": "docs/validation/webview-engine/cohorts/legacy-common-negative/cases/case-incompatible-engine-shows-native-recovery-without-dispatch.json", + "public_sha256": "b658676338dd2eecb98e3d8eae8398fe52cfac57562eab112314f673eb7d3d38", + "keys": [ + "android_api", + "case", + "fixture_bytecode_scope", + "fixture_cleanup_owner", + "font_scale", + "palette_preferences_restored", + "provider", + "provider_version", + "published_native_tree", + "runtime_error", + "scope", + "time_to_result_ms" + ] + }, + { + "original": "artifacts/webview-compatibility/legacy-before/separate-recovery.json", + "original_sha256": "3bf5621625d1d4b824ad0656817909166fea5b942cf3d1e9cfceee5dc12160f8", + "public": "docs/validation/webview-engine/history/legacy-before/separate-recovery.json", + "public_sha256": "5dd5ffafd56fbb0c6fdf1a41ec80cf54426004a34f08bf45dca6937a43e335b7", + "keys": [ + "checks", + "completed", + "original_outer_run_still_failed", + "original_run_record_sha256" + ] + }, + { + "original": "artifacts/webview-compatibility/legacy-candidate-v1/separate-setup-recovery.json", + "original_sha256": "d335fe277777f1fdf930015ca6a53ddec402f6927ad3f72b473a420f37414961", + "public": "docs/validation/webview-engine/history/legacy-candidate-v1/separate-setup-recovery.json", + "public_sha256": "4dfb0eecd2ae56e758c9a354d5524091057b4b1f18e9a9693be7d710ad607b0f", + "keys": [ + "checks", + "completed", + "native_executions", + "original_outer_run_still_failed", + "original_run_record_sha256", + "reason" + ] + }, + { + "original": "artifacts/webview-compatibility/modern-tablet-v1/separate-recovery.json", + "original_sha256": "7e15d9a8f401d8a1c3df40053c9cf88fed5c11d5af691f0ce399a159edd56f87", + "public": "docs/validation/webview-engine/history/modern-tablet-v1/separate-recovery.json", + "public_sha256": "fcdfbd7553f66ef0ffc67c106eeb801e3e2b84f43bc7de50581faa22a6292a77", + "keys": [ + "checks", + "completed", + "original_failures", + "original_outer_run_still_failed", + "original_passes", + "original_run_record_sha256", + "preserved_files" + ] + }, + { + "original": "artifacts/webview-compatibility/legacy-final200-v1/separate-font-recovery.json", + "original_sha256": "d340b5ff7aece97d918ae09bcaeb0304104c223a9c773c9943b7400f1085f770", + "public": "docs/validation/webview-engine/history/legacy-final200-v1/separate-font-recovery.json", + "public_sha256": "a3ac92e86d0eb1cd6b6dd2d6c27fd7f0a7ccdd417518678797fa827fb576e3ca", + "keys": [ + "checks", + "completed", + "original_junit_passes", + "original_outer_run_still_failed", + "original_run_record_sha256" + ] + } +] diff --git a/docs/validation/webview-engine/shared-preservation.json b/docs/validation/webview-engine/shared-preservation.json new file mode 100644 index 00000000..2a2fa10d --- /dev/null +++ b/docs/validation/webview-engine/shared-preservation.json @@ -0,0 +1,36 @@ +{ + "completed": true, + "app_sha256": "ae03c859cbdb5177796b6ed559a8db20b210d2919b2f5c9e4bf5d4694ac4ec71", + "test_apk_sha256": "906bc489e527b99d2f763c8c7b60a0cf0692acf671a2d2a7a3bb0204b1849a9c", + "collector_sha256": "4f98c89eb0f6ecb980e0425e01842f16ac0638646af075f51e67c40b81ae1b6d", + "cohorts": { + "review-lifecycle": { + "exit_code": 0, + "completed": true, + "passes": 5, + "cleanup_checks": 18, + "cleanup_passed": true + }, + "handoff": { + "exit_code": 0, + "completed": true, + "passes": 2, + "cleanup_checks": 18, + "cleanup_passed": true + }, + "paste": { + "exit_code": 0, + "completed": true, + "passes": 2, + "cleanup_checks": 18, + "cleanup_passed": true + } + }, + "restoration": { + "original_files_and_evidence": true, + "original_apks": true, + "unprivileged": true, + "release_after_verification": true + }, + "preserved_files": 573 +} diff --git a/scripts/test-webview-engine.py b/scripts/test-webview-engine.py new file mode 100644 index 00000000..38445a22 --- /dev/null +++ b/scripts/test-webview-engine.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python3 +"""Owned API26 rejection or API36 execution probes; retain recovery ownership on any restoration failure.""" +from pathlib import Path, PurePosixPath +import argparse +import hashlib +import io +import json +import os +import re +import shlex +import subprocess +import tarfile +import time +import uuid +from android_test_cleanup import Cleanup, private_path_absent + +APP = 'dev.tinycast.android' +TEST = APP + '.test' +CLASS = 'dev.tinycast.android.WebViewRecoveryDeviceTest' +CASES = { + 'legacy': ['incompatibleEngineShowsNativeRecoveryWithoutDispatch', + 'incompatibleEngineOpensOnlyActualProviderSettingsAndReturns', + 'replacedRecoveryRejectsRetainedSettingsAndReturnCallbacks', + 'equivalentFailureGetsFreshRecoveryActionsBeforeRecomposition'], + 'modern': ['modernEnginePublishesListAndRunsLiveAction', 'modernEnginePublishesGridAndRunsLiveAction'], + 'shared': ['actualProviderParsesProbeWithoutRunningItsBodyAndRejectsSyntax', + 'closingBeforePreflightFinishesRejectsLatePublication', + 'bridgeCannotPublishOrReadHostApisBeforeApproval'], +} + + +def require(value, message): + if not value: + raise ValueError(message) + + +def sha(data): + return hashlib.sha256(data).hexdigest() + + +def listed_package_presence(output, package): + lines = output.splitlines() + require(all(re.fullmatch(r'package:[A-Za-z0-9_.]+', line) for line in lines), 'Invalid PackageManager inventory') + return 'package:' + package in lines + + +def archive_files(data): + files = {} + with tarfile.open(fileobj=io.BytesIO(data)) as archive: + for item in archive: + if item.isdir(): + continue + path = PurePosixPath(item.name) + require(item.isfile() and not path.is_absolute() and '..' not in path.parts + and path.parts[0] in ('files', 'shared_prefs') and item.size <= 64 * 1024 * 1024, + 'Unexpected private archive entry') + require(str(path) not in files, 'Duplicate private archive path') + files[str(path)] = archive.extractfile(item).read() + return files + + +def fixture(id): + # ES5 source: a failure on API26 belongs to the unchanged shared bootstrap, + # not to modern syntax added by the command fixture. + sources = {} + for name, kind, row in [('index', 'List', 'Owned engine row one'), ('grid', 'Grid', 'Owned grid row one')]: + sources[name + '.js'] = ("var React=require('react'),api=require('@raycast/api');exports.default=function(){" + "var state=React.useState(false),done=state[0],setDone=state[1];return React.createElement(api." + kind + + ",{navigationTitle:'Owned WebView fixture'},React.createElement(api." + kind + ".Item,{id:'owned-one'," + "title:done?'Owned " + kind + " action published':'" + row + "',actions:React.createElement(api.ActionPanel,null," + "React.createElement(api.Action,{title:'Publish owned action',onAction:function(){setDone(true);}}))}));};\n").encode() + manifest = {'name': 'owned-webview-fixture', 'title': 'Owned engine fixture', 'commands': [ + {'name': name, 'title': 'Owned engine fixture', 'mode': 'view'} for name in ('index', 'grid')]} + listing = {'id': id, 'name': 'owned-webview-fixture', 'title': 'Owned engine fixture', + 'description': 'Owned engine fixture; local React state only', 'author': 'Droidcast tests', + 'handle': 'owned-webview-tests', 'download_url': '', 'source_url': '', 'commit_sha': '', 'command_count': 2} + return sources | {'package.json': json.dumps(manifest).encode(), '.tinycast-store.json': json.dumps(listing).encode()} + + +def main(): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument('--serial', required=True) + p.add_argument('--avd', required=True) + p.add_argument('--apk', type=Path, required=True) + p.add_argument('--test-apk', type=Path, required=True) + p.add_argument('--output', type=Path, required=True) + p.add_argument('--cases', required=True, help='Comma-separated exact WebViewRecoveryDeviceTest methods') + p.add_argument('--font-scale', type=float, choices=[1, 2], default=1) + p.add_argument('--layout', choices=['tablet', 'phone', 'landscape'], default='phone') + p.add_argument('--expected-negative', action='store_true', help='Only the missing recovery assertion on the old app') + a = p.parse_args() + legacy = a.avd == 'Droidcast_WebView_API26_27caf3' + require(a.serial.startswith('emulator-') and a.avd in ('Droidcast_WebView_API26_27caf3', 'Tinycast_Tablet_API_36'), 'Use an explicitly owned AVD') + methods = a.cases.split(',') + require(len(methods) == len(set(methods)) and 1 <= len(methods) <= 7 and all( + name in CASES['shared'] + CASES['legacy' if legacy else 'modern'] for name in methods), 'Unsupported native cases') + require(not a.expected_negative or legacy and methods == [CASES['legacy'][0]], 'Negative control is limited to the old missing-recovery assertion') + require(not legacy or a.layout == 'phone', 'Keep the actual API26 geometry unchanged') + require(a.apk.is_file() and a.test_apk.is_file(), 'Both frozen APKs are required') + sdk = os.environ.get('ANDROID_HOME') or next(x.removeprefix('sdk.dir=') for x in Path('local.properties').read_text().splitlines() if x.startswith('sdk.dir=')) + adb = [str(Path(sdk) / 'platform-tools/adb'), '-s', a.serial] + + def raw(*args, data=None, timeout=60): + return subprocess.check_output(adb + list(args), input=data, stderr=subprocess.STDOUT, timeout=timeout) + + def text(*args): + return raw(*args).decode().strip() + + def absent(path): + # API26 run-as cannot exec toybox's `test` symlink. The shell builtin + # preserves silent 0/1 semantics without treating transport errors as absence. + command = 'run-as ' + shlex.quote(APP) + ' /system/bin/sh -c ' + shlex.quote('test -e "$1"') + ' x ' + shlex.quote(path) + return private_path_absent(subprocess.run(adb + ['shell', command], capture_output=True, timeout=30)) + + def package_path(pkg): + # Old PackageManager returns exit 1 from `path` for an absent package. + # Establish absence from its successful exact inventory first. + return text('shell', 'pm', 'path', pkg) if listed_package_presence(text('shell', 'pm', 'list', 'packages', pkg), pkg) else '' + + def restore_font(wanted): + # Android26 may materialize its default row after processing deletion + # of a nondefault scale. Require the original raw value to settle; + # never relabel an effective default as exact restoration. + deadline = time.monotonic() + 5 + stable = None + while time.monotonic() < deadline: + value = text('shell', 'settings', 'get', 'system', 'font_scale') + if value == wanted: + if stable is None: + stable = time.monotonic() + if time.monotonic() - stable >= .5: + return + else: + stable = None + raw('shell', 'settings', 'delete', 'system', 'font_scale') if wanted == 'null' else raw('shell', 'settings', 'put', 'system', 'font_scale', wanted) + time.sleep(.1) + require(False, 'Original raw font setting did not settle') + + require(text('emu', 'avd', 'name').splitlines()[0] == a.avd and text('shell', 'getprop', 'ro.kernel.qemu') == '1', 'AVD identity changed') + require(text('shell', 'getprop', 'ro.build.version.sdk') == ('26' if legacy else '36'), 'Unexpected Android API') + require(text('shell', 'id').startswith('uid=2000('), 'adbd must remain unprivileged') + require('ActiveInstrumentation{' not in text('shell', 'dumpsys', 'activity', 'processes'), 'Another instrumentation is active') + initial_packages = {pkg: package_path(pkg) for pkg in (APP, TEST)} + require(all(not value for value in initial_packages.values()) if legacy else all(initial_packages.values()), 'Inspect existing packages before repeating an install') + size = text('shell', 'wm', 'size'); density = text('shell', 'wm', 'density') + require('Override' not in size + density, 'An existing geometry override has an owner') + font = text('shell', 'settings', 'get', 'system', 'font_scale') + nonce = uuid.uuid4().hex; id = 'webview-engine-' + nonce + lease = 'files/webview-compatibility-lease'; evidence = 'files/webview-compatibility-evidence' + root = 'files/extensions/' + id + owner = {'kind': 'webview-compatibility-v1', 'nonce': nonce, 'extension_id': id, 'fresh_disposable_avd': legacy} + owned = [root, 'cache/' + id, 'files/extension-data/' + id, 'shared_prefs/extension-' + id + '.xml', + 'shared_prefs/extension-' + id + '.xml.bak', evidence] + if not legacy: + require(not text('shell', 'run-as', APP, 'id').startswith(('uid=0(', 'uid=1000(', 'uid=2000(')), 'The app must remain unprivileged') + for path in [lease, evidence, 'files/reviewed-text-fixture-lease', 'files/empty-view-fixture-lease'] + owned[:5]: + require(absent(path), 'A prior recovery owner/path remains: ' + path) + a.output.mkdir(parents=True, exist_ok=False, mode=0o700) + (a.output / 'private-owner.json').write_text(json.dumps(owner)); (a.output / 'private-owner.json').chmod(0o600) + r = {'completed': False, 'expected_negative': a.expected_negative, 'runner_sha256': sha(Path(__file__).read_bytes()), + 'apk_sha256': sha(a.apk.read_bytes()), 'test_apk_sha256': sha(a.test_apk.read_bytes()), 'methods': methods, + 'api': 26 if legacy else 36, 'font_scale': a.font_scale, 'layout': a.layout, 'cleanup': {}, + 'provider_before': [line.strip() for line in text('shell', 'dumpsys', 'webviewupdate').splitlines() if 'Current WebView package' in line], + 'original_geometry': {'size': size, 'density': density}, 'original_font_scale': font} + def save(): + (a.output / 'record.json').write_text(json.dumps(r, indent=2) + '\n') + save() + before = {}; originals = {}; palette = None; original_profile = None + lease_claimed = False; installed = [] + def claim(): + # A never-launched fresh installation has no files directory yet. + raw('shell', 'run-as', APP, 'mkdir', '-p', 'files') + raw('shell', 'run-as', APP, 'mkdir', lease) + raw('shell', 'run-as', APP, 'tee', lease + '/owner.json', data=json.dumps(owner).encode()) + def verify_owner(): + require(json.loads(raw('exec-out', 'run-as', APP, 'cat', lease + '/owner.json')) == owner, 'Recovery owner changed') + if not legacy: + claim(); lease_claimed = True + for pkg in (TEST, APP): + raw('shell', 'am', 'force-stop', pkg) + for pkg, value in initial_packages.items(): + require(value.count('package:') == 1, 'Split APK restoration is not supported by this runner') + data = raw('exec-out', 'cat', value.removeprefix('package:')) + path = a.output / ('private-original-' + pkg + '.apk'); path.write_bytes(data); path.chmod(0o600) + originals[pkg] = (path, sha(data)) + data = raw('exec-out', 'run-as', APP, 'tar', '-cf', '-', 'files', 'shared_prefs') + path = a.output / 'private-data-before.tar'; path.write_bytes(data); path.chmod(0o600) + original_files = archive_files(data) + original_profile = original_files.get('files/profileInstalled') + before = {path: sha(value) for path, value in original_files.items() if not path.startswith(lease + '/')} + palette = raw('exec-out', 'run-as', APP, 'cat', 'shared_prefs/palette.xml') + (a.output / 'private-palette.xml').write_bytes(palette); (a.output / 'private-palette.xml').chmod(0o600) + try: + for pkg, apk in [(APP, a.apk), (TEST, a.test_apk)]: + raw('install', '-r', '-t', str(apk), timeout=120); installed.append(pkg) + require(sha(raw('exec-out', 'cat', text('shell', 'pm', 'path', pkg).removeprefix('package:'))) == sha(apk.read_bytes()), 'Installed APK differs') + if legacy: + claim(); lease_claimed = True + raw('shell', 'run-as', APP, 'mkdir', '-p', root) + r['fixture_sha256'] = {} + for name, data in fixture(id).items(): + raw('shell', 'run-as', APP, 'tee', root + '/' + name, data=data); r['fixture_sha256'][name] = sha(data) + if not legacy and a.layout != 'tablet': + raw('shell', 'wm', 'size', '1080x2340' if a.layout == 'phone' else '2340x1080'); raw('shell', 'wm', 'density', '420') + raw('shell', 'settings', 'put', 'system', 'font_scale', str(a.font_scale)) + save() + command = ['shell', 'am', 'instrument', '-w', '-r', '-e', 'webViewFixture', 'true', '-e', 'webViewOwner', nonce, + '-e', 'class', ','.join(CLASS + '#' + name for name in methods), TEST + '/androidx.test.runner.AndroidJUnitRunner'] + with (a.output / 'tests.log').open('xb') as log: + result = subprocess.run(adb + command, stdout=log, stderr=subprocess.STDOUT, timeout=90 * len(methods)) + r['instrumentation_exit_code'] = result.returncode + require('ActiveInstrumentation{' not in text('shell', 'dumpsys', 'activity', 'processes'), 'Instrumentation still active; retain recovery owner') + log = (a.output / 'tests.log').read_text() + r['passes'] = len(re.findall(r'^INSTRUMENTATION_STATUS_CODE: 0$', log, re.M)) + r['failures'] = len(re.findall(r'^INSTRUMENTATION_STATUS_CODE: -2$', log, re.M)) + r['initialization_error'] = 'INSTRUMENTATION_STATUS: test=initializationError' in log + r['native_expected_outcome'] = (r['passes'] == 0 and r['failures'] == 1 and 'extension-engine-problem' in log and 'NoClassDefFoundError' not in log + if a.expected_negative else r['passes'] == len(methods) and r['failures'] == 0 and f'OK ({len(methods)} test' in log) + save() # Keep the native outcome even when evidence collection fails. + data = raw('exec-out', 'run-as', APP, 'tar', '-cf', '-', evidence) + frames = archive_files(data) + captures = a.output / 'captures'; captures.mkdir() + for path, value in frames.items(): + name = PurePosixPath(path).name + require(PurePosixPath(path).parent == PurePosixPath(evidence) and re.fullmatch(r'[a-z0-9-]+\.(png|xml|json)', name), 'Unexpected evidence path') + (captures / name).write_bytes(value) + r['captures'] = {PurePosixPath(path).name: sha(value) for path, value in frames.items()} + save() + finally: + c = Cleanup(r) + if lease_claimed: + def idle_owner(): + require('ActiveInstrumentation{' not in text('shell', 'dumpsys', 'activity', 'processes'), 'Do not restore under active instrumentation') + verify_owner() + c.attempt('idle-owned-instrumentation', idle_owner) + if not c.errors: + for pkg in (TEST, APP): + c.attempt('stop-' + pkg, lambda pkg=pkg: raw('shell', 'am', 'force-stop', pkg)) + def remove_owned(): + verify_owner() + raw('shell', 'run-as', APP, 'rm', '-rf', *owned) + require(all(absent(path) for path in owned), 'Registered fixture path remains') + c.attempt('owned-paths', remove_owned) + if palette is not None: + def restore_palette(): + raw('shell', 'run-as', APP, 'rm', '-f', 'shared_prefs/palette.xml.bak') + raw('shell', 'run-as', APP, 'tee', 'shared_prefs/palette.xml', data=palette) + require(raw('exec-out', 'run-as', APP, 'cat', 'shared_prefs/palette.xml') == palette, 'Palette restoration differs') + c.attempt('palette-bytes', restore_palette) + c.attempt('restore-font', lambda: restore_font(font)) + if not legacy and a.layout != 'tablet': + c.attempt('restore-size', lambda: raw('shell', 'wm', 'size', 'reset')) + c.attempt('restore-density', lambda: raw('shell', 'wm', 'density', 'reset')) + def geometry(): + require(text('shell', 'wm', 'size') == size and text('shell', 'wm', 'density') == density + and text('shell', 'settings', 'get', 'system', 'font_scale') == font, 'Original settings differ') + c.attempt('verify-settings', geometry) + if not legacy: + def restore_profile_stamp(): + # AndroidX ProfileInstaller updates this build-derived + # marker after installing a different APK. It is not an + # extension/user-data restoration wildcard. + if original_profile is None: + raw('shell', 'run-as', APP, 'rm', '-f', 'files/profileInstalled') + require(absent('files/profileInstalled'), 'Profile marker remains') + else: + raw('shell', 'run-as', APP, 'tee', 'files/profileInstalled', data=original_profile) + require(raw('exec-out', 'run-as', APP, 'cat', 'files/profileInstalled') == original_profile, 'Profile marker differs') + c.attempt('profile-installer-marker', restore_profile_stamp) + def preserved_data(): + after = archive_files(raw('exec-out', 'run-as', APP, 'tar', '-cf', '-', 'files', 'shared_prefs')) + after = {path: sha(value) for path, value in after.items() if not path.startswith(lease + '/')} + require(after == before, 'Installed data/evidence changed; retain private recovery inputs') + r['preserved_file_count'] = len(before) + c.attempt('installed-data-and-evidence', preserved_data) + c.attempt('verify-unprivileged', lambda: require(text('shell', 'id').startswith('uid=2000(') + and not text('shell', 'run-as', APP, 'id').startswith(('uid=0(', 'uid=1000(', 'uid=2000(')), 'Unexpected UID')) + if not c.errors: + verify_owner() + if legacy: + # The app lease stays held until PackageManager removes + # the entire owned app. Host journal stays for verification. + for pkg in (TEST, APP): + c.attempt('restore-absence-' + pkg, lambda pkg=pkg: raw('uninstall', pkg)) + c.attempt('verify-initial-package-absence', lambda: require(all(not package_path(pkg) for pkg in (APP, TEST)), 'A package remains')) + else: + for pkg, (path, expected) in originals.items(): + c.attempt('restore-binary-' + pkg, lambda path=path: raw('install', '-r', '-t', str(path), timeout=120)) + c.attempt('verify-binary-' + pkg, lambda pkg=pkg, expected=expected: require(sha(raw('exec-out', 'cat', text('shell', 'pm', 'path', pkg).removeprefix('package:'))) == expected, 'Original binary differs')) + if not c.errors: + verify_owner() + # Final device operation: no restoration runs after release. + c.attempt('release-owner-last', lambda: raw('shell', 'run-as', APP, 'rm', '-rf', lease)) + else: + r['recovery_required'] = bool(installed) + r['completed'] = bool(r.get('native_expected_outcome')) and not c.errors and lease_claimed + save(); c.finish() + require(r['completed'], 'Native outcome failed; inspect retained receipts') + print(json.dumps({key: r.get(key) for key in ('completed', 'passes', 'failures', 'expected_negative', 'preserved_file_count')})) + + +if __name__ == '__main__': + main() diff --git a/scripts/tests/test_webview_engine_runner.py b/scripts/tests/test_webview_engine_runner.py new file mode 100644 index 00000000..d0bc8d90 --- /dev/null +++ b/scripts/tests/test_webview_engine_runner.py @@ -0,0 +1,64 @@ +import importlib.util +import io +from pathlib import Path +import sys +import tarfile +import unittest + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) +spec = importlib.util.spec_from_file_location('webview_engine_runner', ROOT / 'test-webview-engine.py') +runner = importlib.util.module_from_spec(spec) +spec.loader.exec_module(runner) + + +class WebViewRunnerTests(unittest.TestCase): + def test_package_absence_uses_exact_successful_inventory(self): + self.assertFalse(runner.listed_package_presence('', 'dev.tinycast.android')) + self.assertFalse(runner.listed_package_presence('package:dev.tinycast.android.test\n', 'dev.tinycast.android')) + self.assertTrue(runner.listed_package_presence('package:dev.tinycast.android\n', 'dev.tinycast.android')) + for error in ('Error: transport failed', 'package:/not/a/package'): + with self.assertRaises(ValueError): + runner.listed_package_presence(error, 'dev.tinycast.android') + + def archive(self, entries): + data = io.BytesIO() + with tarfile.open(fileobj=data, mode='w') as archive: + for name, kind, value in entries: + info = tarfile.TarInfo(name); info.type = kind; info.size = len(value) + archive.addfile(info, io.BytesIO(value)) + return data.getvalue() + + def test_private_archives_preserve_file_bytes_without_extraction(self): + data = self.archive([('files/owned/data', tarfile.REGTYPE, b'\x00\r\nprivate'), + ('shared_prefs/palette.xml', tarfile.REGTYPE, b'')]) + self.assertEqual({'files/owned/data': b'\x00\r\nprivate', 'shared_prefs/palette.xml': b''}, runner.archive_files(data)) + + def test_archive_rejects_paths_outside_registered_app_namespaces(self): + for name in ('/files/data', '../files/data', 'files/../other', 'cache/private'): + with self.subTest(name=name), self.assertRaises(ValueError): + runner.archive_files(self.archive([(name, tarfile.REGTYPE, b'x')])) + + def test_archive_rejects_duplicate_or_nonregular_entries(self): + with self.assertRaises(ValueError): + runner.archive_files(self.archive([('files/a', tarfile.REGTYPE, b'x')] * 2)) + for kind in (tarfile.SYMTYPE, tarfile.LNKTYPE, tarfile.FIFOTYPE): + with self.subTest(kind=kind), self.assertRaises(ValueError): + runner.archive_files(self.archive([('files/a', kind, b'')])) + + def test_guards_remain_active_with_optimized_python(self): + with self.assertRaises(ValueError): + runner.require(False, 'retained owner') + + def test_fixture_has_only_local_state_actions_and_two_declared_commands(self): + import json + files = runner.fixture('webview-engine-' + 'a' * 32) + self.assertEqual({'index.js', 'grid.js', 'package.json', '.tinycast-store.json'}, set(files)) + self.assertEqual(['index', 'grid'], [c['name'] for c in json.loads(files['package.json'])['commands']]) + for name in ('index.js', 'grid.js'): + for denied in (b'Clipboard', b'fetch(', b'LocalStorage', b'launchCommand'): + self.assertNotIn(denied, files[name]) + + +if __name__ == '__main__': + unittest.main()