aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/script_task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/script/script_task.rs')
-rw-r--r--src/components/script/script_task.rs101
1 files changed, 49 insertions, 52 deletions
diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs
index 1929449f9a7..f28044a7102 100644
--- a/src/components/script/script_task.rs
+++ b/src/components/script/script_task.rs
@@ -34,7 +34,7 @@ use layout_interface::UntrustedNodeAddress;
use layout_interface;
use geom::point::Point2D;
-use geom::size::Size2D;
+use geom::size::TypedSize2D;
use js::jsapi::JS_CallFunctionValue;
use js::jsapi::{JS_SetWrapObjectCallbacks, JS_SetGCZeal, JS_DEFAULT_ZEAL_FREQ, JS_GC};
use js::jsapi::{JSContext, JSRuntime};
@@ -49,7 +49,7 @@ use servo_msg::constellation_msg::{PipelineId, SubpageId, Failure, FailureMsg};
use servo_msg::constellation_msg;
use servo_net::image_cache_task::ImageCacheTask;
use servo_net::resource_task::ResourceTask;
-use servo_util::geometry::to_frac_px;
+use servo_util::geometry::{PagePx, to_frac_px};
use servo_util::task::send_on_failure;
use servo_util::namespace::Null;
use servo_util::str::DOMString;
@@ -80,13 +80,13 @@ pub enum ScriptMsg {
/// Sends a DOM event.
SendEventMsg(PipelineId, Event_),
/// Window resized. Sends a DOM event eventually, but first we combine events.
- ResizeMsg(PipelineId, Size2D<uint>),
+ ResizeMsg(PipelineId, TypedSize2D<PagePx, f32>),
/// Fires a JavaScript timeout.
FireTimerMsg(PipelineId, TimerId),
/// Notifies script that reflow is finished.
ReflowCompleteMsg(PipelineId, uint),
/// Notifies script that window has been resized but to not take immediate action.
- ResizeInactiveMsg(PipelineId, Size2D<uint>),
+ ResizeInactiveMsg(PipelineId, TypedSize2D<PagePx, f32>),
/// Notifies the script that a pipeline should be closed.
ExitPipelineMsg(PipelineId),
/// Notifies the script that a window associated with a particular pipeline should be closed.
@@ -145,7 +145,7 @@ pub struct Page {
damage: Traceable<RefCell<Option<DocumentDamage>>>,
/// The current size of the window, in pixels.
- window_size: Untraceable<Cell<Size2D<uint>>>,
+ window_size: Untraceable<Cell<TypedSize2D<PagePx, f32>>>,
js_info: Traceable<RefCell<Option<JSPageInfo>>>,
@@ -158,7 +158,7 @@ pub struct Page {
next_subpage_id: Untraceable<Cell<SubpageId>>,
/// Pending resize event, if any.
- resize_event: Untraceable<Cell<Option<Size2D<uint>>>>,
+ resize_event: Untraceable<Cell<Option<TypedSize2D<PagePx, f32>>>>,
/// Pending scroll to fragment event, if any
fragment_node: Cell<Option<JS<Element>>>,
@@ -201,7 +201,7 @@ impl IterablePage for Rc<Page> {
impl Page {
fn new(id: PipelineId, subpage_id: Option<SubpageId>,
layout_chan: LayoutChan,
- window_size: Size2D<uint>, resource_task: ResourceTask,
+ window_size: TypedSize2D<PagePx, f32>, resource_task: ResourceTask,
constellation_chan: ConstellationChan,
js_context: Rc<Cx>) -> Page {
let js_info = JSPageInfo {
@@ -609,7 +609,7 @@ impl ScriptTask {
constellation_chan: ConstellationChan,
resource_task: ResourceTask,
img_cache_task: ImageCacheTask,
- window_size: Size2D<uint>)
+ window_size: TypedSize2D<PagePx, f32>)
-> Rc<ScriptTask> {
let (js_runtime, js_context) = ScriptTask::new_rt_and_cx();
let page = Page::new(id, None, layout_chan, window_size,
@@ -690,7 +690,7 @@ impl ScriptTask {
failure_msg: Failure,
resource_task: ResourceTask,
image_cache_task: ImageCacheTask,
- window_size: Size2D<uint>) {
+ window_size: TypedSize2D<PagePx, f32>) {
let mut builder = TaskBuilder::new().named("ScriptTask");
let ConstellationChan(const_chan) = constellation_chan.clone();
send_on_failure(&mut builder, FailureMsg(failure_msg), const_chan);
@@ -737,8 +737,8 @@ impl ScriptTask {
}
}
- for (id, Size2D { width, height }) in resizes.move_iter() {
- self.handle_event(id, ResizeEvent(width, height));
+ for (id, size) in resizes.move_iter() {
+ self.handle_event(id, ResizeEvent(size));
}
// Store new resizes, and gather all other events.
@@ -817,31 +817,27 @@ impl ScriptTask {
let page = page.find(id).expect("ScriptTask: received fire timer msg for a
pipeline ID not associated with this script task. This is a bug.");
let frame = page.frame();
- let mut window = frame.get_ref().window.root();
+ let window = frame.get_ref().window.root();
let this_value = window.deref().reflector().get_jsobject();
- let is_interval;
- match window.deref().active_timers.find(&timer_id) {
+ let data = match window.deref().active_timers.deref().borrow().find(&timer_id) {
None => return,
- Some(timer_handle) => {
- // TODO: Support extra arguments. This requires passing a `*JSVal` array as `argv`.
- let cx = self.get_cx();
- with_compartment(cx, this_value, || {
- let mut rval = NullValue();
- unsafe {
- JS_CallFunctionValue(cx, this_value,
- *timer_handle.data.funval,
- 0, ptr::mut_null(), &mut rval);
- }
- });
+ Some(timer_handle) => timer_handle.data,
+ };
- is_interval = timer_handle.data.is_interval;
+ // TODO: Support extra arguments. This requires passing a `*JSVal` array as `argv`.
+ let cx = self.get_cx();
+ with_compartment(cx, this_value, || {
+ let mut rval = NullValue();
+ unsafe {
+ JS_CallFunctionValue(cx, this_value, *data.funval,
+ 0, ptr::mut_null(), &mut rval);
}
- }
+ });
- if !is_interval {
- window.deref_mut().active_timers.remove(&timer_id);
+ if !data.is_interval {
+ window.deref().active_timers.deref().borrow_mut().remove(&timer_id);
}
}
@@ -868,7 +864,7 @@ impl ScriptTask {
}
/// Window was resized, but this script was not active, so don't reflow yet
- fn handle_resize_inactive_msg(&self, id: PipelineId, new_size: Size2D<uint>) {
+ fn handle_resize_inactive_msg(&self, id: PipelineId, new_size: TypedSize2D<PagePx, f32>) {
let mut page = self.page.borrow_mut();
let page = page.find(id).expect("Received resize message for PipelineId not associated
with a page in the page tree. This is a bug.");
@@ -951,12 +947,12 @@ impl ScriptTask {
self.chan.clone(),
self.compositor.dup(),
self.image_cache_task.clone()).root();
- let mut document = Document::new(&*window, Some(url.clone()), HTMLDocument, None).root();
- window.deref_mut().init_browser_context(&*document);
+ let document = Document::new(&*window, Some(url.clone()), HTMLDocument, None).root();
+ window.deref().init_browser_context(&*document);
with_compartment((**cx).ptr, window.reflector().get_jsobject(), || {
let mut js_info = page.mut_js_info();
- RegisterBindings::Register(&window.unrooted(), js_info.get_mut_ref());
+ RegisterBindings::Register(&*window, js_info.get_mut_ref());
});
self.compositor.set_ready_state(Loading);
@@ -964,7 +960,7 @@ impl ScriptTask {
//
// Note: We can parse the next document in parallel with any previous documents.
let html_parsing_result = hubbub_html_parser::parse_html(&*page,
- &mut *document,
+ &*document,
url.clone(),
self.resource_task.clone());
@@ -1002,7 +998,7 @@ impl ScriptTask {
}
// Kick off the initial reflow of the page.
- document.content_changed();
+ document.deref().content_changed();
let fragment = url.fragment.as_ref().map(|ref fragment| fragment.to_string());
@@ -1033,12 +1029,11 @@ impl ScriptTask {
// 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.
- let mut event =
- Event::new(&*window, "load".to_string(), false, false).root();
+ let event = Event::new(&*window, "load".to_string(), false, false).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).clone()),
- &mut *event);
+ &*event);
page.fragment_node.assign(fragment.map_or(None, |fragid| page.find_fragment_node(fragid)));
@@ -1063,12 +1058,12 @@ impl ScriptTask {
/// TODO: Actually perform DOM event dispatch.
fn handle_event(&self, pipeline_id: PipelineId, event: Event_) {
match event {
- ResizeEvent(new_width, new_height) => {
- debug!("script got resize event: {:u}, {:u}", new_width, new_height);
+ ResizeEvent(new_size) => {
+ debug!("script got resize event: {:?}", new_size);
let window = {
let page = get_page(&*self.page.borrow(), pipeline_id);
- page.window_size.deref().set(Size2D(new_width, new_height));
+ page.window_size.deref().set(new_size);
let frame = page.frame();
if frame.is_some() {
@@ -1089,12 +1084,14 @@ impl ScriptTask {
Some(mut window) => {
// http://dev.w3.org/csswg/cssom-view/#resizing-viewports
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#event-type-resize
- let mut uievent = UIEvent::new(&window.clone(), "resize".to_string(), false, false,
- Some((*window).clone()), 0i32).root();
- let event: &mut JSRef<Event> = EventCast::from_mut_ref(&mut *uievent);
-
- let wintarget: &mut JSRef<EventTarget> = EventTargetCast::from_mut_ref(&mut *window);
- let _ = wintarget.dispatch_event_with_target(None, &mut *event);
+ let uievent = UIEvent::new(&window.clone(),
+ "resize".to_string(), false,
+ false, Some(window.clone()),
+ 0i32).root();
+ let event: &JSRef<Event> = EventCast::from_ref(&*uievent);
+
+ let wintarget: &JSRef<EventTarget> = EventTargetCast::from_ref(&*window);
+ let _ = wintarget.dispatch_event_with_target(None, event);
}
None => ()
}
@@ -1129,12 +1126,12 @@ impl ScriptTask {
match *page.frame() {
Some(ref frame) => {
let window = frame.window.root();
- let mut event =
+ let event =
Event::new(&*window,
"click".to_string(),
true, true).root();
let eventtarget: &JSRef<EventTarget> = EventTargetCast::from_ref(&node);
- let _ = eventtarget.dispatch_event_with_target(None, &mut *event);
+ let _ = eventtarget.dispatch_event_with_target(None, &*event);
}
None => {}
}
@@ -1160,8 +1157,8 @@ impl ScriptTask {
match *mouse_over_targets {
Some(ref mut mouse_over_targets) => {
for node in mouse_over_targets.mut_iter() {
- let mut node = node.root();
- node.set_hover_state(false);
+ let node = node.root();
+ node.deref().set_hover_state(false);
}
}
None => {}
@@ -1175,7 +1172,7 @@ impl ScriptTask {
let maybe_node = temp_node.root().ancestors().find(|node| node.is_element());
match maybe_node {
- Some(mut node) => {
+ Some(node) => {
node.set_hover_state(true);
match *mouse_over_targets {