diff options
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 11 | ||||
-rw-r--r-- | components/script/dom/bindings/guard.rs | 2 | ||||
-rw-r--r-- | components/script/dom/bindings/interface.rs | 3 |
3 files changed, 13 insertions, 3 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index 8f0281be802..3191a7acc4d 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -2968,12 +2968,19 @@ class CGCollectJSONAttributesMethod(CGAbstractMethod): def definition_body(self): ret = '' interface = self.descriptor.interface + for m in interface.members: if m.isAttr() and not m.isStatic() and m.type.isJSONType(): name = m.identifier.name + conditions = MemberCondition(None, None, m.exposureSet) + ret_conditions = 'vec![' + ",".join(conditions) + "]" ret += fill( """ - rooted!(in(cx) let mut temp = UndefinedValue()); + let conditions = ${conditions}; + if !conditions.iter().any(|c| c.is_satisfied(SafeJSContext::from_ptr(cx), HandleObject::from_raw(obj), HandleObject::from_raw(obj))) { + return false; + } + rooted!(in(cx) let mut temp = UndefinedValue()); if !get_${name}(cx, obj, this, JSJitGetterCallArgs { _base: temp.handle_mut().into() }) { return false; } @@ -2983,7 +2990,7 @@ class CGCollectJSONAttributesMethod(CGAbstractMethod): return false; } """, - name=name, nameAsArray=str_to_const_array(name)) + name=name, nameAsArray=str_to_const_array(name), conditions=ret_conditions) ret += 'return true;\n' return CGGeneric(ret) diff --git a/components/script/dom/bindings/guard.rs b/components/script/dom/bindings/guard.rs index bba30e1581c..188d36fee17 100644 --- a/components/script/dom/bindings/guard.rs +++ b/components/script/dom/bindings/guard.rs @@ -50,7 +50,7 @@ pub enum Condition { } impl Condition { - fn is_satisfied(&self, cx: JSContext, obj: HandleObject, global: HandleObject) -> bool { + pub fn is_satisfied(&self, cx: JSContext, obj: HandleObject, global: HandleObject) -> bool { match *self { Condition::Pref(name) => prefs::pref_map().get(name).as_bool().unwrap_or(false), Condition::Func(f) => f(cx, obj), diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index d0b3771890e..0faecf2a91b 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -375,6 +375,9 @@ pub fn is_exposed_in(object: HandleObject, globals: Globals) -> bool { unsafe { let unwrapped = UncheckedUnwrapObject(object.get(), /* stopAtWindowProxy = */ 0); let dom_class = get_dom_class(unwrapped).unwrap(); + if (dom_class.global.is_empty()) && (!globals.is_empty()) { + return false + } globals.contains(dom_class.global) } } |