aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmliframeelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmliframeelement.rs')
-rw-r--r--components/script/dom/htmliframeelement.rs34
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