Bug 1071177 - Introduce JSIDVariant type for CPOWs. r=billm

This commit is contained in:
Tom Schuster 2014-10-07 11:29:02 +02:00
Родитель 90d0d29b1f
Коммит eec11c26a0
10 изменённых файлов: 190 добавлений и 120 удалений

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

@ -38,42 +38,42 @@ class JavaScriptBase : public WrapperOwner, public WrapperAnswer, public Base
bool AnswerPreventExtensions(const uint64_t &objId, ReturnStatus *rs) { bool AnswerPreventExtensions(const uint64_t &objId, ReturnStatus *rs) {
return Answer::AnswerPreventExtensions(ObjectId::deserialize(objId), rs); return Answer::AnswerPreventExtensions(ObjectId::deserialize(objId), rs);
} }
bool AnswerGetPropertyDescriptor(const uint64_t &objId, const nsString &id, bool AnswerGetPropertyDescriptor(const uint64_t &objId, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out) { PPropertyDescriptor *out) {
return Answer::AnswerGetPropertyDescriptor(ObjectId::deserialize(objId), id, rs, out); return Answer::AnswerGetPropertyDescriptor(ObjectId::deserialize(objId), id, rs, out);
} }
bool AnswerGetOwnPropertyDescriptor(const uint64_t &objId, bool AnswerGetOwnPropertyDescriptor(const uint64_t &objId,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out) { PPropertyDescriptor *out) {
return Answer::AnswerGetOwnPropertyDescriptor(ObjectId::deserialize(objId), id, rs, out); return Answer::AnswerGetOwnPropertyDescriptor(ObjectId::deserialize(objId), id, rs, out);
} }
bool AnswerDefineProperty(const uint64_t &objId, const nsString &id, bool AnswerDefineProperty(const uint64_t &objId, const JSIDVariant &id,
const PPropertyDescriptor &flags, const PPropertyDescriptor &flags,
ReturnStatus *rs) { ReturnStatus *rs) {
return Answer::AnswerDefineProperty(ObjectId::deserialize(objId), id, flags, rs); return Answer::AnswerDefineProperty(ObjectId::deserialize(objId), id, flags, rs);
} }
bool AnswerDelete(const uint64_t &objId, const nsString &id, bool AnswerDelete(const uint64_t &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *success) { ReturnStatus *rs, bool *success) {
return Answer::AnswerDelete(ObjectId::deserialize(objId), id, rs, success); return Answer::AnswerDelete(ObjectId::deserialize(objId), id, rs, success);
} }
bool AnswerHas(const uint64_t &objId, const nsString &id, bool AnswerHas(const uint64_t &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp) { ReturnStatus *rs, bool *bp) {
return Answer::AnswerHas(ObjectId::deserialize(objId), id, rs, bp); return Answer::AnswerHas(ObjectId::deserialize(objId), id, rs, bp);
} }
bool AnswerHasOwn(const uint64_t &objId, const nsString &id, bool AnswerHasOwn(const uint64_t &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp) { ReturnStatus *rs, bool *bp) {
return Answer::AnswerHasOwn(ObjectId::deserialize(objId), id, rs, bp); return Answer::AnswerHasOwn(ObjectId::deserialize(objId), id, rs, bp);
} }
bool AnswerGet(const uint64_t &objId, const ObjectVariant &receiverVar, bool AnswerGet(const uint64_t &objId, const ObjectVariant &receiverVar,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, JSVariant *result) { ReturnStatus *rs, JSVariant *result) {
return Answer::AnswerGet(ObjectId::deserialize(objId), receiverVar, id, rs, result); return Answer::AnswerGet(ObjectId::deserialize(objId), receiverVar, id, rs, result);
} }
bool AnswerSet(const uint64_t &objId, const ObjectVariant &receiverVar, bool AnswerSet(const uint64_t &objId, const ObjectVariant &receiverVar,
const nsString &id, const bool &strict, const JSIDVariant &id, const bool &strict,
const JSVariant &value, ReturnStatus *rs, JSVariant *result) { const JSVariant &value, ReturnStatus *rs, JSVariant *result) {
return Answer::AnswerSet(ObjectId::deserialize(objId), receiverVar, id, strict, value, rs, result); return Answer::AnswerSet(ObjectId::deserialize(objId), receiverVar, id, strict, value, rs, result);
} }
@ -134,42 +134,42 @@ class JavaScriptBase : public WrapperOwner, public WrapperAnswer, public Base
bool CallPreventExtensions(const ObjectId &objId, ReturnStatus *rs) { bool CallPreventExtensions(const ObjectId &objId, ReturnStatus *rs) {
return Base::CallPreventExtensions(objId.serialize(), rs); return Base::CallPreventExtensions(objId.serialize(), rs);
} }
bool CallGetPropertyDescriptor(const ObjectId &objId, const nsString &id, bool CallGetPropertyDescriptor(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out) { PPropertyDescriptor *out) {
return Base::CallGetPropertyDescriptor(objId.serialize(), id, rs, out); return Base::CallGetPropertyDescriptor(objId.serialize(), id, rs, out);
} }
bool CallGetOwnPropertyDescriptor(const ObjectId &objId, bool CallGetOwnPropertyDescriptor(const ObjectId &objId,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out) { PPropertyDescriptor *out) {
return Base::CallGetOwnPropertyDescriptor(objId.serialize(), id, rs, out); return Base::CallGetOwnPropertyDescriptor(objId.serialize(), id, rs, out);
} }
bool CallDefineProperty(const ObjectId &objId, const nsString &id, bool CallDefineProperty(const ObjectId &objId, const JSIDVariant &id,
const PPropertyDescriptor &flags, const PPropertyDescriptor &flags,
ReturnStatus *rs) { ReturnStatus *rs) {
return Base::CallDefineProperty(objId.serialize(), id, flags, rs); return Base::CallDefineProperty(objId.serialize(), id, flags, rs);
} }
bool CallDelete(const ObjectId &objId, const nsString &id, bool CallDelete(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *success) { ReturnStatus *rs, bool *success) {
return Base::CallDelete(objId.serialize(), id, rs, success); return Base::CallDelete(objId.serialize(), id, rs, success);
} }
bool CallHas(const ObjectId &objId, const nsString &id, bool CallHas(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp) { ReturnStatus *rs, bool *bp) {
return Base::CallHas(objId.serialize(), id, rs, bp); return Base::CallHas(objId.serialize(), id, rs, bp);
} }
bool CallHasOwn(const ObjectId &objId, const nsString &id, bool CallHasOwn(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp) { ReturnStatus *rs, bool *bp) {
return Base::CallHasOwn(objId.serialize(), id, rs, bp); return Base::CallHasOwn(objId.serialize(), id, rs, bp);
} }
bool CallGet(const ObjectId &objId, const ObjectVariant &receiverVar, bool CallGet(const ObjectId &objId, const ObjectVariant &receiverVar,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, JSVariant *result) { ReturnStatus *rs, JSVariant *result) {
return Base::CallGet(objId.serialize(), receiverVar, id, rs, result); return Base::CallGet(objId.serialize(), receiverVar, id, rs, result);
} }
bool CallSet(const ObjectId &objId, const ObjectVariant &receiverVar, bool CallSet(const ObjectId &objId, const ObjectVariant &receiverVar,
const nsString &id, const bool &strict, const JSIDVariant &id, const bool &strict,
const JSVariant &value, ReturnStatus *rs, JSVariant *result) { const JSVariant &value, ReturnStatus *rs, JSVariant *result) {
return Base::CallSet(objId.serialize(), receiverVar, id, strict, value, rs, result); return Base::CallSet(objId.serialize(), receiverVar, id, strict, value, rs, result);
} }

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

