author | Olli Pettay <Olli.Pettay@helsinki.fi> |
Tue, 16 Oct 2012 17:52:10 +0300 | |
changeset 110381 | b3d5c1bcf8470f13703aca76c7890ac7abd8df4e |
parent 110380 | fc883f5a1a0830fa405879998e040cd8cb651c0b |
child 110382 | 5a707ebc03294847732922f6b4d2b8a0560d56e8 |
push id | 23682 |
push user | opettay@mozilla.com |
push date | Tue, 16 Oct 2012 16:11:00 +0000 |
treeherder | mozilla-central@5a707ebc0329 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | khuey |
bugs | 797806 |
milestone | 19.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -6,16 +6,17 @@ #include <stdarg.h> #include "BindingUtils.h" #include "AccessCheck.h" #include "WrapperFactory.h" #include "xpcprivate.h" +#include "nsContentUtils.h" #include "XPCQuickStubs.h" #include "nsIXPConnect.h" namespace mozilla { namespace dom { JSErrorFormatString ErrorFormatString[] = { #define MSG_DEF(_name, _argc, _str) \ @@ -734,10 +735,29 @@ SetXrayExpandoChain(JSObject* obj, JSObj JS::Value v = chain ? JS::ObjectValue(*chain) : JSVAL_VOID; if (IsDOMProxy(obj)) { js::SetProxyExtra(obj, JSPROXYSLOT_XRAY_EXPANDO, v); } else { js::SetReservedSlot(obj, DOM_XRAY_EXPANDO_SLOT, v); } } +JSContext* +MainThreadDictionaryBase::ParseJSON(const nsAString& aJSON, + mozilla::Maybe<JSAutoRequest>& aAr, + mozilla::Maybe<JSAutoCompartment>& aAc, + JS::Value& aVal) +{ + JSContext* cx = nsContentUtils::ThreadJSContextStack()->GetSafeJSContext(); + NS_ENSURE_TRUE(cx, nullptr); + JSObject* global = JS_GetGlobalObject(cx); + aAr.construct(cx); + aAc.construct(cx, global); + if (!JS_ParseJSON(cx, + static_cast<const jschar*>(PromiseFlatString(aJSON).get()), + aJSON.Length(), &aVal)) { + return nullptr; + } + return cx; +} + } // namespace dom } // namespace mozilla
--- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -1222,12 +1222,21 @@ MustInheritFromNonRefcountedDOMObject(No { } // Set the chain of expando objects for various consumers of the given object. // For Paris Bindings only. See the relevant infrastructure in XrayWrapper.cpp. JSObject* GetXrayExpandoChain(JSObject *obj); void SetXrayExpandoChain(JSObject *obj, JSObject *chain); +struct MainThreadDictionaryBase +{ +protected: + JSContext* ParseJSON(const nsAString& aJSON, + mozilla::Maybe<JSAutoRequest>& aAr, + mozilla::Maybe<JSAutoCompartment>& aAc, + JS::Value& aVal); +}; + } // namespace dom } // namespace mozilla #endif /* mozilla_dom_BindingUtils_h__ */
--- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -5385,26 +5385,41 @@ class CGDictionary(CGThing): self.generatable = False def declare(self): if not self.generatable: return "" d = self.dictionary if d.parent: inheritance = ": public %s " % self.makeClassName(d.parent) + elif not self.workers: + inheritance = ": public MainThreadDictionaryBase " else: inheritance = "" memberDecls = [" %s %s;" % (self.getMemberType(m), m[0].identifier.name) for m in self.memberInfo] return (string.Template( "struct ${selfName} ${inheritance}{\n" " ${selfName}() {}\n" " bool Init(JSContext* cx, const JS::Value& val);\n" + " \n" + + (" bool Init(const nsAString& aJSON)\n" + " {\n" + " if (aJSON.IsEmpty()) {\n" + " return true;\n" + " }\n" + " mozilla::Maybe<JSAutoRequest> ar;\n" + " mozilla::Maybe<JSAutoCompartment> ac;\n" + " jsval json = JSVAL_VOID;\n" + " JSContext* cx = ParseJSON(aJSON, ar, ac, json);\n" + " NS_ENSURE_TRUE(cx, false);\n" + " return Init(cx, json);\n" + " }\n" if not self.workers else "") + "\n" + "\n".join(memberDecls) + "\n" "private:\n" " // Disallow copy-construction\n" " ${selfName}(const ${selfName}&) MOZ_DELETE;\n" + # NOTE: jsids are per-runtime, so don't use them in workers (" static bool InitIds(JSContext* cx);\n" " static bool initedIds;\n" if not self.workers else "") +