diff options
Diffstat (limited to 'components/script/dom/htmliframeelement.rs')
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 4cf2c3f467e..4e7e6108785 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -6,6 +6,7 @@ use document_loader::{LoadType, LoadBlocker}; use dom::attr::{Attr, AttrValue}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::BrowserElementBinding::BrowserElementIconChangeEventDetail; +use dom::bindings::codegen::Bindings::BrowserElementBinding::BrowserElementLocationChangeEventDetail; use dom::bindings::codegen::Bindings::BrowserElementBinding::BrowserElementSecurityChangeDetail; use dom::bindings::codegen::Bindings::BrowserElementBinding::BrowserShowModalPromptEventDetail; use dom::bindings::codegen::Bindings::HTMLIFrameElementBinding; @@ -27,6 +28,7 @@ use dom::node::{Node, UnbindContext, window_from_node, document_from_node}; use dom::urlhelper::UrlHelper; use dom::virtualmethods::VirtualMethods; use dom::window::{ReflowReason, Window}; +use ipc_channel::ipc; use js::jsapi::{JSAutoCompartment, JSAutoRequest, RootedValue, JSContext, MutableHandleValue}; use js::jsval::{UndefinedValue, NullValue}; use layout_interface::ReflowQueryType; @@ -323,9 +325,16 @@ impl MozBrowserEventDetailBuilder for HTMLIFrameElement { mixedState: None, }.to_jsval(cx, rval); } - MozBrowserEvent::LocationChange(ref string) | MozBrowserEvent::TitleChange(ref string) => { + MozBrowserEvent::TitleChange(ref string) => { string.to_jsval(cx, rval); } + MozBrowserEvent::LocationChange(uri, can_go_back, can_go_forward) => { + BrowserElementLocationChangeEventDetail { + uri: Some(DOMString::from(uri)), + canGoBack: Some(can_go_back), + canGoForward: Some(can_go_forward), + }.to_jsval(cx, rval); + } MozBrowserEvent::IconChange(rel, href, sizes) => { BrowserElementIconChangeEventDetail { rel: Some(DOMString::from(rel)), @@ -551,9 +560,30 @@ impl VirtualMethods for HTMLIFrameElement { let window = window_from_node(self); let window = window.r(); + // The only reason we're waiting for the iframe to be totally + // removed is to ensure the script thread can't add iframes faster + // than the compositor can remove them. + // + // Since most of this cleanup doesn't happen on same-origin + // iframes, and since that would cause a deadlock, don't do it. let ConstellationChan(ref chan) = window.constellation_chan(); - let msg = ConstellationMsg::RemoveIFrame(pipeline_id); + let same_origin = if let Some(self_url) = self.get_url() { + let win_url = window_from_node(self).get_url(); + UrlHelper::SameOrigin(&self_url, &win_url) + } else { + false + }; + let (sender, receiver) = if same_origin { + (None, None) + } else { + let (sender, receiver) = ipc::channel().unwrap(); + (Some(sender), Some(receiver)) + }; + let msg = ConstellationMsg::RemoveIFrame(pipeline_id, sender); chan.send(msg).unwrap(); + if let Some(receiver) = receiver { + receiver.recv().unwrap() + } // Resetting the subpage id to None is required here so that // if this iframe is subsequently re-added to the document |