diff options
author | Josh Matthews <josh@joshmatthews.net> | 2013-10-21 08:11:18 +0100 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2014-04-22 10:57:25 -0400 |
commit | 94dffca1e165eb5504feda42e89015648b484b78 (patch) | |
tree | 333bc6894ead07d5b7d6c222ae4d050e174f4c7a /src/components/script/dom/browsercontext.rs | |
parent | c760577aee3ca31e58b4dd2b7f919d14fcaa2d2f (diff) | |
download | servo-94dffca1e165eb5504feda42e89015648b484b78.tar.gz servo-94dffca1e165eb5504feda42e89015648b484b78.zip |
Remove all traces of WindowProxy. Implement basic browser context concept and outerizing of inner windows.
Diffstat (limited to 'src/components/script/dom/browsercontext.rs')
-rw-r--r-- | src/components/script/dom/browsercontext.rs | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/components/script/dom/browsercontext.rs b/src/components/script/dom/browsercontext.rs new file mode 100644 index 00000000000..907a26f99e3 --- /dev/null +++ b/src/components/script/dom/browsercontext.rs @@ -0,0 +1,118 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::js::JS; +use dom::bindings::trace::Traceable; +use dom::bindings::utils::Reflectable; +use dom::document::Document; +use dom::window::Window; + +use js::jsapi::JSObject; +use js::glue::{WrapperNew, CreateWrapperProxyHandler, ProxyTraps}; + +use std::libc::c_void; +use std::ptr; + +#[deriving(Encodable)] +pub struct BrowserContext { + priv history: Vec<SessionHistoryEntry>, + priv active_index: uint, + priv window_proxy: Traceable<*JSObject>, +} + +impl BrowserContext { + pub fn new(document: &JS<Document>) -> BrowserContext { + let mut context = BrowserContext { + history: vec!(SessionHistoryEntry::new(document)), + active_index: 0, + window_proxy: Traceable::new(ptr::null()), + }; + context.window_proxy = Traceable::new(context.create_window_proxy()); + context + } + + pub fn active_document(&self) -> JS<Document> { + self.history.get(self.active_index).document.clone() + } + + pub fn active_window(&self) -> JS<Window> { + let doc = self.active_document(); + doc.get().window.clone() + } + + pub fn window_proxy(&self) -> *JSObject { + assert!(self.window_proxy.deref().is_not_null()); + *self.window_proxy + } + + pub fn create_window_proxy(&self) -> *JSObject { + let win = self.active_window(); + let page = win.get().page(); + let js_info = page.js_info(); + + let handler = js_info.get_ref().dom_static.windowproxy_handler; + assert!(handler.deref().is_not_null()); + + let parent = win.get().reflector().get_jsobject(); + let cx = js_info.get_ref().js_context.deref().deref().ptr; + let wrapper = unsafe { + WrapperNew(cx, parent, *handler.deref()) + }; + assert!(wrapper.is_not_null()); + wrapper + } +} + +#[deriving(Encodable)] +pub struct SessionHistoryEntry { + priv document: JS<Document>, + priv children: Vec<BrowserContext> +} + +impl SessionHistoryEntry { + fn new(document: &JS<Document>) -> SessionHistoryEntry { + SessionHistoryEntry { + document: document.clone(), + children: vec!() + } + } +} + +static proxy_handler: ProxyTraps = ProxyTraps { + getPropertyDescriptor: None, + getOwnPropertyDescriptor: None, + defineProperty: None, + getOwnPropertyNames: 0 as *u8, + delete_: None, + enumerate: 0 as *u8, + + has: None, + hasOwn: None, + get: None, + set: None, + keys: 0 as *u8, + iterate: None, + + call: None, + construct: None, + nativeCall: 0 as *u8, + hasInstance: None, + typeOf: None, + objectClassIs: None, + obj_toString: None, + fun_toString: None, + //regexp_toShared: 0 as *u8, + defaultValue: None, + iteratorNext: None, + finalize: None, + getElementIfPresent: None, + getPrototypeOf: None, + trace: None +}; + +pub fn new_window_proxy_handler() -> *c_void { + unsafe { + CreateWrapperProxyHandler(&proxy_handler) + } +} |