123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include "StructuredCloneData.h"
- #include "nsIDOMDOMException.h"
- #include "nsIMutable.h"
- #include "nsIXPConnect.h"
- #include "ipc/IPCMessageUtils.h"
- #include "mozilla/dom/BindingUtils.h"
- #include "mozilla/dom/BlobBinding.h"
- #include "mozilla/dom/DOMTypes.h"
- #include "mozilla/dom/File.h"
- #include "mozilla/dom/ToJSValue.h"
- #include "nsContentUtils.h"
- #include "nsJSEnvironment.h"
- #include "MainThreadUtils.h"
- #include "StructuredCloneTags.h"
- #include "jsapi.h"
- namespace mozilla {
- namespace dom {
- namespace ipc {
- bool
- StructuredCloneData::Copy(const StructuredCloneData& aData)
- {
- if (!aData.mInitialized) {
- return true;
- }
- if (aData.SharedData()) {
- mSharedData = aData.SharedData();
- } else {
- mSharedData =
- SharedJSAllocatedData::CreateFromExternalData(aData.Data());
- NS_ENSURE_TRUE(mSharedData, false);
- }
- PortIdentifiers().AppendElements(aData.PortIdentifiers());
- MOZ_ASSERT(BlobImpls().IsEmpty());
- BlobImpls().AppendElements(aData.BlobImpls());
- MOZ_ASSERT(GetSurfaces().IsEmpty());
- MOZ_ASSERT(WasmModules().IsEmpty());
- mInitialized = true;
- return true;
- }
- void
- StructuredCloneData::Read(JSContext* aCx,
- JS::MutableHandle<JS::Value> aValue,
- ErrorResult &aRv)
- {
- MOZ_ASSERT(mInitialized);
- nsIGlobalObject *global = xpc::NativeGlobal(JS::CurrentGlobalOrNull(aCx));
- MOZ_ASSERT(global);
- ReadFromBuffer(global, aCx, Data(), aValue, aRv);
- }
- void
- StructuredCloneData::Write(JSContext* aCx,
- JS::Handle<JS::Value> aValue,
- ErrorResult &aRv)
- {
- Write(aCx, aValue, JS::UndefinedHandleValue, aRv);
- }
- void
- StructuredCloneData::Write(JSContext* aCx,
- JS::Handle<JS::Value> aValue,
- JS::Handle<JS::Value> aTransfer,
- ErrorResult &aRv)
- {
- MOZ_ASSERT(!mInitialized);
- StructuredCloneHolder::Write(aCx, aValue, aTransfer,
- JS::CloneDataPolicy().denySharedArrayBuffer(), aRv);
- if (NS_WARN_IF(aRv.Failed())) {
- return;
- }
- JSStructuredCloneData data(mBuffer->scope());
- mBuffer->abandon();
- mBuffer->steal(&data);
- mBuffer = nullptr;
- mSharedData = new SharedJSAllocatedData(Move(data));
- mInitialized = true;
- }
- void
- StructuredCloneData::WriteIPCParams(IPC::Message* aMsg) const
- {
- WriteParam(aMsg, Data());
- }
- bool
- StructuredCloneData::ReadIPCParams(const IPC::Message* aMsg,
- PickleIterator* aIter)
- {
- MOZ_ASSERT(!mInitialized);
- JSStructuredCloneData data(JS::StructuredCloneScope::DifferentProcess);
- if (!ReadParam(aMsg, aIter, &data)) {
- return false;
- }
- mSharedData = new SharedJSAllocatedData(Move(data));
- mInitialized = true;
- return true;
- }
- bool
- StructuredCloneData::CopyExternalData(const char* aData,
- size_t aDataLength)
- {
- MOZ_ASSERT(!mInitialized);
- mSharedData = SharedJSAllocatedData::CreateFromExternalData(aData,
- aDataLength);
- NS_ENSURE_TRUE(mSharedData, false);
- mInitialized = true;
- return true;
- }
- } // namespace ipc
- } // namespace dom
- } // namespace mozilla
|