File size: 4,341 Bytes
8155d78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
355c4d1
 
 
 
8155d78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python3
"""Deterministic static-analysis regression for Phase 08-03: persistent side
panel (R18). The extension JS can't run headless, so we assert the wiring
CONTRACT by source inspection (mirroring the 06/07 plans). ASCII-only output.

Proves:
  * content.js injects an idempotent left-docked iframe panel hosting
    popup/popup.html, with a collapse/dismiss toggle, handles TOGGLE_PANEL, and
    keeps EXTRACT_JD; it never disables page interaction globally.
  * manifest.json exposes the popup via web_accessible_resources, bumps the
    version to 1.5.0, and retains the content script + default_popup launcher.
  * popup.js keeps the background-owned run (ats_results + storage.onChanged +
    getCurrentUrlKey), adds launcher/embed awareness (TOGGLE_PANEL + window.top),
    and surfaces the 08-01 LaTeX compile-failure reason (pdf_error + compile_log).

Exit code: 0 when every assertion passes, 1 otherwise.
"""

import json
import os
import sys

REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
EXT = os.path.join(REPO_ROOT, "extension")
CONTENT = os.path.join(EXT, "content.js")
MANIFEST = os.path.join(EXT, "manifest.json")
POPUP_JS = os.path.join(EXT, "popup", "popup.js")

_failures = []


def _read(path):
    with open(path, encoding="utf-8") as fh:
        return fh.read()


def check(condition, message):
    if condition:
        print(f"  [PASS] {message}")
    else:
        print(f"  [FAIL] {message}")
        _failures.append(message)


def test_content_js():
    print("[1] content.js injects a persistent left-docked iframe panel")
    js = _read(CONTENT)
    for token in ("injectSidePanel", "ats-side-panel-root",
                  "chrome.runtime.getURL", "popup/popup.html",
                  "TOGGLE_PANEL", "collapsed"):
        check(token in js, f"content.js references '{token}'")
    check("ats-side-panel-toggle" in js or "ats-side-panel-dismiss" in js,
          "collapse/dismiss toggle present")
    check("EXTRACT_JD" in js, "JD extraction listener preserved")
    # Crude guard against blocking the whole page.
    check("document.body.style.pointerEvents" not in js,
          "does NOT globally disable page pointer events")


def test_manifest():
    print("[2] manifest.json exposes popup + bumps version, keeps launcher")
    m = json.loads(_read(MANIFEST))
    war = m.get("web_accessible_resources")
    check(bool(war), "web_accessible_resources present")
    res = (war[0].get("resources") if war else []) or []
    check(any("popup/popup.html" in r for r in res),
          "popup/popup.html is web-accessible")
    # Panel landed in 1.5.0; accept any >= 1.5.0 so follow-up patch bumps
    # (1.5.1, 1.5.2, ...) don't break this check.
    _vt = tuple(int(x) for x in str(m.get("version", "0")).split("."))
    check(_vt >= (1, 5, 0), f"version >= 1.5.0 (got {m.get('version')})")
    cs = m.get("content_scripts", [])
    check(any("content.js" in (c.get("js") or []) for c in cs)
          and any("<all_urls>" in (c.get("matches") or []) for c in cs),
          "content.js still registered on <all_urls>")
    check(bool(m.get("action", {}).get("default_popup")),
          "default_popup retained (thin launcher)")


def test_popup_js():
    print("[3] popup.js keeps background-owned run + adds launcher/embed + pdf_error")
    js = _read(POPUP_JS)
    for token in ("ats_results", "chrome.storage.onChanged", "getCurrentUrlKey"):
        check(token in js, f"popup.js retains '{token}' (R15 run + live reflect)")
    check("TOGGLE_PANEL" in js and "window.top" in js,
          "popup.js has launcher/embed awareness (TOGGLE_PANEL + window.top)")
    check("pdf_error" in js and "compile_log" in js,
          "popup.js surfaces the 08-01 LaTeX compile-failure reason")


def main():
    print("=" * 68)
    print("Phase 08-03 verification: persistent left-docked side panel (R18)")
    print("=" * 68)
    test_content_js()
    test_manifest()
    test_popup_js()
    print("-" * 68)
    if _failures:
        print(f"FAIL - {len(_failures)} check(s) failed:")
        for f in _failures:
            print(f"  - {f}")
        return 1
    print("PASS - persistent side panel wiring verified (iframe panel + manifest "
          "+ background-owned run + pdf_error surfacing)")
    return 0


if __name__ == "__main__":
    sys.exit(main())