NS_IMETHODIMP nsJSONListener::OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) { nsresult rv; // This can happen with short UTF-8 messages (<4 bytes) if (!mSniffBuffer.IsEmpty()) { // Just consume mSniffBuffer rv = ProcessBytes(nullptr, 0); NS_ENSURE_SUCCESS(rv, rv); } JS::RootedValue reviver(mCx, JS::NullValue()), value(mCx); JS::StableCharPtr chars(reinterpret_cast<const jschar*>(mBufferedChars.Elements()), mBufferedChars.Length()); JSBool ok = js::ParseJSONWithReviver(mCx, chars, (uint32_t) mBufferedChars.Length(), reviver, &value, mDecodingMode); *mRootVal = value; mBufferedChars.TruncateLength(0); return ok ? NS_OK : NS_ERROR_FAILURE; }
NS_IMETHODIMP nsJSON::LegacyDecodeToJSVal(const nsAString &str, JSContext *cx, JS::Value *result) { JS::RootedValue reviver(cx, JS::NullValue()), value(cx); JS::StableCharPtr chars(static_cast<const jschar*>(PromiseFlatString(str).get()), str.Length()); if (!js::ParseJSONWithReviver(cx, chars, str.Length(), reviver, &value, LEGACY)) { return NS_ERROR_UNEXPECTED; } *result = value; return NS_OK; }