aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-02-15 19:13:02 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2016-02-15 19:13:02 +0530
commit87c6889f44f67e9c8a186e1b4d95066a4e67ecd3 (patch)
tree83263a15b4fd9f43e9851788393e4fc1672aa4e2 /components/script/dom
parentc9b2ef5c7f5b23d815e8c3c78f972f6f880d6dbd (diff)
parentae72d1dfbe37acaaa26dfa5f050bd6cad19f32a4 (diff)
downloadservo-87c6889f44f67e9c8a186e1b4d95066a4e67ecd3.tar.gz
servo-87c6889f44f67e9c8a186e1b4d95066a4e67ecd3.zip
Auto merge of #9645 - nox:fix-has-instance, r=Ms2ger
Fix the hasInstance hook of interface objects <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.svg" height="40" alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9645) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/interface.rs31
1 files changed, 18 insertions, 13 deletions
diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs
index 58646ad0307..20f5f1c9178 100644
--- a/components/script/dom/bindings/interface.rs
+++ b/components/script/dom/bindings/interface.rs
@@ -6,20 +6,19 @@
use dom::bindings::codegen::PrototypeList;
use dom::bindings::conversions::get_dom_class;
+use dom::bindings::utils::get_proto_or_iface_array;
use js::glue::UncheckedUnwrapObject;
-use js::jsapi::{Class, ClassExtension, ClassSpec, HandleObject, HandleValue, JSClass};
-use js::jsapi::{JSContext, JSFunctionSpec, JSPropertySpec, JSString, JS_DefineProperty1};
-use js::jsapi::{JS_DefineProperty2, JS_DefineProperty4, JS_GetFunctionObject};
-use js::jsapi::{JS_GetPrototype, JS_InternString, JS_LinkConstructorAndPrototype};
-use js::jsapi::{JS_NewFunction, JS_NewObject, JS_NewObjectWithUniqueType, JS_DefineProperty};
-use js::jsapi::{MutableHandleObject, MutableHandleValue, ObjectOps, RootedObject};
-use js::jsapi::{RootedString, Value};
-use js::jsapi::{RootedValue};
+use js::jsapi::{Class, ClassExtension, ClassSpec, GetGlobalForObjectCrossCompartment};
+use js::jsapi::{HandleObject, HandleValue, JSClass, JSContext, JSFunctionSpec};
+use js::jsapi::{JSPropertySpec, JSString, JS_DefineProperty1, JS_DefineProperty2};
+use js::jsapi::{JS_DefineProperty4, JS_GetFunctionObject, JS_GetPrototype, JS_InternString};
+use js::jsapi::{JS_LinkConstructorAndPrototype, JS_NewFunction, JS_NewObject};
+use js::jsapi::{JS_NewObjectWithUniqueType, JS_DefineProperty, MutableHandleObject};
+use js::jsapi::{MutableHandleValue, ObjectOps, RootedObject, RootedString, RootedValue, Value};
use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value};
use js::rust::{define_methods, define_properties};
use js::{JSPROP_ENUMERATE, JSFUN_CONSTRUCTOR, JSPROP_PERMANENT, JSPROP_READONLY};
use libc;
-use libc::c_uint;
use std::ptr;
/// Representation of an IDL constant value.
@@ -61,7 +60,7 @@ impl ConstantSpec {
/// A JSNative that cannot be null.
pub type NonNullJSNative =
- unsafe extern "C" fn (arg1: *mut JSContext, arg2: c_uint, arg3: *mut JSVal) -> bool;
+ unsafe extern "C" fn (arg1: *mut JSContext, arg2: libc::c_uint, arg3: *mut JSVal) -> bool;
/// Defines constants on `obj`.
/// Fails on JSAPI failure.
@@ -262,7 +261,7 @@ pub unsafe fn create_named_constructors(
/// http://heycam.github.io/webidl/#es-interface-hasinstance
pub unsafe fn has_instance(
cx: *mut JSContext,
- prototype: HandleObject,
+ interface_object: HandleObject,
value: HandleValue,
id: PrototypeList::ID,
index: usize)
@@ -273,8 +272,6 @@ pub unsafe fn has_instance(
}
let mut value = RootedObject::new(cx, value.to_object());
- // Steps 2-3 only concern callback interface objects.
-
if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject(value.ptr, /* stopAtOuter = */ 0)) {
if dom_class.interface_chain[index] == id {
// Step 4.
@@ -282,6 +279,14 @@ pub unsafe fn has_instance(
}
}
+ // Step 2.
+ let global = GetGlobalForObjectCrossCompartment(interface_object.get());
+ assert!(!global.is_null());
+ let proto_or_iface_array = get_proto_or_iface_array(global);
+ let prototype = RootedObject::new(cx, (*proto_or_iface_array)[id as usize]);
+ assert!(!prototype.ptr.is_null());
+ // Step 3 only concern legacy callback interface objects (i.e. NodeFilter).
+
while JS_GetPrototype(cx, value.handle(), value.handle_mut()) {
if value.ptr.is_null() {
// Step 5.2.