auto merge of #2002 : mrobinson/servo/issue-1477, r=jdm

A HashMap allows easily looking up a timer and canceling it in
Window.ClearTimeout.

Fixes #1477.
This commit is contained in:
bors-servo 2014-03-31 19:07:50 -04:00
commit 3eac31394c
2 changed files with 16 additions and 12 deletions

View file

@ -25,7 +25,7 @@ use js::jsval::JSVal;
use js::jsval::{NullValue, ObjectValue}; use js::jsval::{NullValue, ObjectValue};
use js::JSPROP_ENUMERATE; use js::JSPROP_ENUMERATE;
use collections::hashmap::HashSet; use collections::hashmap::HashMap;
use std::cast; use std::cast;
use std::cmp; use std::cmp;
use std::comm::Chan; use std::comm::Chan;
@ -79,7 +79,7 @@ pub struct Window {
location: Option<JS<Location>>, location: Option<JS<Location>>,
navigator: Option<JS<Navigator>>, navigator: Option<JS<Navigator>>,
image_cache_task: ImageCacheTask, image_cache_task: ImageCacheTask,
active_timers: ~HashSet<TimerHandle>, active_timers: ~HashMap<i32, TimerHandle>,
next_timer_handle: i32, next_timer_handle: i32,
priv extra: Untraceable priv extra: Untraceable
} }
@ -116,8 +116,8 @@ impl Window {
impl Drop for Window { impl Drop for Window {
fn drop(&mut self) { fn drop(&mut self) {
self.extra.timer_chan.send(TimerMessageClose); self.extra.timer_chan.send(TimerMessageClose);
for handle in self.active_timers.iter() { for timer_handle in self.active_timers.values() {
handle.cancel(); timer_handle.cancel();
} }
} }
} }
@ -254,14 +254,16 @@ impl Window {
})); }));
} }
}); });
self.active_timers.insert(TimerHandle { handle: handle, cancel_chan: Some(cancel_chan) }); self.active_timers.insert(handle, TimerHandle { handle: handle, cancel_chan: Some(cancel_chan) });
handle handle
} }
pub fn ClearTimeout(&mut self, handle: i32) { pub fn ClearTimeout(&mut self, handle: i32) {
// FIXME(#1477): active_timers should be a HashMap and this should let timer_handle = self.active_timers.pop(&handle);
// cancel the removed timer. match timer_handle {
self.active_timers.remove(&TimerHandle { handle: handle, cancel_chan: None }); Some(handle) => handle.cancel(),
None => { }
}
} }
pub fn damage_and_reflow(&self, damage: DocumentDamageLevel) { pub fn damage_and_reflow(&self, damage: DocumentDamageLevel) {
@ -310,7 +312,7 @@ impl Window {
location: None, location: None,
navigator: None, navigator: None,
image_cache_task: image_cache_task, image_cache_task: image_cache_task,
active_timers: ~HashSet::new(), active_timers: ~HashMap::new(),
next_timer_handle: 0 next_timer_handle: 0
}; };

View file

@ -16,7 +16,7 @@ use dom::event::Event;
use dom::uievent::UIEvent; use dom::uievent::UIEvent;
use dom::eventtarget::EventTarget; use dom::eventtarget::EventTarget;
use dom::node::{Node, NodeHelpers}; use dom::node::{Node, NodeHelpers};
use dom::window::{TimerData, TimerHandle, Window}; use dom::window::{TimerData, Window};
use dom::windowproxy::WindowProxy; use dom::windowproxy::WindowProxy;
use html::hubbub_html_parser::HtmlParserResult; use html::hubbub_html_parser::HtmlParserResult;
use html::hubbub_html_parser::{HtmlDiscoveredStyle, HtmlDiscoveredIFrame, HtmlDiscoveredScript}; use html::hubbub_html_parser::{HtmlDiscoveredStyle, HtmlDiscoveredIFrame, HtmlDiscoveredScript};
@ -645,10 +645,12 @@ impl ScriptTask {
pipeline ID not associated with this script task. This is a bug.").page(); pipeline ID not associated with this script task. This is a bug.").page();
let frame = page.frame(); let frame = page.frame();
let mut window = frame.get().get_ref().window.clone(); let mut window = frame.get().get_ref().window.clone();
if !window.get().active_timers.contains(&TimerHandle { handle: timer_data.handle, cancel_chan: None }) {
let timer_handle = window.get_mut().active_timers.pop(&timer_data.handle);
if timer_handle.is_none() {
return; return;
} }
window.get_mut().active_timers.remove(&TimerHandle { handle: timer_data.handle, cancel_chan: None });
let js_info = page.js_info(); let js_info = page.js_info();
let this_value = if timer_data.args.len() > 0 { let this_value = if timer_data.args.len() > 0 {
fail!("NYI") fail!("NYI")