mirror of
https://github.com/servo/servo.git
synced 2025-06-24 17:14:33 +01:00
auto merge of #1213 : jdm/servo/loadevent, r=kmcallister
It's good enough for now, since we don't track document resources at all. Should be good enough for #841.
This commit is contained in:
commit
da4ca51049
4 changed files with 54 additions and 3 deletions
|
@ -9,12 +9,14 @@ use dom::node::AbstractNode;
|
||||||
use servo_util::tree::{TreeNodeRef};
|
use servo_util::tree::{TreeNodeRef};
|
||||||
|
|
||||||
// See http://dom.spec.whatwg.org/#concept-event-dispatch for the full dispatch algorithm
|
// See http://dom.spec.whatwg.org/#concept-event-dispatch for the full dispatch algorithm
|
||||||
pub fn dispatch_event(target: AbstractEventTarget, event: AbstractEvent) -> bool {
|
pub fn dispatch_event(target: AbstractEventTarget,
|
||||||
|
pseudo_target: Option<AbstractEventTarget>,
|
||||||
|
event: AbstractEvent) -> bool {
|
||||||
assert!(!event.event().dispatching);
|
assert!(!event.event().dispatching);
|
||||||
|
|
||||||
{
|
{
|
||||||
let event = event.mut_event();
|
let event = event.mut_event();
|
||||||
event.target = Some(target);
|
event.target = Some(pseudo_target.unwrap_or(target));
|
||||||
event.dispatching = true;
|
event.dispatching = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,11 @@
|
||||||
use dom::bindings::utils::{Reflectable, Reflector, DOMString, Fallible};
|
use dom::bindings::utils::{Reflectable, Reflector, DOMString, Fallible};
|
||||||
use dom::bindings::utils::{null_str_as_word_null, InvalidState};
|
use dom::bindings::utils::{null_str_as_word_null, InvalidState};
|
||||||
use dom::bindings::codegen::EventListenerBinding::EventListener;
|
use dom::bindings::codegen::EventListenerBinding::EventListener;
|
||||||
|
use dom::document::AbstractDocument;
|
||||||
use dom::event::AbstractEvent;
|
use dom::event::AbstractEvent;
|
||||||
use dom::eventdispatcher::dispatch_event;
|
use dom::eventdispatcher::dispatch_event;
|
||||||
use dom::node::{AbstractNode, ScriptView};
|
use dom::node::{AbstractNode, ScriptView};
|
||||||
|
use dom::window::Window;
|
||||||
|
|
||||||
use std::cast;
|
use std::cast;
|
||||||
use std::hashmap::HashMap;
|
use std::hashmap::HashMap;
|
||||||
|
@ -54,6 +56,18 @@ impl AbstractEventTarget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn from_window(window: @mut Window) -> AbstractEventTarget {
|
||||||
|
AbstractEventTarget {
|
||||||
|
eventtarget: unsafe { cast::transmute(window) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn from_document(document: AbstractDocument) -> AbstractEventTarget {
|
||||||
|
unsafe {
|
||||||
|
cast::transmute(document)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn type_id(&self) -> EventTargetTypeId {
|
pub fn type_id(&self) -> EventTargetTypeId {
|
||||||
self.eventtarget().type_id
|
self.eventtarget().type_id
|
||||||
}
|
}
|
||||||
|
@ -164,10 +178,17 @@ impl EventTarget {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn DispatchEvent(&self, abstract_self: AbstractEventTarget, event: AbstractEvent) -> Fallible<bool> {
|
pub fn DispatchEvent(&self, abstract_self: AbstractEventTarget, event: AbstractEvent) -> Fallible<bool> {
|
||||||
|
self.dispatch_event_with_target(abstract_self, None, event)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dispatch_event_with_target(&self,
|
||||||
|
abstract_self: AbstractEventTarget,
|
||||||
|
abstract_target: Option<AbstractEventTarget>,
|
||||||
|
event: AbstractEvent) -> Fallible<bool> {
|
||||||
if event.event().dispatching || !event.event().initialized {
|
if event.event().dispatching || !event.event().initialized {
|
||||||
return Err(InvalidState);
|
return Err(InvalidState);
|
||||||
}
|
}
|
||||||
Ok(dispatch_event(abstract_self, event))
|
Ok(dispatch_event(abstract_self, abstract_target, event))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ use dom::bindings::utils::{Reflectable, GlobalStaticData};
|
||||||
use dom::document::AbstractDocument;
|
use dom::document::AbstractDocument;
|
||||||
use dom::element::Element;
|
use dom::element::Element;
|
||||||
use dom::event::{Event_, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent, MouseUpEvent};
|
use dom::event::{Event_, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent, MouseUpEvent};
|
||||||
|
use dom::event::{Event, HTMLEventTypeId};
|
||||||
|
use dom::eventtarget::AbstractEventTarget;
|
||||||
use dom::htmldocument::HTMLDocument;
|
use dom::htmldocument::HTMLDocument;
|
||||||
use dom::window::Window;
|
use dom::window::Window;
|
||||||
use layout_interface::{AddStylesheetMsg, DocumentDamage};
|
use layout_interface::{AddStylesheetMsg, DocumentDamage};
|
||||||
|
@ -765,6 +767,15 @@ impl ScriptTask {
|
||||||
file.url.to_str(),
|
file.url.to_str(),
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We have no concept of a document loader right now, so just dispatch the
|
||||||
|
// "load" event as soon as we've finished executing all scripts parsed during
|
||||||
|
// the initial load.
|
||||||
|
let event = Event::new(window, HTMLEventTypeId);
|
||||||
|
event.mut_event().InitEvent(&Some(~"load"), false, false);
|
||||||
|
let doctarget = AbstractEventTarget::from_document(document);
|
||||||
|
let wintarget = AbstractEventTarget::from_window(window);
|
||||||
|
window.eventtarget.dispatch_event_with_target(wintarget, Some(doctarget), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is the main entry point for receiving and dispatching DOM events.
|
/// This is the main entry point for receiving and dispatching DOM events.
|
||||||
|
|
17
src/test/html/content/test_load_event.html
Normal file
17
src/test/html/content/test_load_event.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="harness.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
addEventListener("load", function(ev) {
|
||||||
|
is_a(ev, Event);
|
||||||
|
ev.preventDefault();
|
||||||
|
is(ev.defaultPrevented, false);
|
||||||
|
is(ev.target, document);
|
||||||
|
is(ev.currentTarget, window);
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Add table
Add a link
Reference in a new issue