aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/components/script/dom/eventdispatcher.rs6
-rw-r--r--src/components/script/dom/eventtarget.rs23
-rw-r--r--src/components/script/script_task.rs11
-rw-r--r--src/test/html/content/test_load_event.html17
4 files changed, 54 insertions, 3 deletions
diff --git a/src/components/script/dom/eventdispatcher.rs b/src/components/script/dom/eventdispatcher.rs
index 2c3ccc0da32..7edc4f5df1d 100644
--- a/src/components/script/dom/eventdispatcher.rs
+++ b/src/components/script/dom/eventdispatcher.rs
@@ -9,12 +9,14 @@ use dom::node::AbstractNode;
use servo_util::tree::{TreeNodeRef};
// 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);
{
let event = event.mut_event();
- event.target = Some(target);
+ event.target = Some(pseudo_target.unwrap_or(target));
event.dispatching = true;
}
diff --git a/src/components/script/dom/eventtarget.rs b/src/components/script/dom/eventtarget.rs
index ae87a5d73ac..77753fd3b5a 100644
--- a/src/components/script/dom/eventtarget.rs
+++ b/src/components/script/dom/eventtarget.rs
@@ -5,9 +5,11 @@
use dom::bindings::utils::{Reflectable, Reflector, DOMString, Fallible};
use dom::bindings::utils::{null_str_as_word_null, InvalidState};
use dom::bindings::codegen::EventListenerBinding::EventListener;
+use dom::document::AbstractDocument;
use dom::event::AbstractEvent;
use dom::eventdispatcher::dispatch_event;
use dom::node::{AbstractNode, ScriptView};
+use dom::window::Window;
use std::cast;
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 {
self.eventtarget().type_id
}
@@ -164,10 +178,17 @@ impl EventTarget {
}
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 {
return Err(InvalidState);
}
- Ok(dispatch_event(abstract_self, event))
+ Ok(dispatch_event(abstract_self, abstract_target, event))
}
}
diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs
index fed211c1fce..8a21e984639 100644
--- a/src/components/script/script_task.rs
+++ b/src/components/script/script_task.rs
@@ -12,6 +12,8 @@ use dom::bindings::utils::{Reflectable, GlobalStaticData};
use dom::document::AbstractDocument;
use dom::element::Element;
use dom::event::{Event_, ResizeEvent, ReflowEvent, ClickEvent, MouseDownEvent, MouseUpEvent};
+use dom::event::{Event, HTMLEventTypeId};
+use dom::eventtarget::AbstractEventTarget;
use dom::htmldocument::HTMLDocument;
use dom::window::Window;
use layout_interface::{AddStylesheetMsg, DocumentDamage};
@@ -765,6 +767,15 @@ impl ScriptTask {
file.url.to_str(),
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.
diff --git a/src/test/html/content/test_load_event.html b/src/test/html/content/test_load_event.html
new file mode 100644
index 00000000000..fd8502fcd7d
--- /dev/null
+++ b/src/test/html/content/test_load_event.html
@@ -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>