mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Dispatch load events for cross origin iframes. Resolves #6672.
This commit is contained in:
parent
2a125b5613
commit
c23cbd4163
23 changed files with 470 additions and 66 deletions
|
@ -58,7 +58,7 @@ use dom::keyboardevent::KeyboardEvent;
|
|||
use dom::location::Location;
|
||||
use dom::messageevent::MessageEvent;
|
||||
use dom::mouseevent::MouseEvent;
|
||||
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage, window_from_node};
|
||||
use dom::node::{self, CloneChildrenFlag, Node, NodeDamage};
|
||||
use dom::nodeiterator::NodeIterator;
|
||||
use dom::nodelist::NodeList;
|
||||
use dom::processinginstruction::ProcessingInstruction;
|
||||
|
@ -79,9 +79,9 @@ use layout_interface::{HitTestResponse, MouseOverResponse};
|
|||
use layout_interface::{LayoutChan, Msg};
|
||||
use layout_interface::{ReflowGoal, ReflowQueryType};
|
||||
use msg::compositor_msg::ScriptToCompositorMsg;
|
||||
use msg::constellation_msg::AnimationState;
|
||||
use msg::constellation_msg::ScriptMsg as ConstellationMsg;
|
||||
use msg::constellation_msg::{ALT, CONTROL, SHIFT, SUPER};
|
||||
use msg::constellation_msg::{AnimationState, PipelineId};
|
||||
use msg::constellation_msg::{ConstellationChan, FocusType, Key, KeyModifiers, KeyState, MozBrowserEvent, SubpageId};
|
||||
use net_traits::ControlMsg::{GetCookiesForUrl, SetCookiesForUrl};
|
||||
use net_traits::CookieSource::NonHTTP;
|
||||
|
@ -1333,6 +1333,14 @@ impl Document {
|
|||
.find(|node| node.subpage_id() == Some(subpage_id))
|
||||
}
|
||||
|
||||
/// Find an iframe element in the document.
|
||||
pub fn find_iframe_by_pipeline(&self, pipeline: PipelineId) -> Option<Root<HTMLIFrameElement>> {
|
||||
self.upcast::<Node>()
|
||||
.traverse_preorder()
|
||||
.filter_map(Root::downcast::<HTMLIFrameElement>)
|
||||
.find(|node| node.pipeline() == Some(pipeline))
|
||||
}
|
||||
|
||||
pub fn get_dom_loading(&self) -> u64 {
|
||||
self.dom_loading.get()
|
||||
}
|
||||
|
@ -2433,18 +2441,6 @@ impl DocumentProgressHandler {
|
|||
event.set_trusted(true);
|
||||
let _ = wintarget.dispatch_event_with_target(document.upcast(), &event);
|
||||
|
||||
let browsing_context = window.browsing_context();
|
||||
let browsing_context = browsing_context.as_ref().unwrap();
|
||||
|
||||
if let Some(frame_element) = browsing_context.frame_element() {
|
||||
let frame_window = window_from_node(frame_element);
|
||||
let event = Event::new(GlobalRef::Window(frame_window.r()),
|
||||
DOMString::from("load"),
|
||||
EventBubbles::DoesNotBubble,
|
||||
EventCancelable::NotCancelable);
|
||||
event.fire(frame_element.upcast());
|
||||
};
|
||||
|
||||
document.notify_constellation_load();
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/Events/mozbrowserloadend
|
||||
|
|
|
@ -16,7 +16,7 @@ use dom::bindings::reflector::Reflectable;
|
|||
use dom::customevent::CustomEvent;
|
||||
use dom::document::Document;
|
||||
use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers};
|
||||
use dom::event::Event;
|
||||
use dom::event::{Event, EventBubbles, EventCancelable};
|
||||
use dom::htmlelement::HTMLElement;
|
||||
use dom::node::{Node, window_from_node};
|
||||
use dom::urlhelper::UrlHelper;
|
||||
|
@ -189,6 +189,29 @@ impl HTMLIFrameElement {
|
|||
pub fn subpage_id(&self) -> Option<SubpageId> {
|
||||
self.subpage_id.get()
|
||||
}
|
||||
|
||||
pub fn pipeline(&self) -> Option<PipelineId> {
|
||||
self.pipeline_id.get()
|
||||
}
|
||||
|
||||
/// https://html.spec.whatwg.org/multipage/#iframe-load-event-steps steps 1-4
|
||||
pub fn iframe_load_event_steps(&self) {
|
||||
// TODO A cross-origin child document would not be easily accessible
|
||||
// from this script thread. It's unclear how to implement
|
||||
// steps 2, 3, and 5 efficiently in this case.
|
||||
// TODO Step 2 - check child document `mute iframe load` flag
|
||||
// TODO Step 3 - set child document `mut iframe load` flag
|
||||
|
||||
// Step 4
|
||||
let window = window_from_node(self);
|
||||
let event = Event::new(GlobalRef::Window(window.r()),
|
||||
DOMString::from("load".to_owned()),
|
||||
EventBubbles::DoesNotBubble,
|
||||
EventCancelable::NotCancelable);
|
||||
event.fire(self.upcast());
|
||||
|
||||
// TODO Step 5 - unset child document `mut iframe load` flag
|
||||
}
|
||||
}
|
||||
|
||||
pub trait HTMLIFrameElementLayoutMethods {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue