Bug 1166847 - Implement OpaqueCrossCompartmentWrapper;r=evilpies

This commit is contained in:
Eddy Bruël 2015-06-02 16:54:54 +02:00
Родитель 05c931e961
Коммит 27446f880e
4 изменённых файлов: 236 добавлений и 24 удалений

Просмотреть файл

@ -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;