Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Return window proxy properly for indexed window getter
  • Loading branch information
KiChjang committed Apr 30, 2018
1 parent 4383b30 commit 0806000
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 18 deletions.
10 changes: 7 additions & 3 deletions components/script/dom/dissimilaroriginwindow.rs
Expand Up @@ -77,22 +77,26 @@ impl DissimilarOriginWindow {
pub fn origin(&self) -> &MutableOrigin {
self.upcast::<GlobalScope>().origin()
}

pub fn window_proxy(&self) -> DomRoot<WindowProxy> {
DomRoot::from_ref(&*self.window_proxy)
}
}

impl DissimilarOriginWindowMethods for DissimilarOriginWindow {
// https://html.spec.whatwg.org/multipage/#dom-window
fn Window(&self) -> DomRoot<WindowProxy> {
DomRoot::from_ref(&*self.window_proxy)
self.window_proxy()
}

// https://html.spec.whatwg.org/multipage/#dom-self
fn Self_(&self) -> DomRoot<WindowProxy> {
DomRoot::from_ref(&*self.window_proxy)
self.window_proxy()
}

// https://html.spec.whatwg.org/multipage/#dom-frames
fn Frames(&self) -> DomRoot<WindowProxy> {
DomRoot::from_ref(&*self.window_proxy)
self.window_proxy()
}

// https://html.spec.whatwg.org/multipage/#dom-parent
Expand Down
5 changes: 0 additions & 5 deletions components/script/dom/window.rs
Expand Up @@ -1634,11 +1634,6 @@ impl Window {
had_clip_rect
}

// https://html.spec.whatwg.org/multipage/#accessing-other-browsing-contexts
pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> Option<DomRoot<Window>> {
None
}

pub fn suspend(&self) {
// Suspend timer events.
self.upcast::<GlobalScope>().suspend();
Expand Down
49 changes: 39 additions & 10 deletions components/script/dom/windowproxy.rs
Expand Up @@ -17,6 +17,7 @@ use dom::element::Element;
use dom::globalscope::GlobalScope;
use dom::window::Window;
use dom_struct::dom_struct;
use ipc_channel::ipc;
use js::JSCLASS_IS_GLOBAL;
use js::glue::{CreateWrapperProxyHandler, ProxyTraps};
use js::glue::{GetProxyPrivate, SetProxyExtra, GetProxyExtra};
Expand All @@ -40,6 +41,8 @@ use js::rust::wrappers::{NewWindowProxy, SetWindowProxy, JS_TransplantObject};
use msg::constellation_msg::BrowsingContextId;
use msg::constellation_msg::PipelineId;
use msg::constellation_msg::TopLevelBrowsingContextId;
use script_thread::ScriptThread;
use script_traits::ScriptMsg;
use std::cell::Cell;
use std::ptr;

Expand Down Expand Up @@ -301,17 +304,43 @@ impl WindowProxy {

// This is only called from extern functions,
// there's no use using the lifetimed handles here.
// https://html.spec.whatwg.org/multipage/#accessing-other-browsing-contexts
#[allow(unsafe_code)]
unsafe fn GetSubframeWindow(cx: *mut JSContext,
proxy: RawHandleObject,
id: RawHandleId)
-> Option<DomRoot<Window>> {
unsafe fn GetSubframeWindowProxy(
cx: *mut JSContext,
proxy: RawHandleObject,
id: RawHandleId
) -> Option<DomRoot<WindowProxy>> {
let index = get_array_index_from_id(cx, Handle::from_raw(id));
if let Some(index) = index {
rooted!(in(cx) let target = GetProxyPrivate(*proxy).to_object());
let win = root_from_handleobject::<Window>(target.handle()).unwrap();
let mut found = false;
return win.IndexedGetter(index, &mut found);
if let Ok(win) = root_from_handleobject::<Window>(target.handle()) {
let browsing_context_id = win.window_proxy().browsing_context_id();
let (result_sender, result_receiver) = ipc::channel().unwrap();

let _ = win.upcast::<GlobalScope>().script_to_constellation_chan().send(
ScriptMsg::GetChildBrowsingContextId(
browsing_context_id,
index as usize,
result_sender
)
);
return result_receiver.recv().ok()
.and_then(|maybe_bcid| maybe_bcid)
.and_then(ScriptThread::find_window_proxy);
} else if let Ok(win) = root_from_handleobject::<DissimilarOriginWindow>(target.handle()) {
let browsing_context_id = win.window_proxy().browsing_context_id();
let (result_sender, result_receiver) = ipc::channel().unwrap();

let _ = win.global().script_to_constellation_chan().send(ScriptMsg::GetChildBrowsingContextId(
browsing_context_id,
index as usize,
result_sender
));
return result_receiver.recv().ok()
.and_then(|maybe_bcid| maybe_bcid)
.and_then(ScriptThread::find_window_proxy);
}
}

None
Expand All @@ -323,7 +352,7 @@ unsafe extern "C" fn getOwnPropertyDescriptor(cx: *mut JSContext,
id: RawHandleId,
mut desc: RawMutableHandle<PropertyDescriptor>)
-> bool {
let window = GetSubframeWindow(cx, proxy, id);
let window = GetSubframeWindowProxy(cx, proxy, id);
if let Some(window) = window {
rooted!(in(cx) let mut val = UndefinedValue());
window.to_jsval(cx, val.handle_mut());
Expand Down Expand Up @@ -372,7 +401,7 @@ unsafe extern "C" fn has(cx: *mut JSContext,
id: RawHandleId,
bp: *mut bool)
-> bool {
let window = GetSubframeWindow(cx, proxy, id);
let window = GetSubframeWindowProxy(cx, proxy, id);
if window.is_some() {
*bp = true;
return true;
Expand All @@ -395,7 +424,7 @@ unsafe extern "C" fn get(cx: *mut JSContext,
id: RawHandleId,
vp: RawMutableHandleValue)
-> bool {
let window = GetSubframeWindow(cx, proxy, id);
let window = GetSubframeWindowProxy(cx, proxy, id);
if let Some(window) = window {
window.to_jsval(cx, MutableHandle::from_raw(vp));
return true;
Expand Down

0 comments on commit 0806000

Please sign in to comment.