diff options
Diffstat (limited to 'src/components/script/script_task.rs')
-rw-r--r-- | src/components/script/script_task.rs | 101 |
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 { |