@ai-ecoverse/slicc-browsers 1.20.2 → 1.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -938,7 +938,48 @@ async function driveCast(client, page, frameMs) {
938
938
  };
939
939
  }
940
940
 
941
- export async function driveReveal(client, reader, page, observer, frameMs, missing, side) {
941
+ function classifyRevealOverlap(
942
+ captureStartedAt,
943
+ revealAt,
944
+ pendingWhenRevealAcknowledged,
945
+ captureSettledAt
946
+ ) {
947
+ if (typeof captureStartedAt !== 'number' || typeof revealAt !== 'number') return 'unknown';
948
+ if (revealAt <= captureStartedAt) return 'before';
949
+ if (pendingWhenRevealAcknowledged) return 'during';
950
+ if (typeof captureSettledAt === 'number' && captureSettledAt < revealAt) return 'after';
951
+ return 'unknown';
952
+ }
953
+
954
+ function revealRaceVerdict(overlap, side, ok, shownRefused) {
955
+ if (overlap === 'during' || overlap === 'before') return side === 'control' ? ok : shownRefused;
956
+ if (overlap === 'after') return ok || shownRefused;
957
+ return false;
958
+ }
959
+
960
+ async function finishReveal(
961
+ client,
962
+ reader,
963
+ page,
964
+ observer,
965
+ frameMs,
966
+ { ok, text, overlap, revealRacePass }
967
+ ) {
968
+ const revealedPress = await click(client, reader, page, observer);
969
+ await style(reader, observer, 'hidden', frameMs);
970
+ const rehidden = await shot(client, page);
971
+ return {
972
+ revealedShot: ok,
973
+ revealedRefusal: text,
974
+ revealOverlap: overlap,
975
+ revealRacePass,
976
+ revealedClick: revealedPress.ok,
977
+ revealedClickRefusal: refusal(revealedPress.out),
978
+ rehiddenShot: rehidden.ok,
979
+ };
980
+ }
981
+
982
+ async function attemptRevealCapture(client, reader, page, observer, side) {
942
983
  const captureStartedAt = await observe(reader, observer, 'performance.now()');
943
984
  let captureSettled = false;
944
985
  let captureSettledAt;
@@ -963,31 +1004,38 @@ export async function driveReveal(client, reader, page, observer, frameMs, missi
963
1004
  const out = await pending;
964
1005
  const ok = out.ok && typeof out.result?.data === 'string' && out.result.data.length > 0;
965
1006
  const text = refusal(out);
966
- let overlap = 'unknown';
967
- if (typeof captureStartedAt !== 'number' || typeof revealAt !== 'number') overlap = 'unknown';
968
- else if (revealAt <= captureStartedAt) overlap = 'before';
969
- else if (pendingWhenRevealAcknowledged) overlap = 'during';
970
- else if (typeof captureSettledAt === 'number' && captureSettledAt < revealAt) overlap = 'after';
971
- if (overlap === 'unknown') missing.push('reveal/capture overlap unproven');
1007
+ const overlap = classifyRevealOverlap(
1008
+ captureStartedAt,
1009
+ revealAt,
1010
+ pendingWhenRevealAcknowledged,
1011
+ captureSettledAt
1012
+ );
972
1013
  const shownRefused = Boolean(text && (text === SHOWN || /^slicc: refused/.test(text)));
973
- let revealRacePass = false;
974
- if (overlap === 'during' || overlap === 'before')
975
- revealRacePass = side === 'control' ? ok : shownRefused;
976
- else if (overlap === 'after') revealRacePass = ok || shownRefused;
977
- const revealedPress = await click(client, reader, page, observer);
978
- await style(reader, observer, 'hidden', frameMs);
979
- const rehidden = await shot(client, page);
980
1014
  return {
981
- revealedShot: ok,
982
- revealedRefusal: text,
983
- revealOverlap: overlap,
984
- revealRacePass,
985
- revealedClick: revealedPress.ok,
986
- revealedClickRefusal: refusal(revealedPress.out),
987
- rehiddenShot: rehidden.ok,
1015
+ ok,
1016
+ text,
1017
+ overlap,
1018
+ revealRacePass: revealRaceVerdict(overlap, side, ok, shownRefused),
988
1019
  };
989
1020
  }
990
1021
 
1022
+ export async function driveReveal(client, reader, page, observer, frameMs, missing, side) {
1023
+ const maxAttempts = 3;
1024
+ let last = null;
1025
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
1026
+ last = await attemptRevealCapture(client, reader, page, observer, side);
1027
+ if (last.overlap !== 'unknown')
1028
+ return finishReveal(client, reader, page, observer, frameMs, last);
1029
+ if (attempt < maxAttempts) await style(reader, observer, 'hidden', frameMs);
1030
+ }
1031
+ missing.push(`reveal/capture overlap unproven (${maxAttempts} attempts)`);
1032
+ return finishReveal(client, reader, page, observer, frameMs, {
1033
+ ...last,
1034
+ overlap: 'unknown',
1035
+ revealRacePass: false,
1036
+ });
1037
+ }
1038
+
991
1039
  function frameObservations({ pageAttached, origin, read, leaks, picture, input, captures }) {
992
1040
  return {
993
1041
  exists: true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "setVersion": "1.20.2",
3
+ "setVersion": "1.20.3",
4
4
  "sources": [
5
5
  {
6
6
  "repo": "ai-ecoverse/slicc-cli",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-browsers",
3
- "version": "1.20.2",
3
+ "version": "1.20.3",
4
4
  "description": "SLICC's shared browser catalog, JSON schemas and discovery conformance corpus",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -84,7 +84,7 @@
84
84
  "test:unit:guard": "mkdir -p coverage/unit && node --experimental-vm-modules --no-warnings --experimental-test-coverage --test --test-concurrency=1 --test-coverage-include=guard-runner.mjs --test-coverage-include=guard-driver.mjs --test-coverage-include=extension-frame.mjs --test-coverage-include=fixture-server.mjs --test-coverage-include=fixture-client.mjs --test-coverage-include=observer-target.mjs --test-coverage-include=frame-read.mjs --test-coverage-include=bfcache-restore.mjs --test-coverage-include=protected-error-page.mjs --test-coverage-include=unparseable-url.mjs --test-coverage-include=scripts/browser-runner.mjs --test-coverage-include=scripts/validate.mjs --test-reporter=lcov --test-reporter-destination=coverage/unit/guard.lcov test/unit/guard-*.test.mjs && slicc-diff-cover coverage/unit/guard.lcov"
85
85
  },
86
86
  "devDependencies": {
87
- "@ai-ecoverse/slicc-cdp": "1.46.1",
87
+ "@ai-ecoverse/slicc-cdp": "1.46.2",
88
88
  "@ai-ecoverse/slicc-shared-web": "2.13.10",
89
89
  "@biomejs/biome": "2.6.4",
90
90
  "ajv": "8.20.0",