StructuredCloneBlob.h (3032B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_dom_StructuredCloneBlob_h 8 #define mozilla_dom_StructuredCloneBlob_h 9 10 #include "js/TypeDecls.h" 11 #include "mozilla/AlreadyAddRefed.h" 12 #include "mozilla/Maybe.h" 13 #include "mozilla/RefPtr.h" 14 #include "mozilla/dom/StructuredCloneHolder.h" 15 #include "nsIMemoryReporter.h" 16 #include "nsISupports.h" 17 18 struct JSStructuredCloneReader; 19 struct JSStructuredCloneWriter; 20 21 namespace mozilla { 22 23 class ErrorResult; 24 25 namespace dom { 26 27 class GlobalObject; 28 29 class StructuredCloneBlob final : public nsIMemoryReporter { 30 MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf) 31 32 public: 33 NS_DECL_ISUPPORTS 34 NS_DECL_NSIMEMORYREPORTER 35 36 static JSObject* ReadStructuredClone(JSContext* aCx, 37 JSStructuredCloneReader* aReader, 38 StructuredCloneHolder* aHolder); 39 bool WriteStructuredClone(JSContext* aCx, JSStructuredCloneWriter* aWriter, 40 StructuredCloneHolder* aHolder); 41 42 static already_AddRefed<StructuredCloneBlob> Constructor( 43 GlobalObject& aGlobal, const nsACString& aName, 44 const nsACString& aAnonymizedName, JS::Handle<JS::Value> aValue, 45 JS::Handle<JSObject*> aTargetGlobal, ErrorResult& aRv); 46 47 void Deserialize(JSContext* aCx, JS::Handle<JSObject*> aTargetScope, 48 bool aKeepData, JS::MutableHandle<JS::Value> aResult, 49 ErrorResult& aRv); 50 51 uint64_t DataSize() { 52 return mHolder.isSome() && mHolder->HasData() ? mHolder->BufferData().Size() 53 : 0; 54 } 55 56 nsISupports* GetParentObject() const { return nullptr; } 57 JSObject* GetWrapper() const { return nullptr; } 58 59 bool WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto, 60 JS::MutableHandle<JSObject*> aResult); 61 62 protected: 63 virtual ~StructuredCloneBlob(); 64 65 private: 66 explicit StructuredCloneBlob(); 67 68 class Holder : public StructuredCloneHolder { 69 public: 70 using StructuredCloneHolder::StructuredCloneHolder; 71 72 bool ReadStructuredCloneInternal(JSContext* aCx, 73 JSStructuredCloneReader* aReader, 74 StructuredCloneHolder* aHolder); 75 76 bool WriteStructuredClone(JSContext* aCx, JSStructuredCloneWriter* aWriter, 77 StructuredCloneHolder* aHolder); 78 }; 79 80 nsCString mName; 81 nsCString mAnonymizedName; 82 Maybe<Holder> mHolder; 83 84 static already_AddRefed<StructuredCloneBlob> Create() { 85 RefPtr<StructuredCloneBlob> holder = new StructuredCloneBlob(); 86 RegisterWeakMemoryReporter(holder); 87 return holder.forget(); 88 } 89 }; 90 91 } // namespace dom 92 } // namespace mozilla 93 94 #endif // mozilla_dom_StructuredCloneBlob_h