aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py3
-rw-r--r--components/script/dom/bindings/guard.rs12
-rw-r--r--components/script/dom/bindings/interface.rs8
-rw-r--r--components/script/dom/testbinding.rs16
-rw-r--r--components/script/dom/webidls/TestBinding.webidl22
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;
};