aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/script_task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/script_task.rs')
-rw-r--r--components/script/script_task.rs68
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);