diff options
author | Ms2ger <ms2ger@gmail.com> | 2015-07-20 17:16:46 +0200 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2015-11-04 12:30:13 +0100 |
commit | f86502f80c3b6a89b1fc880dd51e8da6531d5865 (patch) | |
tree | 77971a51f958af33d76509c7110a48bae4c5c756 /components/script/dom/browsercontext.rs | |
parent | b6850853da5fc677ecfa15d273159371a909ac6c (diff) | |
download | servo-f86502f80c3b6a89b1fc880dd51e8da6531d5865.tar.gz servo-f86502f80c3b6a89b1fc880dd51e8da6531d5865.zip |
Make BrowsingContext JS-managed.
Diffstat (limited to 'components/script/dom/browsercontext.rs')
-rw-r--r-- | components/script/dom/browsercontext.rs | 75 |
1 files changed, 42 insertions, 33 deletions
diff --git a/components/script/dom/browsercontext.rs b/components/script/dom/browsercontext.rs index 049ff432538..72d48d51d45 100644 --- a/components/script/dom/browsercontext.rs +++ b/components/script/dom/browsercontext.rs @@ -6,45 +6,70 @@ use dom::bindings::conversions::native_from_handleobject; use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::js::{JS, Root}; use dom::bindings::proxyhandler::{fill_property_descriptor, get_property_descriptor}; -use dom::bindings::reflector::Reflectable; +use dom::bindings::reflector::{Reflectable, Reflector}; use dom::bindings::utils::WindowProxyHandler; use dom::bindings::utils::get_array_index_from_id; use dom::document::Document; use dom::element::Element; use dom::window::Window; +use js::JSCLASS_IS_GLOBAL; use js::glue::{CreateWrapperProxyHandler, ProxyTraps, WrapperNew}; -use js::glue::{GetProxyPrivate}; -use js::jsapi::{Handle, Heap, JS_ForwardSetPropertyTo, ObjectOpResult, RootedObject, RootedValue}; +use js::glue::{GetProxyPrivate, SetProxyExtra}; +use js::jsapi::{Handle, JS_ForwardSetPropertyTo, ObjectOpResult, RootedObject, RootedValue}; use js::jsapi::{HandleId, HandleObject, MutableHandle, MutableHandleValue}; -use js::jsapi::{JSAutoCompartment, JSAutoRequest}; +use js::jsapi::{JSAutoCompartment, JSAutoRequest, JS_GetClass}; use js::jsapi::{JSContext, JSErrNum, JSObject, JSPropertyDescriptor}; use js::jsapi::{JS_AlreadyHasOwnPropertyById, JS_ForwardGetPropertyTo}; use js::jsapi::{JS_DefinePropertyById6, JS_GetPropertyDescriptorById}; -use js::jsval::{ObjectValue, UndefinedValue}; -use std::default::Default; +use js::jsval::{ObjectValue, UndefinedValue, PrivateValue}; use std::ptr; -#[derive(JSTraceable, HeapSizeOf)] -#[privatize] -#[allow(raw_pointer_derive)] -#[must_root] +#[dom_struct] pub struct BrowsingContext { + reflector: Reflector, history: Vec<SessionHistoryEntry>, active_index: usize, - window_proxy: Heap<*mut JSObject>, frame_element: Option<JS<Element>>, } impl BrowsingContext { - pub fn new(document: &Document, frame_element: Option<&Element>) -> BrowsingContext { + pub fn new_inherited(document: &Document, frame_element: Option<&Element>) -> BrowsingContext { BrowsingContext { + reflector: Reflector::new(), history: vec!(SessionHistoryEntry::new(document)), active_index: 0, - window_proxy: Heap::default(), frame_element: frame_element.map(JS::from_ref), } } + #[allow(unsafe_code)] + pub fn new(document: &Document, frame_element: Option<&Element>) -> Root<BrowsingContext> { + unsafe { + let window = document.window(); + + let WindowProxyHandler(handler) = window.windowproxy_handler(); + assert!(!handler.is_null()); + + let cx = window.get_cx(); + let _ar = JSAutoRequest::new(cx); + let parent = window.reflector().get_jsobject(); + assert!(!parent.get().is_null()); + assert!(((*JS_GetClass(parent.get())).flags & JSCLASS_IS_GLOBAL) != 0); + let _ac = JSAutoCompartment::new(cx, parent.get()); + let window_proxy = RootedObject::new(cx, WrapperNew(cx, parent, handler, ptr::null(), true)); + assert!(!window_proxy.ptr.is_null()); + + let object = box BrowsingContext::new_inherited(document, frame_element); + + let raw = Box::into_raw(object); + SetProxyExtra(window_proxy.ptr, 0, PrivateValue(raw as *const _)); + + (*raw).init_reflector(window_proxy.ptr); + + Root::from_ref(&*raw) + } + } + pub fn active_document(&self) -> &Document { &*self.history[self.active_index].document } @@ -58,25 +83,9 @@ impl BrowsingContext { } pub fn window_proxy(&self) -> *mut JSObject { - assert!(!self.window_proxy.get().is_null()); - self.window_proxy.get() - } - - #[allow(unsafe_code)] - pub fn create_window_proxy(&mut self) { - // We inline self.active_window() because we can't borrow *self here. - let win = self.history[self.active_index].document.window(); - - let WindowProxyHandler(handler) = win.windowproxy_handler(); - assert!(!handler.is_null()); - - let cx = win.get_cx(); - let _ar = JSAutoRequest::new(cx); - let parent = win.reflector().get_jsobject(); - let _ac = JSAutoCompartment::new(cx, parent.get()); - let wrapper = unsafe { WrapperNew(cx, parent, handler, ptr::null(), false) }; - assert!(!wrapper.is_null()); - self.window_proxy.set(wrapper); + let window_proxy = self.reflector.get_jsobject(); + assert!(!window_proxy.get().is_null()); + window_proxy.get() } } @@ -87,7 +96,7 @@ impl BrowsingContext { #[derive(JSTraceable, HeapSizeOf)] pub struct SessionHistoryEntry { document: JS<Document>, - children: Vec<BrowsingContext> + children: Vec<JS<BrowsingContext>> } impl SessionHistoryEntry { |