Bug 1264642 - Part 5. Define ParamTraits<JSStructuredCloneData> and use it. draft
authorKan-Ru Chen <kanru@kanru.info>
Mon, 09 May 2016 19:08:49 +0800
changeset 376061 39c5c218d50fe61c9ceb857926f3b8dcb9807254
parent 376060 01f251dc7852744ddca1963170bac704efa18440
child 376062 431448232986bd9b8eb4a9542019c5a694cba085
push id20495
push userbmo:kchen@mozilla.com
push dateTue, 07 Jun 2016 09:48:13 +0000
bugs1264642
milestone49.0a1
Bug 1264642 - Part 5. Define ParamTraits<JSStructuredCloneData> and use it. MozReview-Commit-ID: Eir5bZumcoj
dom/ipc/StructuredCloneData.cpp
ipc/glue/IPCMessageUtils.h
--- a/dom/ipc/StructuredCloneData.cpp
+++ b/dom/ipc/StructuredCloneData.cpp
@@ -91,57 +91,30 @@ StructuredCloneData::Write(JSContext* aC
   mBuffer = nullptr;
   mSharedData = new SharedJSAllocatedData(Move(data));
   mInitialized = true;
 }
 
 void
 StructuredCloneData::WriteIPCParams(IPC::Message* aMsg) const
 {
-  size_t length = DataLength() / sizeof(uint64_t);
-  WriteParam(aMsg, length);
-
-  if (length) {
-    for (auto iter = Data().Iter(); !iter.Done(); iter.Advance(Data(), sizeof(uint64_t))) {
-      WriteParam(aMsg, *reinterpret_cast<uint64_t*>(iter.Data()));
-    }
-  }
+  WriteParam(aMsg, Data());
 }
 
 bool
 StructuredCloneData::ReadIPCParams(const IPC::Message* aMsg,
                                    PickleIterator* aIter)
 {
-  // MOZ_ASSERT(!Data());
-
-  // FIXME Fixed in later patch. See also
-  // ParamTraits<mozilla::SerializedStructuredCloneBuffer>
-  size_t dataLength = 0;
-  if (!ReadParam(aMsg, aIter, &dataLength)) {
+  MOZ_ASSERT(!mInitialized);
+  JSStructuredCloneData data(0, 4096, 4096);
+  if (!ReadParam(aMsg, aIter, &data)) {
     return false;
   }
-
-  if (!dataLength) {
-    return true;
-  }
-
-  JSStructuredCloneData buf(0, 4096, 4096);
-  uint64_t cur;
-  for (size_t i = 0; i < dataLength; ++i) {
-    if (!ReadParam(aMsg, aIter, &cur)) {
-      return false;
-    } else {
-      if (!buf.WriteBytes(reinterpret_cast<char*>(&cur), sizeof(uint64_t))) {
-        return false;
-      }
-    }
-  }
-
-  mSharedData = new SharedJSAllocatedData(Move(buf));
-
+  mSharedData = new SharedJSAllocatedData(Move(data));
+  mInitialized = true;
   return true;
 }
 
 bool
 StructuredCloneData::CopyExternalData(const char* aData,
                                       size_t aDataLength)
 {
   MOZ_ASSERT(!mInitialized);
--- a/ipc/glue/IPCMessageUtils.h
+++ b/ipc/glue/IPCMessageUtils.h
@@ -709,57 +709,68 @@ struct ParamTraits<mozilla::net::WebSock
 
   static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
   {
     return aResult->ReadIPCParams(aMsg, aIter);
   }
 };
 
 template <>
-struct ParamTraits<mozilla::SerializedStructuredCloneBuffer>
+struct ParamTraits<JSStructuredCloneData>
 {
-  typedef mozilla::SerializedStructuredCloneBuffer paramType;
+  typedef JSStructuredCloneData paramType;
 
   static void Write(Message* aMsg, const paramType& aParam)
   {
-    // XXX Use ParamTraits<JSStructuredCloneData>
-    // Fixed in later patch
-    size_t length = aParam.data.Size() / sizeof(uint64_t);
-    WriteParam(aMsg, length);
-    if (length) {
-      for (auto iter = aParam.data.Iter(); !iter.Done(); iter.Advance(aParam.data, sizeof(uint64_t))) {
-        WriteParam(aMsg, *reinterpret_cast<uint64_t*>(iter.Data()));
-      }
+    MOZ_ASSERT(!(aParam.Size() % sizeof(uint64_t)));
+    WriteParam(aMsg, aParam.Size() / sizeof(uint64_t));
+    auto iter = aParam.Iter();
+    while (!iter.Done()) {
+      aMsg->WriteBytes(iter.Data(), iter.RemainingInSegment());
+      iter.Advance(aParam, iter.RemainingInSegment());
     }
   }
 
   static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
   {
-    // XXX Use ParamTraits<JSStructuredCloneData>
-    // Fixed in later patch
+    // FIXME borrow from aIter directly
     size_t length = 0;
     if (!ReadParam(aMsg, aIter, &length)) {
       return false;
     }
 
     if (length) {
       uint64_t cur;
       for (size_t i = 0; i < length; ++i) {
         if (!ReadParam(aMsg, aIter, &cur)) {
           return false;
         } else {
-          if (!aResult->data.WriteBytes(reinterpret_cast<char*>(&cur),
-                                       sizeof(uint64_t))) {
+          if (!aResult->WriteBytes(reinterpret_cast<char*>(&cur), sizeof(uint64_t))) {
             return false;
           }
         }
       }
     }
+    return true;
+  }
+};
 
-    return true;
+template <>
+struct ParamTraits<mozilla::SerializedStructuredCloneBuffer>
+{
+  typedef mozilla::SerializedStructuredCloneBuffer paramType;
+
+  static void Write(Message* aMsg, const paramType& aParam)
+  {
+    WriteParam(aMsg, aParam.data);
+  }
+
+  static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
+  {
+    return ReadParam(aMsg, aIter, &aResult->data);
   }
 
   static void Log(const paramType& aParam, std::wstring* aLog)
   {
     LogParam(aParam.data.Size(), aLog);
   }
 };