diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/bindings/codegen/CodegenRust.py | 3 | ||||
-rw-r--r-- | components/script/dom/bindings/guard.rs | 12 | ||||
-rw-r--r-- | components/script/dom/bindings/interface.rs | 8 | ||||
-rw-r--r-- | components/script/dom/testbinding.rs | 16 | ||||
-rw-r--r-- | components/script/dom/webidls/TestBinding.webidl | 22 |
5 files changed, 53 insertions, 8 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index f418a1ba569..73d9f7f3ed0 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1334,8 +1334,11 @@ def MemberCondition(pref, func): """ assert pref is None or isinstance(pref, str) assert func is None or isinstance(func, str) + assert func is None or pref is None if pref: return 'Condition::Pref("%s")' % pref + if func: + return 'Condition::Func(%s)' % func return "Condition::Satisfied" diff --git a/components/script/dom/bindings/guard.rs b/components/script/dom/bindings/guard.rs index 15b7c418a31..40faebbd4f2 100644 --- a/components/script/dom/bindings/guard.rs +++ b/components/script/dom/bindings/guard.rs @@ -4,6 +4,7 @@ //! Machinery to conditionally expose things. +use js::jsapi::{HandleObject, JSContext}; use util::prefs::get_pref; /// A container with a condition. @@ -22,8 +23,10 @@ impl<T: Clone + Copy> Guard<T> { } /// Expose the value if the condition is satisfied. - pub fn expose(&self) -> Option<T> { - if self.condition.is_satisfied() { + /// + /// The passed handle is the object on which the value may be exposed. + pub unsafe fn expose(&self, cx: *mut JSContext, obj: HandleObject) -> Option<T> { + if self.condition.is_satisfied(cx, obj) { Some(self.value) } else { None @@ -33,6 +36,8 @@ impl<T: Clone + Copy> Guard<T> { /// A condition to expose things. pub enum Condition { + /// The condition is satisfied if the function returns true. + Func(unsafe fn(*mut JSContext, HandleObject) -> bool), /// The condition is satisfied if the preference is set. Pref(&'static str), /// The condition is always satisfied. @@ -40,9 +45,10 @@ pub enum Condition { } impl Condition { - fn is_satisfied(&self) -> bool { + unsafe fn is_satisfied(&self, cx: *mut JSContext, obj: HandleObject) -> bool { match *self { Condition::Pref(name) => get_pref(name).as_boolean().unwrap_or(false), + Condition::Func(f) => f(cx, obj), Condition::Satisfied => true, } } diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index 371e70372ac..590e57ba8e0 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -220,7 +220,7 @@ pub unsafe fn create_callback_interface_object( rval.set(JS_NewObject(cx, ptr::null())); assert!(!rval.ptr.is_null()); for guard in constants { - if let Some(specs) = guard.expose() { + if let Some(specs) = guard.expose(cx, rval.handle()) { define_constants(cx, rval.handle(), specs); } } @@ -369,7 +369,7 @@ unsafe fn create_object( define_guarded_methods(cx, rval.handle(), methods); define_guarded_properties(cx, rval.handle(), properties); for guard in constants { - if let Some(specs) = guard.expose() { + if let Some(specs) = guard.expose(cx, rval.handle()) { define_constants(cx, rval.handle(), specs); } } @@ -381,7 +381,7 @@ pub unsafe fn define_guarded_methods( obj: HandleObject, methods: &[Guard<&'static [JSFunctionSpec]>]) { for guard in methods { - if let Some(specs) = guard.expose() { + if let Some(specs) = guard.expose(cx, obj) { define_methods(cx, obj, specs).unwrap(); } } @@ -393,7 +393,7 @@ pub unsafe fn define_guarded_properties( obj: HandleObject, properties: &[Guard<&'static [JSPropertySpec]>]) { for guard in properties { - if let Some(specs) = guard.expose() { + if let Some(specs) = guard.expose(cx, obj) { define_properties(cx, obj, specs).unwrap(); } } diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index faf53596ecc..5ff0e0bd272 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -24,7 +24,7 @@ use dom::bindings::str::{ByteString, DOMString, USVString}; use dom::bindings::weakref::MutableWeakRef; use dom::blob::{Blob, DataSlice}; use dom::url::URL; -use js::jsapi::{HandleValue, JSContext, JSObject}; +use js::jsapi::{HandleObject, HandleValue, JSContext, JSObject}; use js::jsval::{JSVal, NullValue}; use std::borrow::ToOwned; use std::ptr; @@ -567,6 +567,10 @@ impl TestBindingMethods for TestBinding { fn PrefControlledAttributeEnabled(&self) -> bool { false } fn PrefControlledMethodDisabled(&self) {} fn PrefControlledMethodEnabled(&self) {} + fn FuncControlledAttributeDisabled(&self) -> bool { false } + fn FuncControlledAttributeEnabled(&self) -> bool { false } + fn FuncControlledMethodDisabled(&self) {} + fn FuncControlledMethodEnabled(&self) {} } impl TestBinding { @@ -577,4 +581,14 @@ impl TestBinding { pub fn PrefControlledStaticAttributeEnabled(_: GlobalRef) -> bool { false } pub fn PrefControlledStaticMethodDisabled(_: GlobalRef) {} pub fn PrefControlledStaticMethodEnabled(_: GlobalRef) {} + pub fn FuncControlledStaticAttributeDisabled(_: GlobalRef) -> bool { false } + pub fn FuncControlledStaticAttributeEnabled(_: GlobalRef) -> bool { false } + pub fn FuncControlledStaticMethodDisabled(_: GlobalRef) {} + pub fn FuncControlledStaticMethodEnabled(_: GlobalRef) {} +} + +#[allow(unsafe_code)] +impl TestBinding { + pub unsafe fn condition_satisfied(_: *mut JSContext, _: HandleObject) -> bool { true } + pub unsafe fn condition_unsatisfied(_: *mut JSContext, _: HandleObject) -> bool { false } } diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index 6706ccfdaa9..cdfb9fd18ae 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -433,4 +433,26 @@ interface TestBinding { static void prefControlledStaticMethodEnabled(); [Pref="dom.testbinding.prefcontrolled2.enabled"] const unsigned short prefControlledConstEnabled = 0; + + [Func="TestBinding::condition_unsatisfied"] + readonly attribute boolean funcControlledAttributeDisabled; + [Func="TestBinding::condition_unsatisfied"] + static readonly attribute boolean funcControlledStaticAttributeDisabled; + [Func="TestBinding::condition_unsatisfied"] + void funcControlledMethodDisabled(); + [Func="TestBinding::condition_unsatisfied"] + static void funcControlledStaticMethodDisabled(); + [Func="TestBinding::condition_unsatisfied"] + const unsigned short funcControlledConstDisabled = 0; + + [Func="TestBinding::condition_satisfied"] + readonly attribute boolean funcControlledAttributeEnabled; + [Func="TestBinding::condition_satisfied"] + static readonly attribute boolean funcControlledStaticAttributeEnabled; + [Func="TestBinding::condition_satisfied"] + void funcControlledMethodEnabled(); + [Func="TestBinding::condition_satisfied"] + static void funcControlledStaticMethodEnabled(); + [Func="TestBinding::condition_satisfied"] + const unsigned short funcControlledConstEnabled = 0; }; |