diff options
author | Glenn Watson <gw@intuitionlibrary.com> | 2015-02-03 12:52:18 +1000 |
---|---|---|
committer | Glenn Watson <gw@intuitionlibrary.com> | 2015-02-05 07:04:04 +1000 |
commit | 0873e5c8ca60d977d164ce5f5b85ca70dd76e5d9 (patch) | |
tree | a88e73d5e9f98a2338f2de877ec7058aab8a7ba4 /components/script/dom | |
parent | 7e3f504d94ffb77ec6148166d2ab73978e1c71c8 (diff) | |
download | servo-0873e5c8ca60d977d164ce5f5b85ca70dd76e5d9.tar.gz servo-0873e5c8ca60d977d164ce5f5b85ca70dd76e5d9.zip |
Implement window.parent for iframes.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/browsercontext.rs | 10 | ||||
-rw-r--r-- | components/script/dom/window.rs | 10 |
2 files changed, 14 insertions, 6 deletions
diff --git a/components/script/dom/browsercontext.rs b/components/script/dom/browsercontext.rs index 3d486a3fe11..f7572d6d6a7 100644 --- a/components/script/dom/browsercontext.rs +++ b/components/script/dom/browsercontext.rs @@ -33,14 +33,16 @@ pub struct BrowserContext { history: Vec<SessionHistoryEntry>, active_index: uint, window_proxy: *mut JSObject, + parent: Option<JS<Window>>, } impl BrowserContext { - pub fn new(document: JSRef<Document>) -> BrowserContext { + pub fn new(document: JSRef<Document>, parent: Option<JSRef<Window>>) -> BrowserContext { let mut context = BrowserContext { history: vec!(SessionHistoryEntry::new(document)), active_index: 0, window_proxy: ptr::null_mut(), + parent: parent.map(|p| JS::from_rooted(p)), }; context.create_window_proxy(); context @@ -60,6 +62,12 @@ impl BrowserContext { self.window_proxy } + pub fn parent(&self) -> Option<Temporary<Window>> { + self.parent.map(|p| { + p.root().browser_context().as_ref().unwrap().active_window() + }) + } + #[allow(unsafe_blocks)] fn create_window_proxy(&mut self) { let win = self.active_window().root(); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 5477f7a3d65..d1d76cfaa4e 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -272,9 +272,9 @@ impl<'a> WindowMethods for JSRef<'a, Window> { self.Window() } + // https://html.spec.whatwg.org/multipage/browsers.html#dom-parent fn Parent(self) -> Temporary<Window> { - //TODO - Once we support iframes correctly this needs to return the parent frame - self.Window() + self.browser_context().as_ref().unwrap().parent().unwrap_or(self.Window()) } fn Performance(self) -> Temporary<Performance> { @@ -314,7 +314,7 @@ impl<'a> WindowMethods for JSRef<'a, Window> { pub trait WindowHelpers { fn flush_layout(self, goal: ReflowGoal, query: ReflowQueryType); - fn init_browser_context(self, doc: JSRef<Document>); + fn init_browser_context(self, doc: JSRef<Document>, parent: Option<JSRef<Window>>); fn load_url(self, href: DOMString); fn handle_fire_timer(self, timer_id: TimerId); fn IndexedGetter(self, _index: u32, _found: &mut bool) -> Option<Temporary<Window>>; @@ -357,8 +357,8 @@ impl<'a> WindowHelpers for JSRef<'a, Window> { self.page().flush_layout(goal, query); } - fn init_browser_context(self, doc: JSRef<Document>) { - *self.browser_context.borrow_mut() = Some(BrowserContext::new(doc)); + fn init_browser_context(self, doc: JSRef<Document>, parent: Option<JSRef<Window>>) { + *self.browser_context.borrow_mut() = Some(BrowserContext::new(doc, parent)); } /// Commence a new URL load which will either replace this window or scroll to a fragment. |