mirror of
https://github.com/servo/servo.git
synced 2025-06-25 01:24:37 +01:00
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:
commit
3eac31394c
2 changed files with 16 additions and 12 deletions
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue