Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: Source/bindings/core/v8/ScriptValueSerializer.h

Issue 1097773004: Sharing of SharedArrayBuffer via PostMessage transfer (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: update for non-split typedarray hierarchy Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef ScriptValueSerializer_h 5 #ifndef ScriptValueSerializer_h
6 #define ScriptValueSerializer_h 6 #define ScriptValueSerializer_h
7 7
8 #include "bindings/core/v8/SerializationTag.h" 8 #include "bindings/core/v8/SerializationTag.h"
9 #include "bindings/core/v8/SerializedScriptValue.h" 9 #include "bindings/core/v8/SerializedScriptValue.h"
10 #include "bindings/core/v8/V8Binding.h" 10 #include "bindings/core/v8/V8Binding.h"
11 #include "core/CoreExport.h" 11 #include "core/CoreExport.h"
12 #include "wtf/ArrayBufferContents.h" 12 #include "wtf/ArrayBufferContents.h"
13 #include "wtf/HashMap.h" 13 #include "wtf/HashMap.h"
14 #include "wtf/Noncopyable.h" 14 #include "wtf/Noncopyable.h"
15 #include "wtf/Vector.h" 15 #include "wtf/Vector.h"
16 #include "wtf/text/WTFString.h" 16 #include "wtf/text/WTFString.h"
17 #include <v8.h> 17 #include <v8.h>
18 18
19 namespace blink { 19 namespace blink {
20 20
21 class CompositorProxy; 21 class CompositorProxy;
22 class DOMArrayBuffer; 22 class DOMArrayBuffer;
23 class DOMArrayBufferView; 23 class DOMArrayBufferView;
24 class DOMSharedArrayBuffer;
24 class File; 25 class File;
25 class FileList; 26 class FileList;
26 27
27 typedef Vector<WTF::ArrayBufferContents, 1> ArrayBufferContentsArray; 28 typedef Vector<WTF::ArrayBufferContents, 1> ArrayBufferContentsArray;
28 29
29 // V8ObjectMap is a map from V8 objects to arbitrary values of type T. 30 // V8ObjectMap is a map from V8 objects to arbitrary values of type T.
30 // V8 objects (or handles to V8 objects) cannot be used as keys in ordinary wtf: :HashMaps; 31 // V8 objects (or handles to V8 objects) cannot be used as keys in ordinary wtf: :HashMaps;
31 // this class should be used instead. GCObject must be a subtype of v8::Object. 32 // this class should be used instead. GCObject must be a subtype of v8::Object.
32 // Suggested usage: 33 // Suggested usage:
33 // V8ObjectMap<v8::Object, int> map; 34 // V8ObjectMap<v8::Object, int> map;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 void writeFile(const File&); 128 void writeFile(const File&);
128 void writeFileIndex(int blobIndex); 129 void writeFileIndex(int blobIndex);
129 void writeFileList(const FileList&); 130 void writeFileList(const FileList&);
130 void writeFileListIndex(const Vector<int>& blobIndices); 131 void writeFileListIndex(const Vector<int>& blobIndices);
131 void writeArrayBuffer(const DOMArrayBuffer&); 132 void writeArrayBuffer(const DOMArrayBuffer&);
132 void writeArrayBufferView(const DOMArrayBufferView&); 133 void writeArrayBufferView(const DOMArrayBufferView&);
133 void writeImageData(uint32_t width, uint32_t height, const uint8_t* pixelDat a, uint32_t pixelDataLength); 134 void writeImageData(uint32_t width, uint32_t height, const uint8_t* pixelDat a, uint32_t pixelDataLength);
134 void writeRegExp(v8::Local<v8::String> pattern, v8::RegExp::Flags); 135 void writeRegExp(v8::Local<v8::String> pattern, v8::RegExp::Flags);
135 void writeTransferredMessagePort(uint32_t index); 136 void writeTransferredMessagePort(uint32_t index);
136 void writeTransferredArrayBuffer(uint32_t index); 137 void writeTransferredArrayBuffer(uint32_t index);
138 void writeTransferredSharedArrayBuffer(uint32_t index);
137 void writeObjectReference(uint32_t reference); 139 void writeObjectReference(uint32_t reference);
138 void writeObject(uint32_t numProperties); 140 void writeObject(uint32_t numProperties);
139 void writeSparseArray(uint32_t numProperties, uint32_t length); 141 void writeSparseArray(uint32_t numProperties, uint32_t length);
140 void writeDenseArray(uint32_t numProperties, uint32_t length); 142 void writeDenseArray(uint32_t numProperties, uint32_t length);
141 String takeWireString(); 143 String takeWireString();
142 void writeReferenceCount(uint32_t numberOfReferences); 144 void writeReferenceCount(uint32_t numberOfReferences);
143 void writeGenerateFreshObject(); 145 void writeGenerateFreshObject();
144 void writeGenerateFreshSparseArray(uint32_t length); 146 void writeGenerateFreshSparseArray(uint32_t length);
145 void writeGenerateFreshDenseArray(uint32_t length); 147 void writeGenerateFreshDenseArray(uint32_t length);
146 148
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 protected: 189 protected:
188 class StateBase; 190 class StateBase;
189 public: 191 public:
190 enum Status { 192 enum Status {
191 Success, 193 Success,
192 InputError, 194 InputError,
193 DataCloneError, 195 DataCloneError,
194 JSException 196 JSException
195 }; 197 };
196 198
197 ScriptValueSerializer(SerializedScriptValueWriter&, MessagePortArray* messag ePorts, ArrayBufferArray* arrayBuffers, WebBlobInfoArray*, BlobDataHandleMap& bl obDataHandles, v8::TryCatch&, ScriptState*); 199 ScriptValueSerializer(SerializedScriptValueWriter&, MessagePortArray* messag ePorts, ArrayBufferArray* arrayBuffers, SharedArrayBufferArray* sharedArrayBuffe rs, WebBlobInfoArray*, BlobDataHandleMap& blobDataHandles, v8::TryCatch&, Script State*);
198 v8::Isolate* isolate() { return m_scriptState->isolate(); } 200 v8::Isolate* isolate() { return m_scriptState->isolate(); }
199 v8::Local<v8::Context> context() { return m_scriptState->context(); } 201 v8::Local<v8::Context> context() { return m_scriptState->context(); }
200 202
201 Status serialize(v8::Local<v8::Value>); 203 Status serialize(v8::Local<v8::Value>);
202 String errorMessage() { return m_errorMessage; } 204 String errorMessage() { return m_errorMessage; }
203 205
204 protected: 206 protected:
205 class StateBase { 207 class StateBase {
206 WTF_MAKE_NONCOPYABLE(StateBase); 208 WTF_MAKE_NONCOPYABLE(StateBase);
207 public: 209 public:
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 void writeBooleanObject(v8::Local<v8::Value>); 363 void writeBooleanObject(v8::Local<v8::Value>);
362 StateBase* writeBlob(v8::Local<v8::Value>, StateBase* next); 364 StateBase* writeBlob(v8::Local<v8::Value>, StateBase* next);
363 StateBase* writeCompositorProxy(v8::Local<v8::Value>, StateBase* next); 365 StateBase* writeCompositorProxy(v8::Local<v8::Value>, StateBase* next);
364 StateBase* writeFile(v8::Local<v8::Value>, StateBase* next); 366 StateBase* writeFile(v8::Local<v8::Value>, StateBase* next);
365 StateBase* writeFileList(v8::Local<v8::Value>, StateBase* next); 367 StateBase* writeFileList(v8::Local<v8::Value>, StateBase* next);
366 void writeImageData(v8::Local<v8::Value>); 368 void writeImageData(v8::Local<v8::Value>);
367 void writeRegExp(v8::Local<v8::Value>); 369 void writeRegExp(v8::Local<v8::Value>);
368 StateBase* writeAndGreyArrayBufferView(v8::Local<v8::Object>, StateBase* nex t); 370 StateBase* writeAndGreyArrayBufferView(v8::Local<v8::Object>, StateBase* nex t);
369 StateBase* writeArrayBuffer(v8::Local<v8::Value>, StateBase* next); 371 StateBase* writeArrayBuffer(v8::Local<v8::Value>, StateBase* next);
370 StateBase* writeTransferredArrayBuffer(v8::Local<v8::Value>, uint32_t index, StateBase* next); 372 StateBase* writeTransferredArrayBuffer(v8::Local<v8::Value>, uint32_t index, StateBase* next);
373 StateBase* writeTransferredSharedArrayBuffer(v8::Local<v8::Value>, uint32_t index, StateBase* next);
371 static bool shouldSerializeDensely(uint32_t length, uint32_t propertyCount); 374 static bool shouldSerializeDensely(uint32_t length, uint32_t propertyCount);
372 375
373 StateBase* startArrayState(v8::Local<v8::Array>, StateBase* next); 376 StateBase* startArrayState(v8::Local<v8::Array>, StateBase* next);
374 StateBase* startObjectState(v8::Local<v8::Object>, StateBase* next); 377 StateBase* startObjectState(v8::Local<v8::Object>, StateBase* next);
375 378
376 bool appendBlobInfo(const String& uuid, const String& type, unsigned long lo ng size, int* index); 379 bool appendBlobInfo(const String& uuid, const String& type, unsigned long lo ng size, int* index);
377 bool appendFileInfo(const File*, int* index); 380 bool appendFileInfo(const File*, int* index);
378 381
379 protected: 382 protected:
380 // Marks object as having been visited by the serializer and assigns it a un ique object reference ID. 383 // Marks object as having been visited by the serializer and assigns it a un ique object reference ID.
381 // An object may only be greyed once. 384 // An object may only be greyed once.
382 void greyObject(const v8::Local<v8::Object>&); 385 void greyObject(const v8::Local<v8::Object>&);
383 386
384 StateBase* handleError(Status errorStatus, const String& message, StateBase* ); 387 StateBase* handleError(Status errorStatus, const String& message, StateBase* );
385 388
386 SerializedScriptValueWriter& writer() { return m_writer; } 389 SerializedScriptValueWriter& writer() { return m_writer; }
387 uint32_t nextObjectReference() const { return m_nextObjectReference; } 390 uint32_t nextObjectReference() const { return m_nextObjectReference; }
388 391
389 private: 392 private:
390 RefPtr<ScriptState> m_scriptState; 393 RefPtr<ScriptState> m_scriptState;
391 SerializedScriptValueWriter& m_writer; 394 SerializedScriptValueWriter& m_writer;
392 v8::TryCatch& m_tryCatch; 395 v8::TryCatch& m_tryCatch;
393 int m_depth; 396 int m_depth;
394 Status m_status; 397 Status m_status;
395 String m_errorMessage; 398 String m_errorMessage;
396 typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool; 399 typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool;
397 ObjectPool m_objectPool; 400 ObjectPool m_objectPool;
398 ObjectPool m_transferredMessagePorts; 401 ObjectPool m_transferredMessagePorts;
399 ObjectPool m_transferredArrayBuffers; 402 ObjectPool m_transferredArrayBuffers;
403 ObjectPool m_transferredSharedArrayBuffers;
400 uint32_t m_nextObjectReference; 404 uint32_t m_nextObjectReference;
401 WebBlobInfoArray* m_blobInfo; 405 WebBlobInfoArray* m_blobInfo;
402 BlobDataHandleMap& m_blobDataHandles; 406 BlobDataHandleMap& m_blobDataHandles;
403 }; 407 };
404 408
405 // Interface used by SerializedScriptValueReader to create objects of composite types. 409 // Interface used by SerializedScriptValueReader to create objects of composite types.
406 class CORE_EXPORT ScriptValueCompositeCreator { 410 class CORE_EXPORT ScriptValueCompositeCreator {
407 STACK_ALLOCATED(); 411 STACK_ALLOCATED();
408 WTF_MAKE_NONCOPYABLE(ScriptValueCompositeCreator); 412 WTF_MAKE_NONCOPYABLE(ScriptValueCompositeCreator);
409 public: 413 public:
410 ScriptValueCompositeCreator() { } 414 ScriptValueCompositeCreator() { }
411 virtual ~ScriptValueCompositeCreator() { } 415 virtual ~ScriptValueCompositeCreator() { }
412 416
413 virtual bool consumeTopOfStack(v8::Local<v8::Value>*) = 0; 417 virtual bool consumeTopOfStack(v8::Local<v8::Value>*) = 0;
414 virtual uint32_t objectReferenceCount() = 0; 418 virtual uint32_t objectReferenceCount() = 0;
415 virtual void pushObjectReference(const v8::Local<v8::Value>&) = 0; 419 virtual void pushObjectReference(const v8::Local<v8::Value>&) = 0;
416 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Local<v 8::Value>*) = 0; 420 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Local<v 8::Value>*) = 0;
417 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Local<v8::Valu e>*) = 0; 421 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Local<v8::Valu e>*) = 0;
418 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Local<v8::Valu e>*) = 0; 422 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Local<v8::Valu e>*) = 0;
423 virtual bool tryGetTransferredSharedArrayBuffer(uint32_t index, v8::Local<v8 ::Value>*) = 0;
419 virtual bool newSparseArray(uint32_t length) = 0; 424 virtual bool newSparseArray(uint32_t length) = 0;
420 virtual bool newDenseArray(uint32_t length) = 0; 425 virtual bool newDenseArray(uint32_t length) = 0;
421 virtual bool newObject() = 0; 426 virtual bool newObject() = 0;
422 virtual bool completeObject(uint32_t numProperties, v8::Local<v8::Value>*) = 0; 427 virtual bool completeObject(uint32_t numProperties, v8::Local<v8::Value>*) = 0;
423 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Local<v8::Value>*) = 0; 428 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Local<v8::Value>*) = 0;
424 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8: :Local<v8::Value>*) = 0; 429 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8: :Local<v8::Value>*) = 0;
425 }; 430 };
426 431
427 // SerializedScriptValueReader is responsible for deserializing primitive types and 432 // SerializedScriptValueReader is responsible for deserializing primitive types and
428 // restoring information about saved objects of composite types. 433 // restoring information about saved objects of composite types.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 virtual bool newSparseArray(uint32_t) override; 548 virtual bool newSparseArray(uint32_t) override;
544 virtual bool newDenseArray(uint32_t length) override; 549 virtual bool newDenseArray(uint32_t length) override;
545 virtual bool consumeTopOfStack(v8::Local<v8::Value>*) override; 550 virtual bool consumeTopOfStack(v8::Local<v8::Value>*) override;
546 virtual bool newObject() override; 551 virtual bool newObject() override;
547 virtual bool completeObject(uint32_t numProperties, v8::Local<v8::Value>*) o verride; 552 virtual bool completeObject(uint32_t numProperties, v8::Local<v8::Value>*) o verride;
548 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Local<v8::Value>*) override; 553 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Local<v8::Value>*) override;
549 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8: :Local<v8::Value>*) override; 554 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8: :Local<v8::Value>*) override;
550 virtual void pushObjectReference(const v8::Local<v8::Value>&) override; 555 virtual void pushObjectReference(const v8::Local<v8::Value>&) override;
551 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Local<v8::Valu e>*) override; 556 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Local<v8::Valu e>*) override;
552 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Local<v8::Valu e>*) override; 557 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Local<v8::Valu e>*) override;
558 virtual bool tryGetTransferredSharedArrayBuffer(uint32_t index, v8::Local<v8 ::Value>*) override;
553 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Local<v 8::Value>*) override; 559 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Local<v 8::Value>*) override;
554 virtual uint32_t objectReferenceCount() override; 560 virtual uint32_t objectReferenceCount() override;
555 561
556 protected: 562 protected:
557 SerializedScriptValueReader& reader() { return m_reader; } 563 SerializedScriptValueReader& reader() { return m_reader; }
558 virtual bool read(v8::Local<v8::Value>*); 564 virtual bool read(v8::Local<v8::Value>*);
559 565
560 private: 566 private:
561 bool initializeObject(v8::Local<v8::Object>, uint32_t numProperties, v8::Loc al<v8::Value>*); 567 bool initializeObject(v8::Local<v8::Object>, uint32_t numProperties, v8::Loc al<v8::Value>*);
562 bool doDeserialize(); 568 bool doDeserialize();
(...skipping 15 matching lines...) Expand all
578 Vector<uint32_t> m_openCompositeReferenceStack; 584 Vector<uint32_t> m_openCompositeReferenceStack;
579 MessagePortArray* m_transferredMessagePorts; 585 MessagePortArray* m_transferredMessagePorts;
580 ArrayBufferContentsArray* m_arrayBufferContents; 586 ArrayBufferContentsArray* m_arrayBufferContents;
581 Vector<v8::Local<v8::Value>> m_arrayBuffers; 587 Vector<v8::Local<v8::Value>> m_arrayBuffers;
582 uint32_t m_version; 588 uint32_t m_version;
583 }; 589 };
584 590
585 } // namespace blink 591 } // namespace blink
586 592
587 #endif // ScriptValueSerializer_h 593 #endif // ScriptValueSerializer_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698