зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1166847 - Implement OpaqueCrossCompartmentWrapper;r=evilpies
This commit is contained in:
Родитель
05c931e961
Коммит
27446f880e
|
@ -893,25 +893,6 @@ PreserveWrapper(JSContext *cx, JSObject *obj)
|
|||
return mozilla::dom::TryPreserveWrapper(obj);
|
||||
}
|
||||
|
||||
class DebuggeeGlobalSecurityWrapper : public js::CrossCompartmentSecurityWrapper {
|
||||
public:
|
||||
DebuggeeGlobalSecurityWrapper()
|
||||
: js::CrossCompartmentSecurityWrapper(CROSS_COMPARTMENT, false)
|
||||
{
|
||||
}
|
||||
|
||||
bool enter(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id,
|
||||
js::Wrapper::Action act, bool* bp) const
|
||||
{
|
||||
*bp = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
static const DebuggeeGlobalSecurityWrapper singleton;
|
||||
};
|
||||
|
||||
const DebuggeeGlobalSecurityWrapper DebuggeeGlobalSecurityWrapper::singleton;
|
||||
|
||||
JSObject*
|
||||
Wrap(JSContext *cx, JS::HandleObject existing, JS::HandleObject obj)
|
||||
{
|
||||
|
@ -926,11 +907,7 @@ Wrap(JSContext *cx, JS::HandleObject existing, JS::HandleObject obj)
|
|||
if (IsDebuggerGlobal(originGlobal) || IsDebuggerSandbox(originGlobal)) {
|
||||
wrapper = &js::CrossCompartmentWrapper::singleton;
|
||||
} else {
|
||||
if (obj != originGlobal) {
|
||||
MOZ_CRASH("The should be only edges from the debugger to the debuggee global.");
|
||||
}
|
||||
|
||||
wrapper = &DebuggeeGlobalSecurityWrapper::singleton;
|
||||
wrapper = &js::OpaqueCrossCompartmentWrapper::singleton;
|
||||
}
|
||||
|
||||
if (existing) {
|
||||
|
|
|
@ -162,6 +162,57 @@ class JS_FRIEND_API(CrossCompartmentWrapper) : public Wrapper
|
|||
static const CrossCompartmentWrapper singletonWithPrototype;
|
||||
};
|
||||
|
||||
class JS_FRIEND_API(OpaqueCrossCompartmentWrapper) : public CrossCompartmentWrapper
|
||||
{
|
||||
public:
|
||||
explicit MOZ_CONSTEXPR OpaqueCrossCompartmentWrapper() : CrossCompartmentWrapper(0)
|
||||
{ }
|
||||
|
||||
/* Standard internal methods. */
|
||||
virtual bool getOwnPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
MutableHandle<JSPropertyDescriptor> desc) const override;
|
||||
virtual bool defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
Handle<JSPropertyDescriptor> desc,
|
||||
ObjectOpResult& result) const override;
|
||||
virtual bool ownPropertyKeys(JSContext* cx, HandleObject wrapper,
|
||||
AutoIdVector& props) const override;
|
||||
virtual bool delete_(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
ObjectOpResult& result) const override;
|
||||
virtual bool enumerate(JSContext* cx, HandleObject wrapper,
|
||||
MutableHandleObject objp) const override;
|
||||
virtual bool getPrototype(JSContext* cx, HandleObject wrapper,
|
||||
MutableHandleObject protop) const override;
|
||||
virtual bool setPrototype(JSContext* cx, HandleObject wrapper, HandleObject proto,
|
||||
ObjectOpResult& result) const override;
|
||||
virtual bool setImmutablePrototype(JSContext* cx, HandleObject wrapper,
|
||||
bool* succeeded) const override;
|
||||
virtual bool preventExtensions(JSContext* cx, HandleObject wrapper,
|
||||
ObjectOpResult& result) const override;
|
||||
virtual bool isExtensible(JSContext* cx, HandleObject wrapper, bool* extensible) const override;
|
||||
virtual bool has(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
bool* bp) const override;
|
||||
virtual bool get(JSContext* cx, HandleObject wrapper, HandleObject receiver,
|
||||
HandleId id, MutableHandleValue vp) const override;
|
||||
virtual bool set(JSContext* cx, HandleObject wrapper, HandleId id, HandleValue v,
|
||||
HandleValue receiver, ObjectOpResult& result) const override;
|
||||
virtual bool call(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override;
|
||||
virtual bool construct(JSContext* cx, HandleObject wrapper, const CallArgs& args) const override;
|
||||
|
||||
/* SpiderMonkey extensions. */
|
||||
virtual bool getPropertyDescriptor(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
MutableHandle<JSPropertyDescriptor> desc) const override;
|
||||
virtual bool hasOwn(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
bool* bp) const override;
|
||||
virtual bool getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper,
|
||||
AutoIdVector& props) const override;
|
||||
virtual bool objectClassIs(HandleObject obj, ESClassValue classValue, JSContext* cx) const;
|
||||
virtual const char* className(JSContext* cx, HandleObject wrapper) const override;
|
||||
virtual JSString* fun_toString(JSContext* cx, HandleObject proxy, unsigned indent) const;
|
||||
virtual bool defaultValue(JSContext* cx, HandleObject obj, JSType hint, MutableHandleValue vp) const;
|
||||
|
||||
static const OpaqueCrossCompartmentWrapper singleton;
|
||||
};
|
||||
|
||||
/*
|
||||
* Base class for security wrappers. A security wrapper is potentially hiding
|
||||
* all or part of some wrapped object thus SecurityWrapper defaults to denying
|
||||
|
|
|
@ -268,6 +268,7 @@ UNIFIED_SOURCES += [
|
|||
'proxy/CrossCompartmentWrapper.cpp',
|
||||
'proxy/DeadObjectProxy.cpp',
|
||||
'proxy/DirectProxyHandler.cpp',
|
||||
'proxy/OpaqueCrossCompartmentWrapper.cpp',
|
||||
'proxy/Proxy.cpp',
|
||||
'proxy/ScriptedDirectProxyHandler.cpp',
|
||||
'proxy/ScriptedIndirectProxyHandler.cpp',
|
||||
|
|
|
@ -0,0 +1,183 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "jswrapper.h"
|
||||
|
||||
#include "jsobjinlines.h"
|
||||
|
||||
using namespace js;
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::getOwnPropertyDescriptor(JSContext* cx,
|
||||
HandleObject wrapper,
|
||||
HandleId id,
|
||||
MutableHandle<PropertyDescriptor> desc) const
|
||||
{
|
||||
desc.object().set(nullptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::defineProperty(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
Handle<JSPropertyDescriptor> desc,
|
||||
ObjectOpResult& result) const
|
||||
{
|
||||
return result.succeed();
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::ownPropertyKeys(JSContext* cx, HandleObject wrapper,
|
||||
AutoIdVector& props) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::delete_(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
ObjectOpResult& result) const
|
||||
{
|
||||
return result.succeed();
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::enumerate(JSContext* cx, HandleObject wrapper,
|
||||
MutableHandleObject objp) const
|
||||
{
|
||||
return BaseProxyHandler::enumerate(cx, wrapper, objp);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::getPrototype(JSContext* cx, HandleObject proxy,
|
||||
MutableHandleObject protop) const
|
||||
{
|
||||
protop.set(nullptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::setPrototype(JSContext* cx, HandleObject proxy, HandleObject proto,
|
||||
ObjectOpResult& result) const
|
||||
{
|
||||
return result.succeed();
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::setImmutablePrototype(JSContext* cx, HandleObject proxy,
|
||||
bool* succeeded) const
|
||||
{
|
||||
*succeeded = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::preventExtensions(JSContext* cx, HandleObject wrapper,
|
||||
ObjectOpResult& result) const
|
||||
{
|
||||
return result.failCantPreventExtensions();
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::isExtensible(JSContext* cx, HandleObject wrapper,
|
||||
bool* extensible) const
|
||||
{
|
||||
*extensible = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::has(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
bool* bp) const
|
||||
{
|
||||
return BaseProxyHandler::has(cx, wrapper, id, bp);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::get(JSContext* cx, HandleObject wrapper, HandleObject receiver,
|
||||
HandleId id, MutableHandleValue vp) const
|
||||
{
|
||||
return BaseProxyHandler::get(cx, wrapper, receiver, id, vp);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::set(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
HandleValue v, HandleValue receiver,
|
||||
ObjectOpResult& result) const
|
||||
{
|
||||
return BaseProxyHandler::set(cx, wrapper, id, v, receiver, result);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::call(JSContext* cx, HandleObject wrapper,
|
||||
const CallArgs& args) const
|
||||
{
|
||||
RootedValue v(cx, ObjectValue(*wrapper));
|
||||
ReportIsNotFunction(cx, v);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::construct(JSContext* cx, HandleObject wrapper,
|
||||
const CallArgs& args) const
|
||||
{
|
||||
RootedValue v(cx, ObjectValue(*wrapper));
|
||||
ReportIsNotFunction(cx, v);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::getPropertyDescriptor(JSContext* cx,
|
||||
HandleObject wrapper,
|
||||
HandleId id,
|
||||
MutableHandle<JSPropertyDescriptor> desc) const
|
||||
{
|
||||
return BaseProxyHandler::getPropertyDescriptor(cx, wrapper, id, desc);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::hasOwn(JSContext* cx, HandleObject wrapper, HandleId id,
|
||||
bool* bp) const
|
||||
{
|
||||
return BaseProxyHandler::hasOwn(cx, wrapper, id, bp);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::getOwnEnumerablePropertyKeys(JSContext* cx, HandleObject wrapper,
|
||||
AutoIdVector& props) const
|
||||
{
|
||||
return BaseProxyHandler::getOwnEnumerablePropertyKeys(cx, wrapper, props);
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::objectClassIs(HandleObject obj, ESClassValue classValue,
|
||||
JSContext* cx) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const char*
|
||||
OpaqueCrossCompartmentWrapper::className(JSContext* cx,
|
||||
HandleObject proxy) const
|
||||
{
|
||||
return "Opaque";
|
||||
}
|
||||
|
||||
JSString*
|
||||
OpaqueCrossCompartmentWrapper::fun_toString(JSContext* cx, HandleObject proxy,
|
||||
unsigned indent) const
|
||||
{
|
||||
JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_INCOMPATIBLE_PROTO, js_Function_str,
|
||||
js_toString_str, "object");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool
|
||||
OpaqueCrossCompartmentWrapper::defaultValue(JSContext* cx, HandleObject wrapper, JSType hint,
|
||||
MutableHandleValue vp) const
|
||||
{
|
||||
return OrdinaryToPrimitive(cx, wrapper, hint, vp);
|
||||
}
|
||||
|
||||
const OpaqueCrossCompartmentWrapper OpaqueCrossCompartmentWrapper::singleton;
|
Загрузка…
Ссылка в новой задаче