aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/window.rs
diff options
context:
space:
mode:
authorGuillaume Bort <guillaume.bort@gmail.com>2014-11-19 12:06:36 +0100
committerGuillaume Bort <guillaume.bort@gmail.com>2015-01-07 11:39:15 +0100
commit5fe3a3e54f2d94c33ca84c54521aab4bd6b98c1e (patch)
treeb00df282e3464c87308642eb6e765762418ba09c /components/script/dom/window.rs
parentca876edc051c9b105747252155d0f11c31189646 (diff)
downloadservo-5fe3a3e54f2d94c33ca84c54521aab4bd6b98c1e.tar.gz
servo-5fe3a3e54f2d94c33ca84c54521aab4bd6b98c1e.zip
Fix #3936 – {Window,WorkerGlobalScope}.set{Timeout,Interval}(DOMString)
Diffstat (limited to 'components/script/dom/window.rs')
-rw-r--r--components/script/dom/window.rs46
1 files changed, 35 insertions, 11 deletions
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 5f4517aff3f..3f87ab00da8 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -8,6 +8,7 @@ use dom::bindings::codegen::Bindings::FunctionBinding::Function;
use dom::bindings::codegen::Bindings::WindowBinding;
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::codegen::InheritTypes::EventTargetCast;
+use dom::bindings::global::global_object_for_js_object;
use dom::bindings::error::Fallible;
use dom::bindings::error::Error::InvalidCharacter;
use dom::bindings::global::GlobalRef;
@@ -27,7 +28,7 @@ use page::Page;
use script_task::{TimerSource, ScriptChan};
use script_task::ScriptMsg;
use script_traits::ScriptControlChan;
-use timers::{IsInterval, TimerId, TimerManager};
+use timers::{IsInterval, TimerId, TimerManager, TimerCallback};
use servo_msg::compositor_msg::ScriptListener;
use servo_msg::constellation_msg::LoadData;
@@ -214,7 +215,16 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
}
fn SetTimeout(self, _cx: *mut JSContext, callback: Function, timeout: i32, args: Vec<JSVal>) -> i32 {
- self.timers.set_timeout_or_interval(callback,
+ self.timers.set_timeout_or_interval(TimerCallback::FunctionTimerCallback(callback),
+ args,
+ timeout,
+ IsInterval::NonInterval,
+ TimerSource::FromWindow(self.page.id.clone()),
+ self.script_chan.clone())
+ }
+
+ fn SetTimeout_(self, _cx: *mut JSContext, callback: DOMString, timeout: i32, args: Vec<JSVal>) -> i32 {
+ self.timers.set_timeout_or_interval(TimerCallback::StringTimerCallback(callback),
args,
timeout,
IsInterval::NonInterval,
@@ -227,7 +237,16 @@ impl<'a> WindowMethods for JSRef<'a, Window> {
}
fn SetInterval(self, _cx: *mut JSContext, callback: Function, timeout: i32, args: Vec<JSVal>) -> i32 {
- self.timers.set_timeout_or_interval(callback,
+ self.timers.set_timeout_or_interval(TimerCallback::FunctionTimerCallback(callback),
+ args,
+ timeout,
+ IsInterval::Interval,
+ TimerSource::FromWindow(self.page.id.clone()),
+ self.script_chan.clone())
+ }
+
+ fn SetInterval_(self, _cx: *mut JSContext, callback: DOMString, timeout: i32, args: Vec<JSVal>) -> i32 {
+ self.timers.set_timeout_or_interval(TimerCallback::StringTimerCallback(callback),
args,
timeout,
IsInterval::Interval,
@@ -297,22 +316,25 @@ pub trait WindowHelpers {
fn init_browser_context(self, doc: JSRef<Document>);
fn load_url(self, href: DOMString);
fn handle_fire_timer(self, timer_id: TimerId);
- fn evaluate_js_with_result(self, code: &str) -> JSVal;
- fn evaluate_script_with_result(self, code: &str, filename: &str) -> JSVal;
}
+pub trait ScriptHelpers {
+ fn evaluate_js_on_global_with_result(self, code: &str) -> JSVal;
+ fn evaluate_script_on_global_with_result(self, code: &str, filename: &str) -> JSVal;
+}
-impl<'a> WindowHelpers for JSRef<'a, Window> {
- fn evaluate_js_with_result(self, code: &str) -> JSVal {
- self.evaluate_script_with_result(code, "")
+impl<'a, T: Reflectable> ScriptHelpers for JSRef<'a, T> {
+ fn evaluate_js_on_global_with_result(self, code: &str) -> JSVal {
+ self.evaluate_script_on_global_with_result(code, "")
}
- fn evaluate_script_with_result(self, code: &str, filename: &str) -> JSVal {
- let global = self.reflector().get_jsobject();
+ fn evaluate_script_on_global_with_result(self, code: &str, filename: &str) -> JSVal {
+ let this = self.reflector().get_jsobject();
+ let cx = global_object_for_js_object(this).root().r().get_cx();
+ let global = global_object_for_js_object(this).root().r().reflector().get_jsobject();
let code: Vec<u16> = code.as_slice().utf16_units().collect();
let mut rval = UndefinedValue();
let filename = filename.to_c_str();
- let cx = self.get_cx();
with_compartment(cx, global, || {
unsafe {
@@ -325,7 +347,9 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
}
})
}
+}
+impl<'a> WindowHelpers for JSRef<'a, Window> {
fn flush_layout(self, goal: ReflowGoal, query: ReflowQueryType) {
self.page().flush_layout(goal, query);
}