aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_task.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2014-10-21 14:44:30 -0400
committerJosh Matthews <josh@joshmatthews.net>2014-10-23 10:55:59 -0400
commit539c21f38022b6d0be6ad01be94bc2e1217d5ccb (patch)
tree8f4278428198189993dd703945ada5189ddaf764 /components/script/script_task.rs
parent470d27a6681b4647de64c085654403820d48f7af (diff)
downloadservo-539c21f38022b6d0be6ad01be94bc2e1217d5ccb.tar.gz
servo-539c21f38022b6d0be6ad01be94bc2e1217d5ccb.zip
Implement Document.readyState. Prevent iframes from notifying the compositor after the initial parse. Fixes #1720. Fixes #3738.
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r--components/script/script_task.rs20
1 files changed, 16 insertions, 4 deletions
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index 2ea31959e05..363b7ea75cf 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -6,9 +6,10 @@
//! and layout tasks.
use dom::bindings::cell::DOMRefCell;
-use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
+use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyStateValues};
use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods;
+use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods;
use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, EventCast, ElementCast};
use dom::bindings::conversions;
use dom::bindings::conversions::{FromJSValConvertible, Empty};
@@ -17,7 +18,7 @@ use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalRootable};
use dom::bindings::trace::JSTraceable;
use dom::bindings::utils::Reflectable;
use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap};
-use dom::document::{Document, HTMLDocument, DocumentHelpers};
+use dom::document::{Document, HTMLDocument, DocumentHelpers, FromParser};
use dom::element::{Element, HTMLButtonElementTypeId, HTMLInputElementTypeId};
use dom::element::{HTMLSelectElementTypeId, HTMLTextAreaElementTypeId, HTMLOptionElementTypeId};
use dom::event::{Event, Bubbles, DoesNotBubble, Cancelable, NotCancelable};
@@ -762,7 +763,7 @@ impl ScriptTask {
url.clone()
};
let document = Document::new(*window, Some(doc_url), HTMLDocument,
- None).root();
+ None, FromParser).root();
window.init_browser_context(*document);
@@ -793,6 +794,8 @@ impl ScriptTask {
});
}
+ document.set_ready_state(DocumentReadyStateValues::Interactive);
+
// Send style sheets over to layout.
//
// FIXME: These should be streamed to layout as they're parsed. We don't need to stop here
@@ -849,11 +852,20 @@ impl ScriptTask {
}
});
+ // https://html.spec.whatwg.org/multipage/#the-end step 4
+ let event = Event::new(&global::Window(*window), "DOMContentLoaded".to_string(),
+ DoesNotBubble, NotCancelable).root();
+ let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(*document);
+ let _ = doctarget.DispatchEvent(*event);
+
// 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.
+
+ // https://html.spec.whatwg.org/multipage/#the-end step 7
+ document.set_ready_state(DocumentReadyStateValues::Complete);
+
let event = Event::new(&global::Window(*window), "load".to_string(), DoesNotBubble, NotCancelable).root();
- let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(*document);
let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(*window);
let _ = wintarget.dispatch_event_with_target(Some(doctarget), *event);