126 lines
4.1 KiB
Python
126 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
"""Static regression guards for browser chrome contrast in mixed theme setups."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
|
|
def repo_root() -> Path:
|
|
result = subprocess.run(
|
|
["git", "rev-parse", "--show-toplevel"],
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
if result.returncode == 0:
|
|
return Path(result.stdout.strip())
|
|
return Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def extract_block(source: str, signature: str) -> str:
|
|
start = source.find(signature)
|
|
if start < 0:
|
|
raise ValueError(f"Missing signature: {signature}")
|
|
|
|
brace_start = source.find("{", start)
|
|
if brace_start < 0:
|
|
raise ValueError(f"Missing opening brace for: {signature}")
|
|
|
|
depth = 0
|
|
for idx in range(brace_start, len(source)):
|
|
char = source[idx]
|
|
if char == "{":
|
|
depth += 1
|
|
elif char == "}":
|
|
depth -= 1
|
|
if depth == 0:
|
|
return source[brace_start : idx + 1]
|
|
|
|
raise ValueError(f"Unbalanced braces for: {signature}")
|
|
|
|
|
|
def main() -> int:
|
|
root = repo_root()
|
|
view_path = root / "Sources" / "Panels" / "BrowserPanelView.swift"
|
|
source = view_path.read_text(encoding="utf-8")
|
|
failures: list[str] = []
|
|
|
|
try:
|
|
browser_panel_view_block = extract_block(source, "struct BrowserPanelView: View")
|
|
except ValueError as error:
|
|
failures.append(str(error))
|
|
browser_panel_view_block = ""
|
|
|
|
try:
|
|
resolver_block = extract_block(source, "func resolvedBrowserChromeColorScheme(")
|
|
except ValueError as error:
|
|
failures.append(str(error))
|
|
resolver_block = ""
|
|
|
|
if resolver_block:
|
|
if "backgroundColor.isLightColor ? .light : .dark" not in resolver_block:
|
|
failures.append(
|
|
"resolvedBrowserChromeColorScheme must map luminance to a light/dark ColorScheme"
|
|
)
|
|
|
|
try:
|
|
chrome_scheme_block = extract_block(
|
|
browser_panel_view_block,
|
|
"private var browserChromeColorScheme: ColorScheme",
|
|
)
|
|
except ValueError as error:
|
|
failures.append(str(error))
|
|
chrome_scheme_block = ""
|
|
|
|
if chrome_scheme_block and "resolvedBrowserChromeColorScheme(" not in chrome_scheme_block:
|
|
failures.append("browserChromeColorScheme must use resolvedBrowserChromeColorScheme")
|
|
|
|
try:
|
|
omnibar_background_block = extract_block(
|
|
browser_panel_view_block,
|
|
"private var omnibarPillBackgroundColor: NSColor",
|
|
)
|
|
except ValueError as error:
|
|
failures.append(str(error))
|
|
omnibar_background_block = ""
|
|
|
|
if omnibar_background_block and "for: browserChromeColorScheme" not in omnibar_background_block:
|
|
failures.append("omnibar pill background must use browserChromeColorScheme")
|
|
|
|
try:
|
|
address_bar_block = extract_block(
|
|
browser_panel_view_block,
|
|
"private var addressBar: some View",
|
|
)
|
|
except ValueError as error:
|
|
failures.append(str(error))
|
|
address_bar_block = ""
|
|
|
|
if address_bar_block and ".environment(\\.colorScheme, browserChromeColorScheme)" not in address_bar_block:
|
|
failures.append("addressBar must apply browserChromeColorScheme via environment")
|
|
|
|
try:
|
|
body_block = extract_block(browser_panel_view_block, "var body: some View")
|
|
except ValueError as error:
|
|
failures.append(str(error))
|
|
body_block = ""
|
|
|
|
if body_block:
|
|
if "OmnibarSuggestionsView(" not in body_block:
|
|
failures.append("Expected OmnibarSuggestionsView block in BrowserPanelView body")
|
|
elif ".environment(\\.colorScheme, browserChromeColorScheme)" not in body_block:
|
|
failures.append("Omnibar suggestions must apply browserChromeColorScheme via environment")
|
|
|
|
if failures:
|
|
print("FAIL: browser chrome contrast regression guards failed")
|
|
for failure in failures:
|
|
print(f" - {failure}")
|
|
return 1
|
|
|
|
print("PASS: browser chrome contrast regression guards are in place")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|