зеркало из https://github.com/mozilla/gecko-dev.git
Bug 828607 - Fix exact rooting in jsproxy; r=evilpie
--HG-- rename : extensions/cookie/test/frame_clear_browser_data.html => dom/tests/mochitest/localstorage/frame_clear_browser_data.html rename : extensions/cookie/test/test_app_cleardata_permissions.html => extensions/cookie/test/test_app_uninstall_permissions.html rename : services/crypto/cryptoComponents.manifest => services/sync/SyncComponents.manifest rename : toolkit/components/passwordmgr/test/test_privbrowsing_perwindowpb.html => toolkit/components/passwordmgr/test/test_privbrowsing.html extra : rebase_source : 60c8a3c9390572c40c817d4d6e1e21056920e046
This commit is contained in:
Родитель
1e1a3187d9
Коммит
83418c4ac8
|
@ -28,6 +28,8 @@
|
||||||
#include "vm/ObjectImpl.h"
|
#include "vm/ObjectImpl.h"
|
||||||
#include "vm/String.h"
|
#include "vm/String.h"
|
||||||
|
|
||||||
|
ForwardDeclareJS(Object);
|
||||||
|
|
||||||
namespace JS {
|
namespace JS {
|
||||||
struct ObjectsExtraSizes;
|
struct ObjectsExtraSizes;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,14 +27,14 @@ using namespace js;
|
||||||
using namespace js::gc;
|
using namespace js::gc;
|
||||||
|
|
||||||
static inline HeapSlot &
|
static inline HeapSlot &
|
||||||
GetCall(JSObject *proxy)
|
GetCall(UnrootedObject proxy)
|
||||||
{
|
{
|
||||||
JS_ASSERT(IsFunctionProxy(proxy));
|
JS_ASSERT(IsFunctionProxy(proxy));
|
||||||
return proxy->getSlotRef(JSSLOT_PROXY_CALL);
|
return proxy->getSlotRef(JSSLOT_PROXY_CALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Value
|
static inline Value
|
||||||
GetConstruct(JSObject *proxy)
|
GetConstruct(UnrootedObject proxy)
|
||||||
{
|
{
|
||||||
if (proxy->slotSpan() <= JSSLOT_PROXY_CONSTRUCT)
|
if (proxy->slotSpan() <= JSSLOT_PROXY_CONSTRUCT)
|
||||||
return UndefinedValue();
|
return UndefinedValue();
|
||||||
|
@ -42,7 +42,7 @@ GetConstruct(JSObject *proxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline HeapSlot &
|
static inline HeapSlot &
|
||||||
GetFunctionProxyConstruct(JSObject *proxy)
|
GetFunctionProxyConstruct(UnrootedObject proxy)
|
||||||
{
|
{
|
||||||
JS_ASSERT(IsFunctionProxy(proxy));
|
JS_ASSERT(IsFunctionProxy(proxy));
|
||||||
JS_ASSERT(proxy->slotSpan() > JSSLOT_PROXY_CONSTRUCT);
|
JS_ASSERT(proxy->slotSpan() > JSSLOT_PROXY_CONSTRUCT);
|
||||||
|
@ -60,8 +60,10 @@ BaseProxyHandler::~BaseProxyHandler()
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
BaseProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
|
BaseProxyHandler::has(JSContext *cx, JSObject *proxy_, jsid id_, bool *bp)
|
||||||
{
|
{
|
||||||
|
RootedObject proxy(cx, proxy_);
|
||||||
|
RootedId id(cx, id_);
|
||||||
AutoPropertyDescriptorRooter desc(cx);
|
AutoPropertyDescriptorRooter desc(cx);
|
||||||
if (!getPropertyDescriptor(cx, proxy, id, &desc, 0))
|
if (!getPropertyDescriptor(cx, proxy, id, &desc, 0))
|
||||||
return false;
|
return false;
|
||||||
|
@ -70,8 +72,10 @@ BaseProxyHandler::has(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
BaseProxyHandler::hasOwn(JSContext *cx, JSObject *proxy, jsid id, bool *bp)
|
BaseProxyHandler::hasOwn(JSContext *cx, JSObject *proxy_, jsid id_, bool *bp)
|
||||||
{
|
{
|
||||||
|
RootedObject proxy(cx, proxy_);
|
||||||
|
RootedId id(cx, id_);
|
||||||
AutoPropertyDescriptorRooter desc(cx);
|
AutoPropertyDescriptorRooter desc(cx);
|
||||||
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0))
|
if (!getOwnPropertyDescriptor(cx, proxy, id, &desc, 0))
|
||||||
return false;
|
return false;
|
||||||
|
@ -270,10 +274,11 @@ BaseProxyHandler::call(JSContext *cx, JSObject *proxy, unsigned argc,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
BaseProxyHandler::construct(JSContext *cx, JSObject *proxy, unsigned argc,
|
BaseProxyHandler::construct(JSContext *cx, JSObject *proxy_, unsigned argc,
|
||||||
Value *argv, Value *rval)
|
Value *argv, Value *rval)
|
||||||
{
|
{
|
||||||
Value fval = GetConstruct(proxy);
|
RootedObject proxy(cx, proxy_);
|
||||||
|
RootedValue fval(cx, GetConstruct(proxy_));
|
||||||
if (fval.isUndefined())
|
if (fval.isUndefined())
|
||||||
fval = GetCall(proxy);
|
fval = GetCall(proxy);
|
||||||
return InvokeConstructor(cx, fval, argc, argv, rval);
|
return InvokeConstructor(cx, fval, argc, argv, rval);
|
||||||
|
@ -1646,7 +1651,7 @@ ScriptedDirectProxyHandler::getOwnPropertyNames(JSContext *cx, JSObject *proxy_,
|
||||||
|
|
||||||
// step d
|
// step d
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::getOwnPropertyNames(cx, proxy_, props);
|
return DirectProxyHandler::getOwnPropertyNames(cx, proxy, props);
|
||||||
|
|
||||||
// step e
|
// step e
|
||||||
Value argv[] = {
|
Value argv[] = {
|
||||||
|
@ -1687,7 +1692,7 @@ ScriptedDirectProxyHandler::delete_(JSContext *cx, JSObject *proxy_, jsid id_, b
|
||||||
|
|
||||||
// step 4
|
// step 4
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::delete_(cx, proxy_, id_, bp);
|
return DirectProxyHandler::delete_(cx, proxy, id, bp);
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
RootedValue value(cx);
|
RootedValue value(cx);
|
||||||
|
@ -1741,7 +1746,7 @@ ScriptedDirectProxyHandler::enumerate(JSContext *cx, JSObject *proxy_, AutoIdVec
|
||||||
|
|
||||||
// step d
|
// step d
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::enumerate(cx, proxy_, props);
|
return DirectProxyHandler::enumerate(cx, proxy, props);
|
||||||
|
|
||||||
// step e
|
// step e
|
||||||
Value argv[] = {
|
Value argv[] = {
|
||||||
|
@ -1787,7 +1792,7 @@ ScriptedDirectProxyHandler::has(JSContext *cx, JSObject *proxy_, jsid id_, bool
|
||||||
|
|
||||||
// step 4
|
// step 4
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::has(cx, proxy_, id_, bp);
|
return DirectProxyHandler::has(cx, proxy, id, bp);
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
RootedValue value(cx);
|
RootedValue value(cx);
|
||||||
|
@ -1850,7 +1855,7 @@ ScriptedDirectProxyHandler::hasOwn(JSContext *cx, JSObject *proxy_, jsid id_, bo
|
||||||
|
|
||||||
// step 4
|
// step 4
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::hasOwn(cx, proxy_, id_, bp);
|
return DirectProxyHandler::hasOwn(cx, proxy, id, bp);
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
RootedValue value(cx);
|
RootedValue value(cx);
|
||||||
|
@ -1923,7 +1928,7 @@ ScriptedDirectProxyHandler::get(JSContext *cx, JSObject *proxy_, JSObject *recei
|
||||||
|
|
||||||
// step 4
|
// step 4
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::get(cx, proxy_, receiver_, id_, vp);
|
return DirectProxyHandler::get(cx, proxy, receiver, id, vp);
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
RootedValue value(cx);
|
RootedValue value(cx);
|
||||||
|
@ -1996,7 +2001,7 @@ ScriptedDirectProxyHandler::set(JSContext *cx, JSObject *proxy_, JSObject *recei
|
||||||
|
|
||||||
// step 4
|
// step 4
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::set(cx, proxy_, receiver_, id_, strict, vp);
|
return DirectProxyHandler::set(cx, proxy, receiver, id, strict, vp);
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
RootedValue value(cx);
|
RootedValue value(cx);
|
||||||
|
@ -2066,7 +2071,7 @@ ScriptedDirectProxyHandler::keys(JSContext *cx, JSObject *proxy_, AutoIdVector &
|
||||||
|
|
||||||
// step d
|
// step d
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::keys(cx, proxy_, props);
|
return DirectProxyHandler::keys(cx, proxy, props);
|
||||||
|
|
||||||
// step e
|
// step e
|
||||||
Value argv[] = {
|
Value argv[] = {
|
||||||
|
@ -2126,7 +2131,7 @@ ScriptedDirectProxyHandler::call(JSContext *cx, JSObject *proxy_, unsigned argc,
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::call(cx, proxy_, argc, vp);
|
return DirectProxyHandler::call(cx, proxy, argc, vp);
|
||||||
|
|
||||||
// step 6
|
// step 6
|
||||||
Value argv[] = {
|
Value argv[] = {
|
||||||
|
@ -2167,7 +2172,7 @@ ScriptedDirectProxyHandler::construct(JSContext *cx, JSObject *proxy_, unsigned
|
||||||
|
|
||||||
// step 5
|
// step 5
|
||||||
if (trap.isUndefined())
|
if (trap.isUndefined())
|
||||||
return DirectProxyHandler::construct(cx, proxy_, argc, argv, rval);
|
return DirectProxyHandler::construct(cx, proxy, argc, argv, rval);
|
||||||
|
|
||||||
// step 6
|
// step 6
|
||||||
Value constructArgv[] = {
|
Value constructArgv[] = {
|
||||||
|
@ -2991,7 +2996,7 @@ JS_FRIEND_DATA(Class) js::OuterWindowProxyClass = {
|
||||||
static JSBool
|
static JSBool
|
||||||
proxy_Call(JSContext *cx, unsigned argc, Value *vp)
|
proxy_Call(JSContext *cx, unsigned argc, Value *vp)
|
||||||
{
|
{
|
||||||
JSObject *proxy = &JS_CALLEE(cx, vp).toObject();
|
RootedObject proxy(cx, &JS_CALLEE(cx, vp).toObject());
|
||||||
JS_ASSERT(proxy->isProxy());
|
JS_ASSERT(proxy->isProxy());
|
||||||
return Proxy::call(cx, proxy, argc, vp);
|
return Proxy::call(cx, proxy, argc, vp);
|
||||||
}
|
}
|
||||||
|
@ -2999,10 +3004,9 @@ proxy_Call(JSContext *cx, unsigned argc, Value *vp)
|
||||||
static JSBool
|
static JSBool
|
||||||
proxy_Construct(JSContext *cx, unsigned argc, Value *vp)
|
proxy_Construct(JSContext *cx, unsigned argc, Value *vp)
|
||||||
{
|
{
|
||||||
JSObject *proxy = &JS_CALLEE(cx, vp).toObject();
|
RootedObject proxy(cx, &JS_CALLEE(cx, vp).toObject());
|
||||||
JS_ASSERT(proxy->isProxy());
|
JS_ASSERT(proxy->isProxy());
|
||||||
bool ok = Proxy::construct(cx, proxy, argc, JS_ARGV(cx, vp), vp);
|
return Proxy::construct(cx, proxy, argc, JS_ARGV(cx, vp), vp);
|
||||||
return ok;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_FRIEND_DATA(Class) js::FunctionProxyClass = {
|
JS_FRIEND_DATA(Class) js::FunctionProxyClass = {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче