aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2015-01-04 05:14:55 +0900
committerTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2015-01-11 03:38:57 +0900
commitb984815b98a22d0453dd922ac2652a35f2d08b44 (patch)
tree0fa67544e12f6236004bdffdf3a18cc83877d9fe /components/script/dom
parentf627b35ef6e40e5a87a2e9173309af75f6322310 (diff)
downloadservo-b984815b98a22d0453dd922ac2652a35f2d08b44.tar.gz
servo-b984815b98a22d0453dd922ac2652a35f2d08b44.zip
Make script load event asynchronous for internal scripts
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/htmlscriptelement.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index 5acef40364e..411110dbb81 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -15,6 +15,7 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCas
use dom::bindings::codegen::InheritTypes::EventTargetCast;
use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JSRef, Temporary, OptionalRootable};
+use dom::bindings::refcounted::Trusted;
use dom::document::Document;
use dom::element::{Element, AttributeHandlers, ElementCreator};
use dom::eventtarget::{EventTarget, EventTargetTypeId, EventTargetHelpers};
@@ -24,6 +25,7 @@ use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
use dom::node::{Node, NodeHelpers, NodeTypeId, window_from_node, CloneChildrenFlag};
use dom::virtualmethods::VirtualMethods;
use dom::window::ScriptHelpers;
+use script_task::{ScriptMsg, Runnable};
use encoding::all::UTF_8;
use encoding::types::{Encoding, DecoderTrap};
@@ -89,6 +91,9 @@ pub trait HTMLScriptElementHelpers {
/// Set the "already started" flag (<https://whatwg.org/html/#already-started>)
fn mark_already_started(self);
+
+ /// Dispatch load event.
+ fn dispatch_load_event(self);
}
/// Supported script types as defined by
@@ -216,6 +221,23 @@ impl<'a> HTMLScriptElementHelpers for JSRef<'a, HTMLScriptElement> {
window.evaluate_script_on_global_with_result(source.as_slice(), url.serialize().as_slice());
+ // https://html.spec.whatwg.org/multipage/scripting.html#execute-the-script-block
+ // step 2, substep 10
+ match origin {
+ ScriptOrigin::External => {
+ self.dispatch_load_event();
+ }
+ ScriptOrigin::Internal => {
+ let chan = window.script_chan();
+ let handler = Trusted::new(window.get_cx(), self, chan.clone());
+ chan.send(ScriptMsg::RunnableMsg(box handler));
+ }
+ }
+ }
+
+ fn dispatch_load_event(self) {
+ let window = window_from_node(self).root();
+ let window = window.r();
let event = Event::new(GlobalRef::Window(window),
"load".into_string(),
EventBubbles::DoesNotBubble,
@@ -336,3 +358,9 @@ impl<'a> HTMLScriptElementMethods for JSRef<'a, HTMLScriptElement> {
}
}
+impl Runnable for Trusted<HTMLScriptElement> {
+ fn handler(&self) {
+ let target = self.to_temporary().root();
+ target.r().dispatch_load_event();
+ }
+}