Don't return window proxy if it has been discarded

This commit is contained in:
Connor Brewster 2017-06-26 22:27:02 -07:00
parent 3f2d747689
commit 79f3237692
3 changed files with 11 additions and 16 deletions

View file

@ -406,7 +406,7 @@ impl Document {
#[inline] #[inline]
pub fn browsing_context(&self) -> Option<Root<WindowProxy>> { pub fn browsing_context(&self) -> Option<Root<WindowProxy>> {
if self.has_browsing_context { if self.has_browsing_context {
self.window.maybe_window_proxy() self.window.undiscarded_window_proxy()
} else { } else {
None None
} }

View file

@ -345,8 +345,15 @@ impl Window {
self.window_proxy.get().unwrap() self.window_proxy.get().unwrap()
} }
pub fn maybe_window_proxy(&self) -> Option<Root<WindowProxy>> { /// Returns the window proxy if it has not been discarded.
/// https://html.spec.whatwg.org/multipage/#a-browsing-context-is-discarded
pub fn undiscarded_window_proxy(&self) -> Option<Root<WindowProxy>> {
self.window_proxy.get() self.window_proxy.get()
.and_then(|window_proxy| if window_proxy.is_browsing_context_discarded() {
None
} else {
Some(window_proxy)
})
} }
pub fn bluetooth_thread(&self) -> IpcSender<BluetoothRequest> { pub fn bluetooth_thread(&self) -> IpcSender<BluetoothRequest> {
@ -670,13 +677,10 @@ impl WindowMethods for Window {
// https://html.spec.whatwg.org/multipage/#dom-parent // https://html.spec.whatwg.org/multipage/#dom-parent
fn GetParent(&self) -> Option<Root<WindowProxy>> { fn GetParent(&self) -> Option<Root<WindowProxy>> {
// Steps 1-3. // Steps 1-3.
let window_proxy = match self.maybe_window_proxy() { let window_proxy = match self.undiscarded_window_proxy() {
Some(window_proxy) => window_proxy, Some(window_proxy) => window_proxy,
None => return None, None => return None,
}; };
if window_proxy.is_browsing_context_discarded() {
return None;
}
// Step 4. // Step 4.
if let Some(parent) = window_proxy.parent() { if let Some(parent) = window_proxy.parent() {
return Some(Root::from_ref(parent)); return Some(Root::from_ref(parent));
@ -688,13 +692,10 @@ impl WindowMethods for Window {
// https://html.spec.whatwg.org/multipage/#dom-top // https://html.spec.whatwg.org/multipage/#dom-top
fn GetTop(&self) -> Option<Root<WindowProxy>> { fn GetTop(&self) -> Option<Root<WindowProxy>> {
// Steps 1-3. // Steps 1-3.
let window_proxy = match self.maybe_window_proxy() { let window_proxy = match self.undiscarded_window_proxy() {
Some(window_proxy) => window_proxy, Some(window_proxy) => window_proxy,
None => return None, None => return None,
}; };
if window_proxy.is_browsing_context_discarded() {
return None;
}
// Steps 4-5. // Steps 4-5.
Some(Root::from_ref(window_proxy.top())) Some(Root::from_ref(window_proxy.top()))
} }

View file

@ -1,6 +0,0 @@
[iframe-append-to-child-document.html]
type: testharness
[Append iframe element to its own child document]
bug: https://github.com/servo/servo/issues/17479
expected: FAIL