diff options
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r-- | components/script/script_task.rs | 68 |
1 files changed, 41 insertions, 27 deletions
diff --git a/components/script/script_task.rs b/components/script/script_task.rs index 6d408d2f10f..b7fc3198511 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -31,7 +31,7 @@ use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference}; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::{JSTraceable, trace_collections, RootedVec}; use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap}; -use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentProgressHandler, DocumentProgressTask, DocumentSource}; +use dom::document::{Document, IsHTMLDocument, DocumentHelpers, DocumentProgressHandler, DocumentProgressTask, DocumentSource, MouseEventType}; use dom::element::{Element, AttributeHandlers}; use dom::event::{Event, EventHelpers, EventBubbles, EventCancelable}; use dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementHelpers}; @@ -51,7 +51,7 @@ use webdriver_handlers; use devtools_traits::{DevtoolsControlChan, DevtoolsControlPort, DevtoolsPageInfo}; use devtools_traits::{DevtoolsControlMsg, DevtoolScriptControlMsg}; use devtools_traits::{TimelineMarker, TimelineMarkerType, TracingMetadata}; -use script_traits::CompositorEvent; +use script_traits::{CompositorEvent, MouseButton}; use script_traits::CompositorEvent::{ResizeEvent, ClickEvent}; use script_traits::CompositorEvent::{MouseDownEvent, MouseUpEvent}; use script_traits::CompositorEvent::{MouseMoveEvent, KeyEvent}; @@ -70,8 +70,6 @@ use net_traits::LoadData as NetLoadData; use net_traits::image_cache_task::{ImageCacheChan, ImageCacheTask, ImageCacheResult}; use net_traits::storage_task::StorageTask; use string_cache::Atom; -use util::geometry::to_frac_px; -use util::smallvec::SmallVec; use util::str::DOMString; use util::task::{spawn_named, spawn_named_with_send_on_failure}; use util::task_state; @@ -90,7 +88,6 @@ use std::any::Any; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; use std::collections::HashSet; -use std::num::ToPrimitive; use std::option::Option; use std::ptr; use std::rc::Rc; @@ -98,7 +95,7 @@ use std::result::Result; use std::sync::mpsc::{channel, Sender, Receiver, Select}; use time::Tm; -use hyper::header::ContentType; +use hyper::header::{ContentType, HttpDate}; use hyper::mime::{Mime, TopLevel, SubLevel}; thread_local!(pub static STACK_ROOTS: Cell<Option<RootCollectionPtr>> = Cell::new(None)); @@ -266,8 +263,6 @@ impl Drop for StackRootTLS { /// Information for an entire page. Pages are top-level browsing contexts and can contain multiple /// frames. -/// -/// FIXME: Rename to `Page`, following WebKit? #[jstraceable] pub struct ScriptTask { /// A handle to the information pertaining to page layout @@ -342,7 +337,6 @@ impl<'a> ScriptMemoryFailsafe<'a> { } } -#[unsafe_destructor] impl<'a> Drop for ScriptMemoryFailsafe<'a> { #[allow(unrooted_must_root)] fn drop(&mut self) { @@ -730,9 +724,10 @@ impl ScriptTask { self.handle_update_subpage_id(containing_pipeline_id, old_subpage_id, new_subpage_id), ConstellationControlMsg::FocusIFrame(containing_pipeline_id, subpage_id) => self.handle_focus_iframe_msg(containing_pipeline_id, subpage_id), - ConstellationControlMsg::WebDriverCommand(pipeline_id, msg) => { - self.handle_webdriver_msg(pipeline_id, msg); - } + ConstellationControlMsg::WebDriverCommand(pipeline_id, msg) => + self.handle_webdriver_msg(pipeline_id, msg), + ConstellationControlMsg::TickAllAnimations(pipeline_id) => + self.handle_tick_all_animations(pipeline_id), } } @@ -782,6 +777,8 @@ impl ScriptTask { devtools::handle_set_timeline_markers(&page, self, marker_types, reply), DevtoolScriptControlMsg::DropTimelineMarkers(_pipeline_id, marker_types) => devtools::handle_drop_timeline_markers(&page, self, marker_types), + DevtoolScriptControlMsg::RequestAnimationFrame(pipeline_id, callback) => + devtools::handle_request_animation_frame(&page, pipeline_id, callback), } } @@ -793,7 +790,9 @@ impl ScriptTask { let page = self.root_page(); match msg { WebDriverScriptCommand::EvaluateJS(script, reply) => - webdriver_handlers::handle_evaluate_js(&page, pipeline_id, script, reply) + webdriver_handlers::handle_evaluate_js(&page, pipeline_id, script, reply), + WebDriverScriptCommand::GetTitle(reply) => + webdriver_handlers::handle_get_title(&page, pipeline_id, reply) } } @@ -1022,6 +1021,13 @@ impl ScriptTask { return false; } + /// Handles when layout task finishes all animation in one tick + fn handle_tick_all_animations(&self, id: PipelineId) { + let page = get_page(&self.root_page(), id); + let document = page.document().root(); + document.r().invoke_animation_callbacks(); + } + /// The entry point to document loading. Defines bindings, sets up the window and document /// objects, parses HTML and CSS, and kicks off initial layout. fn load(&self, response: LoadResponse, incomplete: InProgressLoad) { @@ -1090,7 +1096,6 @@ impl ScriptTask { self.neutered = true; } } - #[unsafe_destructor] impl<'a> Drop for AutoPageRemover<'a> { fn drop(&mut self) { if !self.neutered { @@ -1129,7 +1134,7 @@ impl ScriptTask { incomplete.window_size).root(); let last_modified: Option<DOMString> = response.metadata.headers.as_ref().and_then(|headers| { - headers.get().map(|&LastModified(ref tm)| dom_last_modified(tm)) + headers.get().map(|&LastModified(HttpDate(ref tm))| dom_last_modified(tm)) }); let content_type = match response.metadata.content_type { @@ -1187,8 +1192,7 @@ impl ScriptTask { fn scroll_fragment_point(&self, pipeline_id: PipelineId, node: JSRef<Element>) { let node: JSRef<Node> = NodeCast::from_ref(node); let rect = node.get_bounding_content_box(); - let point = Point2D(to_frac_px(rect.origin.x).to_f32().unwrap(), - to_frac_px(rect.origin.y).to_f32().unwrap()); + let point = Point2D(rect.origin.x.to_f32_px(), rect.origin.y.to_f32_px()); // FIXME(#2003, pcwalton): This is pretty bogus when multiple layers are involved. // Really what needs to happen is that this needs to go through layout to ask which // layer the element belongs to, and have it send the scroll message to the @@ -1230,17 +1234,17 @@ impl ScriptTask { } ClickEvent(button, point) => { - let _marker; - if self.need_emit_timeline_marker(TimelineMarkerType::DOMEvent) { - _marker = AutoDOMEventMarker::new(self); - } - let page = get_page(&self.root_page(), pipeline_id); - let document = page.document().root(); - document.r().handle_click_event(self.js_runtime.rt(), button, point); + self.handle_mouse_event(pipeline_id, MouseEventType::Click, button, point); + } + + MouseDownEvent(button, point) => { + self.handle_mouse_event(pipeline_id, MouseEventType::MouseDown, button, point); + } + + MouseUpEvent(button, point) => { + self.handle_mouse_event(pipeline_id, MouseEventType::MouseUp, button, point); } - MouseDownEvent(..) => {} - MouseUpEvent(..) => {} MouseMoveEvent(point) => { let _marker; if self.need_emit_timeline_marker(TimelineMarkerType::DOMEvent) { @@ -1268,6 +1272,16 @@ impl ScriptTask { } } + fn handle_mouse_event(&self, pipeline_id: PipelineId, mouse_event_type: MouseEventType, button: MouseButton, point: Point2D<f32>) { + let _marker; + if self.need_emit_timeline_marker(TimelineMarkerType::DOMEvent) { + _marker = AutoDOMEventMarker::new(self); + } + let page = get_page(&self.root_page(), pipeline_id); + let document = page.document().root(); + document.r().handle_mouse_event(self.js_runtime.rt(), button, point, mouse_event_type); + } + /// https://html.spec.whatwg.org/multipage/#navigating-across-documents /// The entry point for content to notify that a new load has been requested /// for the given pipeline (specifically the "navigate" algorithm). @@ -1353,6 +1367,7 @@ impl ScriptTask { preserved_headers: load_data.headers, data: load_data.data, cors: None, + pipeline_id: Some(id), }, LoadConsumer::Channel(input_chan))).unwrap(); let load_response = input_port.recv().unwrap(); @@ -1450,7 +1465,6 @@ impl<'a> AutoDOMEventMarker<'a> { } } -#[unsafe_destructor] impl<'a> Drop for AutoDOMEventMarker<'a> { fn drop(&mut self) { let marker = TimelineMarker::new("DOMEvent".to_owned(), TracingMetadata::IntervalEnd); |