From bb5fdff668ce2f9175d330bf2b8c0bbdf768e570 Mon Sep 17 00:00:00 2001 From: Ben Turner Date: Wed, 8 Dec 2010 15:53:47 -0800 Subject: [PATCH] Backed out changeset f205194a4128 --- dom/src/threads/nsDOMWorker.cpp | 70 +++++++++++++++++-- dom/src/threads/test/atob_worker.js | 5 +- .../xpconnect/loader/mozJSComponentLoader.cpp | 62 +++++++++++++++- js/src/xpconnect/src/nsXPConnect.cpp | 70 +++---------------- js/src/xpconnect/src/xpcprivate.h | 6 -- js/src/xpconnect/src/xpcquickstubs.cpp | 7 +- js/src/xpconnect/src/xpcquickstubs.h | 4 +- 7 files changed, 141 insertions(+), 83 deletions(-) diff --git a/dom/src/threads/nsDOMWorker.cpp b/dom/src/threads/nsDOMWorker.cpp index a17d8160dc2e..2df5cca7e7be 100644 --- a/dom/src/threads/nsDOMWorker.cpp +++ b/dom/src/threads/nsDOMWorker.cpp @@ -367,8 +367,39 @@ nsDOMWorkerFunctions::AtoB(JSContext* aCx, return JS_FALSE; } - return nsXPConnect::Base64Decode(aCx, JS_ARGV(aCx, aVp)[0], - &JS_RVAL(aCx, aVp)); + JSString* str = JS_ValueToString(aCx, JS_ARGV(aCx, aVp)[0]); + if (!str) { + NS_ASSERTION(JS_IsExceptionPending(aCx), "Need to set an exception!"); + return JS_FALSE; + } + + size_t len = JS_GetStringEncodingLength(aCx, str); + if (len == size_t(-1)) + return JS_FALSE; + + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString string(buffer, len); + nsCAutoString result; + + if (NS_FAILED(nsXPConnect::Base64Decode(string, result))) { + JS_ReportError(aCx, "Failed to decode base64 string!"); + return JS_FALSE; + } + + str = JS_NewStringCopyN(aCx, result.get(), result.Length()); + if (!str) { + return JS_FALSE; + } + + JS_SET_RVAL(aCx, aVp, STRING_TO_JSVAL(str)); + return JS_TRUE; } JSBool @@ -388,8 +419,39 @@ nsDOMWorkerFunctions::BtoA(JSContext* aCx, return JS_FALSE; } - return nsXPConnect::Base64Encode(aCx, JS_ARGV(aCx, aVp)[0], - &JS_RVAL(aCx, aVp)); + JSString* str = JS_ValueToString(aCx, JS_ARGV(aCx, aVp)[0]); + if (!str) { + NS_ASSERTION(JS_IsExceptionPending(aCx), "Need to set an exception!"); + return JS_FALSE; + } + + size_t len = JS_GetStringEncodingLength(aCx, str); + if (len == size_t(-1)) + return JS_FALSE; + + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString string(buffer, len); + nsCAutoString result; + + if (NS_FAILED(nsXPConnect::Base64Encode(string, result))) { + JS_ReportError(aCx, "Failed to encode base64 data!"); + return JS_FALSE; + } + + str = JS_NewStringCopyN(aCx, result.get(), result.Length()); + if (!str) { + return JS_FALSE; + } + + JS_SET_RVAL(aCx, aVp, STRING_TO_JSVAL(str)); + return JS_TRUE; } JSBool diff --git a/dom/src/threads/test/atob_worker.js b/dom/src/threads/test/atob_worker.js index d3403a2b60a4..e0ba04fb486a 100644 --- a/dom/src/threads/test/atob_worker.js +++ b/dom/src/threads/test/atob_worker.js @@ -1,4 +1,7 @@ -var data = [ -1, 0, 1, 1.5, null, undefined, true, false ]; +var data = [ -1, 0, 1, 1.5, undefined, true, false ]; + +// XXXbent window.atob treats |null| as the empty string, whereas worker.atob +// and the js component loader treat it as the string 'null'. Meh. var str = ""; for (var i = 0; i < 30; i++) { diff --git a/js/src/xpconnect/loader/mozJSComponentLoader.cpp b/js/src/xpconnect/loader/mozJSComponentLoader.cpp index 409943f92d7c..b4646afc3558 100644 --- a/js/src/xpconnect/loader/mozJSComponentLoader.cpp +++ b/js/src/xpconnect/loader/mozJSComponentLoader.cpp @@ -221,7 +221,36 @@ Atob(JSContext *cx, uintN argc, jsval *vp) if (!argc) return JS_TRUE; - return nsXPConnect::Base64Decode(cx, JS_ARGV(cx, vp)[0], &JS_RVAL(cx, vp)); + JSString *str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); + if (!str) + return JS_FALSE; + + size_t len = JS_GetStringEncodingLength(cx, str); + if (len == size_t(-1)) + return JS_FALSE; + + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString string(buffer, JS_GetStringLength(str)); + nsCAutoString result; + + if (NS_FAILED(nsXPConnect::Base64Decode(string, result))) { + JS_ReportError(cx, "Failed to decode base64 string!"); + return JS_FALSE; + } + + str = JS_NewStringCopyN(cx, result.get(), result.Length()); + if (!str) + return JS_FALSE; + + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(str)); + return JS_TRUE; } static JSBool @@ -230,7 +259,36 @@ Btoa(JSContext *cx, uintN argc, jsval *vp) if (!argc) return JS_TRUE; - return nsXPConnect::Base64Encode(cx, JS_ARGV(cx, vp)[0], &JS_RVAL(cx, vp)); + JSString *str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); + if (!str) + return JS_FALSE; + + size_t len = JS_GetStringEncodingLength(cx, str); + if (len == size_t(-1)) + return JS_FALSE; + + JSUint32 alloc_len = (len + 1) * sizeof(char); + char *buffer = static_cast(nsMemory::Alloc(alloc_len)); + if (!buffer) + return JS_FALSE; + + JS_EncodeStringToBuffer(str, buffer, len); + buffer[len] = '\0'; + + nsDependentCString data(buffer, len); + nsCAutoString result; + + if (NS_FAILED(nsXPConnect::Base64Encode(data, result))) { + JS_ReportError(cx, "Failed to encode base64 data!"); + return JS_FALSE; + } + + str = JS_NewStringCopyN(cx, result.get(), result.Length()); + if (!str) + return JS_FALSE; + + JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(str)); + return JS_TRUE; } static JSFunctionSpec gGlobalFun[] = { diff --git a/js/src/xpconnect/src/nsXPConnect.cpp b/js/src/xpconnect/src/nsXPConnect.cpp index fef5f14dcf43..4d8da0389f96 100644 --- a/js/src/xpconnect/src/nsXPConnect.cpp +++ b/js/src/xpconnect/src/nsXPConnect.cpp @@ -64,8 +64,6 @@ #include "jsdIDebuggerService.h" -#include "xpcquickstubs.h" - NS_IMPL_THREADSAFE_ISUPPORTS6(nsXPConnect, nsIXPConnect, nsISupportsWeakReference, @@ -2617,7 +2615,8 @@ nsXPConnect::GetCaller(JSContext **aJSContext, JSObject **aObj) // static nsresult -nsXPConnect::Base64Encode(const nsACString &aBinaryData, nsACString &aString) +nsXPConnect::Base64Encode(const nsACString &aBinaryData, + nsACString &aString) { // Check for overflow. if(aBinaryData.Length() > (PR_UINT32_MAX / 4) * 3) @@ -2646,7 +2645,8 @@ nsXPConnect::Base64Encode(const nsACString &aBinaryData, nsACString &aString) // static nsresult -nsXPConnect::Base64Encode(const nsAString &aString, nsAString &aBinaryData) +nsXPConnect::Base64Encode(const nsAString &aString, + nsAString &aBinaryData) { NS_LossyConvertUTF16toASCII string(aString); nsCAutoString binaryData; @@ -2660,37 +2660,10 @@ nsXPConnect::Base64Encode(const nsAString &aString, nsAString &aBinaryData) return rv; } -// static -JSBool -nsXPConnect::Base64Encode(JSContext *cx, jsval val, jsval *out) -{ - NS_ASSERTION(cx, "Null context!"); - NS_ASSERTION(out, "Null jsval pointer!"); - - jsval root = val; - xpc_qsACString encodedString(cx, root, &root, xpc_qsACString::eNull, - xpc_qsACString::eStringify); - if(!encodedString.IsValid()) - return JS_FALSE; - - nsCAutoString result; - if(NS_FAILED(nsXPConnect::Base64Encode(encodedString, result))) - { - JS_ReportError(cx, "Failed to encode base64 data!"); - return JS_FALSE; - } - - JSString *str = JS_NewStringCopyN(cx, result.get(), result.Length()); - if (!str) - return JS_FALSE; - - *out = STRING_TO_JSVAL(str); - return JS_TRUE; -} - // static nsresult -nsXPConnect::Base64Decode(const nsACString &aString, nsACString &aBinaryData) +nsXPConnect::Base64Decode(const nsACString &aString, + nsACString &aBinaryData) { // Check for overflow. if(aString.Length() > PR_UINT32_MAX / 3) @@ -2727,7 +2700,8 @@ nsXPConnect::Base64Decode(const nsACString &aString, nsACString &aBinaryData) // static nsresult -nsXPConnect::Base64Decode(const nsAString &aBinaryData, nsAString &aString) +nsXPConnect::Base64Decode(const nsAString &aBinaryData, + nsAString &aString) { NS_LossyConvertUTF16toASCII binaryData(aBinaryData); nsCAutoString string; @@ -2741,34 +2715,6 @@ nsXPConnect::Base64Decode(const nsAString &aBinaryData, nsAString &aString) return rv; } -// static -JSBool -nsXPConnect::Base64Decode(JSContext *cx, jsval val, jsval *out) -{ - NS_ASSERTION(cx, "Null context!"); - NS_ASSERTION(out, "Null jsval pointer!"); - - jsval root = val; - xpc_qsACString encodedString(cx, root, &root, xpc_qsACString::eNull, - xpc_qsACString::eNull); - if(!encodedString.IsValid()) - return JS_FALSE; - - nsCAutoString result; - if(NS_FAILED(nsXPConnect::Base64Decode(encodedString, result))) - { - JS_ReportError(cx, "Failed to decode base64 string!"); - return JS_FALSE; - } - - JSString *str = JS_NewStringCopyN(cx, result.get(), result.Length()); - if(!str) - return JS_FALSE; - - *out = STRING_TO_JSVAL(str); - return JS_TRUE; -} - NS_IMETHODIMP nsXPConnect::SetDebugModeWhenPossible(PRBool mode) { diff --git a/js/src/xpconnect/src/xpcprivate.h b/js/src/xpconnect/src/xpcprivate.h index e4902c732da9..55fe767c0fda 100644 --- a/js/src/xpconnect/src/xpcprivate.h +++ b/js/src/xpconnect/src/xpcprivate.h @@ -570,18 +570,12 @@ public: static nsresult Base64Encode(const nsAString &aString, nsAString &aBinaryData); - // If this returns JS_FALSE then an exception will be set on cx. - static JSBool Base64Encode(JSContext *cx, jsval val, jsval *out); - static nsresult Base64Decode(const nsACString &aBinaryData, nsACString &aString); static nsresult Base64Decode(const nsAString &aBinaryData, nsAString &aString); - // If this returns JS_FALSE then an exception will be set on cx. - static JSBool Base64Decode(JSContext *cx, jsval val, jsval *out); - // nsCycleCollectionParticipant NS_IMETHOD RootAndUnlinkJSObjects(void *p); NS_IMETHOD Unlink(void *p); diff --git a/js/src/xpconnect/src/xpcquickstubs.cpp b/js/src/xpconnect/src/xpcquickstubs.cpp index c9233099dd10..26209c31441c 100644 --- a/js/src/xpconnect/src/xpcquickstubs.cpp +++ b/js/src/xpconnect/src/xpcquickstubs.cpp @@ -709,14 +709,11 @@ xpc_qsDOMString::xpc_qsDOMString(JSContext *cx, jsval v, jsval *pval, mValid = JS_TRUE; } -xpc_qsACString::xpc_qsACString(JSContext *cx, jsval v, jsval *pval, - StringificationBehavior nullBehavior, - StringificationBehavior undefinedBehavior) +xpc_qsACString::xpc_qsACString(JSContext *cx, jsval v, jsval *pval) { typedef implementation_type::char_traits traits; // From the T_CSTRING case in XPCConvert::JSData2Native. - JSString *s = InitOrStringify(cx, v, pval, nullBehavior, - undefinedBehavior); + JSString *s = InitOrStringify(cx, v, pval, eNull, eNull); if (!s) return; diff --git a/js/src/xpconnect/src/xpcquickstubs.h b/js/src/xpconnect/src/xpcquickstubs.h index 7f0c430b5bf5..de3fa1276ea9 100644 --- a/js/src/xpconnect/src/xpcquickstubs.h +++ b/js/src/xpconnect/src/xpcquickstubs.h @@ -439,9 +439,7 @@ public: class xpc_qsACString : public xpc_qsBasicString { public: - xpc_qsACString(JSContext *cx, jsval v, jsval *pval, - StringificationBehavior nullBehavior = eNull, - StringificationBehavior undefinedBehavior = eNull); + xpc_qsACString(JSContext *cx, jsval v, jsval *pval); }; /**