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