Rewild Your Web
web browser dweb
at main 67 lines 2.5 kB view raw
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,