@ -49,6 +49,12 @@ struct OutVariant
explicit OutVariant(const JSVariant &variant) : variant(variant) {} explicit OutVariant(const JSVariant &variant) : variant(variant) {}
}; };
struct Identifier
{
JSIDVariant variant;
explicit Identifier(const JSIDVariant &variant) : variant(variant) {}
};
class Logging class Logging
{ {
public: public:
@ -184,6 +190,25 @@ class Logging
} }
} }
void format(const Identifier &id, nsCString &out) {
switch (id.variant.type()) {
case JSIDVariant::TnsString: {
nsAutoCString tmp;
format(id.variant.get_nsString(), tmp);
out = nsPrintfCString("\"%s\"", tmp.get());
break;
}
case JSIDVariant::Tint32_t: {
out = nsPrintfCString("%d", id.variant.get_int32_t());
break;
}
default: {
out = "Unknown";
break;
}
}
}
private: private:
JavaScriptShared *shared; JavaScriptShared *shared;
JSContext *cx; JSContext *cx;

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

@ -348,10 +348,45 @@ JavaScriptShared::fromVariant(JSContext *cx, const JSVariant &from, MutableHandl
} }
default: default:
MOZ_CRASH("NYI");
return false; return false;
} }
} }
bool
JavaScriptShared::toJSIDVariant(JSContext *cx, HandleId from, JSIDVariant *to)
{
if (JSID_IS_STRING(from)) {
nsAutoJSString autoStr;
if (!autoStr.init(cx, JSID_TO_STRING(from)))
return false;
*to = autoStr;
return true;
}
if (JSID_IS_INT(from)) {
*to = JSID_TO_INT(from);
return true;
}
MOZ_CRASH("NYI");
return false;
}
bool
JavaScriptShared::fromJSIDVariant(JSContext *cx, const JSIDVariant &from, MutableHandleId to)
{
switch (from.type()) {
case JSIDVariant::TnsString:
return convertGeckoStringToId(cx, from.get_nsString(), to);
case JSIDVariant::Tint32_t:
to.set(INT_TO_JSID(from.get_int32_t()));
return true;
default:
return false;
}
}
/* static */ void /* static */ void
JavaScriptShared::ConvertID(const nsID &from, JSIID *to) JavaScriptShared::ConvertID(const nsID &from, JSIID *to)
{ {

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

@ -158,6 +158,9 @@ class JavaScriptShared
bool toVariant(JSContext *cx, JS::HandleValue from, JSVariant *to); bool toVariant(JSContext *cx, JS::HandleValue from, JSVariant *to);
bool fromVariant(JSContext *cx, const JSVariant &from, JS::MutableHandleValue to); bool fromVariant(JSContext *cx, const JSVariant &from, JS::MutableHandleValue to);
bool toJSIDVariant(JSContext *cx, JS::HandleId from, JSIDVariant *to);
bool fromJSIDVariant(JSContext *cx, const JSIDVariant &from, JS::MutableHandleId to);
bool fromDescriptor(JSContext *cx, JS::Handle<JSPropertyDescriptor> desc, bool fromDescriptor(JSContext *cx, JS::Handle<JSPropertyDescriptor> desc,
PPropertyDescriptor *out); PPropertyDescriptor *out);
bool toDescriptor(JSContext *cx, const PPropertyDescriptor &in, bool toDescriptor(JSContext *cx, const PPropertyDescriptor &in,

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

@ -57,6 +57,12 @@ union JSVariant
JSIID; /* XPC nsIID */ JSIID; /* XPC nsIID */
}; };
union JSIDVariant
{
nsString;
int32_t;
};
struct ReturnSuccess struct ReturnSuccess
{ {
}; };

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

@ -25,15 +25,15 @@ both:
// These roughly map to the ProxyHandler hooks that CPOWs need. // These roughly map to the ProxyHandler hooks that CPOWs need.
rpc PreventExtensions(uint64_t objId) returns (ReturnStatus rs); rpc PreventExtensions(uint64_t objId) returns (ReturnStatus rs);
rpc GetPropertyDescriptor(uint64_t objId, nsString id) returns (ReturnStatus rs, PPropertyDescriptor result); rpc GetPropertyDescriptor(uint64_t objId, JSIDVariant id) returns (ReturnStatus rs, PPropertyDescriptor result);
rpc GetOwnPropertyDescriptor(uint64_t objId, nsString id) returns (ReturnStatus rs, PPropertyDescriptor result); rpc GetOwnPropertyDescriptor(uint64_t objId, JSIDVariant id) returns (ReturnStatus rs, PPropertyDescriptor result);
rpc DefineProperty(uint64_t objId, nsString id, PPropertyDescriptor descriptor) returns (ReturnStatus rs); rpc DefineProperty(uint64_t objId, JSIDVariant id, PPropertyDescriptor descriptor) returns (ReturnStatus rs);
rpc Delete(uint64_t objId, nsString id) returns (ReturnStatus rs, bool successful); rpc Delete(uint64_t objId, JSIDVariant id) returns (ReturnStatus rs, bool successful);
rpc Has(uint64_t objId, nsString id) returns (ReturnStatus rs, bool has); rpc Has(uint64_t objId, JSIDVariant id) returns (ReturnStatus rs, bool has);
rpc HasOwn(uint64_t objId, nsString id) returns (ReturnStatus rs, bool has); rpc HasOwn(uint64_t objId, JSIDVariant id) returns (ReturnStatus rs, bool has);
rpc Get(uint64_t objId, ObjectVariant receiver, nsString id) returns (ReturnStatus rs, JSVariant result); rpc Get(uint64_t objId, ObjectVariant receiver, JSIDVariant id) returns (ReturnStatus rs, JSVariant result);
rpc Set(uint64_t objId, ObjectVariant receiver, nsString id, bool strict, JSVariant value) returns (ReturnStatus rs, JSVariant result); rpc Set(uint64_t objId, ObjectVariant receiver, JSIDVariant id, bool strict, JSVariant value) returns (ReturnStatus rs, JSVariant result);
rpc IsExtensible(uint64_t objId) returns (ReturnStatus rs, bool result); rpc IsExtensible(uint64_t objId) returns (ReturnStatus rs, bool result);
rpc CallOrConstruct(uint64_t objId, JSParam[] argv, bool construct) returns (ReturnStatus rs, JSVariant result, JSParam[] outparams); rpc CallOrConstruct(uint64_t objId, JSParam[] argv, bool construct) returns (ReturnStatus rs, JSVariant result, JSParam[] outparams);

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

@ -87,8 +87,8 @@ EmptyDesc(PPropertyDescriptor *desc)
} }
bool bool
WrapperAnswer::AnswerGetPropertyDescriptor(const ObjectId &objId, const nsString &id, WrapperAnswer::AnswerGetPropertyDescriptor(const ObjectId &objId, const JSIDVariant &idVar,
ReturnStatus *rs, PPropertyDescriptor *out) ReturnStatus *rs, PPropertyDescriptor *out)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -101,14 +101,14 @@ WrapperAnswer::AnswerGetPropertyDescriptor(const ObjectId &objId, const nsString
JSAutoCompartment comp(cx, obj); JSAutoCompartment comp(cx, obj);
LOG("%s.getPropertyDescriptor(%s)", ReceiverObj(objId), id); LOG("%s.getPropertyDescriptor(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
Rooted<JSPropertyDescriptor> desc(cx); Rooted<JSPropertyDescriptor> desc(cx);
if (!JS_GetPropertyDescriptorById(cx, obj, internedId, &desc)) if (!JS_GetPropertyDescriptorById(cx, obj, id, &desc))
return fail(cx, rs); return fail(cx, rs);
if (!desc.object()) if (!desc.object())
@ -121,8 +121,8 @@ WrapperAnswer::AnswerGetPropertyDescriptor(const ObjectId &objId, const nsString
} }
bool bool
WrapperAnswer::AnswerGetOwnPropertyDescriptor(const ObjectId &objId, const nsString &id, WrapperAnswer::AnswerGetOwnPropertyDescriptor(const ObjectId &objId, const JSIDVariant &idVar,
ReturnStatus *rs, PPropertyDescriptor *out) ReturnStatus *rs, PPropertyDescriptor *out)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -135,14 +135,14 @@ WrapperAnswer::AnswerGetOwnPropertyDescriptor(const ObjectId &objId, const nsStr
JSAutoCompartment comp(cx, obj); JSAutoCompartment comp(cx, obj);
LOG("%s.getOwnPropertyDescriptor(%s)", ReceiverObj(objId), id); LOG("%s.getOwnPropertyDescriptor(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
Rooted<JSPropertyDescriptor> desc(cx); Rooted<JSPropertyDescriptor> desc(cx);
if (!JS_GetPropertyDescriptorById(cx, obj, internedId, &desc)) if (!JS_GetPropertyDescriptorById(cx, obj, id, &desc))
return fail(cx, rs); return fail(cx, rs);
if (desc.object() != obj) if (desc.object() != obj)
@ -155,8 +155,8 @@ WrapperAnswer::AnswerGetOwnPropertyDescriptor(const ObjectId &objId, const nsStr
} }
bool bool
WrapperAnswer::AnswerDefineProperty(const ObjectId &objId, const nsString &id, WrapperAnswer::AnswerDefineProperty(const ObjectId &objId, const JSIDVariant &idVar,
const PPropertyDescriptor &descriptor, ReturnStatus *rs) const PPropertyDescriptor &descriptor, ReturnStatus *rs)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -167,23 +167,23 @@ WrapperAnswer::AnswerDefineProperty(const ObjectId &objId, const nsString &id,
JSAutoCompartment comp(cx, obj); JSAutoCompartment comp(cx, obj);
LOG("define %s[%s]", ReceiverObj(objId), id); LOG("define %s[%s]", ReceiverObj(objId), Identifier(idVar));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
Rooted<JSPropertyDescriptor> desc(cx); Rooted<JSPropertyDescriptor> desc(cx);
if (!toDescriptor(cx, descriptor, &desc)) if (!toDescriptor(cx, descriptor, &desc))
return fail(cx, rs); return fail(cx, rs);
if (!js::CheckDefineProperty(cx, obj, internedId, desc.value(), desc.attributes(), if (!js::CheckDefineProperty(cx, obj, id, desc.value(), desc.attributes(),
desc.getter(), desc.setter())) desc.getter(), desc.setter()))
{ {
return fail(cx, rs); return fail(cx, rs);
} }
if (!JS_DefinePropertyById(cx, obj, internedId, desc.value(), desc.attributes(), if (!JS_DefinePropertyById(cx, obj, id, desc.value(), desc.attributes(),
desc.getter(), desc.setter())) desc.getter(), desc.setter()))
{ {
return fail(cx, rs); return fail(cx, rs);
@ -193,8 +193,8 @@ WrapperAnswer::AnswerDefineProperty(const ObjectId &objId, const nsString &id,
} }
bool bool
WrapperAnswer::AnswerDelete(const ObjectId &objId, const nsString &id, ReturnStatus *rs, WrapperAnswer::AnswerDelete(const ObjectId &objId, const JSIDVariant &idVar, ReturnStatus *rs,
bool *success) bool *success)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -207,20 +207,20 @@ WrapperAnswer::AnswerDelete(const ObjectId &objId, const nsString &id, ReturnSta
JSAutoCompartment comp(cx, obj); JSAutoCompartment comp(cx, obj);
LOG("delete %s[%s]", ReceiverObj(objId), id); LOG("delete %s[%s]", ReceiverObj(objId), Identifier(idVar));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
if (!JS_DeletePropertyById2(cx, obj, internedId, success)) if (!JS_DeletePropertyById2(cx, obj, id, success))
return fail(cx, rs); return fail(cx, rs);
return ok(rs); return ok(rs);
} }
bool bool
WrapperAnswer::AnswerHas(const ObjectId &objId, const nsString &id, ReturnStatus *rs, bool *bp) WrapperAnswer::AnswerHas(const ObjectId &objId, const JSIDVariant &idVar, ReturnStatus *rs, bool *bp)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -233,14 +233,14 @@ WrapperAnswer::AnswerHas(const ObjectId &objId, const nsString &id, ReturnStatus
JSAutoCompartment comp(cx, obj); JSAutoCompartment comp(cx, obj);
LOG("%s.has(%s)", ReceiverObj(objId), id); LOG("%s.has(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
bool found; bool found;
if (!JS_HasPropertyById(cx, obj, internedId, &found)) if (!JS_HasPropertyById(cx, obj, id, &found))
return fail(cx, rs); return fail(cx, rs);
*bp = !!found; *bp = !!found;
@ -248,7 +248,8 @@ WrapperAnswer::AnswerHas(const ObjectId &objId, const nsString &id, ReturnStatus
} }
bool bool
WrapperAnswer::AnswerHasOwn(const ObjectId &objId, const nsString &id, ReturnStatus *rs, bool *bp) WrapperAnswer::AnswerHasOwn(const ObjectId &objId, const JSIDVariant &idVar, ReturnStatus *rs,
bool *bp)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -261,14 +262,14 @@ WrapperAnswer::AnswerHasOwn(const ObjectId &objId, const nsString &id, ReturnSta
JSAutoCompartment comp(cx, obj); JSAutoCompartment comp(cx, obj);
LOG("%s.hasOwn(%s)", ReceiverObj(objId), id); LOG("%s.hasOwn(%s)", ReceiverObj(objId), Identifier(idVar));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
Rooted<JSPropertyDescriptor> desc(cx); Rooted<JSPropertyDescriptor> desc(cx);
if (!JS_GetPropertyDescriptorById(cx, obj, internedId, &desc)) if (!JS_GetPropertyDescriptorById(cx, obj, id, &desc))
return fail(cx, rs); return fail(cx, rs);
*bp = (desc.object() == obj); *bp = (desc.object() == obj);
@ -276,8 +277,8 @@ WrapperAnswer::AnswerHasOwn(const ObjectId &objId, const nsString &id, ReturnSta
} }
bool bool
WrapperAnswer::AnswerGet(const ObjectId &objId, const ObjectVariant &receiverVar, const nsString &id, WrapperAnswer::AnswerGet(const ObjectId &objId, const ObjectVariant &receiverVar,
ReturnStatus *rs, JSVariant *result) const JSIDVariant &idVar, ReturnStatus *rs, JSVariant *result)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -296,26 +297,26 @@ WrapperAnswer::AnswerGet(const ObjectId &objId, const ObjectVariant &receiverVar
if (!receiver) if (!receiver)
return fail(cx, rs); return fail(cx, rs);
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
JS::RootedValue val(cx); JS::RootedValue val(cx);
if (!JS_ForwardGetPropertyTo(cx, obj, internedId, receiver, &val)) if (!JS_ForwardGetPropertyTo(cx, obj, id, receiver, &val))
return fail(cx, rs); return fail(cx, rs);
if (!toVariant(cx, val, result)) if (!toVariant(cx, val, result))
return fail(cx, rs); return fail(cx, rs);
LOG("get %s.%s = %s", ReceiverObj(objId), id, OutVariant(*result)); LOG("get %s.%s = %s", ReceiverObj(objId), Identifier(idVar), OutVariant(*result));
return ok(rs); return ok(rs);
} }
bool bool
WrapperAnswer::AnswerSet(const ObjectId &objId, const ObjectVariant &receiverVar, const nsString &id, WrapperAnswer::AnswerSet(const ObjectId &objId, const ObjectVariant &receiverVar,
const bool &strict, const JSVariant &value, ReturnStatus *rs, const JSIDVariant &idVar, const bool &strict, const JSVariant &value,
JSVariant *result) ReturnStatus *rs, JSVariant *result)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -334,10 +335,10 @@ WrapperAnswer::AnswerSet(const ObjectId &objId, const ObjectVariant &receiverVar
if (!receiver) if (!receiver)
return fail(cx, rs); return fail(cx, rs);
LOG("set %s[%s] = %s", ReceiverObj(objId), id, InVariant(value)); LOG("set %s[%s] = %s", ReceiverObj(objId), Identifier(idVar), InVariant(value));
RootedId internedId(cx); RootedId id(cx);
if (!convertGeckoStringToId(cx, id, &internedId)) if (!fromJSIDVariant(cx, idVar, &id))
return fail(cx, rs); return fail(cx, rs);
MOZ_ASSERT(obj == receiver); MOZ_ASSERT(obj == receiver);
@ -346,7 +347,7 @@ WrapperAnswer::AnswerSet(const ObjectId &objId, const ObjectVariant &receiverVar
if (!fromVariant(cx, value, &val)) if (!fromVariant(cx, value, &val))
return fail(cx, rs); return fail(cx, rs);
if (!JS_SetPropertyById(cx, obj, internedId, val)) if (!JS_SetPropertyById(cx, obj, id, val))
return fail(cx, rs); return fail(cx, rs);
if (!toVariant(cx, val, result)) if (!toVariant(cx, val, result))
@ -512,7 +513,7 @@ WrapperAnswer::AnswerHasInstance(const ObjectId &objId, const JSVariant &vVar, R
bool bool
WrapperAnswer::AnswerObjectClassIs(const ObjectId &objId, const uint32_t &classValue, WrapperAnswer::AnswerObjectClassIs(const ObjectId &objId, const uint32_t &classValue,
bool *result) bool *result)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -579,7 +580,7 @@ WrapperAnswer::AnswerRegExpToShared(const ObjectId &objId, ReturnStatus *rs,
bool bool
WrapperAnswer::AnswerGetPropertyNames(const ObjectId &objId, const uint32_t &flags, WrapperAnswer::AnswerGetPropertyNames(const ObjectId &objId, const uint32_t &flags,
ReturnStatus *rs, nsTArray<nsString> *names) ReturnStatus *rs, nsTArray<nsString> *names)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -609,7 +610,7 @@ WrapperAnswer::AnswerGetPropertyNames(const ObjectId &objId, const uint32_t &fla
bool bool
WrapperAnswer::AnswerInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnStatus *rs, WrapperAnswer::AnswerInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnStatus *rs,
bool *instanceof) bool *instanceof)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);
@ -636,8 +637,7 @@ WrapperAnswer::AnswerInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnS
bool bool
WrapperAnswer::AnswerDOMInstanceOf(const ObjectId &objId, const int &prototypeID, WrapperAnswer::AnswerDOMInstanceOf(const ObjectId &objId, const int &prototypeID,
const int &depth, const int &depth, ReturnStatus *rs, bool *instanceof)
ReturnStatus *rs, bool *instanceof)
{ {
AutoSafeJSContext cx; AutoSafeJSContext cx;
JSAutoRequest request(cx); JSAutoRequest request(cx);

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

@ -19,28 +19,28 @@ class WrapperAnswer : public virtual JavaScriptShared
explicit WrapperAnswer(JSRuntime *rt) : JavaScriptShared(rt) {} explicit WrapperAnswer(JSRuntime *rt) : JavaScriptShared(rt) {}
bool AnswerPreventExtensions(const ObjectId &objId, ReturnStatus *rs); bool AnswerPreventExtensions(const ObjectId &objId, ReturnStatus *rs);
bool AnswerGetPropertyDescriptor(const ObjectId &objId, const nsString &id, bool AnswerGetPropertyDescriptor(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out); PPropertyDescriptor *out);
bool AnswerGetOwnPropertyDescriptor(const ObjectId &objId, bool AnswerGetOwnPropertyDescriptor(const ObjectId &objId,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out); PPropertyDescriptor *out);
bool AnswerDefineProperty(const ObjectId &objId, const nsString &id, bool AnswerDefineProperty(const ObjectId &objId, const JSIDVariant &id,
const PPropertyDescriptor &flags, const PPropertyDescriptor &flags,
ReturnStatus *rs); ReturnStatus *rs);
bool AnswerDelete(const ObjectId &objId, const nsString &id, bool AnswerDelete(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *success); ReturnStatus *rs, bool *success);
bool AnswerHas(const ObjectId &objId, const nsString &id, bool AnswerHas(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp); ReturnStatus *rs, bool *bp);
bool AnswerHasOwn(const ObjectId &objId, const nsString &id, bool AnswerHasOwn(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp); ReturnStatus *rs, bool *bp);
bool AnswerGet(const ObjectId &objId, const ObjectVariant &receiverVar, bool AnswerGet(const ObjectId &objId, const ObjectVariant &receiverVar,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, JSVariant *result); ReturnStatus *rs, JSVariant *result);
bool AnswerSet(const ObjectId &objId, const ObjectVariant &receiverVar, bool AnswerSet(const ObjectId &objId, const ObjectVariant &receiverVar,
const nsString &id, const bool &strict, const JSIDVariant &id, const bool &strict,
const JSVariant &value, ReturnStatus *rs, JSVariant *result); const JSVariant &value, ReturnStatus *rs, JSVariant *result);
bool AnswerIsExtensible(const ObjectId &objId, ReturnStatus *rs, bool AnswerIsExtensible(const ObjectId &objId, ReturnStatus *rs,

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

@ -145,13 +145,13 @@ WrapperOwner::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
ReturnStatus status; ReturnStatus status;
PPropertyDescriptor result; PPropertyDescriptor result;
if (!CallGetPropertyDescriptor(objId, idstr, &status, &result)) if (!CallGetPropertyDescriptor(objId, idVar, &status, &result))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -175,13 +175,13 @@ WrapperOwner::getOwnPropertyDescriptor(JSContext *cx, HandleObject proxy, Handle
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
ReturnStatus status; ReturnStatus status;
PPropertyDescriptor result; PPropertyDescriptor result;
if (!CallGetOwnPropertyDescriptor(objId, idstr, &status, &result)) if (!CallGetOwnPropertyDescriptor(objId, idVar, &status, &result))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -205,8 +205,8 @@ WrapperOwner::defineProperty(JSContext *cx, HandleObject proxy, HandleId id,
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
PPropertyDescriptor descriptor; PPropertyDescriptor descriptor;
@ -214,7 +214,7 @@ WrapperOwner::defineProperty(JSContext *cx, HandleObject proxy, HandleId id,
return false; return false;
ReturnStatus status; ReturnStatus status;
if (!CallDefineProperty(objId, idstr, descriptor, &status)) if (!CallDefineProperty(objId, idVar, descriptor, &status))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -246,12 +246,12 @@ WrapperOwner::delete_(JSContext *cx, HandleObject proxy, HandleId id, bool *bp)
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
ReturnStatus status; ReturnStatus status;
if (!CallDelete(objId, idstr, &status, bp)) if (!CallDelete(objId, idVar, &status, bp))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -282,12 +282,12 @@ WrapperOwner::has(JSContext *cx, HandleObject proxy, HandleId id, bool *bp)
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
ReturnStatus status; ReturnStatus status;
if (!CallHas(objId, idstr, &status, bp)) if (!CallHas(objId, idVar, &status, bp))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -306,12 +306,12 @@ WrapperOwner::hasOwn(JSContext *cx, HandleObject proxy, HandleId id, bool *bp)
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
ReturnStatus status; ReturnStatus status;
if (!CallHasOwn(objId, idstr, &status, bp)) if (!CallHasOwn(objId, idVar, &status, bp))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -382,7 +382,7 @@ WrapperOwner::toString(JSContext *cx, HandleObject cpow, JS::CallArgs &args)
bool bool
WrapperOwner::get(JSContext *cx, HandleObject proxy, HandleObject receiver, WrapperOwner::get(JSContext *cx, HandleObject proxy, HandleObject receiver,
HandleId id, MutableHandleValue vp) HandleId id, MutableHandleValue vp)
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
@ -390,13 +390,13 @@ WrapperOwner::get(JSContext *cx, HandleObject proxy, HandleObject receiver,
if (!toObjectVariant(cx, receiver, &receiverVar)) if (!toObjectVariant(cx, receiver, &receiverVar))
return false; return false;
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
JSVariant val; JSVariant val;
ReturnStatus status; ReturnStatus status;
if (!CallGet(objId, receiverVar, idstr, &status, &val)) if (!CallGet(objId, receiverVar, idVar, &status, &val))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();
@ -407,7 +407,8 @@ WrapperOwner::get(JSContext *cx, HandleObject proxy, HandleObject receiver,
if (!fromVariant(cx, val, vp)) if (!fromVariant(cx, val, vp))
return false; return false;
if (idstr.EqualsLiteral("toString")) { if (idVar.type() == JSIDVariant::TnsString &&
idVar.get_nsString().EqualsLiteral("toString")) {
RootedFunction toString(cx, JS_NewFunction(cx, CPOWToString, 0, 0, proxy, "toString")); RootedFunction toString(cx, JS_NewFunction(cx, CPOWToString, 0, 0, proxy, "toString"));
if (!toString) if (!toString)
return false; return false;
@ -432,7 +433,7 @@ CPOWProxyHandler::set(JSContext *cx, JS::HandleObject proxy, JS::HandleObject re
bool bool
WrapperOwner::set(JSContext *cx, JS::HandleObject proxy, JS::HandleObject receiver, WrapperOwner::set(JSContext *cx, JS::HandleObject proxy, JS::HandleObject receiver,
JS::HandleId id, bool strict, JS::MutableHandleValue vp) JS::HandleId id, bool strict, JS::MutableHandleValue vp)
{ {
ObjectId objId = idOf(proxy); ObjectId objId = idOf(proxy);
@ -440,8 +441,8 @@ WrapperOwner::set(JSContext *cx, JS::HandleObject proxy, JS::HandleObject receiv
if (!toObjectVariant(cx, receiver, &receiverVar)) if (!toObjectVariant(cx, receiver, &receiverVar))
return false; return false;
nsString idstr; JSIDVariant idVar;
if (!convertIdToGeckoString(cx, id, &idstr)) if (!toJSIDVariant(cx, id, &idVar))
return false; return false;
JSVariant val; JSVariant val;
@ -450,7 +451,7 @@ WrapperOwner::set(JSContext *cx, JS::HandleObject proxy, JS::HandleObject receiv
ReturnStatus status; ReturnStatus status;
JSVariant result; JSVariant result;
if (!CallSet(objId, receiverVar, idstr, strict, val, &status, &result)) if (!CallSet(objId, receiverVar, idVar, strict, val, &status, &result))
return ipcfail(cx); return ipcfail(cx);
LOG_STACK(); LOG_STACK();

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

@ -108,28 +108,28 @@ class WrapperOwner : public virtual JavaScriptShared
public: public:
virtual bool SendDropObject(const ObjectId &objId) = 0; virtual bool SendDropObject(const ObjectId &objId) = 0;
virtual bool CallPreventExtensions(const ObjectId &objId, ReturnStatus *rs) = 0; virtual bool CallPreventExtensions(const ObjectId &objId, ReturnStatus *rs) = 0;
virtual bool CallGetPropertyDescriptor(const ObjectId &objId, const nsString &id, virtual bool CallGetPropertyDescriptor(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out) = 0; PPropertyDescriptor *out) = 0;
virtual bool CallGetOwnPropertyDescriptor(const ObjectId &objId, virtual bool CallGetOwnPropertyDescriptor(const ObjectId &objId,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, ReturnStatus *rs,
PPropertyDescriptor *out) = 0; PPropertyDescriptor *out) = 0;
virtual bool CallDefineProperty(const ObjectId &objId, const nsString &id, virtual bool CallDefineProperty(const ObjectId &objId, const JSIDVariant &id,
const PPropertyDescriptor &flags, const PPropertyDescriptor &flags,
ReturnStatus *rs) = 0; ReturnStatus *rs) = 0;
virtual bool CallDelete(const ObjectId &objId, const nsString &id, virtual bool CallDelete(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *success) = 0; ReturnStatus *rs, bool *success) = 0;
virtual bool CallHas(const ObjectId &objId, const nsString &id, virtual bool CallHas(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp) = 0; ReturnStatus *rs, bool *bp) = 0;
virtual bool CallHasOwn(const ObjectId &objId, const nsString &id, virtual bool CallHasOwn(const ObjectId &objId, const JSIDVariant &id,
ReturnStatus *rs, bool *bp) = 0; ReturnStatus *rs, bool *bp) = 0;
virtual bool CallGet(const ObjectId &objId, const ObjectVariant &receiverVar, virtual bool CallGet(const ObjectId &objId, const ObjectVariant &receiverVar,
const nsString &id, const JSIDVariant &id,
ReturnStatus *rs, JSVariant *result) = 0; ReturnStatus *rs, JSVariant *result) = 0;
virtual bool CallSet(const ObjectId &objId, const ObjectVariant &receiverVar, virtual bool CallSet(const ObjectId &objId, const ObjectVariant &receiverVar,
const nsString &id, const bool &strict, const JSIDVariant &id, const bool &strict,
const JSVariant &value, ReturnStatus *rs, JSVariant *result) = 0; const JSVariant &value, ReturnStatus *rs, JSVariant *result) = 0;
virtual bool CallIsExtensible(const ObjectId &objId, ReturnStatus *rs, virtual bool CallIsExtensible(const ObjectId &objId, ReturnStatus *rs,