Rewild Your Web
web
browser
dweb
1--- original
2+++ modified
3@@ -119,6 +119,7 @@
4 webview_id: WebViewId,
5 parent_info: Option<PipelineId>,
6 opener: Option<BrowsingContextId>,
7+ is_embedded_webview: bool,
8 ) -> DomRoot<WindowProxy> {
9 if let Some(window_proxy) = self.get(browsing_context_id) {
10 // Note: we do not set the window to be the currently-active one,
11@@ -130,12 +131,29 @@
12 .borrow()
13 .find_iframe(parent_id, browsing_context_id)
14 });
15- let parent_browsing_context = match (parent_info, iframe.as_ref()) {
16- (_, Some(iframe)) => Some(iframe.owner_window().window_proxy()),
17- (Some(parent_id), _) => {
18- self.remote_window_proxy(senders, window.upcast(), webview_id, parent_id, opener)
19- },
20- _ => None,
21+
22+ // For embedded webview iframes, treat them as having no parent so that
23+ // window.parent === window.self returns true.
24+ // We check both the passed-in flag AND the iframe (if found in same thread).
25+ let is_embedded_webview = is_embedded_webview ||
26+ iframe
27+ .as_ref()
28+ .is_some_and(|iframe| iframe.is_embedded_webview());
29+
30+ let parent_browsing_context = if is_embedded_webview {
31+ None
32+ } else {
33+ match (parent_info, iframe.as_ref()) {
34+ (_, Some(iframe)) => Some(iframe.owner_window().window_proxy()),
35+ (Some(parent_id), _) => self.remote_window_proxy(
36+ senders,
37+ window.upcast(),
38+ webview_id,
39+ parent_id,
40+ opener,
41+ ),
42+ _ => None,
43+ }
44 };
45
46 let opener_browsing_context = opener.and_then(|id| self.find_window_proxy(id));
47@@ -145,11 +163,19 @@
48 opener_browsing_context.as_deref(),
49 );
50
51+ // For embedded webviews, don't pass the iframe as frame_element since
52+ // they are top-level browsing contexts.
53+ let frame_element = if is_embedded_webview {
54+ None
55+ } else {
56+ iframe.as_deref().map(Castable::upcast)
57+ };
58+
59 let window_proxy = WindowProxy::new(
60 window,
61 browsing_context_id,
62 webview_id,
63- iframe.as_deref().map(Castable::upcast),
64+ frame_element,
65 parent_browsing_context.as_deref(),
66 opener,
67 creator,