diff options
author | Josh Matthews <josh@joshmatthews.net> | 2014-10-21 14:44:30 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2014-10-23 10:55:59 -0400 |
commit | 539c21f38022b6d0be6ad01be94bc2e1217d5ccb (patch) | |
tree | 8f4278428198189993dd703945ada5189ddaf764 /components/script/script_task.rs | |
parent | 470d27a6681b4647de64c085654403820d48f7af (diff) | |
download | servo-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.rs | 20 |
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); |