script/dom/
idbkeyrange.rs1use dom_struct::dom_struct;
6use js::gc::MutableHandleValue;
7use js::rust::HandleValue;
8use net_traits::indexeddb_thread::IndexedDBKeyRange;
9use script_bindings::codegen::GenericBindings::IDBKeyRangeBinding::IDBKeyRangeMethods;
10use script_bindings::root::DomRoot;
11use script_bindings::script_runtime::CanGc;
12
13use crate::dom::bindings::error::{Error, Fallible};
14use crate::dom::bindings::import::module::SafeJSContext;
15use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
16use crate::dom::globalscope::GlobalScope;
17use crate::indexed_db::{convert_value_to_key, key_type_to_jsval};
18
19#[dom_struct]
20pub struct IDBKeyRange {
21 reflector_: Reflector,
22 #[no_trace]
23 inner: IndexedDBKeyRange,
24}
25
26impl IDBKeyRange {
27 pub fn new_inherited(inner: IndexedDBKeyRange) -> Self {
28 IDBKeyRange {
29 reflector_: Reflector::new(),
30 inner,
31 }
32 }
33
34 pub fn new(global: &GlobalScope, inner: IndexedDBKeyRange, can_gc: CanGc) -> DomRoot<Self> {
35 reflect_dom_object(Box::new(IDBKeyRange::new_inherited(inner)), global, can_gc)
36 }
37
38 pub fn inner(&self) -> &IndexedDBKeyRange {
39 &self.inner
40 }
41}
42
43impl IDBKeyRangeMethods<crate::DomTypeHolder> for IDBKeyRange {
44 fn Lower(&self, cx: SafeJSContext, answer: MutableHandleValue) {
46 if let Some(lower) = self.inner.lower.as_ref() {
47 key_type_to_jsval(cx, lower, answer);
48 }
49 }
50
51 fn Upper(&self, cx: SafeJSContext, answer: MutableHandleValue) {
53 if let Some(upper) = self.inner.upper.as_ref() {
54 key_type_to_jsval(cx, upper, answer);
55 }
56 }
57
58 fn LowerOpen(&self) -> bool {
60 self.inner.lower_open
61 }
62
63 fn UpperOpen(&self) -> bool {
65 self.inner.upper_open
66 }
67
68 fn Only(
70 cx: SafeJSContext,
71 global: &GlobalScope,
72 value: HandleValue,
73 ) -> Fallible<DomRoot<IDBKeyRange>> {
74 let key = convert_value_to_key(cx, value, None)?;
75 let inner = IndexedDBKeyRange::only(key);
76 Ok(IDBKeyRange::new(global, inner, CanGc::note()))
77 }
78
79 fn LowerBound(
81 cx: SafeJSContext,
82 global: &GlobalScope,
83 lower: HandleValue,
84 open: bool,
85 ) -> Fallible<DomRoot<IDBKeyRange>> {
86 let key = convert_value_to_key(cx, lower, None)?;
87 let inner = IndexedDBKeyRange::lower_bound(key, open);
88 Ok(IDBKeyRange::new(global, inner, CanGc::note()))
89 }
90
91 fn UpperBound(
93 cx: SafeJSContext,
94 global: &GlobalScope,
95 upper: HandleValue,
96 open: bool,
97 ) -> Fallible<DomRoot<IDBKeyRange>> {
98 let key = convert_value_to_key(cx, upper, None)?;
99 let inner = IndexedDBKeyRange::upper_bound(key, open);
100 Ok(IDBKeyRange::new(global, inner, CanGc::note()))
101 }
102
103 fn Bound(
105 cx: SafeJSContext,
106 global: &GlobalScope,
107 lower: HandleValue,
108 upper: HandleValue,
109 lower_open: bool,
110 upper_open: bool,
111 ) -> Fallible<DomRoot<IDBKeyRange>> {
112 let lower_key = convert_value_to_key(cx, lower, None)?;
116
117 let upper_key = convert_value_to_key(cx, upper, None)?;
121
122 if lower_key > upper_key {
124 return Err(Error::Data);
125 }
126
127 let inner =
131 IndexedDBKeyRange::new(Some(lower_key), Some(upper_key), lower_open, upper_open);
132 Ok(IDBKeyRange::new(global, inner, CanGc::note()))
133 }
134
135 fn Includes(&self, cx: SafeJSContext, value: HandleValue) -> Fallible<bool> {
137 let key = convert_value_to_key(cx, value, None)?;
138 if self.inner.contains(&key) {
139 return Ok(true);
140 }
141 Ok(false)
142 }
143}