Bug 1490632 - Always use braces for if/for/while statements in js/ipc. r=evilpie

Differential Revision: https://phabricator.services.mozilla.com/D5661

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Jan de Mooij 2018-09-12 20:04:14 +00:00
Родитель 49446b1a78
Коммит 6b342c5c13
7 изменённых файлов: 494 добавлений и 248 удалений

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

@ -16,8 +16,9 @@ CPOWTimer::CPOWTimer(JSContext* cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM_IN_IMPL)
, startInterval_(0)
{
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
if (!js::GetStopwatchIsMonitoringCPOW(cx))
if (!js::GetStopwatchIsMonitoringCPOW(cx)) {
return;
}
cx_ = cx;
startInterval_ = JS_Now();
}

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

@ -128,8 +128,9 @@ class Logging
nsAutoCString tmp;
out.Truncate();
for (size_t i = 0; i < values.Length(); i++) {
if (i)
if (i) {
out.AppendLiteral(", ");
}
if (values[i].type() == JSParam::Tvoid_t) {
out.AppendLiteral("<void>");
} else {

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

@ -75,8 +75,9 @@ JavaScriptParent::allowMessage(JSContext* cx)
MessageChannel* channel = GetIPCChannel();
bool isSafe = channel->IsInTransaction();
if (isSafe)
if (isSafe) {
return true;
}
nsIGlobalObject* global = dom::GetIncumbentGlobal();
JS::Rooted<JSObject*> jsGlobal(cx, global ? global->GetGlobalJSObject() : nullptr);
@ -134,14 +135,16 @@ JavaScriptParent::scopeForTargetObjects()
void
JavaScriptParent::afterProcessTask()
{
if (savedNextCPOWNumber_ == nextCPOWNumber_)
if (savedNextCPOWNumber_ == nextCPOWNumber_) {
return;
}
savedNextCPOWNumber_ = nextCPOWNumber_;
MOZ_ASSERT(nextCPOWNumber_ > 0);
if (active())
if (active()) {
Unused << SendDropTemporaryStrongReferences(nextCPOWNumber_ - 1);
}
}
PJavaScriptParent*
@ -160,7 +163,8 @@ void
mozilla::jsipc::AfterProcessTask()
{
for (auto* cp : ContentParent::AllProcesses(ContentParent::eLive)) {
if (PJavaScriptParent* p = LoneManagedOrNullAsserts(cp->ManagedPJavaScriptParent()))
if (PJavaScriptParent* p = LoneManagedOrNullAsserts(cp->ManagedPJavaScriptParent())) {
static_cast<JavaScriptParent*>(p)->afterProcessTask();
}
}
}

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

@ -28,8 +28,9 @@ void
IdToObjectMap::trace(JSTracer* trc, uint64_t minimumId)
{
for (Table::Range r(table_.all()); !r.empty(); r.popFront()) {
if (r.front().key().serialNumber() >= minimumId)
if (r.front().key().serialNumber() >= minimumId) {
JS::TraceEdge(trc, &r.front().value(), "ipc-object");
}
}
}
@ -39,8 +40,9 @@ IdToObjectMap::sweep()
for (Table::Enum e(table_); !e.empty(); e.popFront()) {
JS::Heap<JSObject*>* objp = &e.front().value();
JS_UpdateWeakPointerAfterGC(objp);
if (!*objp)
if (!*objp) {
e.removeFront();
}
}
}
@ -48,8 +50,9 @@ JSObject*
IdToObjectMap::find(ObjectId id)
{
Table::Ptr p = table_.lookup(id);
if (!p)
if (!p) {
return nullptr;
}
return p->value();
}
@ -57,8 +60,9 @@ JSObject*
IdToObjectMap::findPreserveColor(ObjectId id)
{
Table::Ptr p = table_.lookup(id);
if (!p)
if (!p) {
return nullptr;
}
return p->value().unbarrieredGet();
}
@ -91,8 +95,9 @@ bool
IdToObjectMap::has(const ObjectId& id, const JSObject* obj) const
{
auto p = table_.lookup(id);
if (!p)
if (!p) {
return false;
}
return p->value() == obj;
}
#endif
@ -118,8 +123,9 @@ ObjectId
ObjectToIdMap::find(JSObject* obj)
{
Table::Ptr p = table_.lookup(obj);
if (!p)
if (!p) {
return ObjectId::nullId();
}
return p->value();
}
@ -174,8 +180,9 @@ void
JavaScriptShared::decref()
{
refcount_--;
if (!refcount_)
if (!refcount_) {
delete this;
}
}
void
@ -188,12 +195,14 @@ bool
JavaScriptShared::convertIdToGeckoString(JSContext* cx, JS::HandleId id, nsString* to)
{
RootedValue idval(cx);
if (!JS_IdToValue(cx, id, &idval))
if (!JS_IdToValue(cx, id, &idval)) {
return false;
}
RootedString str(cx, ToString(cx, idval));
if (!str)
if (!str) {
return false;
}
return AssignJSString(cx, *to, str);
}
@ -202,8 +211,9 @@ bool
JavaScriptShared::convertGeckoStringToId(JSContext* cx, const nsString& from, JS::MutableHandleId to)
{
RootedString str(cx, JS_NewUCStringCopyN(cx, from.BeginReading(), from.Length()));
if (!str)
if (!str) {
return false;
}
return JS_StringToId(cx, str, to);
}
@ -235,8 +245,9 @@ JavaScriptShared::toVariant(JSContext* cx, JS::HandleValue from, JSVariant* to)
}
ObjectVariant objVar;
if (!toObjectVariant(cx, obj, &objVar))
if (!toObjectVariant(cx, obj, &objVar)) {
return false;
}
*to = objVar;
return true;
}
@ -246,8 +257,9 @@ JavaScriptShared::toVariant(JSContext* cx, JS::HandleValue from, JSVariant* to)
RootedSymbol sym(cx, from.toSymbol());
SymbolVariant symVar;
if (!toSymbolVariant(cx, sym, &symVar))
if (!toSymbolVariant(cx, sym, &symVar)) {
return false;
}
*to = symVar;
return true;
}
@ -255,17 +267,19 @@ JavaScriptShared::toVariant(JSContext* cx, JS::HandleValue from, JSVariant* to)
case JSTYPE_STRING:
{
nsAutoJSString autoStr;
if (!autoStr.init(cx, from))
if (!autoStr.init(cx, from)) {
return false;
}
*to = autoStr;
return true;
}
case JSTYPE_NUMBER:
if (from.isInt32())
if (from.isInt32()) {
*to = double(from.toInt32());
else
} else {
*to = from.toDouble();
}
return true;
case JSTYPE_BOOLEAN:
@ -293,8 +307,9 @@ JavaScriptShared::fromVariant(JSContext* cx, const JSVariant& from, MutableHandl
case JSVariant::TObjectVariant:
{
JSObject* obj = fromObjectVariant(cx, from.get_ObjectVariant());
if (!obj)
if (!obj) {
return false;
}
to.set(ObjectValue(*obj));
return true;
}
@ -302,8 +317,9 @@ JavaScriptShared::fromVariant(JSContext* cx, const JSVariant& from, MutableHandl
case JSVariant::TSymbolVariant:
{
Symbol* sym = fromSymbolVariant(cx, from.get_SymbolVariant());
if (!sym)
if (!sym) {
return false;
}
to.setSymbol(sym);
return true;
}
@ -320,8 +336,9 @@ JavaScriptShared::fromVariant(JSContext* cx, const JSVariant& from, MutableHandl
{
const nsString& old = from.get_nsString();
JSString* str = JS_NewUCStringCopyN(cx, old.BeginReading(), old.Length());
if (!str)
if (!str) {
return false;
}
to.set(StringValue(str));
return true;
}
@ -334,8 +351,9 @@ JavaScriptShared::fromVariant(JSContext* cx, const JSVariant& from, MutableHandl
RootedObject global(cx, JS::CurrentGlobalOrNull(cx));
JSObject* obj = xpc_NewIDObject(cx, global, iid);
if (!obj)
if (!obj) {
return false;
}
to.set(ObjectValue(*obj));
return true;
}
@ -351,8 +369,9 @@ JavaScriptShared::toJSIDVariant(JSContext* cx, HandleId from, JSIDVariant* to)
{
if (JSID_IS_STRING(from)) {
nsAutoJSString autoStr;
if (!autoStr.init(cx, JSID_TO_STRING(from)))
if (!autoStr.init(cx, JSID_TO_STRING(from))) {
return false;
}
*to = autoStr;
return true;
}
@ -362,8 +381,9 @@ JavaScriptShared::toJSIDVariant(JSContext* cx, HandleId from, JSIDVariant* to)
}
if (JSID_IS_SYMBOL(from)) {
SymbolVariant symVar;
if (!toSymbolVariant(cx, JSID_TO_SYMBOL(from), &symVar))
if (!toSymbolVariant(cx, JSID_TO_SYMBOL(from), &symVar)) {
return false;
}
*to = symVar;
return true;
}
@ -377,8 +397,9 @@ JavaScriptShared::fromJSIDVariant(JSContext* cx, const JSIDVariant& from, Mutabl
switch (from.type()) {
case JSIDVariant::TSymbolVariant: {
Symbol* sym = fromSymbolVariant(cx, from.get_SymbolVariant());
if (!sym)
if (!sym) {
return false;
}
to.set(SYMBOL_TO_JSID(sym));
return true;
}
@ -408,8 +429,9 @@ JavaScriptShared::toSymbolVariant(JSContext* cx, JS::Symbol* symArg, SymbolVaria
}
if (code == SymbolCode::InSymbolRegistry) {
nsAutoJSString autoStr;
if (!autoStr.init(cx, GetSymbolDescription(sym)))
if (!autoStr.init(cx, GetSymbolDescription(sym))) {
return false;
}
*symVarp = RegisteredSymbol(autoStr);
return true;
}
@ -424,8 +446,9 @@ JavaScriptShared::fromSymbolVariant(JSContext* cx, const SymbolVariant& symVar)
switch (symVar.type()) {
case SymbolVariant::TWellKnownSymbol: {
uint32_t which = symVar.get_WellKnownSymbol().which();
if (which < WellKnownSymbolLimit)
if (which < WellKnownSymbolLimit) {
return GetWellKnownSymbol(cx, static_cast<SymbolCode>(which));
}
MOZ_ASSERT(false, "bad child data");
return nullptr;
}
@ -433,8 +456,9 @@ JavaScriptShared::fromSymbolVariant(JSContext* cx, const SymbolVariant& symVar)
case SymbolVariant::TRegisteredSymbol: {
nsString key = symVar.get_RegisteredSymbol().key();
RootedString str(cx, JS_NewUCStringCopyN(cx, key.get(), key.Length()));
if (!str)
if (!str) {
return nullptr;
}
return GetSymbolFor(cx, str);
}
@ -479,8 +503,9 @@ JSObject*
JavaScriptShared::findCPOWById(const ObjectId& objId)
{
JSObject* obj = findCPOWByIdPreserveColor(objId);
if (obj)
if (obj) {
JS::ExposeObjectToActiveJS(obj);
}
return obj;
}
@ -488,8 +513,9 @@ JSObject*
JavaScriptShared::findCPOWByIdPreserveColor(const ObjectId& objId)
{
JSObject* obj = cpows_.findPreserveColor(objId);
if (!obj)
if (!obj) {
return nullptr;
}
if (js::gc::EdgeNeedsSweepUnbarriered(&obj)) {
cpows_.remove(objId);
@ -516,11 +542,13 @@ JavaScriptShared::findObjectById(JSContext* cx, const ObjectId& objId)
if (objId.hasXrayWaiver()) {
obj = js::ToWindowProxyIfWindow(obj);
MOZ_ASSERT(obj);
if (!xpc::WrapperFactory::WaiveXrayAndWrap(cx, &obj))
if (!xpc::WrapperFactory::WaiveXrayAndWrap(cx, &obj)) {
return nullptr;
}
} else {
if (!JS_WrapObject(cx, &obj))
if (!JS_WrapObject(cx, &obj)) {
return nullptr;
}
}
return obj;
}
@ -532,19 +560,22 @@ JavaScriptShared::fromDescriptor(JSContext* cx, Handle<PropertyDescriptor> desc,
PPropertyDescriptor* out)
{
out->attrs() = desc.attributes();
if (!toVariant(cx, desc.value(), &out->value()))
if (!toVariant(cx, desc.value(), &out->value())) {
return false;
}
if (!toObjectOrNullVariant(cx, desc.object(), &out->obj()))
if (!toObjectOrNullVariant(cx, desc.object(), &out->obj())) {
return false;
}
if (!desc.getter()) {
out->getter() = 0;
} else if (desc.hasGetterObject()) {
JSObject* getter = desc.getterObject();
ObjectVariant objVar;
if (!toObjectVariant(cx, getter, &objVar))
if (!toObjectVariant(cx, getter, &objVar)) {
return false;
}
out->getter() = objVar;
} else {
out->getter() = UnknownPropertyOp;
@ -555,8 +586,9 @@ JavaScriptShared::fromDescriptor(JSContext* cx, Handle<PropertyDescriptor> desc,
} else if (desc.hasSetterObject()) {
JSObject* setter = desc.setterObject();
ObjectVariant objVar;
if (!toObjectVariant(cx, setter, &objVar))
if (!toObjectVariant(cx, setter, &objVar)) {
return false;
}
out->setter() = objVar;
} else {
out->setter() = UnknownPropertyOp;
@ -585,8 +617,9 @@ JavaScriptShared::toDescriptor(JSContext* cx, const PPropertyDescriptor& in,
MutableHandle<PropertyDescriptor> out)
{
out.setAttributes(in.attrs());
if (!fromVariant(cx, in.value(), out.value()))
if (!fromVariant(cx, in.value(), out.value())) {
return false;
}
out.object().set(fromObjectOrNullVariant(cx, in.obj()));
if (in.getter().type() == GetterSetter::Tuint64_t && !in.getter().get_uint64_t()) {
@ -594,8 +627,9 @@ JavaScriptShared::toDescriptor(JSContext* cx, const PPropertyDescriptor& in,
} else if (in.attrs() & JSPROP_GETTER) {
Rooted<JSObject*> getter(cx);
getter = fromObjectVariant(cx, in.getter().get_ObjectVariant());
if (!getter)
if (!getter) {
return false;
}
out.setGetter(JS_DATA_TO_FUNC_PTR(JSGetterOp, getter.get()));
} else {
out.setGetter(UnknownPropertyStub);
@ -606,8 +640,9 @@ JavaScriptShared::toDescriptor(JSContext* cx, const PPropertyDescriptor& in,
} else if (in.attrs() & JSPROP_SETTER) {
Rooted<JSObject*> setter(cx);
setter = fromObjectVariant(cx, in.setter().get_ObjectVariant());
if (!setter)
if (!setter) {
return false;
}
out.setSetter(JS_DATA_TO_FUNC_PTR(JSSetterOp, setter.get()));
} else {
out.setSetter(UnknownStrictPropertyStub);
@ -625,8 +660,9 @@ JavaScriptShared::toObjectOrNullVariant(JSContext* cx, JSObject* obj, ObjectOrNu
}
ObjectVariant objVar;
if (!toObjectVariant(cx, obj, &objVar))
if (!toObjectVariant(cx, obj, &objVar)) {
return false;
}
*objVarp = objVar;
return true;
@ -635,8 +671,9 @@ JavaScriptShared::toObjectOrNullVariant(JSContext* cx, JSObject* obj, ObjectOrNu
JSObject*
JavaScriptShared::fromObjectOrNullVariant(JSContext* cx, const ObjectOrNullVariant& objVar)
{
if (objVar.type() == ObjectOrNullVariant::TNullVariant)
if (objVar.type() == ObjectOrNullVariant::TNullVariant) {
return nullptr;
}
return fromObjectVariant(cx, objVar.get_ObjectVariant());
}
@ -648,8 +685,9 @@ CrossProcessCpowHolder::CrossProcessCpowHolder(dom::CPOWManagerGetter* managerGe
unwrapped_(false)
{
// Only instantiate the CPOW manager if we might need it later.
if (cpows.Length())
if (cpows.Length()) {
js_ = managerGetter->GetCPOWManager();
}
}
CrossProcessCpowHolder::~CrossProcessCpowHolder()
@ -665,11 +703,13 @@ CrossProcessCpowHolder::~CrossProcessCpowHolder()
// recording or replaying, as they do not have a CPOW manager
// and the message will also be received in the recording
// process.
if (recordreplay::IsMiddleman())
if (recordreplay::IsMiddleman()) {
return;
}
AutoJSAPI jsapi;
if (!jsapi.Init(xpc::PrivilegedJunkScope()))
if (!jsapi.Init(xpc::PrivilegedJunkScope())) {
return;
}
JSContext* cx = jsapi.cx();
JS::Rooted<JSObject*> cpows(cx);
js_->Unwrap(cx, cpows_, &cpows);
@ -681,8 +721,9 @@ CrossProcessCpowHolder::ToObject(JSContext* cx, JS::MutableHandleObject objp)
{
unwrapped_ = true;
if (!cpows_.Length())
if (!cpows_.Length()) {
return true;
}
return js_->Unwrap(cx, cpows_, objp);
}
@ -696,20 +737,23 @@ JavaScriptShared::Unwrap(JSContext* cx, const InfallibleTArray<CpowEntry>& aCpow
objp.set(nullptr);
if (!aCpows.Length())
if (!aCpows.Length()) {
return true;
}
RootedObject obj(cx, JS_NewPlainObject(cx));
if (!obj)
if (!obj) {
return false;
}
RootedValue v(cx);
RootedString str(cx);
for (size_t i = 0; i < aCpows.Length(); i++) {
const nsString& name = aCpows[i].name();
if (!fromVariant(cx, aCpows[i].value(), &v))
if (!fromVariant(cx, aCpows[i].value(), &v)) {
return false;
}
if (!JS_DefineUCProperty(cx,
obj,
@ -729,12 +773,14 @@ JavaScriptShared::Unwrap(JSContext* cx, const InfallibleTArray<CpowEntry>& aCpow
bool
JavaScriptShared::Wrap(JSContext* cx, HandleObject aObj, InfallibleTArray<CpowEntry>* outCpows)
{
if (!aObj)
if (!aObj) {
return true;
}
Rooted<IdVector> ids(cx, IdVector(cx));
if (!JS_Enumerate(cx, aObj, &ids))
if (!JS_Enumerate(cx, aObj, &ids)) {
return false;
}
RootedId id(cx);
RootedValue v(cx);
@ -742,15 +788,18 @@ JavaScriptShared::Wrap(JSContext* cx, HandleObject aObj, InfallibleTArray<CpowEn
id = ids[i];
nsString str;
if (!convertIdToGeckoString(cx, id, &str))
if (!convertIdToGeckoString(cx, id, &str)) {
return false;
}
if (!JS_GetPropertyById(cx, aObj, id, &v))
if (!JS_GetPropertyById(cx, aObj, id, &v)) {
return false;
}
JSVariant var;
if (!toVariant(cx, v, &var))
if (!toVariant(cx, v, &var)) {
return false;
}
outCpows->AppendElement(CpowEntry(str, var));
}

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

@ -29,8 +29,9 @@ class ObjectId {
explicit ObjectId(uint64_t serialNumber, bool hasXrayWaiver)
: serialNumber_(serialNumber), hasXrayWaiver_(hasXrayWaiver)
{
if (isInvalidSerialNumber(serialNumber))
if (isInvalidSerialNumber(serialNumber)) {
MOZ_CRASH("Bad CPOW Id");
}
}
bool operator==(const ObjectId& other) const {

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

@ -35,8 +35,9 @@ MaybeForceDebugGC()
static bool sEnvVarInitialized = false;
static bool sDebugGCs = false;
if (!sEnvVarInitialized)
if (!sEnvVarInitialized) {
sDebugGCs = !!PR_GetEnv("MOZ_DEBUG_DEAD_CPOWS");
}
if (sDebugGCs) {
JSContext* cx = XPCJSContext::Get()->Context();
@ -58,11 +59,13 @@ WrapperAnswer::fail(AutoJSAPI& jsapi, ReturnStatus* rs)
JSContext* cx = jsapi.cx();
RootedValue exn(cx);
if (!jsapi.HasException())
if (!jsapi.HasException()) {
return true;
}
if (!jsapi.StealException(&exn))
if (!jsapi.StealException(&exn)) {
return true;
}
// If this fails, we still don't want to exit. Just return an invalid
// exception.
@ -98,23 +101,27 @@ WrapperAnswer::deadCPOW(AutoJSAPI& jsapi, ReturnStatus* rs)
bool
WrapperAnswer::RecvPreventExtensions(const ObjectId& objId, ReturnStatus* rs)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
ObjectOpResult success;
if (!JS_PreventExtensions(cx, obj, success))
if (!JS_PreventExtensions(cx, obj, success)) {
return fail(jsapi, rs);
}
LOG("%s.preventExtensions()", ReceiverObj(objId));
return ok(rs, success);
@ -134,33 +141,39 @@ bool
WrapperAnswer::RecvGetOwnPropertyDescriptor(const ObjectId& objId, const JSIDVariant& idVar,
ReturnStatus* rs, PPropertyDescriptor* out)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
EmptyDesc(out);
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.getOwnPropertyDescriptor(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(jsapi, rs);
}
Rooted<PropertyDescriptor> desc(cx);
if (!JS_GetOwnPropertyDescriptorById(cx, obj, id, &desc))
if (!JS_GetOwnPropertyDescriptorById(cx, obj, id, &desc)) {
return fail(jsapi, rs);
}
if (!fromDescriptor(cx, desc, out))
if (!fromDescriptor(cx, desc, out)) {
return fail(jsapi, rs);
}
return ok(rs);
}
@ -169,62 +182,73 @@ bool
WrapperAnswer::RecvDefineProperty(const ObjectId& objId, const JSIDVariant& idVar,
const PPropertyDescriptor& descriptor, ReturnStatus* rs)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("define %s[%s]", ReceiverObj(objId), Identifier(idVar));
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(jsapi, rs);
}
Rooted<PropertyDescriptor> desc(cx);
if (!toDescriptor(cx, descriptor, &desc))
if (!toDescriptor(cx, descriptor, &desc)) {
return fail(jsapi, rs);
}
ObjectOpResult success;
if (!JS_DefinePropertyById(cx, obj, id, desc, success))
if (!JS_DefinePropertyById(cx, obj, id, desc, success)) {
return fail(jsapi, rs);
}
return ok(rs, success);
}
bool
WrapperAnswer::RecvDelete(const ObjectId& objId, const JSIDVariant& idVar, ReturnStatus* rs)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("delete %s[%s]", ReceiverObj(objId), Identifier(idVar));
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(jsapi, rs);
}
ObjectOpResult success;
if (!JS_DeletePropertyById(cx, obj, id, success))
if (!JS_DeletePropertyById(cx, obj, id, success)) {
return fail(jsapi, rs);
}
return ok(rs, success);
}
@ -232,29 +256,34 @@ bool
WrapperAnswer::RecvHas(const ObjectId& objId, const JSIDVariant& idVar, ReturnStatus* rs,
bool* foundp)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
*foundp = false;
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.has(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(jsapi, rs);
}
if (!JS_HasPropertyById(cx, obj, id, foundp))
if (!JS_HasPropertyById(cx, obj, id, foundp)) {
return fail(jsapi, rs);
}
return ok(rs);
}
@ -262,29 +291,34 @@ bool
WrapperAnswer::RecvHasOwn(const ObjectId& objId, const JSIDVariant& idVar, ReturnStatus* rs,
bool* foundp)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
*foundp = false;
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.hasOwn(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(jsapi, rs);
}
if (!JS_HasOwnPropertyById(cx, obj, id, foundp))
if (!JS_HasOwnPropertyById(cx, obj, id, foundp)) {
return fail(jsapi, rs);
}
return ok(rs);
}
@ -292,8 +326,9 @@ bool
WrapperAnswer::RecvGet(const ObjectId& objId, const JSVariant& receiverVar,
const JSIDVariant& idVar, ReturnStatus* rs, JSVariant* result)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
@ -307,23 +342,28 @@ WrapperAnswer::RecvGet(const ObjectId& objId, const JSVariant& receiverVar,
*result = UndefinedVariant();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(aes, rs);
}
RootedValue receiver(cx);
if (!fromVariant(cx, receiverVar, &receiver))
if (!fromVariant(cx, receiverVar, &receiver)) {
return fail(aes, rs);
}
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(aes, rs);
}
JS::RootedValue val(cx);
if (!JS_ForwardGetPropertyTo(cx, obj, id, receiver, &val))
if (!JS_ForwardGetPropertyTo(cx, obj, id, receiver, &val)) {
return fail(aes, rs);
}
if (!toVariant(cx, val, result))
if (!toVariant(cx, val, result)) {
return fail(aes, rs);
}
LOG("get %s.%s = %s", ReceiverObj(objId), Identifier(idVar), OutVariant(*result));
@ -334,8 +374,9 @@ bool
WrapperAnswer::RecvSet(const ObjectId& objId, const JSIDVariant& idVar, const JSVariant& value,
const JSVariant& receiverVar, ReturnStatus* rs)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
@ -345,26 +386,31 @@ WrapperAnswer::RecvSet(const ObjectId& objId, const JSIDVariant& idVar, const JS
JSContext* cx = aes.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(aes, rs);
}
LOG("set %s[%s] = %s", ReceiverObj(objId), Identifier(idVar), InVariant(value));
RootedId id(cx);
if (!fromJSIDVariant(cx, idVar, &id))
if (!fromJSIDVariant(cx, idVar, &id)) {
return fail(aes, rs);
}
RootedValue val(cx);
if (!fromVariant(cx, value, &val))
if (!fromVariant(cx, value, &val)) {
return fail(aes, rs);
}
RootedValue receiver(cx);
if (!fromVariant(cx, receiverVar, &receiver))
if (!fromVariant(cx, receiverVar, &receiver)) {
return fail(aes, rs);
}
ObjectOpResult result;
if (!JS_ForwardSetPropertyTo(cx, obj, id, val, receiver, result))
if (!JS_ForwardSetPropertyTo(cx, obj, id, val, receiver, result)) {
return fail(aes, rs);
}
return ok(rs, result);
}
@ -372,26 +418,30 @@ WrapperAnswer::RecvSet(const ObjectId& objId, const JSIDVariant& idVar, const JS
bool
WrapperAnswer::RecvIsExtensible(const ObjectId& objId, ReturnStatus* rs, bool* result)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
*result = false;
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.isExtensible()", ReceiverObj(objId));
bool extensible;
if (!JS_IsExtensible(cx, obj, &extensible))
if (!JS_IsExtensible(cx, obj, &extensible)) {
return fail(jsapi, rs);
}
*result = !!extensible;
return ok(rs);
@ -405,8 +455,9 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
JSVariant* result,
nsTArray<JSParam>* outparams)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
@ -419,14 +470,16 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
*result = UndefinedVariant();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(aes, rs);
}
MOZ_ASSERT(argv.Length() >= 2);
RootedValue objv(cx);
if (!fromVariant(cx, argv[0], &objv))
if (!fromVariant(cx, argv[0], &objv)) {
return fail(aes, rs);
}
*result = JSVariant(UndefinedVariant());
@ -436,18 +489,23 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
if (argv[i].type() == JSParam::Tvoid_t) {
// This is an outparam.
RootedObject obj(cx, xpc::NewOutObject(cx));
if (!obj)
if (!obj) {
return fail(aes, rs);
if (!outobjects.append(ObjectValue(*obj)))
}
if (!outobjects.append(ObjectValue(*obj))) {
return fail(aes, rs);
if (!vals.append(ObjectValue(*obj)))
}
if (!vals.append(ObjectValue(*obj))) {
return fail(aes, rs);
}
} else {
RootedValue v(cx);
if (!fromVariant(cx, argv[i].get_JSVariant(), &v))
if (!fromVariant(cx, argv[i].get_JSVariant(), &v)) {
return fail(aes, rs);
if (!vals.append(v))
}
if (!vals.append(v)) {
return fail(aes, rs);
}
}
}
@ -456,8 +514,9 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
HandleValueArray args = HandleValueArray::subarray(vals, 2, vals.length() - 2);
if (construct) {
RootedObject obj(cx);
if (!JS::Construct(cx, vals[0], args, &obj))
if (!JS::Construct(cx, vals[0], args, &obj)) {
return fail(aes, rs);
}
rval.setObject(*obj);
} else {
if(!JS::Call(cx, vals[1], vals[0], args, &rval))
@ -465,12 +524,14 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
}
}
if (!toVariant(cx, rval, result))
if (!toVariant(cx, rval, result)) {
return fail(aes, rs);
}
// Prefill everything with a dummy jsval.
for (size_t i = 0; i < outobjects.length(); i++)
for (size_t i = 0; i < outobjects.length(); i++) {
outparams->AppendElement(JSParam(void_t()));
}
// Go through each argument that was an outparam, retrieve the "value"
// field, and add it to a temporary list. We need to do this separately
@ -482,21 +543,24 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
RootedValue v(cx);
bool found;
if (JS_HasProperty(cx, obj, "value", &found)) {
if (!JS_GetProperty(cx, obj, "value", &v))
if (!JS_GetProperty(cx, obj, "value", &v)) {
return fail(aes, rs);
}
} else {
v = UndefinedValue();
}
if (!vals.append(v))
if (!vals.append(v)) {
return fail(aes, rs);
}
}
// Copy the outparams. If any outparam is already set to a void_t, we
// treat this as the outparam never having been set.
for (size_t i = 0; i < vals.length(); i++) {
JSVariant variant;
if (!toVariant(cx, vals[i], &variant))
if (!toVariant(cx, vals[i], &variant)) {
return fail(aes, rs);
}
outparams->ReplaceElementAt(i, JSParam(variant));
}
@ -508,28 +572,33 @@ WrapperAnswer::RecvCallOrConstruct(const ObjectId& objId,
bool
WrapperAnswer::RecvHasInstance(const ObjectId& objId, const JSVariant& vVar, ReturnStatus* rs, bool* bp)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.hasInstance(%s)", ReceiverObj(objId), InVariant(vVar));
RootedValue val(cx);
if (!fromVariant(cx, vVar, &val))
if (!fromVariant(cx, vVar, &val)) {
return fail(jsapi, rs);
}
if (!JS_HasInstance(cx, obj, val, bp))
if (!JS_HasInstance(cx, obj, val, bp)) {
return fail(jsapi, rs);
}
return ok(rs);
}
@ -538,27 +607,31 @@ bool
WrapperAnswer::RecvGetBuiltinClass(const ObjectId& objId, ReturnStatus* rs,
uint32_t* classValue)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
*classValue = uint32_t(js::ESClass::Other);
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.getBuiltinClass()", ReceiverObj(objId));
js::ESClass cls;
if (!js::GetBuiltinClass(cx, obj, &cls))
if (!js::GetBuiltinClass(cx, obj, &cls)) {
return fail(jsapi, rs);
}
*classValue = uint32_t(cls);
return ok(rs);
@ -568,27 +641,31 @@ bool
WrapperAnswer::RecvIsArray(const ObjectId& objId, ReturnStatus* rs,
uint32_t* ans)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
*ans = uint32_t(IsArrayAnswer::NotArray);
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.isArray()", ReceiverObj(objId));
IsArrayAnswer answer;
if (!JS::IsArray(cx, obj, &answer))
if (!JS::IsArray(cx, obj, &answer)) {
return fail(jsapi, rs);
}
*ans = uint32_t(answer);
return ok(rs);
@ -597,14 +674,16 @@ WrapperAnswer::RecvIsArray(const ObjectId& objId, ReturnStatus* rs,
bool
WrapperAnswer::RecvClassName(const ObjectId& objId, nsCString* name)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
@ -623,28 +702,33 @@ WrapperAnswer::RecvClassName(const ObjectId& objId, nsCString* name)
bool
WrapperAnswer::RecvGetPrototype(const ObjectId& objId, ReturnStatus* rs, ObjectOrNullVariant* result)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
*result = NullVariant();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
JS::RootedObject proto(cx);
if (!JS_GetPrototype(cx, obj, &proto))
if (!JS_GetPrototype(cx, obj, &proto)) {
return fail(jsapi, rs);
}
if (!toObjectOrNullVariant(cx, proto, result))
if (!toObjectOrNullVariant(cx, proto, result)) {
return fail(jsapi, rs);
}
LOG("getPrototype(%s)", ReceiverObj(objId));
@ -655,8 +739,9 @@ bool
WrapperAnswer::RecvGetPrototypeIfOrdinary(const ObjectId& objId, ReturnStatus* rs, bool* isOrdinary,
ObjectOrNullVariant* result)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
@ -664,20 +749,24 @@ WrapperAnswer::RecvGetPrototypeIfOrdinary(const ObjectId& objId, ReturnStatus* r
*isOrdinary = false;
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
JS::RootedObject proto(cx);
if (!JS_GetPrototypeIfOrdinary(cx, obj, isOrdinary, &proto))
if (!JS_GetPrototypeIfOrdinary(cx, obj, isOrdinary, &proto)) {
return fail(jsapi, rs);
}
if (!toObjectOrNullVariant(cx, proto, result))
if (!toObjectOrNullVariant(cx, proto, result)) {
return fail(jsapi, rs);
}
LOG("getPrototypeIfOrdinary(%s)", ReceiverObj(objId));
@ -688,26 +777,31 @@ bool
WrapperAnswer::RecvRegExpToShared(const ObjectId& objId, ReturnStatus* rs,
nsString* source, uint32_t* flags)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
RootedString sourceJSStr(cx, JS_GetRegExpSource(cx, obj));
if (!sourceJSStr)
if (!sourceJSStr) {
return fail(jsapi, rs);
}
nsAutoJSString sourceStr;
if (!sourceStr.init(cx, sourceJSStr))
if (!sourceStr.init(cx, sourceJSStr)) {
return fail(jsapi, rs);
}
source->Assign(sourceStr);
*flags = JS_GetRegExpFlags(cx, obj);
@ -719,30 +813,35 @@ bool
WrapperAnswer::RecvGetPropertyKeys(const ObjectId& objId, const uint32_t& flags,
ReturnStatus* rs, nsTArray<JSIDVariant>* ids)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.getPropertyKeys()", ReceiverObj(objId));
AutoIdVector props(cx);
if (!js::GetPropertyKeys(cx, obj, flags, &props))
if (!js::GetPropertyKeys(cx, obj, flags, &props)) {
return fail(jsapi, rs);
}
for (size_t i = 0; i < props.length(); i++) {
JSIDVariant id;
if (!toJSIDVariant(cx, props[i], &id))
if (!toJSIDVariant(cx, props[i], &id)) {
return fail(jsapi, rs);
}
ids->AppendElement(id);
}
@ -754,21 +853,24 @@ bool
WrapperAnswer::RecvInstanceOf(const ObjectId& objId, const JSIID& iid, ReturnStatus* rs,
bool* instanceof)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
*instanceof = false;
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.instanceOf()", ReceiverObj(objId));
@ -776,8 +878,9 @@ WrapperAnswer::RecvInstanceOf(const ObjectId& objId, const JSIID& iid, ReturnSta
ConvertID(iid, &nsiid);
nsresult rv = xpc::HasInstance(cx, obj, &nsiid, instanceof);
if (rv != NS_OK)
if (rv != NS_OK) {
return fail(jsapi, rs);
}
return ok(rs);
}
@ -786,26 +889,30 @@ bool
WrapperAnswer::RecvDOMInstanceOf(const ObjectId& objId, const int& prototypeID,
const int& depth, ReturnStatus* rs, bool* instanceof)
{
if (!IsInAutomation())
if (!IsInAutomation()) {
return false;
}
MaybeForceDebugGC();
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects())))
if (NS_WARN_IF(!jsapi.Init(scopeForTargetObjects()))) {
return false;
}
JSContext* cx = jsapi.cx();
*instanceof = false;
RootedObject obj(cx, findObjectById(cx, objId));
if (!obj)
if (!obj) {
return deadCPOW(jsapi, rs);
}
LOG("%s.domInstanceOf()", ReceiverObj(objId));
bool tmp;
if (!mozilla::dom::InterfaceHasInstance(cx, prototypeID, depth, obj, &tmp))
if (!mozilla::dom::InterfaceHasInstance(cx, prototypeID, depth, obj, &tmp)) {
return fail(jsapi, rs);
}
*instanceof = tmp;
return ok(rs);

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

@ -172,18 +172,21 @@ WrapperOwner::getOwnPropertyDescriptor(JSContext* cx, HandleObject proxy, Handle
ObjectId objId = idOf(proxy);
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
ReturnStatus status;
PPropertyDescriptor result;
if (!SendGetOwnPropertyDescriptor(objId, idVar, &status, &result))
if (!SendGetOwnPropertyDescriptor(objId, idVar, &status, &result)) {
return ipcfail(cx);
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return false;
}
return toDescriptor(cx, result, desc);
}
@ -204,16 +207,19 @@ WrapperOwner::defineProperty(JSContext* cx, HandleObject proxy, HandleId id,
ObjectId objId = idOf(proxy);
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
PPropertyDescriptor descriptor;
if (!fromDescriptor(cx, desc, &descriptor))
if (!fromDescriptor(cx, desc, &descriptor)) {
return false;
}
ReturnStatus status;
if (!SendDefineProperty(objId, idVar, descriptor, &status))
if (!SendDefineProperty(objId, idVar, descriptor, &status)) {
return ipcfail(cx);
}
LOG_STACK();
@ -246,12 +252,14 @@ WrapperOwner::delete_(JSContext* cx, HandleObject proxy, HandleId id, ObjectOpRe
ObjectId objId = idOf(proxy);
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
ReturnStatus status;
if (!SendDelete(objId, idVar, &status))
if (!SendDelete(objId, idVar, &status)) {
return ipcfail(cx);
}
LOG_STACK();
@ -279,12 +287,14 @@ WrapperOwner::has(JSContext* cx, HandleObject proxy, HandleId id, bool* bp)
ObjectId objId = idOf(proxy);
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
ReturnStatus status;
if (!SendHas(objId, idVar, &status, bp))
if (!SendHas(objId, idVar, &status, bp)) {
return ipcfail(cx);
}
LOG_STACK();
@ -303,12 +313,14 @@ WrapperOwner::hasOwn(JSContext* cx, HandleObject proxy, HandleId id, bool* bp)
ObjectId objId = idOf(proxy);
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
ReturnStatus status;
if (!SendHasOwn(objId, idVar, &status, bp))
if (!SendHasOwn(objId, idVar, &status, bp)) {
return ipcfail(cx);
}
LOG_STACK();
@ -341,8 +353,9 @@ CPOWToString(JSContext* cx, unsigned argc, Value* vp)
CallArgs args = CallArgsFromVp(argc, vp);
RootedObject callee(cx, &args.callee());
RootedValue cpowValue(cx);
if (!JS_GetProperty(cx, callee, "__cpow__", &cpowValue))
if (!JS_GetProperty(cx, callee, "__cpow__", &cpowValue)) {
return false;
}
if (!cpowValue.isObject() || !IsCPOW(&cpowValue.toObject())) {
JS_ReportErrorASCII(cx, "CPOWToString called on an incompatible object");
@ -359,16 +372,19 @@ WrapperOwner::toString(JSContext* cx, HandleObject cpow, JS::CallArgs& args)
// Ask the other side to call its toString method. Update the callee so that
// it points to the CPOW and not to the synthesized CPOWToString function.
args.setCallee(ObjectValue(*cpow));
if (!callOrConstruct(cx, cpow, args, false))
if (!callOrConstruct(cx, cpow, args, false)) {
return false;
}
if (!args.rval().isString())
if (!args.rval().isString()) {
return true;
}
RootedString cpowResult(cx, args.rval().toString());
nsAutoJSString toStringResult;
if (!toStringResult.init(cx, cpowResult))
if (!toStringResult.init(cx, cpowResult)) {
return false;
}
// We don't want to wrap toString() results for things like the location
// object, where toString() is supposed to return a URL and nothing else.
@ -382,8 +398,9 @@ WrapperOwner::toString(JSContext* cx, HandleObject cpow, JS::CallArgs& args)
}
JSString* str = JS_NewUCStringCopyN(cx, result.get(), result.Length());
if (!str)
if (!str) {
return false;
}
args.rval().setString(str);
return true;
@ -409,8 +426,9 @@ WrapperOwner::DOMQI(JSContext* cx, JS::HandleObject proxy, JS::CallArgs& args)
}
// Webidl-implemented DOM objects never have nsIClassInfo.
if (idptr->Equals(NS_GET_IID(nsIClassInfo)))
if (idptr->Equals(NS_GET_IID(nsIClassInfo))) {
return Throw(cx, NS_ERROR_NO_INTERFACE);
}
}
}
@ -422,8 +440,9 @@ WrapperOwner::DOMQI(JSContext* cx, JS::HandleObject proxy, JS::CallArgs& args)
// if we're called multiple times, but since we're transient, there's no
// point right now.
JS::Rooted<PropertyDescriptor> propDesc(cx);
if (!JS_GetPropertyDescriptor(cx, proxy, "QueryInterface", &propDesc))
if (!JS_GetPropertyDescriptor(cx, proxy, "QueryInterface", &propDesc)) {
return false;
}
if (!propDesc.value().isObject()) {
MOZ_ASSERT_UNREACHABLE("We didn't get QueryInterface off a node");
@ -439,12 +458,14 @@ WrapperOwner::get(JSContext* cx, HandleObject proxy, HandleValue receiver,
ObjectId objId = idOf(proxy);
JSVariant receiverVar;
if (!toVariant(cx, receiver, &receiverVar))
if (!toVariant(cx, receiver, &receiverVar)) {
return false;
}
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
AuxCPOWData* data = AuxCPOWDataOf(proxy);
if (data->isDOMObject &&
@ -455,8 +476,9 @@ WrapperOwner::get(JSContext* cx, HandleObject proxy, HandleValue receiver,
// certain things about their implementation.
RootedFunction qi(cx, JS_NewFunction(cx, CPOWDOMQI, 1, 0,
"QueryInterface"));
if (!qi)
if (!qi) {
return false;
}
vp.set(ObjectValue(*JS_GetFunctionObject(qi)));
return true;
@ -464,28 +486,33 @@ WrapperOwner::get(JSContext* cx, HandleObject proxy, HandleValue receiver,
JSVariant val;
ReturnStatus status;
if (!SendGet(objId, receiverVar, idVar, &status, &val))
if (!SendGet(objId, receiverVar, idVar, &status, &val)) {
return ipcfail(cx);
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return false;
}
if (!fromVariant(cx, val, vp))
if (!fromVariant(cx, val, vp)) {
return false;
}
if (idVar.type() == JSIDVariant::TnsString &&
idVar.get_nsString().EqualsLiteral("toString")) {
RootedFunction toString(cx, JS_NewFunction(cx, CPOWToString, 0, 0,
"toString"));
if (!toString)
if (!toString) {
return false;
}
RootedObject toStringObj(cx, JS_GetFunctionObject(toString));
if (!JS_DefineProperty(cx, toStringObj, "__cpow__", vp, JSPROP_PERMANENT | JSPROP_READONLY))
if (!JS_DefineProperty(cx, toStringObj, "__cpow__", vp, JSPROP_PERMANENT | JSPROP_READONLY)) {
return false;
}
vp.set(ObjectValue(*toStringObj));
}
@ -507,20 +534,24 @@ WrapperOwner::set(JSContext* cx, JS::HandleObject proxy, JS::HandleId id, JS::Ha
ObjectId objId = idOf(proxy);
JSIDVariant idVar;
if (!toJSIDVariant(cx, id, &idVar))
if (!toJSIDVariant(cx, id, &idVar)) {
return false;
}
JSVariant val;
if (!toVariant(cx, v, &val))
if (!toVariant(cx, v, &val)) {
return false;
}
JSVariant receiverVar;
if (!toVariant(cx, receiver, &receiverVar))
if (!toVariant(cx, receiver, &receiverVar)) {
return false;
}
ReturnStatus status;
if (!SendSet(objId, idVar, val, receiverVar, &status))
if (!SendSet(objId, idVar, val, receiverVar, &status)) {
return ipcfail(cx);
}
LOG_STACK();
@ -552,8 +583,9 @@ WrapperOwner::preventExtensions(JSContext* cx, HandleObject proxy, ObjectOpResul
ObjectId objId = idOf(proxy);
ReturnStatus status;
if (!SendPreventExtensions(objId, &status))
if (!SendPreventExtensions(objId, &status)) {
return ipcfail(cx);
}
LOG_STACK();
@ -572,8 +604,9 @@ WrapperOwner::isExtensible(JSContext* cx, HandleObject proxy, bool* extensible)
ObjectId objId = idOf(proxy);
ReturnStatus status;
if (!SendIsExtensible(objId, &status, extensible))
if (!SendIsExtensible(objId, &status, extensible)) {
return ipcfail(cx);
}
LOG_STACK();
@ -605,66 +638,77 @@ WrapperOwner::callOrConstruct(JSContext* cx, HandleObject proxy, const CallArgs&
for (size_t i = 0; i < args.length() + 2; i++) {
// The |this| value for constructors is a magic value that we won't be
// able to convert, so skip it.
if (i == 1 && construct)
if (i == 1 && construct) {
v = UndefinedValue();
else
} else {
v = args.base()[i];
}
if (v.isObject()) {
RootedObject obj(cx, &v.toObject());
if (xpc::IsOutObject(cx, obj)) {
// Make sure it is not an in-out object.
bool found;
if (!JS_HasProperty(cx, obj, "value", &found))
if (!JS_HasProperty(cx, obj, "value", &found)) {
return false;
}
if (found) {
JS_ReportErrorASCII(cx, "in-out objects cannot be sent via CPOWs yet");
return false;
}
vals.AppendElement(JSParam(void_t()));
if (!outobjects.append(ObjectValue(*obj)))
if (!outobjects.append(ObjectValue(*obj))) {
return false;
}
continue;
}
}
JSVariant val;
if (!toVariant(cx, v, &val))
if (!toVariant(cx, v, &val)) {
return false;
}
vals.AppendElement(JSParam(val));
}
JSVariant result;
ReturnStatus status;
InfallibleTArray<JSParam> outparams;
if (!SendCallOrConstruct(objId, vals, construct, &status, &result, &outparams))
if (!SendCallOrConstruct(objId, vals, construct, &status, &result, &outparams)) {
return ipcfail(cx);
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return false;
}
if (outparams.Length() != outobjects.length())
if (outparams.Length() != outobjects.length()) {
return ipcfail(cx);
}
RootedObject obj(cx);
for (size_t i = 0; i < outparams.Length(); i++) {
// Don't bother doing anything for outparams that weren't set.
if (outparams[i].type() == JSParam::Tvoid_t)
if (outparams[i].type() == JSParam::Tvoid_t) {
continue;
}
// Take the value the child process returned, and set it on the XPC
// object.
if (!fromVariant(cx, outparams[i], &v))
if (!fromVariant(cx, outparams[i], &v)) {
return false;
}
obj = &outobjects[i].toObject();
if (!JS_SetProperty(cx, obj, "value", v))
if (!JS_SetProperty(cx, obj, "value", v)) {
return false;
}
}
if (!fromVariant(cx, result, args.rval()))
if (!fromVariant(cx, result, args.rval())) {
return false;
}
return true;
}
@ -681,12 +725,14 @@ WrapperOwner::hasInstance(JSContext* cx, HandleObject proxy, MutableHandleValue
ObjectId objId = idOf(proxy);
JSVariant vVar;
if (!toVariant(cx, v, &vVar))
if (!toVariant(cx, v, &vVar)) {
return false;
}
ReturnStatus status;
if (!SendHasInstance(objId, vVar, &status, bp))
if (!SendHasInstance(objId, vVar, &status, bp)) {
return ipcfail(cx);
}
LOG_STACK();
@ -706,8 +752,9 @@ WrapperOwner::getBuiltinClass(JSContext* cx, HandleObject proxy, ESClass* cls)
uint32_t classValue = uint32_t(ESClass::Other);
ReturnStatus status;
if (!SendGetBuiltinClass(objId, &status, &classValue))
if (!SendGetBuiltinClass(objId, &status, &classValue)) {
return ipcfail(cx);
}
*cls = ESClass(classValue);
LOG_STACK();
@ -729,8 +776,9 @@ WrapperOwner::isArray(JSContext* cx, HandleObject proxy, IsArrayAnswer* answer)
uint32_t ans;
ReturnStatus status;
if (!SendIsArray(objId, &status, &ans))
if (!SendIsArray(objId, &status, &ans)) {
return ipcfail(cx);
}
LOG_STACK();
@ -746,8 +794,9 @@ const char*
CPOWProxyHandler::className(JSContext* cx, HandleObject proxy) const
{
WrapperOwner* parent = OwnerOf(proxy);
if (!parent->active())
if (!parent->active()) {
return "<dead CPOW>";
}
return parent->className(cx, proxy);
}
@ -758,8 +807,9 @@ WrapperOwner::className(JSContext* cx, HandleObject proxy)
if (data->className.IsEmpty()) {
ObjectId objId = idOf(proxy);
if (!SendClassName(objId, &data->className))
if (!SendClassName(objId, &data->className)) {
return "<error>";
}
LOG_STACK();
}
@ -780,13 +830,15 @@ WrapperOwner::getPrototype(JSContext* cx, HandleObject proxy, MutableHandleObjec
ObjectOrNullVariant val;
ReturnStatus status;
if (!SendGetPrototype(objId, &status, &val))
if (!SendGetPrototype(objId, &status, &val)) {
return ipcfail(cx);
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return false;
}
objp.set(fromObjectOrNullVariant(cx, val));
@ -808,13 +860,15 @@ WrapperOwner::getPrototypeIfOrdinary(JSContext* cx, HandleObject proxy, bool* is
ObjectOrNullVariant val;
ReturnStatus status;
if (!SendGetPrototypeIfOrdinary(objId, &status, isOrdinary, &val))
if (!SendGetPrototypeIfOrdinary(objId, &status, isOrdinary, &val)) {
return ipcfail(cx);
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return false;
}
objp.set(fromObjectOrNullVariant(cx, val));
@ -841,13 +895,15 @@ WrapperOwner::regexp_toShared(JSContext* cx, HandleObject proxy)
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return nullptr;
}
RootedObject regexp(cx);
regexp = JS_NewUCRegExpObject(cx, source.get(), source.Length(), flags);
if (!regexp)
if (!regexp) {
return nullptr;
}
return js::RegExpToSharedNonInline(cx, regexp);
}
@ -859,8 +915,9 @@ CPOWProxyHandler::finalize(JSFreeOp* fop, JSObject* proxy) const
OwnerOf(proxy)->drop(proxy);
if (aux)
if (aux) {
delete aux;
}
}
size_t
@ -890,11 +947,13 @@ WrapperOwner::drop(JSObject* obj)
// The association may have already been swept from the table but if it's
// there then remove it.
ObjectId objId = idOfUnchecked(obj);
if (cpows_.findPreserveColor(objId) == obj)
if (cpows_.findPreserveColor(objId) == obj) {
cpows_.remove(objId);
}
if (active())
if (active()) {
Unused << SendDropObject(objId);
}
decref();
}
@ -913,20 +972,24 @@ WrapperOwner::getPropertyKeys(JSContext* cx, HandleObject proxy, uint32_t flags,
ReturnStatus status;
InfallibleTArray<JSIDVariant> ids;
if (!SendGetPropertyKeys(objId, flags, &status, &ids))
if (!SendGetPropertyKeys(objId, flags, &status, &ids)) {
return ipcfail(cx);
}
LOG_STACK();
if (!ok(cx, status))
if (!ok(cx, status)) {
return false;
}
for (size_t i = 0; i < ids.Length(); i++) {
RootedId id(cx);
if (!fromJSIDVariant(cx, ids[i], &id))
if (!fromJSIDVariant(cx, ids[i], &id)) {
return false;
if (!props.append(id))
}
if (!props.append(id)) {
return false;
}
}
return true;
@ -945,8 +1008,9 @@ bool
IsWrappedCPOW(JSObject* obj)
{
JSObject* unwrapped = js::UncheckedUnwrap(obj, true);
if (!unwrapped)
if (!unwrapped) {
return false;
}
return IsCPOW(unwrapped);
}
@ -957,16 +1021,18 @@ GetWrappedCPOWTag(JSObject* obj, nsACString& out)
MOZ_ASSERT(IsCPOW(unwrapped));
AuxCPOWData* aux = AuxCPOWDataOf(unwrapped);
if (aux)
if (aux) {
out = aux->objectTag;
}
}
nsresult
InstanceOf(JSObject* proxy, const nsID* id, bool* bp)
{
WrapperOwner* parent = OwnerOf(proxy);
if (!parent->active())
if (!parent->active()) {
return NS_ERROR_UNEXPECTED;
}
return parent->instanceOf(proxy, id, bp);
}
@ -989,11 +1055,13 @@ WrapperOwner::instanceOf(JSObject* obj, const nsID* id, bool* bp)
ConvertID(*id, &iid);
ReturnStatus status;
if (!SendInstanceOf(objId, iid, &status, bp))
if (!SendInstanceOf(objId, iid, &status, bp)) {
return NS_ERROR_UNEXPECTED;
}
if (status.type() != ReturnStatus::TReturnSuccess)
if (status.type() != ReturnStatus::TReturnSuccess) {
return NS_ERROR_UNEXPECTED;
}
return NS_OK;
}
@ -1004,8 +1072,9 @@ WrapperOwner::domInstanceOf(JSContext* cx, JSObject* obj, int prototypeID, int d
ObjectId objId = idOf(obj);
ReturnStatus status;
if (!SendDOMInstanceOf(objId, prototypeID, depth, &status, bp))
if (!SendDOMInstanceOf(objId, prototypeID, depth, &status, bp)) {
return ipcfail(cx);
}
LOG_STACK();
@ -1032,8 +1101,9 @@ WrapperOwner::ipcfail(JSContext* cx)
bool
WrapperOwner::ok(JSContext* cx, const ReturnStatus& status)
{
if (status.type() == ReturnStatus::TReturnSuccess)
if (status.type() == ReturnStatus::TReturnSuccess) {
return true;
}
if (status.type() == ReturnStatus::TReturnDeadCPOW) {
JS_ReportErrorASCII(cx, "operation not possible on dead CPOW");
@ -1041,8 +1111,9 @@ WrapperOwner::ok(JSContext* cx, const ReturnStatus& status)
}
RootedValue exn(cx);
if (!fromVariant(cx, status.get_ReturnException().exn(), &exn))
if (!fromVariant(cx, status.get_ReturnException().exn(), &exn)) {
return false;
}
JS_SetPendingException(cx, exn);
return false;
@ -1051,10 +1122,12 @@ WrapperOwner::ok(JSContext* cx, const ReturnStatus& status)
bool
WrapperOwner::ok(JSContext* cx, const ReturnStatus& status, ObjectOpResult& result)
{
if (status.type() == ReturnStatus::TReturnObjectOpResult)
if (status.type() == ReturnStatus::TReturnObjectOpResult) {
return result.fail(status.get_ReturnObjectOpResult().code());
if (!ok(cx, status))
}
if (!ok(cx, status)) {
return false;
}
return result.succeed();
}
@ -1066,12 +1139,14 @@ GetRemoteObjectTag(JS::Handle<JSObject*> obj)
{
if (nsCOMPtr<nsISupports> supports = xpc::UnwrapReflectorToISupports(obj)) {
nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(supports));
if (treeItem)
if (treeItem) {
return NS_LITERAL_CSTRING("ContentDocShellTreeItem");
}
nsCOMPtr<nsIDocument> doc(do_QueryInterface(supports));
if (doc)
if (doc) {
return NS_LITERAL_CSTRING("ContentDocument");
}
}
return NS_LITERAL_CSTRING("generic");
@ -1114,14 +1189,17 @@ WrapperOwner::toObjectVariant(JSContext* cx, JSObject* objArg, ObjectVariant* ob
// Need to call PreserveWrapper on |obj| in case it's a reflector.
// FIXME: What if it's an XPCWrappedNative?
if (mozilla::dom::IsDOMObject(obj))
if (mozilla::dom::IsDOMObject(obj)) {
mozilla::dom::TryPreserveWrapper(obj);
}
id = ObjectId(nextSerialNumber_++, waiveXray);
if (!objects_.add(id, obj))
if (!objects_.add(id, obj)) {
return false;
if (!objectIdMap(waiveXray).add(cx, obj, id))
}
if (!objectIdMap(waiveXray).add(cx, obj, id)) {
return false;
}
*objVarp = MakeRemoteObject(cx, id, obj);
return true;
@ -1162,11 +1240,13 @@ WrapperOwner::fromRemoteObjectVariant(JSContext* cx, const RemoteObject& objVar)
v,
nullptr,
options);
if (!obj)
if (!obj) {
return nullptr;
}
if (!cpows_.add(objId, obj))
if (!cpows_.add(objId, obj)) {
return nullptr;
}
nextCPOWNumber_ = objId.serialNumber() + 1;
@ -1183,8 +1263,9 @@ WrapperOwner::fromRemoteObjectVariant(JSContext* cx, const RemoteObject& objVar)
SetProxyReservedSlot(obj, 1, PrivateValue(aux));
}
if (!JS_WrapObject(cx, &obj))
if (!JS_WrapObject(cx, &obj)) {
return nullptr;
}
return obj;
}
@ -1196,9 +1277,11 @@ WrapperOwner::fromLocalObjectVariant(JSContext* cx, const LocalObject& objVar)
return nullptr;
}
Rooted<JSObject*> obj(cx, findObjectById(cx, id.value()));
if (!obj)
if (!obj) {
return nullptr;
if (!JS_WrapObject(cx, &obj))
}
if (!JS_WrapObject(cx, &obj)) {
return nullptr;
}
return obj;
}