diff --git a/content/base/test/chrome/cpows_child.js b/content/base/test/chrome/cpows_child.js index 8dc79bd497a2..1290d9eb556d 100644 --- a/content/base/test/chrome/cpows_child.js +++ b/content/base/test/chrome/cpows_child.js @@ -12,6 +12,9 @@ var is_remote; error_reporting_test(); dom_test(); xray_test(); + if (typeof Symbol === "function") { + symbol_test(); + } compartment_test(); regexp_test(); sync_test(); @@ -119,15 +122,13 @@ function symbol_test() { let iterator = Symbol.iterator; let named = Symbol.for("cpow-test"); - // let unique = Symbol(); let object = { [iterator]: iterator, [named]: named, - // [unique]: unique, - // "unique": unique }; - sendSyncMessage("cpows:symbol_test", {}, object); + let test = ['a']; + sendSyncMessage("cpows:symbol_test", {}, {object: object, test: test}); } // Parent->Child references should go X->parent.privilegedJunkScope->child.privilegedJunkScope->Y diff --git a/content/base/test/chrome/cpows_parent.xul b/content/base/test/chrome/cpows_parent.xul index 74c5437c297b..73876f63f016 100644 --- a/content/base/test/chrome/cpows_parent.xul +++ b/content/base/test/chrome/cpows_parent.xul @@ -206,10 +206,16 @@ } function recvSymbolTest(message) { - let object = message.objects; + let object = message.objects.object; is(object[Symbol.iterator], Symbol.iterator, "Should use Symbol.iterator"); is(Symbol.keyFor(object[Symbol.for("cpow-test")]), "cpow-test", "Symbols aren't registered correctly"); - // is(object.unique, object[object.unique], "Unique symbols as ids and values don't seem to work"); + let symbols = Object.getOwnPropertySymbols(object); + is(symbols.length, 2, "Object should have two symbol keys"); + let test = undefined; + for (let x of message.objects.test) { + test = x; + } + is(test, "a", "for .. of iteration should work"); } let systemGlobal = this; @@ -307,7 +313,9 @@ mm.addMessageListener("cpows:dom_test", recvDomTest); mm.addMessageListener("cpows:dom_test_after_gc", recvDomTestAfterGC); mm.addMessageListener("cpows:xray_test", recvXrayTest); - mm.addMessageListener("cpows:symbol_test", recvSymbolTest); + if (typeof Symbol === "function") { + mm.addMessageListener("cpows:symbol_test", recvSymbolTest); + } mm.addMessageListener("cpows:compartment_test", recvCompartmentTest); mm.addMessageListener("cpows:regexp_test", recvRegExpTest); mm.addMessageListener("cpows:lifetime_test_1", recvLifetimeTest1); diff --git a/js/ipc/JavaScriptBase.h b/js/ipc/JavaScriptBase.h index 4ff69ab984ad..a7cf7ff46ee2 100644 --- a/js/ipc/JavaScriptBase.h +++ b/js/ipc/JavaScriptBase.h @@ -102,8 +102,8 @@ class JavaScriptBase : public WrapperOwner, public WrapperAnswer, public Base } bool RecvGetPropertyKeys(const uint64_t &objId, const uint32_t &flags, - ReturnStatus *rs, nsTArray *names) { - return Answer::RecvGetPropertyKeys(ObjectId::deserialize(objId), flags, rs, names); + ReturnStatus *rs, nsTArray *ids) { + return Answer::RecvGetPropertyKeys(ObjectId::deserialize(objId), flags, rs, ids); } bool RecvInstanceOf(const uint64_t &objId, const JSIID &iid, ReturnStatus *rs, bool *instanceof) { @@ -200,8 +200,8 @@ class JavaScriptBase : public WrapperOwner, public WrapperAnswer, public Base } bool SendGetPropertyKeys(const ObjectId &objId, const uint32_t &flags, - ReturnStatus *rs, nsTArray *names) { - return Base::SendGetPropertyKeys(objId.serialize(), flags, rs, names); + ReturnStatus *rs, nsTArray *ids) { + return Base::SendGetPropertyKeys(objId.serialize(), flags, rs, ids); } bool SendInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnStatus *rs, bool *instanceof) { diff --git a/js/ipc/JavaScriptShared.cpp b/js/ipc/JavaScriptShared.cpp index cff04a719612..38a73cb470e4 100644 --- a/js/ipc/JavaScriptShared.cpp +++ b/js/ipc/JavaScriptShared.cpp @@ -440,7 +440,8 @@ JavaScriptShared::toSymbolVariant(JSContext *cx, JS::Symbol *symArg, SymbolVaria *symVarp = RegisteredSymbol(autoStr); return true; } - MOZ_CRASH("unique symbols not yet implemented"); + + JS_ReportError(cx, "unique symbol can't be used with CPOW"); return false; } diff --git a/js/ipc/PJavaScript.ipdl b/js/ipc/PJavaScript.ipdl index b17a02ad499d..d8d0254e97e6 100644 --- a/js/ipc/PJavaScript.ipdl +++ b/js/ipc/PJavaScript.ipdl @@ -42,7 +42,7 @@ both: prio(high) sync ClassName(uint64_t objId) returns (nsString name); prio(high) sync RegExpToShared(uint64_t objId) returns (ReturnStatus rs, nsString source, uint32_t flags); - prio(high) sync GetPropertyKeys(uint64_t objId, uint32_t flags) returns (ReturnStatus rs, nsString[] names); + prio(high) sync GetPropertyKeys(uint64_t objId, uint32_t flags) returns (ReturnStatus rs, JSIDVariant[] ids); prio(high) sync InstanceOf(uint64_t objId, JSIID iid) returns (ReturnStatus rs, bool instanceof); prio(high) sync DOMInstanceOf(uint64_t objId, int prototypeID, int depth) returns (ReturnStatus rs, bool instanceof); diff --git a/js/ipc/WrapperAnswer.cpp b/js/ipc/WrapperAnswer.cpp index b63013e70b9c..ce8a7eaf4f58 100644 --- a/js/ipc/WrapperAnswer.cpp +++ b/js/ipc/WrapperAnswer.cpp @@ -580,7 +580,7 @@ WrapperAnswer::RecvRegExpToShared(const ObjectId &objId, ReturnStatus *rs, bool WrapperAnswer::RecvGetPropertyKeys(const ObjectId &objId, const uint32_t &flags, - ReturnStatus *rs, nsTArray *names) + ReturnStatus *rs, nsTArray *ids) { AutoSafeJSContext cx; JSAutoRequest request(cx); @@ -598,11 +598,11 @@ WrapperAnswer::RecvGetPropertyKeys(const ObjectId &objId, const uint32_t &flags, return fail(cx, rs); for (size_t i = 0; i < props.length(); i++) { - nsString name; - if (!convertIdToGeckoString(cx, props[i], &name)) + JSIDVariant id; + if (!toJSIDVariant(cx, props[i], &id)) return fail(cx, rs); - names->AppendElement(name); + ids->AppendElement(id); } return ok(rs); diff --git a/js/ipc/WrapperAnswer.h b/js/ipc/WrapperAnswer.h index fc3b481f9532..08171528de21 100644 --- a/js/ipc/WrapperAnswer.h +++ b/js/ipc/WrapperAnswer.h @@ -55,7 +55,7 @@ class WrapperAnswer : public virtual JavaScriptShared bool RecvRegExpToShared(const ObjectId &objId, ReturnStatus *rs, nsString *source, uint32_t *flags); bool RecvGetPropertyKeys(const ObjectId &objId, const uint32_t &flags, - ReturnStatus *rs, nsTArray *names); + ReturnStatus *rs, nsTArray *ids); bool RecvInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnStatus *rs, bool *instanceof); bool RecvDOMInstanceOf(const ObjectId &objId, const int &prototypeID, const int &depth, diff --git a/js/ipc/WrapperOwner.cpp b/js/ipc/WrapperOwner.cpp index 31abb5ce2a3d..adc5df67f67f 100644 --- a/js/ipc/WrapperOwner.cpp +++ b/js/ipc/WrapperOwner.cpp @@ -232,7 +232,7 @@ CPOWProxyHandler::ownPropertyKeys(JSContext *cx, HandleObject proxy, bool WrapperOwner::ownPropertyKeys(JSContext *cx, HandleObject proxy, AutoIdVector &props) { - return getPropertyKeys(cx, proxy, JSITER_OWNONLY | JSITER_HIDDEN, props); + return getPropertyKeys(cx, proxy, JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS, props); } bool @@ -776,8 +776,8 @@ WrapperOwner::getPropertyKeys(JSContext *cx, HandleObject proxy, uint32_t flags, ObjectId objId = idOf(proxy); ReturnStatus status; - InfallibleTArray names; - if (!SendGetPropertyKeys(objId, flags, &status, &names)) + InfallibleTArray ids; + if (!SendGetPropertyKeys(objId, flags, &status, &ids)) return ipcfail(cx); LOG_STACK(); @@ -785,11 +785,11 @@ WrapperOwner::getPropertyKeys(JSContext *cx, HandleObject proxy, uint32_t flags, if (!ok(cx, status)) return false; - for (size_t i = 0; i < names.Length(); i++) { - RootedId name(cx); - if (!convertGeckoStringToId(cx, names[i], &name)) + for (size_t i = 0; i < ids.Length(); i++) { + RootedId id(cx); + if (!fromJSIDVariant(cx, ids[i], &id)) return false; - if (!props.append(name)) + if (!props.append(id)) return false; } diff --git a/js/ipc/WrapperOwner.h b/js/ipc/WrapperOwner.h index 215043dfc072..26f19113c72d 100644 --- a/js/ipc/WrapperOwner.h +++ b/js/ipc/WrapperOwner.h @@ -146,7 +146,7 @@ class WrapperOwner : public virtual JavaScriptShared uint32_t *flags) = 0; virtual bool SendGetPropertyKeys(const ObjectId &objId, const uint32_t &flags, - ReturnStatus *rs, nsTArray *names) = 0; + ReturnStatus *rs, nsTArray *ids) = 0; virtual bool SendInstanceOf(const ObjectId &objId, const JSIID &iid, ReturnStatus *rs, bool *instanceof) = 0; virtual bool SendDOMInstanceOf(const ObjectId &objId, const int &prototypeID, const int &depth,