aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorGlenn Watson <gw@intuitionlibrary.com>2015-02-03 12:52:18 +1000
committerGlenn Watson <gw@intuitionlibrary.com>2015-02-05 07:04:04 +1000
commit0873e5c8ca60d977d164ce5f5b85ca70dd76e5d9 (patch)
treea88e73d5e9f98a2338f2de877ec7058aab8a7ba4 /components/script/dom
parent7e3f504d94ffb77ec6148166d2ab73978e1c71c8 (diff)
downloadservo-0873e5c8ca60d977d164ce5f5b85ca70dd76e5d9.tar.gz
servo-0873e5c8ca60d977d164ce5f5b85ca70dd76e5d9.zip
Implement window.parent for iframes.
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/browsercontext.rs10
-rw-r--r--components/script/dom/window.rs10
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.