Bug 1244249, Part 1 - Add JS_ReadString to match JS_WriteString. draft
authorKit Cambridge <kcambridge@mozilla.com>
Fri, 29 Jan 2016 11:46:02 -0800
changeset 327374 c6693d506d6ea3ef02756326b3abf2e58db0dacc
parent 327366 b2a3dc4b161fdfac6db78cc5bbfb1f53a383b65a
child 327375 96bfc2037ab8f7fbabbedf864a6451eab9450152
push id10237
push userkcambridge@mozilla.com
push dateSun, 31 Jan 2016 22:46:27 +0000
bugs1244249
milestone47.0a1
Bug 1244249, Part 1 - Add JS_ReadString to match JS_WriteString.
js/public/StructuredClone.h
js/src/vm/StructuredClone.cpp
--- 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) {