1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * vim: set ts=8 sts=4 et sw=4 tw=99:
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "jswrapper.h"
8
9 #include "jsobjinlines.h"
10
11 using namespace js;
12
13 bool
getOwnPropertyDescriptor(JSContext * cx,HandleObject wrapper,HandleId id,MutableHandle<PropertyDescriptor> desc) const14 OpaqueCrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext* cx,
15 HandleObject wrapper,
16 HandleId id,
17 MutableHandle<PropertyDescriptor> desc) const
18 {
19 desc.object().set(nullptr);
20 return true;
21 }
22
23 bool
defineProperty(JSContext * cx,HandleObject wrapper,HandleId id,Handle<PropertyDescriptor> desc,ObjectOpResult & result) const24 OpaqueCrossCompartmentWrapper::defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
25 Handle<PropertyDescriptor> desc,
26 ObjectOpResult& result) const
27 {
28 return result.succeed();
29 }
30
31 bool
ownPropertyKeys(JSContext * cx,HandleObject wrapper,AutoIdVector & props) const32 OpaqueCrossCompartmentWrapper::ownPropertyKeys(JSContext* cx, HandleObject wrapper,
33 AutoIdVector& props) const
34 {
35 return true;
36 }
37
38 bool
delete_(JSContext * cx,HandleObject wrapper,HandleId id,ObjectOpResult & result) const39 OpaqueCrossCompartmentWrapper::delete_(JSContext* cx, HandleObject wrapper, HandleId id,
40 ObjectOpResult& result) const
41 {
42 return result.succeed();
43 }
44
45 bool
enumerate(JSContext * cx,HandleObject wrapper,MutableHandleObject objp) const46 OpaqueCrossCompartmentWrapper::enumerate(JSContext* cx, HandleObject wrapper,
47 MutableHandleObject objp) const
48 {
49 return BaseProxyHandler::enumerate(cx, wrapper, objp);
50 }
51
52 bool
getPrototype(JSContext * cx,HandleObject proxy,MutableHandleObject protop) const53 OpaqueCrossCompartmentWrapper::getPrototype(JSContext* cx, HandleObject proxy,
54 MutableHandleObject protop) const
55 {
56 protop.set(nullptr);
57 return true;
58 }
59
60 bool
setPrototype(JSContext * cx,HandleObject proxy,HandleObject proto,ObjectOpResult & result) const61 OpaqueCrossCompartmentWrapper::setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto,
62 ObjectOpResult& result) const
63 {
64 return result.succeed();
65 }
66
67 bool
getPrototypeIfOrdinary(JSContext * cx,HandleObject proxy,bool * isOrdinary,MutableHandleObject protop) const68 OpaqueCrossCompartmentWrapper::getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy,
69 bool* isOrdinary,
70 MutableHandleObject protop) const
71 {
72 *isOrdinary = false;
73 return true;
74 }
75
76 bool
setImmutablePrototype(JSContext * cx,HandleObject proxy,bool * succeeded) const77 OpaqueCrossCompartmentWrapper::setImmutablePrototype(JSContext* cx, HandleObject proxy,
78 bool* succeeded) const
79 {
80 *succeeded = false;
81 return true;
82 }
83
84 bool
preventExtensions(JSContext * cx,HandleObject wrapper,ObjectOpResult & result) const85 OpaqueCrossCompartmentWrapper::preventExtensions(JSContext* cx, HandleObject wrapper,
86 ObjectOpResult& result) const
87 {
88 return result.failCantPreventExtensions();
89 }
90
91 bool
isExtensible(JSContext * cx,HandleObject wrapper,bool * extensible) const92 OpaqueCrossCompartmentWrapper::isExtensible(JSContext* cx, HandleObject wrapper,
93 bool* extensible) const
94 {
95 *extensible = true;
96 return true;
97 }
98
99 bool
has(JSContext * cx,HandleObject wrapper,HandleId id,bool * bp) const100 OpaqueCrossCompartmentWrapper::has(JSContext* cx, HandleObject wrapper, HandleId id,
101 bool* bp) const
102 {
103 return BaseProxyHandler::has(cx, wrapper, id, bp);
104 }
105
106 bool
get(JSContext * cx,HandleObject wrapper,HandleValue receiver,HandleId id,MutableHandleValue vp) const107 OpaqueCrossCompartmentWrapper::get(JSContext* cx, HandleObject wrapper, HandleValue receiver,
108 HandleId id, MutableHandleValue vp) const
109 {
110 return BaseProxyHandler::get(cx, wrapper, receiver, id, vp);
111 }
112
113 bool
set(JSContext * cx,HandleObject wrapper,HandleId id,HandleValue v,HandleValue receiver,ObjectOpResult & result) const114 OpaqueCrossCompartmentWrapper::set(JSContext* cx, HandleObject wrapper, HandleId id,
115 HandleValue v, HandleValue receiver,
116 ObjectOpResult& result) const
117 {
118 return BaseProxyHandler::set(cx, wrapper, id, v, receiver, result);
119 }
120
121 bool
call(JSContext * cx,HandleObject wrapper,const CallArgs & args) const122 OpaqueCrossCompartmentWrapper::call(JSContext* cx, HandleObject wrapper,
123 const CallArgs& args) const
124 {
125 RootedValue v(cx, ObjectValue(*wrapper));
126 ReportIsNotFunction(cx, v);
127 return false;
128 }
129
130 bool
construct(JSContext * cx,HandleObject wrapper,const CallArgs & args) const131 OpaqueCrossCompartmentWrapper::construct(JSContext* cx, HandleObject wrapper,
132 const CallArgs& args) const
133 {
134 RootedValue v(cx, ObjectValue(*wrapper));
135 ReportIsNotFunction(cx, v);
136 return false;
137 }
138
139 bool
getPropertyDescriptor(JSContext * cx,HandleObject wrapper,HandleId id,MutableHandle<PropertyDescriptor> desc) const140 OpaqueCrossCompartmentWrapper::getPropertyDescriptor(JSContext* cx,
141 HandleObject wrapper,
142 HandleId id,
143 MutableHandle<PropertyDescriptor> desc) const
144 {
145 return BaseProxyHandler::getPropertyDescriptor(cx, wrapper, id, desc);
146 }
147
148 bool
hasOwn(JSContext * cx,HandleObject wrapper,HandleId id,bool * bp) const149 OpaqueCrossCompartmentWrapper::hasOwn(JSContext* cx, HandleObject wrapper, HandleId id,
150 bool* bp) const
151 {
152 return BaseProxyHandler::hasOwn(cx, wrapper, id, bp);
153 }
154
155 bool
getOwnEnumerablePropertyKeys(JSContext * cx,HandleObject wrapper,AutoIdVector & props) const156 OpaqueCrossCompartmentWrapper::getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper,
157 AutoIdVector& props) const
158 {
159 return BaseProxyHandler::getOwnEnumerablePropertyKeys(cx, wrapper, props);
160 }
161
162 bool
getBuiltinClass(JSContext * cx,HandleObject wrapper,ESClass * cls) const163 OpaqueCrossCompartmentWrapper::getBuiltinClass(JSContext* cx, HandleObject wrapper,
164 ESClass* cls) const
165 {
166 *cls = ESClass::Other;
167 return true;
168 }
169
170 bool
isArray(JSContext * cx,HandleObject obj,JS::IsArrayAnswer * answer) const171 OpaqueCrossCompartmentWrapper::isArray(JSContext* cx, HandleObject obj,
172 JS::IsArrayAnswer* answer) const
173 {
174 *answer = JS::IsArrayAnswer::NotArray;
175 return true;
176 }
177
178 const char*
className(JSContext * cx,HandleObject proxy) const179 OpaqueCrossCompartmentWrapper::className(JSContext* cx,
180 HandleObject proxy) const
181 {
182 return "Opaque";
183 }
184
185 JSString*
fun_toString(JSContext * cx,HandleObject proxy,unsigned indent) const186 OpaqueCrossCompartmentWrapper::fun_toString(JSContext* cx, HandleObject proxy,
187 unsigned indent) const
188 {
189 JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_INCOMPATIBLE_PROTO,
190 js_Function_str, js_toString_str, "object");
191 return nullptr;
192 }
193
194 const OpaqueCrossCompartmentWrapper OpaqueCrossCompartmentWrapper::singleton;
195