Skip to content

Commit 545dc2e

Browse files
committed
fix: update optional call rewriter for complex chain support and add Linux persona to expected deltas
1 parent 0db9096 commit 545dc2e

3 files changed

Lines changed: 42 additions & 6 deletions

File tree

rewriter-rs/src/js/swc_rewriter.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -663,11 +663,45 @@ impl SwcRewriter<'_> {
663663
}
664664

665665
fn rewrite_optional_call(&mut self, call: &OptCall) -> Option<Expr> {
666-
let callee = Callee::Expr(call.callee.clone());
667-
let (base, prop) = self.call_target_parts(&callee, true)?;
668-
let args = array_expr(call.args.iter().cloned().map(expr_from_spread).collect());
666+
let (base, prop) = self.optional_call_target_parts(&call.callee)?;
667+
let args = array_expr(
668+
call.args
669+
.iter()
670+
.cloned()
671+
.map(|arg| self.transformed_arg_expr(arg))
672+
.collect(),
673+
);
669674
Some(call_helper("__zp_optionalCall", vec![base, prop, args]))
670675
}
676+
677+
fn optional_call_target_parts(&mut self, callee: &Expr) -> Option<(Expr, Expr)> {
678+
match callee {
679+
Expr::Member(member) => {
680+
let wrapped = Callee::Expr(Box::new(Expr::Member(member.clone())));
681+
self.call_target_parts(&wrapped, true)
682+
}
683+
Expr::OptChain(chain) => match &*chain.base {
684+
OptChainBase::Member(member) => {
685+
let base = self.transformed_expr(&member.obj);
686+
let prop = self.member_prop_expr(&member.prop);
687+
Some((base, prop))
688+
}
689+
_ => None,
690+
},
691+
Expr::Paren(paren) => self.optional_call_target_parts(&paren.expr),
692+
_ => None,
693+
}
694+
}
695+
696+
fn transformed_arg_expr(&mut self, arg: ExprOrSpread) -> Expr {
697+
let ExprOrSpread { spread, expr } = arg;
698+
let mut expr = *expr;
699+
expr.visit_mut_with(self);
700+
expr_from_spread(ExprOrSpread {
701+
spread,
702+
expr: Box::new(expr),
703+
})
704+
}
671705
}
672706

673707
fn rewritten_str_lit(src: &Str, ctx: RewriteContext<'_>) -> Str {

test/e2e/expected-deltas.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,17 @@
2727
},
2828
{
2929
"id": "navigator-app-version-persona",
30-
"pattern": "^surface\\.fingerprint\\.objectPropertyCollection\\.r\\.5\\.0 \\((Macintosh; Intel Mac OS X 10_15_7|Windows NT 10\\.0; Win64; x64)\\) AppleWebKit/537\\.36 \\(KHTML, like Gecko\\) (HeadlessChrome|Chrome)/[0-9]+\\.0\\.0\\.0 Safari/537\\.36$",
30+
"pattern": "^surface\\.fingerprint\\.objectPropertyCollection\\.r\\.5\\.0 \\((Macintosh; Intel Mac OS X 10_15_7|Windows NT 10\\.0; Win64; x64|X11; Linux x86_64)\\) AppleWebKit/537\\.36 \\(KHTML, like Gecko\\) (HeadlessChrome|Chrome)/[0-9]+\\.0\\.0\\.0 Safari/537\\.36$",
3131
"reason": "Native Chromium exposes host platform appVersion while ZeroProxy exposes the Windows Chrome persona."
3232
},
3333
{
3434
"id": "navigator-user-agent-persona",
35-
"pattern": "^surface\\.fingerprint\\.objectPropertyCollection\\.r\\.Mozilla/5\\.0 \\((Macintosh; Intel Mac OS X 10_15_7|Windows NT 10\\.0; Win64; x64)\\) AppleWebKit/537\\.36 \\(KHTML, like Gecko\\) (HeadlessChrome|Chrome)/[0-9]+\\.0\\.0\\.0 Safari/537\\.36$",
35+
"pattern": "^surface\\.fingerprint\\.objectPropertyCollection\\.r\\.Mozilla/5\\.0 \\((Macintosh; Intel Mac OS X 10_15_7|Windows NT 10\\.0; Win64; x64|X11; Linux x86_64)\\) AppleWebKit/537\\.36 \\(KHTML, like Gecko\\) (HeadlessChrome|Chrome)/[0-9]+\\.0\\.0\\.0 Safari/537\\.36$",
3636
"reason": "Native Chromium exposes host platform userAgent while ZeroProxy exposes the Windows Chrome persona."
3737
},
3838
{
3939
"id": "navigator-platform-persona",
40-
"pattern": "^surface\\.fingerprint\\.objectPropertyCollection\\.r\\.(MacIntel|Win32)$",
40+
"pattern": "^surface\\.fingerprint\\.objectPropertyCollection\\.r\\.(Linux x86_64|MacIntel|Win32)$",
4141
"reason": "Native Chromium exposes host platform while ZeroProxy exposes the Windows Chrome persona."
4242
}
4343
]

test/js/rewriter.test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,8 @@ test('Rust rewriter preserves optional access semantics for guarded probes', asy
873873
assert.ok(out.code.includes('__zp_optionalCall'));
874874
assert.ok(out.code.includes('__zp_optionalCall(Object,"getOwnPropertyDescriptors"'));
875875
assert.ok(out.code.includes('__zp_optionalCall(Reflect,"ownKeys"'));
876+
assert.ok(out.code.includes('__zp_optionalCall(__zp_optionalGet(frame,"contentWindow"),"postMessage"'));
877+
assert.equal(out.code.includes('__zp_optionalGet(__zp_optionalGet(frame,"contentWindow"),"postMessage")('), false);
876878
});
877879

878880
test('Rust rewriter routes computed global-alias member access through runtime membrane', async () => {

0 commit comments

Comments
 (0)