diff --git a/servo/components/script/dom/bindings/codegen/Bindings.conf b/servo/components/script/dom/bindings/codegen/Bindings.conf index 5647679f4465..2f0b8e7b66b1 100644 --- a/servo/components/script/dom/bindings/codegen/Bindings.conf +++ b/servo/components/script/dom/bindings/codegen/Bindings.conf @@ -34,8 +34,7 @@ DOMInterfaces = { }, 'WindowProxy' : { - 'nativeType': 'BrowsingContext', - 'path': 'dom::browsingcontext::BrowsingContext', + 'path': 'dom::windowproxy::WindowProxy', 'register': False, } diff --git a/servo/components/script/dom/bindings/codegen/CodegenRust.py b/servo/components/script/dom/bindings/codegen/CodegenRust.py index e7a0541c4dac..102c1a17d578 100644 --- a/servo/components/script/dom/bindings/codegen/CodegenRust.py +++ b/servo/components/script/dom/bindings/codegen/CodegenRust.py @@ -5638,7 +5638,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries 'dom::bindings::weakref::DOM_WEAK_SLOT', 'dom::bindings::weakref::WeakBox', 'dom::bindings::weakref::WeakReferenceable', - 'dom::browsingcontext::BrowsingContext', + 'dom::windowproxy::WindowProxy', 'dom::globalscope::GlobalScope', 'mem::heap_size_of_raw_self_and_children', 'libc', diff --git a/servo/components/script/dom/bindings/utils.rs b/servo/components/script/dom/bindings/utils.rs index c7039fd168ca..4792b6b76551 100644 --- a/servo/components/script/dom/bindings/utils.rs +++ b/servo/components/script/dom/bindings/utils.rs @@ -12,7 +12,7 @@ use dom::bindings::error::throw_invalid_this; use dom::bindings::inheritance::TopTypeId; use dom::bindings::str::DOMString; use dom::bindings::trace::trace_object; -use dom::browsingcontext; +use dom::windowproxy; use heapsize::HeapSizeOf; use js; use js::JS_CALLEE; @@ -58,7 +58,7 @@ impl GlobalStaticData { /// Creates a new GlobalStaticData. pub fn new() -> GlobalStaticData { GlobalStaticData { - windowproxy_handler: browsingcontext::new_window_proxy_handler(), + windowproxy_handler: windowproxy::new_window_proxy_handler(), } } } diff --git a/servo/components/script/dom/dissimilaroriginwindow.rs b/servo/components/script/dom/dissimilaroriginwindow.rs index 4188f51f0e5f..7d5bef363448 100644 --- a/servo/components/script/dom/dissimilaroriginwindow.rs +++ b/servo/components/script/dom/dissimilaroriginwindow.rs @@ -9,9 +9,9 @@ use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableJS, Root}; use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; -use dom::browsingcontext::BrowsingContext; use dom::dissimilaroriginlocation::DissimilarOriginLocation; use dom::globalscope::GlobalScope; +use dom::windowproxy::WindowProxy; use dom_struct::dom_struct; use ipc_channel::ipc; use js::jsapi::{JSContext, HandleValue}; @@ -28,7 +28,7 @@ use servo_url::ServoUrl; /// directly, but some of its accessors (for example `window.parent`) /// still need to function. /// -/// In `browsingcontext.rs`, we create a custom window proxy for these windows, +/// In `windowproxy.rs`, we create a custom window proxy for these windows, /// that throws security exceptions for most accessors. This is not a replacement /// for XOWs, but provides belt-and-braces security. #[dom_struct] @@ -36,8 +36,8 @@ pub struct DissimilarOriginWindow { /// The global for this window. globalscope: GlobalScope, - /// The browsing context this window is part of. - browsing_context: JS, + /// The window proxy for this window. + window_proxy: JS, /// The location of this window, initialized lazily. location: MutNullableJS, @@ -45,7 +45,7 @@ pub struct DissimilarOriginWindow { impl DissimilarOriginWindow { #[allow(unsafe_code)] - pub fn new(global_to_clone_from: &GlobalScope, browsing_context: &BrowsingContext) -> Root { + pub fn new(global_to_clone_from: &GlobalScope, window_proxy: &WindowProxy) -> Root { let cx = global_to_clone_from.get_cx(); // Any timer events fired on this window are ignored. let (timer_event_chan, _) = ipc::channel().unwrap(); @@ -59,7 +59,7 @@ impl DissimilarOriginWindow { global_to_clone_from.resource_threads().clone(), timer_event_chan, global_to_clone_from.origin().clone()), - browsing_context: JS::from_ref(browsing_context), + window_proxy: JS::from_ref(window_proxy), location: MutNullableJS::new(None), }; unsafe { DissimilarOriginWindowBinding::Wrap(cx, win) } @@ -73,42 +73,42 @@ impl DissimilarOriginWindow { impl DissimilarOriginWindowMethods for DissimilarOriginWindow { // https://html.spec.whatwg.org/multipage/#dom-window - fn Window(&self) -> Root { - Root::from_ref(&*self.browsing_context) + fn Window(&self) -> Root { + Root::from_ref(&*self.window_proxy) } // https://html.spec.whatwg.org/multipage/#dom-self - fn Self_(&self) -> Root { - Root::from_ref(&*self.browsing_context) + fn Self_(&self) -> Root { + Root::from_ref(&*self.window_proxy) } // https://html.spec.whatwg.org/multipage/#dom-frames - fn Frames(&self) -> Root { - Root::from_ref(&*self.browsing_context) + fn Frames(&self) -> Root { + Root::from_ref(&*self.window_proxy) } // https://html.spec.whatwg.org/multipage/#dom-parent - fn GetParent(&self) -> Option> { + fn GetParent(&self) -> Option> { // Steps 1-3. - if self.browsing_context.is_discarded() { + if self.window_proxy.is_browsing_context_discarded() { return None; } // Step 4. - if let Some(parent) = self.browsing_context.parent() { + if let Some(parent) = self.window_proxy.parent() { return Some(Root::from_ref(parent)); } // Step 5. - Some(Root::from_ref(&*self.browsing_context)) + Some(Root::from_ref(&*self.window_proxy)) } // https://html.spec.whatwg.org/multipage/#dom-top - fn GetTop(&self) -> Option> { + fn GetTop(&self) -> Option> { // Steps 1-3. - if self.browsing_context.is_discarded() { + if self.window_proxy.is_browsing_context_discarded() { return None; } // Steps 4-5. - Some(Root::from_ref(self.browsing_context.top())) + Some(Root::from_ref(self.window_proxy.top())) } // https://html.spec.whatwg.org/multipage/#dom-length @@ -184,7 +184,7 @@ impl DissimilarOriginWindowMethods for DissimilarOriginWindow { impl DissimilarOriginWindow { pub fn post_message(&self, origin: Option, data: StructuredCloneData) { - let msg = ConstellationMsg::PostMessage(self.browsing_context.frame_id(), origin, data.move_to_arraybuffer()); + let msg = ConstellationMsg::PostMessage(self.window_proxy.frame_id(), origin, data.move_to_arraybuffer()); let _ = self.upcast::().constellation_chan().send(msg); } } diff --git a/servo/components/script/dom/document.rs b/servo/components/script/dom/document.rs index 2043c4ed4291..2f0d9dcfde37 100644 --- a/servo/components/script/dom/document.rs +++ b/servo/components/script/dom/document.rs @@ -34,7 +34,6 @@ use dom::bindings::reflector::{DomObject, reflect_dom_object}; use dom::bindings::str::{DOMString, USVString}; use dom::bindings::xmlname::{namespace_from_domstring, validate_and_extract, xml_name_type}; use dom::bindings::xmlname::XMLName::InvalidXMLName; -use dom::browsingcontext::BrowsingContext; use dom::closeevent::CloseEvent; use dom::comment::Comment; use dom::customevent::CustomEvent; @@ -89,6 +88,7 @@ use dom::treewalker::TreeWalker; use dom::uievent::UIEvent; use dom::webglcontextevent::WebGLContextEvent; use dom::window::{ReflowReason, Window}; +use dom::windowproxy::WindowProxy; use dom_struct::dom_struct; use encoding::EncodingRef; use encoding::all::UTF_8; @@ -401,9 +401,9 @@ impl Document { /// https://html.spec.whatwg.org/multipage/#concept-document-bc #[inline] - pub fn browsing_context(&self) -> Option> { + pub fn browsing_context(&self) -> Option> { if self.has_browsing_context { - self.window.maybe_browsing_context() + self.window.maybe_window_proxy() } else { None } diff --git a/servo/components/script/dom/htmliframeelement.rs b/servo/components/script/dom/htmliframeelement.rs index 554dc82f7d31..1e6615ce36aa 100644 --- a/servo/components/script/dom/htmliframeelement.rs +++ b/servo/components/script/dom/htmliframeelement.rs @@ -23,7 +23,6 @@ use dom::bindings::js::{LayoutJS, MutNullableJS, Root}; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::DomObject; use dom::bindings::str::DOMString; -use dom::browsingcontext::BrowsingContext; use dom::customevent::CustomEvent; use dom::document::Document; use dom::domtokenlist::DOMTokenList; @@ -35,6 +34,7 @@ use dom::htmlelement::HTMLElement; use dom::node::{Node, NodeDamage, UnbindContext, document_from_node, window_from_node}; use dom::virtualmethods::VirtualMethods; use dom::window::{ReflowReason, Window}; +use dom::windowproxy::WindowProxy; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; @@ -540,8 +540,8 @@ impl HTMLIFrameElementMethods for HTMLIFrameElement { } // https://html.spec.whatwg.org/multipage/#dom-iframe-contentwindow - fn GetContentWindow(&self) -> Option> { - self.pipeline_id.get().and_then(|_| ScriptThread::find_browsing_context(self.frame_id)) + fn GetContentWindow(&self) -> Option> { + self.pipeline_id.get().and_then(|_| ScriptThread::find_window_proxy(self.frame_id)) } // https://html.spec.whatwg.org/multipage/#dom-iframe-contentdocument @@ -769,7 +769,7 @@ impl VirtualMethods for HTMLIFrameElement { // when the `PipelineExit` message arrives. for exited_pipeline_id in exited_pipeline_ids { if let Some(exited_document) = ScriptThread::find_document(exited_pipeline_id) { - exited_document.window().browsing_context().discard(); + exited_document.window().window_proxy().discard_browsing_context(); for exited_iframe in exited_document.iter_iframes() { exited_iframe.pipeline_id.set(None); } diff --git a/servo/components/script/dom/mod.rs b/servo/components/script/dom/mod.rs index 70d1f30bd4ab..d155b8b6a47f 100644 --- a/servo/components/script/dom/mod.rs +++ b/servo/components/script/dom/mod.rs @@ -229,7 +229,6 @@ pub mod bluetoothremotegattdescriptor; pub mod bluetoothremotegattserver; pub mod bluetoothremotegattservice; pub mod bluetoothuuid; -pub mod browsingcontext; pub mod canvasgradient; pub mod canvaspattern; pub mod canvasrenderingcontext2d; @@ -465,6 +464,7 @@ pub mod webgltexture; pub mod webgluniformlocation; pub mod websocket; pub mod window; +pub mod windowproxy; pub mod worker; pub mod workerglobalscope; pub mod workerlocation; diff --git a/servo/components/script/dom/window.rs b/servo/components/script/dom/window.rs index b7f5881df83d..dbcbd0547431 100644 --- a/servo/components/script/dom/window.rs +++ b/servo/components/script/dom/window.rs @@ -30,7 +30,6 @@ use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::RootedTraceableBox; use dom::bindings::utils::{GlobalStaticData, WindowProxyHandler}; use dom::bluetooth::BluetoothExtraPermissionData; -use dom::browsingcontext::BrowsingContext; use dom::crypto::Crypto; use dom::cssstyledeclaration::{CSSModificationAccess, CSSStyleDeclaration, CSSStyleOwner}; use dom::document::{AnimationFrameCallback, Document}; @@ -49,6 +48,7 @@ use dom::promise::Promise; use dom::screen::Screen; use dom::storage::Storage; use dom::testrunner::TestRunner; +use dom::windowproxy::WindowProxy; use dom_struct::dom_struct; use euclid::{Point2D, Rect, Size2D}; use fetch; @@ -175,7 +175,7 @@ pub struct Window { image_cache: Arc, #[ignore_heap_size_of = "channels are hard"] image_cache_chan: Sender, - browsing_context: MutNullableJS, + window_proxy: MutNullableJS, document: MutNullableJS, history: MutNullableJS, performance: MutNullableJS, @@ -280,7 +280,7 @@ impl Window { pub fn clear_js_runtime_for_script_deallocation(&self) { unsafe { *self.js_runtime.borrow_for_script_deallocation() = None; - self.browsing_context.set(None); + self.window_proxy.set(None); self.current_state.set(WindowState::Zombie); self.ignore_further_async_events.borrow().store(true, Ordering::Relaxed); } @@ -332,12 +332,12 @@ impl Window { } /// This can panic if it is called after the browsing context has been discarded - pub fn browsing_context(&self) -> Root { - self.browsing_context.get().unwrap() + pub fn window_proxy(&self) -> Root { + self.window_proxy.get().unwrap() } - pub fn maybe_browsing_context(&self) -> Option> { - self.browsing_context.get() + pub fn maybe_window_proxy(&self) -> Option> { + self.window_proxy.get() } pub fn bluetooth_thread(&self) -> IpcSender { @@ -545,12 +545,12 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#dom-frameelement fn GetFrameElement(&self) -> Option> { // Steps 1-3. - let context = match self.browsing_context.get() { + let window_proxy = match self.window_proxy.get() { None => return None, - Some(context) => context, + Some(window_proxy) => window_proxy, }; // Step 4-5. - let container = match context.frame_element() { + let container = match window_proxy.frame_element() { None => return None, Some(container) => container, }; @@ -624,50 +624,50 @@ impl WindowMethods for Window { } // https://html.spec.whatwg.org/multipage/#dom-window - fn Window(&self) -> Root { - self.browsing_context() + fn Window(&self) -> Root { + self.window_proxy() } // https://html.spec.whatwg.org/multipage/#dom-self - fn Self_(&self) -> Root { - self.browsing_context() + fn Self_(&self) -> Root { + self.window_proxy() } // https://html.spec.whatwg.org/multipage/#dom-frames - fn Frames(&self) -> Root { - self.browsing_context() + fn Frames(&self) -> Root { + self.window_proxy() } // https://html.spec.whatwg.org/multipage/#dom-parent - fn GetParent(&self) -> Option> { + fn GetParent(&self) -> Option> { // Steps 1-3. - let context = match self.maybe_browsing_context() { - Some(context) => context, + let window_proxy = match self.maybe_window_proxy() { + Some(window_proxy) => window_proxy, None => return None, }; - if context.is_discarded() { + if window_proxy.is_browsing_context_discarded() { return None; } // Step 4. - if let Some(parent) = context.parent() { + if let Some(parent) = window_proxy.parent() { return Some(Root::from_ref(parent)); } // Step 5. - Some(context) + Some(window_proxy) } // https://html.spec.whatwg.org/multipage/#dom-top - fn GetTop(&self) -> Option> { + fn GetTop(&self) -> Option> { // Steps 1-3. - let context = match self.maybe_browsing_context() { - Some(context) => context, + let window_proxy = match self.maybe_window_proxy() { + Some(window_proxy) => window_proxy, None => return None, }; - if context.is_discarded() { + if window_proxy.is_browsing_context_discarded() { return None; } // Steps 4-5. - Some(Root::from_ref(context.top())) + Some(Root::from_ref(window_proxy.top())) } // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/ @@ -1036,7 +1036,7 @@ impl Window { self.current_state.set(WindowState::Zombie); *self.js_runtime.borrow_mut() = None; - self.browsing_context.set(None); + self.window_proxy.set(None); self.ignore_further_async_events.borrow().store(true, Ordering::SeqCst); } @@ -1491,9 +1491,9 @@ impl Window { } #[allow(unsafe_code)] - pub fn init_browsing_context(&self, browsing_context: &BrowsingContext) { - assert!(self.browsing_context.get().is_none()); - self.browsing_context.set(Some(&browsing_context)); + pub fn init_window_proxy(&self, window_proxy: &WindowProxy) { + assert!(self.window_proxy.get().is_none()); + self.window_proxy.set(Some(&window_proxy)); } #[allow(unsafe_code)] @@ -1625,8 +1625,8 @@ impl Window { self.upcast::().suspend(); // Set the window proxy to be a cross-origin window. - if self.browsing_context().currently_active() == Some(self.global().pipeline_id()) { - self.browsing_context().unset_currently_active(); + if self.window_proxy().currently_active() == Some(self.global().pipeline_id()) { + self.window_proxy().unset_currently_active(); } // A hint to the JS runtime that now would be a good time to @@ -1641,7 +1641,7 @@ impl Window { self.upcast::().resume(); // Set the window proxy to be this object. - self.browsing_context().set_currently_active(self); + self.window_proxy().set_currently_active(self); // Push the document title to the compositor since we are // activating this document due to a navigation. @@ -1790,7 +1790,7 @@ impl Window { image_cache: image_cache.clone(), navigator: Default::default(), history: Default::default(), - browsing_context: Default::default(), + window_proxy: Default::default(), document: Default::default(), performance: Default::default(), navigation_start: (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64, diff --git a/servo/components/script/dom/browsingcontext.rs b/servo/components/script/dom/windowproxy.rs similarity index 84% rename from servo/components/script/dom/browsingcontext.rs rename to servo/components/script/dom/windowproxy.rs index 5a1a82ff9b08..3290afa1f2cd 100644 --- a/servo/components/script/dom/browsingcontext.rs +++ b/servo/components/script/dom/windowproxy.rs @@ -38,8 +38,8 @@ use std::ptr; // here, in script, but also in the constellation. The constellation // manages the session history, which in script is accessed through // History objects, messaging the constellation. -pub struct BrowsingContext { - /// The WindowProxy object. +pub struct WindowProxy { + /// The JS WindowProxy object. /// Unlike other reflectors, we mutate this field because /// we have to brain-transplant the reflector when the WindowProxy /// changes Window. @@ -57,24 +57,24 @@ pub struct BrowsingContext { /// the change, which could be expensive. currently_active: Cell>, - /// Has this browsing context been discarded? + /// Has the browsing context been discarded? discarded: Cell, /// The containing iframe element, if this is a same-origin iframe frame_element: Option>, - /// The parent browsing context, if this is a nested browsing context - parent: Option>, + /// The parent browsing context's window proxy, if this is a nested browsing context + parent: Option>, } -impl BrowsingContext { +impl WindowProxy { pub fn new_inherited(frame_id: FrameId, currently_active: Option, frame_element: Option<&Element>, - parent: Option<&BrowsingContext>) - -> BrowsingContext + parent: Option<&WindowProxy>) + -> WindowProxy { - BrowsingContext { + WindowProxy { reflector: Reflector::new(), frame_id: frame_id, currently_active: Cell::new(currently_active), @@ -88,8 +88,8 @@ impl BrowsingContext { pub fn new(window: &Window, frame_id: FrameId, frame_element: Option<&Element>, - parent: Option<&BrowsingContext>) - -> Root + parent: Option<&WindowProxy>) + -> Root { unsafe { let WindowProxyHandler(handler) = window.windowproxy_handler(); @@ -102,32 +102,32 @@ impl BrowsingContext { let _ac = JSAutoCompartment::new(cx, window_jsobject.get()); // Create a new window proxy. - rooted!(in(cx) let window_proxy = NewWindowProxy(cx, window_jsobject, handler)); - assert!(!window_proxy.is_null()); + rooted!(in(cx) let js_proxy = NewWindowProxy(cx, window_jsobject, handler)); + assert!(!js_proxy.is_null()); // Create a new browsing context. let current = Some(window.global().pipeline_id()); - let mut browsing_context = box BrowsingContext::new_inherited(frame_id, current, frame_element, parent); + let mut window_proxy = box WindowProxy::new_inherited(frame_id, current, frame_element, parent); // The window proxy owns the browsing context. // When we finalize the window proxy, it drops the browsing context it owns. - SetProxyExtra(window_proxy.get(), 0, &PrivateValue((&*browsing_context).as_void_ptr())); + SetProxyExtra(js_proxy.get(), 0, &PrivateValue((&*window_proxy).as_void_ptr())); // Notify the JS engine about the new window proxy binding. - SetWindowProxy(cx, window_jsobject, window_proxy.handle()); + SetWindowProxy(cx, window_jsobject, js_proxy.handle()); // Set the reflector. - debug!("Initializing reflector of {:p} to {:p}.", browsing_context, window_proxy.get()); - browsing_context.reflector.set_jsobject(window_proxy.get()); - Root::from_ref(&*Box::into_raw(browsing_context)) + debug!("Initializing reflector of {:p} to {:p}.", window_proxy, js_proxy.get()); + window_proxy.reflector.set_jsobject(js_proxy.get()); + Root::from_ref(&*Box::into_raw(window_proxy)) } } #[allow(unsafe_code)] pub fn new_dissimilar_origin(global_to_clone_from: &GlobalScope, frame_id: FrameId, - parent: Option<&BrowsingContext>) - -> Root + parent: Option<&WindowProxy>) + -> Root { unsafe { let handler = CreateWrapperProxyHandler(&XORIGIN_PROXY_HANDLER); @@ -136,38 +136,38 @@ impl BrowsingContext { let cx = global_to_clone_from.get_cx(); // Create a new browsing context. - let mut browsing_context = box BrowsingContext::new_inherited(frame_id, None, None, parent); + let mut window_proxy = box WindowProxy::new_inherited(frame_id, None, None, parent); // Create a new dissimilar-origin window. - let window = DissimilarOriginWindow::new(global_to_clone_from, &*browsing_context); + let window = DissimilarOriginWindow::new(global_to_clone_from, &*window_proxy); let window_jsobject = window.reflector().get_jsobject(); assert!(!window_jsobject.get().is_null()); assert!(((*get_object_class(window_jsobject.get())).flags & JSCLASS_IS_GLOBAL) != 0); let _ac = JSAutoCompartment::new(cx, window_jsobject.get()); // Create a new window proxy. - rooted!(in(cx) let window_proxy = NewWindowProxy(cx, window_jsobject, handler)); - assert!(!window_proxy.is_null()); + rooted!(in(cx) let js_proxy = NewWindowProxy(cx, window_jsobject, handler)); + assert!(!js_proxy.is_null()); // The window proxy owns the browsing context. // When we finalize the window proxy, it drops the browsing context it owns. - SetProxyExtra(window_proxy.get(), 0, &PrivateValue((&*browsing_context).as_void_ptr())); + SetProxyExtra(js_proxy.get(), 0, &PrivateValue((&*window_proxy).as_void_ptr())); // Notify the JS engine about the new window proxy binding. - SetWindowProxy(cx, window_jsobject, window_proxy.handle()); + SetWindowProxy(cx, window_jsobject, js_proxy.handle()); // Set the reflector. - debug!("Initializing reflector of {:p} to {:p}.", browsing_context, window_proxy.get()); - browsing_context.reflector.set_jsobject(window_proxy.get()); - Root::from_ref(&*Box::into_raw(browsing_context)) + debug!("Initializing reflector of {:p} to {:p}.", window_proxy, js_proxy.get()); + window_proxy.reflector.set_jsobject(js_proxy.get()); + Root::from_ref(&*Box::into_raw(window_proxy)) } } - pub fn discard(&self) { + pub fn discard_browsing_context(&self) { self.discarded.set(true); } - pub fn is_discarded(&self) -> bool { + pub fn is_browsing_context_discarded(&self) -> bool { self.discarded.get() } @@ -179,11 +179,11 @@ impl BrowsingContext { self.frame_element.r() } - pub fn parent(&self) -> Option<&BrowsingContext> { + pub fn parent(&self) -> Option<&WindowProxy> { self.parent.r() } - pub fn top(&self) -> &BrowsingContext { + pub fn top(&self) -> &WindowProxy { let mut result = self; while let Some(parent) = result.parent() { result = parent; @@ -192,24 +192,24 @@ impl BrowsingContext { } #[allow(unsafe_code)] - /// Change the Window that this browsing context's WindowProxy resolves to. + /// Change the Window that this WindowProxy resolves to. // TODO: support setting the window proxy to a dummy value, // to handle the case when the active document is in another script thread. - fn set_window_proxy(&self, window: &GlobalScope, traps: &ProxyTraps) { + fn set_window(&self, window: &GlobalScope, traps: &ProxyTraps) { unsafe { - debug!("Setting window proxy of {:p}.", self); + debug!("Setting window of {:p}.", self); let handler = CreateWrapperProxyHandler(traps); assert!(!handler.is_null()); let cx = window.get_cx(); let window_jsobject = window.reflector().get_jsobject(); - let old_window_proxy = self.reflector.get_jsobject(); + let old_js_proxy = self.reflector.get_jsobject(); assert!(!window_jsobject.get().is_null()); assert!(((*get_object_class(window_jsobject.get())).flags & JSCLASS_IS_GLOBAL) != 0); let _ac = JSAutoCompartment::new(cx, window_jsobject.get()); // The old window proxy no longer owns this browsing context. - SetProxyExtra(old_window_proxy.get(), 0, &PrivateValue(ptr::null_mut())); + SetProxyExtra(old_js_proxy.get(), 0, &PrivateValue(ptr::null_mut())); // Brain transpant the window proxy. // We need to do this, because the Window and WindowProxy @@ -218,45 +218,39 @@ impl BrowsingContext { // of the old window proxy to the new window proxy, then // making the old window proxy a cross-compartment wrapper // pointing to the new window proxy. - rooted!(in(cx) let new_window_proxy = NewWindowProxy(cx, window_jsobject, handler)); - debug!("Transplanting window proxy from {:p} to {:p}.", old_window_proxy.get(), new_window_proxy.get()); - rooted!(in(cx) let new_window_proxy = JS_TransplantObject(cx, old_window_proxy, new_window_proxy.handle())); - debug!("Transplanted window proxy is {:p}.", new_window_proxy.get()); + rooted!(in(cx) let new_js_proxy = NewWindowProxy(cx, window_jsobject, handler)); + debug!("Transplanting proxy from {:p} to {:p}.", old_js_proxy.get(), new_js_proxy.get()); + rooted!(in(cx) let new_js_proxy = JS_TransplantObject(cx, old_js_proxy, new_js_proxy.handle())); + debug!("Transplanted proxy is {:p}.", new_js_proxy.get()); // Transfer ownership of this browsing context from the old window proxy to the new one. - SetProxyExtra(new_window_proxy.get(), 0, &PrivateValue(self.as_void_ptr())); + SetProxyExtra(new_js_proxy.get(), 0, &PrivateValue(self.as_void_ptr())); // Notify the JS engine about the new window proxy binding. - SetWindowProxy(cx, window_jsobject, new_window_proxy.handle()); + SetWindowProxy(cx, window_jsobject, new_js_proxy.handle()); // Update the reflector. - debug!("Setting reflector of {:p} to {:p}.", self, new_window_proxy.get()); - self.reflector.rootable().set(new_window_proxy.get()); + debug!("Setting reflector of {:p} to {:p}.", self, new_js_proxy.get()); + self.reflector.rootable().set(new_js_proxy.get()); } } pub fn set_currently_active(&self, window: &Window) { let globalscope = window.upcast(); - self.set_window_proxy(&*globalscope, &PROXY_HANDLER); + self.set_window(&*globalscope, &PROXY_HANDLER); self.currently_active.set(Some(globalscope.pipeline_id())); } pub fn unset_currently_active(&self) { let globalscope = self.global(); let window = DissimilarOriginWindow::new(&*globalscope, self); - self.set_window_proxy(&*window.upcast(), &XORIGIN_PROXY_HANDLER); + self.set_window(&*window.upcast(), &XORIGIN_PROXY_HANDLER); self.currently_active.set(None); } pub fn currently_active(&self) -> Option { self.currently_active.get() } - - pub fn window_proxy(&self) -> *mut JSObject { - let window_proxy = self.reflector.get_jsobject(); - assert!(!window_proxy.get().is_null()); - window_proxy.get() - } } #[allow(unsafe_code)] @@ -581,19 +575,19 @@ static XORIGIN_PROXY_HANDLER: ProxyTraps = ProxyTraps { #[allow(unsafe_code)] unsafe extern fn finalize(_fop: *mut JSFreeOp, obj: *mut JSObject) { - let this = GetProxyExtra(obj, 0).to_private() as *mut BrowsingContext; + let this = GetProxyExtra(obj, 0).to_private() as *mut WindowProxy; if this.is_null() { // GC during obj creation or after transplanting. return; } let jsobject = (*this).reflector.get_jsobject().get(); - debug!("BrowsingContext finalize: {:p}, with reflector {:p} from {:p}.", this, jsobject, obj); + debug!("WindowProxy finalize: {:p}, with reflector {:p} from {:p}.", this, jsobject, obj); let _ = Box::from_raw(this); } #[allow(unsafe_code)] unsafe extern fn trace(trc: *mut JSTracer, obj: *mut JSObject) { - let this = GetProxyExtra(obj, 0).to_private() as *const BrowsingContext; + let this = GetProxyExtra(obj, 0).to_private() as *const WindowProxy; if this.is_null() { // GC during obj creation or after transplanting. return; diff --git a/servo/components/script/script_thread.rs b/servo/components/script/script_thread.rs index 2f065a90d91a..8a861e925703 100644 --- a/servo/components/script/script_thread.rs +++ b/servo/components/script/script_thread.rs @@ -40,7 +40,6 @@ use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::JSTraceable; use dom::bindings::utils::WRAP_CALLBACKS; -use dom::browsingcontext::BrowsingContext; use dom::document::{Document, DocumentSource, FocusType, HasBrowsingContext, IsHTMLDocument, TouchEventResult}; use dom::element::Element; use dom::event::{Event, EventBubbles, EventCancelable}; @@ -55,6 +54,7 @@ use dom::servoparser::{ParserContext, ServoParser}; use dom::transitionevent::TransitionEvent; use dom::uievent::UIEvent; use dom::window::{ReflowReason, Window}; +use dom::windowproxy::WindowProxy; use dom::worker::TrustedWorkerAddress; use euclid::Rect; use euclid::point::Point2D; @@ -400,9 +400,9 @@ impl<'a> Iterator for DocumentsIter<'a> { pub struct ScriptThread { /// The documents for pipelines managed by this thread documents: DOMRefCell, - /// The browsing contexts known by this thread + /// The window proxies known by this thread /// TODO: this map grows, but never shrinks. Issue #15258. - browsing_contexts: DOMRefCell>>, + window_proxies: DOMRefCell>>, /// A list of data pertaining to loads that have not yet received a network response incomplete_loads: DOMRefCell>, /// A map to store service worker registrations for a given origin @@ -656,10 +656,10 @@ impl ScriptThread { })) } - pub fn find_browsing_context(id: FrameId) -> Option> { + pub fn find_window_proxy(id: FrameId) -> Option> { SCRIPT_THREAD_ROOT.with(|root| root.get().and_then(|script_thread| { let script_thread = unsafe { &*script_thread }; - script_thread.browsing_contexts.borrow().get(&id) + script_thread.window_proxies.borrow().get(&id) .map(|context| Root::from_ref(&**context)) })) } @@ -692,7 +692,7 @@ impl ScriptThread { ScriptThread { documents: DOMRefCell::new(Documents::new()), - browsing_contexts: DOMRefCell::new(HashMap::new()), + window_proxies: DOMRefCell::new(HashMap::new()), incomplete_loads: DOMRefCell::new(vec!()), registration_map: DOMRefCell::new(HashMap::new()), job_queue_map: Rc::new(JobQueue::new()), @@ -1559,7 +1559,7 @@ impl ScriptThread { } else if let Some(document) = self.documents.borrow_mut().remove(id) { let window = document.window(); if discard_bc == DiscardBrowsingContext::Yes { - window.browsing_context().discard(); + window.window_proxy().discard_browsing_context(); } window.clear_js_runtime(); window.layout_chan().clone() @@ -1682,59 +1682,59 @@ impl ScriptThread { // Get the browsing context for a pipeline that may exist in another // script thread. If the browsing context already exists in the - // `browsing_contexts` map, we return it, otherwise we recursively + // `window_proxies` map, we return it, otherwise we recursively // get the browsing context for the parent if there is one, // construct a new dissimilar-origin browsing context, add it - // to the `browsing_contexts` map, and return it. - fn remote_browsing_context(&self, + // to the `window_proxies` map, and return it. + fn remote_window_proxy(&self, global_to_clone: &GlobalScope, pipeline_id: PipelineId) - -> Option> + -> Option> { let frame_id = match self.ask_constellation_for_frame_id(pipeline_id) { Some(frame_id) => frame_id, None => return None, }; - if let Some(browsing_context) = self.browsing_contexts.borrow().get(&frame_id) { - return Some(Root::from_ref(browsing_context)); + if let Some(window_proxy) = self.window_proxies.borrow().get(&frame_id) { + return Some(Root::from_ref(window_proxy)); } let parent = match self.ask_constellation_for_parent_info(pipeline_id) { - Some((parent_id, FrameType::IFrame)) => self.remote_browsing_context(global_to_clone, parent_id), + Some((parent_id, FrameType::IFrame)) => self.remote_window_proxy(global_to_clone, parent_id), _ => None, }; - let browsing_context = BrowsingContext::new_dissimilar_origin(global_to_clone, frame_id, parent.r()); - self.browsing_contexts.borrow_mut().insert(frame_id, JS::from_ref(&*browsing_context)); - Some(browsing_context) + let window_proxy = WindowProxy::new_dissimilar_origin(global_to_clone, frame_id, parent.r()); + self.window_proxies.borrow_mut().insert(frame_id, JS::from_ref(&*window_proxy)); + Some(window_proxy) } // Get the browsing context for a pipeline that exists in this // script thread. If the browsing context already exists in the - // `browsing_contexts` map, we return it, otherwise we recursively + // `window_proxies` map, we return it, otherwise we recursively // get the browsing context for the parent if there is one, // construct a new similar-origin browsing context, add it - // to the `browsing_contexts` map, and return it. - fn local_browsing_context(&self, + // to the `window_proxies` map, and return it. + fn local_window_proxy(&self, window: &Window, frame_id: FrameId, parent_info: Option<(PipelineId, FrameType)>) - -> Root + -> Root { - if let Some(browsing_context) = self.browsing_contexts.borrow().get(&frame_id) { - browsing_context.set_currently_active(&*window); - return Root::from_ref(browsing_context); + if let Some(window_proxy) = self.window_proxies.borrow().get(&frame_id) { + window_proxy.set_currently_active(&*window); + return Root::from_ref(window_proxy); } let iframe = match parent_info { Some((parent_id, FrameType::IFrame)) => self.documents.borrow().find_iframe(parent_id, frame_id), _ => None, }; let parent = match (parent_info, iframe.as_ref()) { - (_, Some(iframe)) => Some(window_from_node(&**iframe).browsing_context()), - (Some((parent_id, FrameType::IFrame)), _) => self.remote_browsing_context(window.upcast(), parent_id), + (_, Some(iframe)) => Some(window_from_node(&**iframe).window_proxy()), + (Some((parent_id, FrameType::IFrame)), _) => self.remote_window_proxy(window.upcast(), parent_id), _ => None, }; - let browsing_context = BrowsingContext::new(&window, frame_id, iframe.r().map(Castable::upcast), parent.r()); - self.browsing_contexts.borrow_mut().insert(frame_id, JS::from_ref(&*browsing_context)); - browsing_context + let window_proxy = WindowProxy::new(&window, frame_id, iframe.r().map(Castable::upcast), parent.r()); + self.window_proxies.borrow_mut().insert(frame_id, JS::from_ref(&*window_proxy)); + window_proxy } /// The entry point to document loading. Defines bindings, sets up the window and document @@ -1790,8 +1790,8 @@ impl ScriptThread { self.webvr_thread.clone()); // Initialize the browsing context for the window. - let browsing_context = self.local_browsing_context(&window, incomplete.frame_id, incomplete.parent_info); - window.init_browsing_context(&browsing_context); + let window_proxy = self.local_window_proxy(&window, incomplete.frame_id, incomplete.parent_info); + window.init_window_proxy(&window_proxy); let last_modified = metadata.headers.as_ref().and_then(|headers| { headers.get().map(|&LastModified(HttpDate(ref tm))| dom_last_modified(tm))