Bug 1244249, Part 1 - Add JS_ReadString to match JS_WriteString.
--- a/js/public/StructuredClone.h
+++ b/js/public/StructuredClone.h
@@ -274,11 +274,14 @@ JS_WriteUint32Pair(JSStructuredCloneWrit
JS_PUBLIC_API(bool)
JS_WriteBytes(JSStructuredCloneWriter* w, const void* p, size_t len);
JS_PUBLIC_API(bool)
JS_WriteString(JSStructuredCloneWriter* w, JS::HandleString str);
JS_PUBLIC_API(bool)
+JS_ReadString(JSStructuredCloneReader* w, JS::MutableHandleValue vp);
+
+JS_PUBLIC_API(bool)
JS_WriteTypedArray(JSStructuredCloneWriter* w, JS::HandleValue v);
#endif /* js_StructuredClone_h */
--- a/js/src/vm/StructuredClone.cpp
+++ b/js/src/vm/StructuredClone.cpp
@@ -262,16 +262,17 @@ struct JSStructuredCloneReader {
// The user defined callbacks that will be used for cloning.
const JSStructuredCloneCallbacks* callbacks;
// Any value passed to JS_ReadStructuredClone.
void* closure;
friend bool JS_ReadTypedArray(JSStructuredCloneReader* r, MutableHandleValue vp);
+ friend bool JS_ReadString(JSStructuredCloneReader* r, MutableHandleValue vp);
};
struct JSStructuredCloneWriter {
public:
explicit JSStructuredCloneWriter(JSContext* cx,
const JSStructuredCloneCallbacks* cb,
void* cbClosure,
Value tVal)
@@ -2371,16 +2372,34 @@ JS_ReadUint32Pair(JSStructuredCloneReade
JS_PUBLIC_API(bool)
JS_ReadBytes(JSStructuredCloneReader* r, void* p, size_t len)
{
return r->input().readBytes(p, len);
}
JS_PUBLIC_API(bool)
+JS_ReadString(JSStructuredCloneReader* r, MutableHandleValue vp)
+{
+ uint32_t tag, lengthAndEncoding;
+ if (!r->input().readPair(&tag, &lengthAndEncoding))
+ return false;
+ if (tag == SCTAG_STRING) {
+ JSString* str = r->readString(lengthAndEncoding);
+ if (!str)
+ return false;
+ vp.setString(str);
+ return true;
+ }
+ JS_ReportErrorNumber(r->context(), GetErrorMessage, nullptr,
+ JSMSG_SC_BAD_SERIALIZED_DATA, "expected type array");
+ return false;
+}
+
+JS_PUBLIC_API(bool)
JS_ReadTypedArray(JSStructuredCloneReader* r, MutableHandleValue vp)
{
uint32_t tag, nelems;
if (!r->input().readPair(&tag, &nelems))
return false;
if (tag >= SCTAG_TYPED_ARRAY_V1_MIN && tag <= SCTAG_TYPED_ARRAY_V1_MAX) {
return r->readTypedArray(TagToV1ArrayType(tag), nelems, vp, true);
} else if (tag == SCTAG_TYPED_ARRAY_OBJECT) {