Skip to content

Commit 6b2ae7e

Browse files
committed
feat: upgrade browser target to Chrome 148 and implement extensive runtime facades for DOM, network, and performance shielding
1 parent 0db422f commit 6b2ae7e

62 files changed

Lines changed: 8749 additions & 7949 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

biome.jsonc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
"!**/bin",
1919
"!rewriter-rs/target",
2020
"!package-lock.json",
21-
// generated wasm glue / loaders — not hand-authored source
22-
"!web/oxc-parser.js",
2321
"!web/wasm_exec.js",
24-
"!web/oxc_parser_wasm_bg.wasm",
2522
"!**/*.wasm"
2623
]
2724
},

cmd/wasm-kernel/deliver_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,28 @@ func runDeliver(req *http.Request, resp *http.Response, finalURL *url.URL) deliv
7474
return out
7575
}
7676

77+
func installDeliverTestRewriter(t *testing.T) func() {
78+
t.Helper()
79+
rewriter := js.Global().Get("ZPRewriter")
80+
rewriteHTML := js.FuncOf(func(_ js.Value, args []js.Value) any {
81+
source := ""
82+
if len(args) > 0 {
83+
source = args[0].String()
84+
}
85+
return map[string]any{
86+
"ok": true,
87+
"code": source + "<!--rewritten-by-test-rewriter-->",
88+
}
89+
})
90+
js.Global().Set("ZPRewriter", map[string]any{
91+
"rewriteHTMLDocument": rewriteHTML,
92+
})
93+
return func() {
94+
rewriteHTML.Release()
95+
js.Global().Set("ZPRewriter", rewriter)
96+
}
97+
}
98+
7799
func deliverReq(hdr map[string]string, raw string) *http.Request {
78100
u, _ := url.Parse(raw)
79101
r := &http.Request{Method: "GET", URL: u, Header: http.Header{}}
@@ -112,6 +134,9 @@ func mustURL(t *testing.T, raw string) *url.URL {
112134
// teardown-ownership flag), basic response delivery, document transform, and
113135
// cookie capture / credentials-omit.
114136
func TestDeliverResponseOwnershipAndDelivery(t *testing.T) {
137+
cleanupRewriter := installDeliverTestRewriter(t)
138+
defer cleanupRewriter()
139+
115140
plain := "https://t.test/a.js"
116141

117142
// Body present -> ownership transfers to the body cancel goroutine -> false.

cmd/wasm-kernel/main.go

Lines changed: 13 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,7 @@ func transformDocumentResponse(req *http.Request, resp *http.Response, tab *zpht
208208
Servers: headerServers(req.Header.Get("X-Zp-Relay-Servers")),
209209
DynamicCompileAllowed: dynamicCompileAllowed,
210210
ReferrerPolicy: referrerPolicy,
211-
ScriptRewriter: rewriteScriptFromJS,
212-
ScriptURLRewriter: rewriteScriptURLFromJS,
213-
FetchURLRewriter: rewriteFetchURLFromJS,
214-
CSSRewriter: rewriteCSSFromJS,
215-
ImportMapRewriter: rewriteImportMapFromJS,
211+
DocumentRewriter: rewriteHTMLDocumentFromJS,
216212
})
217213
closeErr := source.Close()
218214
if err != nil {
@@ -301,88 +297,31 @@ func cookieRecordsForJS(records []cookiejar.SnapshotRecord) []any {
301297
return out
302298
}
303299

304-
func rewriteScriptFromJS(source, kind, targetURL, controlPrefix, tabID, runtimeToken string) (string, error) {
300+
func rewriteHTMLDocumentFromJS(source, targetURL, controlPrefix, runtimePrelude, tabID, runtimeToken string, servers []string) (string, error) {
305301
rewriter := js.Global().Get("ZPRewriter")
306-
if !rewriter.Truthy() || rewriter.Get("rewriteScript").Type() != js.TypeFunction {
307-
return "", fmt.Errorf("REALM_INJECTION_FAILURE")
302+
if !rewriter.Truthy() || rewriter.Get("rewriteHTMLDocument").Type() != js.TypeFunction {
303+
return "", fmt.Errorf("HTML_DOCUMENT_REWRITE_UNAVAILABLE")
308304
}
309-
out := rewriter.Call("rewriteScript", source, map[string]any{
310-
"kind": kind,
305+
out := rewriter.Call("rewriteHTMLDocument", source, map[string]any{
311306
"targetUrl": targetURL,
312307
"controlPrefix": controlPrefix,
308+
"prelude": runtimePrelude,
313309
"tabId": tabID,
314310
"runtimeToken": runtimeToken,
315-
"strict": true,
311+
"servers": stringsForJS(servers),
316312
})
317313
if out.Truthy() && out.Get("ok").Bool() {
318314
return out.Get("code").String(), nil
319315
}
320-
return "", fmt.Errorf("REWRITE_FAILED")
316+
return "", fmt.Errorf("HTML_DOCUMENT_REWRITE_FAILED")
321317
}
322318

323-
func rewriteScriptURLFromJS(raw, kind, targetURL, controlPrefix, tabID, runtimeToken string) (string, string, error) {
324-
rewriter := js.Global().Get("ZPRewriter")
325-
if !rewriter.Truthy() || rewriter.Get("rewriteScriptURL").Type() != js.TypeFunction {
326-
return "", "", fmt.Errorf("REALM_INJECTION_FAILURE")
327-
}
328-
out := rewriter.Call("rewriteScriptURL", raw, map[string]any{
329-
"kind": kind,
330-
"targetUrl": targetURL,
331-
"controlPrefix": controlPrefix,
332-
"tabId": tabID,
333-
"runtimeToken": runtimeToken,
334-
})
335-
if out.Truthy() && out.Get("ok").Bool() {
336-
return out.Get("url").String(), out.Get("target").String(), nil
319+
func stringsForJS(values []string) []any {
320+
out := make([]any, 0, len(values))
321+
for _, value := range values {
322+
out = append(out, value)
337323
}
338-
return "", "", fmt.Errorf("REWRITE_FAILED")
339-
}
340-
341-
func rewriteFetchURLFromJS(raw, targetURL, controlPrefix string) (string, string, error) {
342-
rewriter := js.Global().Get("ZPRewriter")
343-
if !rewriter.Truthy() || rewriter.Get("rewriteFetchURL").Type() != js.TypeFunction {
344-
return "", "", fmt.Errorf("REALM_INJECTION_FAILURE")
345-
}
346-
out := rewriter.Call("rewriteFetchURL", raw, map[string]any{
347-
"targetUrl": targetURL,
348-
"controlPrefix": controlPrefix,
349-
})
350-
if out.Truthy() && out.Get("ok").Bool() {
351-
return out.Get("url").String(), out.Get("target").String(), nil
352-
}
353-
return "", "", fmt.Errorf("REWRITE_FAILED")
354-
}
355-
356-
func rewriteCSSFromJS(source, baseURL string) (string, error) {
357-
rewriter := js.Global().Get("ZPRewriter")
358-
if !rewriter.Truthy() || rewriter.Get("rewriteCSS").Type() != js.TypeFunction {
359-
return "", fmt.Errorf("CSS_REWRITE_UNAVAILABLE")
360-
}
361-
out := rewriter.Call("rewriteCSS", source, map[string]any{
362-
"baseUrl": baseURL,
363-
"controlPrefix": "/zp/",
364-
})
365-
if out.Truthy() && out.Get("ok").Bool() {
366-
return out.Get("code").String(), nil
367-
}
368-
return "", fmt.Errorf("CSS_REWRITE_FAILED")
369-
}
370-
371-
func rewriteImportMapFromJS(source, baseURL, tabID, runtimeToken, controlPrefix string) (string, error) {
372-
rewriter := js.Global().Get("ZPRewriter")
373-
if !rewriter.Truthy() || rewriter.Get("rewriteImportMap").Type() != js.TypeFunction {
374-
return "", fmt.Errorf("IMPORT_MAP_REWRITE_UNAVAILABLE")
375-
}
376-
out := rewriter.Call("rewriteImportMap", source, map[string]any{
377-
"baseUrl": baseURL,
378-
"tabId": tabID,
379-
"runtimeToken": runtimeToken,
380-
"controlPrefix": controlPrefix,
381-
})
382-
if out.Truthy() && out.Get("ok").Bool() {
383-
return out.Get("code").String(), nil
384-
}
385-
return "", fmt.Errorf("IMPORT_MAP_REWRITE_FAILED")
324+
return out
386325
}
387326

388327
func targetDynamicCompileAllowed(h http.Header) bool {

cmd/zeroproxy-server/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ func (s *server) serveAsset(w http.ResponseWriter, r *http.Request, name string)
134134
switch name {
135135
case "zp-core.js", "runtime-prelude.js", "rust-rewriter.js", "http-rewriter.js", "wasm_exec.js", "worker-prelude.js", "favicon.ico", "manifest.webmanifest":
136136
s.serveWeb(w, r, name)
137+
case "rust-rewriter.wasm":
138+
s.serveFile(w, r, filepath.Join(s.webDir, name), "application/wasm")
137139
default:
138140
s.safeError(w, r, "POLICY_BLOCKED", http.StatusForbidden)
139141
}

cmd/zeroproxy-server/routing_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ func TestServeAssetAllowlist(t *testing.T) {
9191

9292
allowed := []string{
9393
"zp-core.js", "runtime-prelude.js", "rust-rewriter.js", "http-rewriter.js",
94-
"wasm_exec.js", "worker-prelude.js", "favicon.ico", "manifest.webmanifest",
94+
"rust-rewriter.wasm", "wasm_exec.js", "worker-prelude.js", "favicon.ico",
95+
"manifest.webmanifest",
9596
}
9697
for _, name := range allowed {
9798
req := httptest.NewRequest(http.MethodGet, assetPrefix+name, nil)

internal/htmltx/injection_inventory_test.go

Lines changed: 0 additions & 211 deletions
This file was deleted.

0 commit comments

Comments
 (0)