From 5fe3a3e54f2d94c33ca84c54521aab4bd6b98c1e Mon Sep 17 00:00:00 2001 From: Guillaume Bort Date: Wed, 19 Nov 2014 12:06:36 +0100 Subject: =?UTF-8?q?Fix=20#3936=20=E2=80=93=20{Window,WorkerGlobalScope}.se?= =?UTF-8?q?t{Timeout,Interval}(DOMString)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/script/dom/bindings/utils.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'components/script/dom/bindings/utils.rs') diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index ec809144374..8119978cff9 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::PrototypeList; use dom::bindings::codegen::PrototypeList::MAX_PROTO_CHAIN_LENGTH; -use dom::bindings::conversions::unwrap_jsmanaged; +use dom::bindings::conversions::{unwrap_jsmanaged, is_dom_class}; use dom::bindings::error::throw_type_error; use dom::bindings::global::GlobalRef; use dom::bindings::js::{Temporary, Root}; @@ -20,7 +20,8 @@ use libc::c_uint; use std::cell::Cell; use std::mem; use std::ptr; -use js::glue::{RUST_JSID_IS_INT, RUST_JSID_TO_INT}; +use js::glue::UnwrapObject; +use js::glue::{IsWrapper, RUST_JSID_IS_INT, RUST_JSID_TO_INT}; use js::jsapi::{JS_AlreadyHasOwnProperty, JS_NewFunction}; use js::jsapi::{JS_DefineProperties, JS_ForwardGetPropertyTo}; use js::jsapi::{JS_GetClass, JS_LinkConstructorAndPrototype, JS_GetStringCharsAndLength}; @@ -464,6 +465,28 @@ pub fn FindEnumStringIndex(cx: *mut JSContext, } } +/// Returns wether `obj` is a platform object +/// http://heycam.github.io/webidl/#dfn-platform-object +pub fn IsPlatformObject(obj: *mut JSObject) -> bool { + unsafe { + // Fast-path the common case + let mut clasp = JS_GetClass(obj); + if is_dom_class(&*clasp) { + return true; + } + // Now for simplicity check for security wrappers before anything else + if IsWrapper(obj) == 1 { + let unwrapped_obj = UnwrapObject(obj, /* stopAtOuter = */ 0, ptr::null_mut()); + if unwrapped_obj.is_null() { + return false; + } + clasp = js::jsapi::JS_GetClass(obj); + } + // TODO also check if JS_IsArrayBufferObject + return is_dom_class(&*clasp); + } +} + /// Get the property with name `property` from `object`. /// Returns `Err(())` on JSAPI failure (there is a pending exception), and /// `Ok(None)` if there was no property with the given name. -- cgit v1.2.3