diff options
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r-- | components/script/script_task.rs | 106 |
1 files changed, 57 insertions, 49 deletions
diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 4e9fe1a93c2..3fc455d588a 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -5,29 +5,31 @@ //! The script task is the task that owns the DOM in memory, runs JavaScript, and spawns parsing //! and layout tasks. +use self::ScriptMsg::*; + use dom::bindings::cell::DOMRefCell; -use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyStateValues}; +use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState}; use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::InheritTypes::{ElementCast, EventTargetCast, NodeCast, EventCast}; -use dom::bindings::conversions::{FromJSValConvertible, Empty}; +use dom::bindings::conversions::FromJSValConvertible; +use dom::bindings::conversions::StringificationBehavior; use dom::bindings::global; use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalRootable}; use dom::bindings::trace::JSTraceable; use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap}; -use dom::document::{Document, HTMLDocument, DocumentHelpers, FromParser}; -use dom::element::{Element, HTMLButtonElementTypeId, HTMLInputElementTypeId}; -use dom::element::{HTMLSelectElementTypeId, HTMLTextAreaElementTypeId, HTMLOptionElementTypeId, ActivationElementHelpers}; -use dom::event::{Event, EventHelpers, Bubbles, DoesNotBubble, Cancelable, NotCancelable}; +use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentSource}; +use dom::element::{Element, ElementTypeId, ActivationElementHelpers}; +use dom::event::{Event, EventHelpers, EventBubbles, EventCancelable}; use dom::uievent::UIEvent; use dom::eventtarget::{EventTarget, EventTargetHelpers}; use dom::keyboardevent::KeyboardEvent; -use dom::node::{mod, ElementNodeTypeId, Node, NodeHelpers, OtherNodeDamage}; +use dom::node::{mod, Node, NodeHelpers, NodeDamage, NodeTypeId}; use dom::window::{Window, WindowHelpers}; use dom::worker::{Worker, TrustedWorkerAddress}; use dom::xmlhttprequest::{TrustedXHRAddress, XMLHttpRequest, XHRProgress}; -use parse::html::{InputString, InputUrl, parse_html}; +use parse::html::{HTMLInput, parse_html}; use layout_interface::{ScriptLayoutChan, LayoutChan, NoQuery, ReflowForDisplay}; use layout_interface; use page::{Page, IterablePage, Frame}; @@ -235,12 +237,12 @@ trait PrivateScriptTaskHelpers { impl<'a> PrivateScriptTaskHelpers for JSRef<'a, Node> { fn click_event_filter_by_disabled_state(&self) -> bool { match self.type_id() { - ElementNodeTypeId(HTMLButtonElementTypeId) | - ElementNodeTypeId(HTMLInputElementTypeId) | - // ElementNodeTypeId(HTMLKeygenElementTypeId) | - ElementNodeTypeId(HTMLOptionElementTypeId) | - ElementNodeTypeId(HTMLSelectElementTypeId) | - ElementNodeTypeId(HTMLTextAreaElementTypeId) if self.get_disabled_state() => true, + NodeTypeId::Element(ElementTypeId::HTMLButtonElement) | + NodeTypeId::Element(ElementTypeId::HTMLInputElement) | + // NodeTypeId::Element(ElementTypeId::HTMLKeygenElement) | + NodeTypeId::Element(ElementTypeId::HTMLOptionElement) | + NodeTypeId::Element(ElementTypeId::HTMLSelectElement) | + NodeTypeId::Element(ElementTypeId::HTMLTextAreaElement) if self.get_disabled_state() => true, _ => false } } @@ -467,11 +469,11 @@ impl ScriptTask { } let ret = sel.wait(); if ret == port1.id() { - FromScript(self.port.recv()) + MixedMessage::FromScript(self.port.recv()) } else if ret == port2.id() { - FromConstellation(self.control_port.recv()) + MixedMessage::FromConstellation(self.control_port.recv()) } else if ret == port3.id() { - FromDevtools(self.devtools_port.recv()) + MixedMessage::FromDevtools(self.devtools_port.recv()) } else { panic!("unexpected select result") } @@ -483,15 +485,15 @@ impl ScriptTask { // This has to be handled before the ResizeMsg below, // otherwise the page may not have been added to the // child list yet, causing the find() to fail. - FromConstellation(AttachLayoutMsg(new_layout_info)) => { + MixedMessage::FromConstellation(AttachLayoutMsg(new_layout_info)) => { self.handle_new_layout(new_layout_info); } - FromConstellation(ResizeMsg(id, size)) => { + MixedMessage::FromConstellation(ResizeMsg(id, size)) => { let page = self.page.borrow_mut(); let page = page.find(id).expect("resize sent to nonexistent pipeline"); page.resize_event.set(Some(size)); } - FromConstellation(ViewportMsg(id, rect)) => { + MixedMessage::FromConstellation(ViewportMsg(id, rect)) => { let page = self.page.borrow_mut(); let inner_page = page.find(id).expect("Page rect message sent to nonexistent pipeline"); if inner_page.set_page_clip_rect_with_new_viewport(rect) { @@ -511,22 +513,22 @@ impl ScriptTask { Err(_) => match self.port.try_recv() { Err(_) => match self.devtools_port.try_recv() { Err(_) => break, - Ok(ev) => event = FromDevtools(ev), + Ok(ev) => event = MixedMessage::FromDevtools(ev), }, - Ok(ev) => event = FromScript(ev), + Ok(ev) => event = MixedMessage::FromScript(ev), }, - Ok(ev) => event = FromConstellation(ev), + Ok(ev) => event = MixedMessage::FromConstellation(ev), } } // Process the gathered events. for msg in sequential.into_iter() { match msg { - FromConstellation(ExitPipelineMsg(id)) => + MixedMessage::FromConstellation(ExitPipelineMsg(id)) => if self.handle_exit_pipeline_msg(id) { return false }, - FromConstellation(inner_msg) => self.handle_msg_from_constellation(inner_msg), - FromScript(inner_msg) => self.handle_msg_from_script(inner_msg), - FromDevtools(inner_msg) => self.handle_msg_from_devtools(inner_msg), + MixedMessage::FromConstellation(inner_msg) => self.handle_msg_from_constellation(inner_msg), + MixedMessage::FromScript(inner_msg) => self.handle_msg_from_script(inner_msg), + MixedMessage::FromDevtools(inner_msg) => self.handle_msg_from_devtools(inner_msg), } } @@ -563,9 +565,9 @@ impl ScriptTask { self.trigger_load(id, load_data), TriggerFragmentMsg(id, url) => self.trigger_fragment(id, url), - FireTimerMsg(FromWindow(id), timer_id) => + FireTimerMsg(TimerSource::FromWindow(id), timer_id) => self.handle_fire_timer_msg(id, timer_id), - FireTimerMsg(FromWorker, _) => + FireTimerMsg(TimerSource::FromWorker, _) => panic!("Worker timeouts must not be sent to script task"), NavigateMsg(direction) => self.handle_navigate_msg(direction), @@ -757,8 +759,9 @@ impl ScriptTask { } else { url.clone() }; - let document = Document::new(*window, Some(doc_url.clone()), HTMLDocument, - None, FromParser).root(); + let document = Document::new(*window, Some(doc_url.clone()), + IsHTMLDocument::HTMLDocument, None, + DocumentSource::FromParser).root(); window.init_browser_context(*document); @@ -802,17 +805,18 @@ impl ScriptTask { *page.mut_url() = Some((final_url.clone(), true)); } - (InputUrl(load_response), final_url) + (HTMLInput::InputUrl(load_response), final_url) } else { let evalstr = load_data.url.non_relative_scheme_data().unwrap(); let jsval = window.evaluate_js_with_result(evalstr); - let strval = FromJSValConvertible::from_jsval(self.get_cx(), jsval, Empty); - (InputString(strval.unwrap_or("".to_string())), doc_url) + let strval = FromJSValConvertible::from_jsval(self.get_cx(), jsval, + StringificationBehavior::Empty); + (HTMLInput::InputString(strval.unwrap_or("".to_string())), doc_url) }; parse_html(*document, parser_input, &final_url); - document.set_ready_state(DocumentReadyStateValues::Interactive); + document.set_ready_state(DocumentReadyState::Interactive); self.compositor.borrow_mut().set_ready_state(pipeline_id, PerformingLayout); // Kick off the initial reflow of the page. @@ -820,7 +824,7 @@ impl ScriptTask { { let document_js_ref = (&*document).clone(); let document_as_node = NodeCast::from_ref(document_js_ref); - document.content_changed(document_as_node, OtherNodeDamage); + document.content_changed(document_as_node, NodeDamage::OtherNodeDamage); } window.flush_layout(ReflowForDisplay, NoQuery); @@ -832,7 +836,8 @@ 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(); + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable).root(); let doctarget: JSRef<EventTarget> = EventTargetCast::from_ref(*document); let _ = doctarget.DispatchEvent(*event); @@ -841,9 +846,11 @@ impl ScriptTask { // the initial load. // https://html.spec.whatwg.org/multipage/#the-end step 7 - document.set_ready_state(DocumentReadyStateValues::Complete); + document.set_ready_state(DocumentReadyState::Complete); - let event = Event::new(global::Window(*window), "load".to_string(), DoesNotBubble, NotCancelable).root(); + let event = Event::new(global::Window(*window), "load".to_string(), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable).root(); let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(*window); let _ = wintarget.dispatch_event_with_target(Some(doctarget), *event); @@ -913,7 +920,7 @@ impl ScriptTask { let page = get_page(&*self.page.borrow(), pipeline_id); let frame = page.frame(); let document = frame.as_ref().unwrap().document.root(); - document.content_changed(*node_to_dirty, OtherNodeDamage); + document.content_changed(*node_to_dirty, NodeDamage::OtherNodeDamage); } self.handle_reflow_event(pipeline_id); @@ -959,10 +966,10 @@ impl ScriptTask { let meta = modifiers.contains(SUPER); let is_composing = false; - let is_repeating = state == Repeated; + let is_repeating = state == KeyState::Repeated; let ev_type = match state { - Pressed | Repeated => "keydown", - Released => "keyup", + KeyState::Pressed | KeyState::Repeated => "keydown", + KeyState::Released => "keyup", }.to_string(); let props = KeyboardEvent::key_properties(key, modifiers); @@ -977,7 +984,7 @@ impl ScriptTask { let mut prevented = event.DefaultPrevented(); // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#keys-cancelable-keys - if state != Released && props.is_printable() && !prevented { + if state != KeyState::Released && props.is_printable() && !prevented { // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#keypress-event-order let event = KeyboardEvent::new(*window, "keypress".to_string(), true, true, Some(*window), 0, props.key.to_string(), props.code.to_string(), @@ -1001,11 +1008,11 @@ impl ScriptTask { // I'm dispatching it after the key event so the script has a chance to cancel it // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27337 match key { - Key::KeySpace if !prevented && state == Released => { + Key::Space if !prevented && state == KeyState::Released => { let maybe_elem: Option<JSRef<Element>> = ElementCast::to_ref(target); maybe_elem.map(|el| el.as_maybe_activatable().map(|a| a.synthetic_click_activation(ctrl, alt, shift, meta))); } - Key::KeyEnter if !prevented && state == Released => { + Key::Enter if !prevented && state == KeyState::Released => { let maybe_elem: Option<JSRef<Element>> = ElementCast::to_ref(target); maybe_elem.map(|el| el.as_maybe_activatable().map(|a| a.implicit_submission(ctrl, alt, shift, meta))); } @@ -1116,7 +1123,8 @@ impl ScriptTask { let event = Event::new(global::Window(*window), "click".to_string(), - Bubbles, Cancelable).root(); + EventBubbles::Bubbles, + EventCancelable::Cancelable).root(); // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#trusted-events event.set_trusted(true); // https://html.spec.whatwg.org/multipage/interaction.html#run-authentic-click-activation-steps @@ -1272,7 +1280,7 @@ impl HeaderFormat for LastModified { // for document.lastModified. fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result { let LastModified(ref tm) = *self; - match tm.tm_gmtoff { + match tm.tm_utcoff { 0 => tm.rfc822().fmt(f), _ => tm.to_utc().rfc822().fmt(f) } @@ -1280,5 +1288,5 @@ impl HeaderFormat for LastModified { } fn dom_last_modified(tm: &Tm) -> String { - tm.to_local().strftime("%m/%d/%Y %H:%M:%S").unwrap() + format!("{}", tm.to_local().strftime("%m/%d/%Y %H:%M:%S").unwrap()) } |