1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * vim: set ts=8 sts=2 et sw=2 tw=80:
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 "js/Wrapper.h"
8
9 #include "vm/JSObject-inl.h"
10
11 using namespace js;
12
getOwnPropertyDescriptor(JSContext * cx,HandleObject wrapper,HandleId id,MutableHandle<PropertyDescriptor> desc) const13 bool OpaqueCrossCompartmentWrapper::getOwnPropertyDescriptor(
14 JSContext* cx, HandleObject wrapper, HandleId id,
15 MutableHandle<PropertyDescriptor> desc) const {
16 desc.object().set(nullptr);
17 return true;
18 }
19
defineProperty(JSContext * cx,HandleObject wrapper,HandleId id,Handle<PropertyDescriptor> desc,ObjectOpResult & result) const20 bool OpaqueCrossCompartmentWrapper::defineProperty(
21 JSContext* cx, HandleObject wrapper, HandleId id,
22 Handle<PropertyDescriptor> desc, ObjectOpResult& result) const {
23 return result.succeed();
24 }
25
ownPropertyKeys(JSContext * cx,HandleObject wrapper,MutableHandleIdVector props) const26 bool OpaqueCrossCompartmentWrapper::ownPropertyKeys(
27 JSContext* cx, HandleObject wrapper, MutableHandleIdVector props) const {
28 return true;
29 }
30
delete_(JSContext * cx,HandleObject wrapper,HandleId id,ObjectOpResult & result) const31 bool OpaqueCrossCompartmentWrapper::delete_(JSContext* cx, HandleObject wrapper,
32 HandleId id,
33 ObjectOpResult& result) const {
34 return result.succeed();
35 }
36
enumerate(JSContext * cx,HandleObject proxy,MutableHandleIdVector props) const37 bool OpaqueCrossCompartmentWrapper::enumerate(
38 JSContext* cx, HandleObject proxy, MutableHandleIdVector props) const {
39 return BaseProxyHandler::enumerate(cx, proxy, props);
40 }
41
getPrototype(JSContext * cx,HandleObject proxy,MutableHandleObject protop) const42 bool OpaqueCrossCompartmentWrapper::getPrototype(
43 JSContext* cx, HandleObject proxy, MutableHandleObject protop) const {
44 protop.set(nullptr);
45 return true;
46 }
47
setPrototype(JSContext * cx,HandleObject proxy,HandleObject proto,ObjectOpResult & result) const48 bool OpaqueCrossCompartmentWrapper::setPrototype(JSContext* cx,
49 HandleObject proxy,
50 HandleObject proto,
51 ObjectOpResult& result) const {
52 return result.succeed();
53 }
54
getPrototypeIfOrdinary(JSContext * cx,HandleObject proxy,bool * isOrdinary,MutableHandleObject protop) const55 bool OpaqueCrossCompartmentWrapper::getPrototypeIfOrdinary(
56 JSContext* cx, HandleObject proxy, bool* isOrdinary,
57 MutableHandleObject protop) const {
58 *isOrdinary = false;
59 return true;
60 }
61
setImmutablePrototype(JSContext * cx,HandleObject proxy,bool * succeeded) const62 bool OpaqueCrossCompartmentWrapper::setImmutablePrototype(
63 JSContext* cx, HandleObject proxy, bool* succeeded) const {
64 *succeeded = false;
65 return true;
66 }
67
preventExtensions(JSContext * cx,HandleObject wrapper,ObjectOpResult & result) const68 bool OpaqueCrossCompartmentWrapper::preventExtensions(
69 JSContext* cx, HandleObject wrapper, ObjectOpResult& result) const {
70 return result.failCantPreventExtensions();
71 }
72
isExtensible(JSContext * cx,HandleObject wrapper,bool * extensible) const73 bool OpaqueCrossCompartmentWrapper::isExtensible(JSContext* cx,
74 HandleObject wrapper,
75 bool* extensible) const {
76 *extensible = true;
77 return true;
78 }
79
has(JSContext * cx,HandleObject wrapper,HandleId id,bool * bp) const80 bool OpaqueCrossCompartmentWrapper::has(JSContext* cx, HandleObject wrapper,
81 HandleId id, bool* bp) const {
82 return BaseProxyHandler::has(cx, wrapper, id, bp);
83 }
84
get(JSContext * cx,HandleObject wrapper,HandleValue receiver,HandleId id,MutableHandleValue vp) const85 bool OpaqueCrossCompartmentWrapper::get(JSContext* cx, HandleObject wrapper,
86 HandleValue receiver, HandleId id,
87 MutableHandleValue vp) const {
88 return BaseProxyHandler::get(cx, wrapper, receiver, id, vp);
89 }
90
set(JSContext * cx,HandleObject wrapper,HandleId id,HandleValue v,HandleValue receiver,ObjectOpResult & result) const91 bool OpaqueCrossCompartmentWrapper::set(JSContext* cx, HandleObject wrapper,
92 HandleId id, HandleValue v,
93 HandleValue receiver,
94 ObjectOpResult& result) const {
95 return BaseProxyHandler::set(cx, wrapper, id, v, receiver, result);
96 }
97
call(JSContext * cx,HandleObject wrapper,const CallArgs & args) const98 bool OpaqueCrossCompartmentWrapper::call(JSContext* cx, HandleObject wrapper,
99 const CallArgs& args) const {
100 RootedValue v(cx, ObjectValue(*wrapper));
101 ReportIsNotFunction(cx, v);
102 return false;
103 }
104
construct(JSContext * cx,HandleObject wrapper,const CallArgs & args) const105 bool OpaqueCrossCompartmentWrapper::construct(JSContext* cx,
106 HandleObject wrapper,
107 const CallArgs& args) const {
108 RootedValue v(cx, ObjectValue(*wrapper));
109 ReportIsNotFunction(cx, v);
110 return false;
111 }
112
hasOwn(JSContext * cx,HandleObject wrapper,HandleId id,bool * bp) const113 bool OpaqueCrossCompartmentWrapper::hasOwn(JSContext* cx, HandleObject wrapper,
114 HandleId id, bool* bp) const {
115 return BaseProxyHandler::hasOwn(cx, wrapper, id, bp);
116 }
117
getOwnEnumerablePropertyKeys(JSContext * cx,HandleObject wrapper,MutableHandleIdVector props) const118 bool OpaqueCrossCompartmentWrapper::getOwnEnumerablePropertyKeys(
119 JSContext* cx, HandleObject wrapper, MutableHandleIdVector props) const {
120 return BaseProxyHandler::getOwnEnumerablePropertyKeys(cx, wrapper, props);
121 }
122
getBuiltinClass(JSContext * cx,HandleObject wrapper,ESClass * cls) const123 bool OpaqueCrossCompartmentWrapper::getBuiltinClass(JSContext* cx,
124 HandleObject wrapper,
125 ESClass* cls) const {
126 *cls = ESClass::Other;
127 return true;
128 }
129
isArray(JSContext * cx,HandleObject obj,JS::IsArrayAnswer * answer) const130 bool OpaqueCrossCompartmentWrapper::isArray(JSContext* cx, HandleObject obj,
131 JS::IsArrayAnswer* answer) const {
132 *answer = JS::IsArrayAnswer::NotArray;
133 return true;
134 }
135
hasInstance(JSContext * cx,HandleObject wrapper,MutableHandleValue v,bool * bp) const136 bool OpaqueCrossCompartmentWrapper::hasInstance(JSContext* cx,
137 HandleObject wrapper,
138 MutableHandleValue v,
139 bool* bp) const {
140 *bp = false;
141 return true;
142 }
143
className(JSContext * cx,HandleObject proxy) const144 const char* OpaqueCrossCompartmentWrapper::className(JSContext* cx,
145 HandleObject proxy) const {
146 return "Opaque";
147 }
148
fun_toString(JSContext * cx,HandleObject proxy,bool isToSource) const149 JSString* OpaqueCrossCompartmentWrapper::fun_toString(JSContext* cx,
150 HandleObject proxy,
151 bool isToSource) const {
152 JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
153 JSMSG_INCOMPATIBLE_PROTO, js_Function_str,
154 js_toString_str, "object");
155 return nullptr;
156 }
157
158 const OpaqueCrossCompartmentWrapper OpaqueCrossCompartmentWrapper::singleton;
159