| OLD | NEW |
| 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 "public/platform/WebCrypto.h" | |
| 12 #include "public/platform/WebCryptoKey.h" | |
| 13 #include "public/platform/WebCryptoKeyAlgorithm.h" | |
| 14 #include "wtf/ArrayBufferContents.h" | 11 #include "wtf/ArrayBufferContents.h" |
| 15 #include "wtf/HashMap.h" | 12 #include "wtf/HashMap.h" |
| 16 #include "wtf/Noncopyable.h" | 13 #include "wtf/Noncopyable.h" |
| 17 #include "wtf/Vector.h" | 14 #include "wtf/Vector.h" |
| 18 #include "wtf/text/WTFString.h" | 15 #include "wtf/text/WTFString.h" |
| 19 #include <v8.h> | 16 #include <v8.h> |
| 20 | 17 |
| 21 namespace WTF { | 18 namespace WTF { |
| 22 | 19 |
| 23 class ArrayBuffer; | 20 class ArrayBuffer; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 void writeStringObject(const char* data, int length); | 121 void writeStringObject(const char* data, int length); |
| 125 void writeWebCoreString(const String&); | 122 void writeWebCoreString(const String&); |
| 126 void writeVersion(); | 123 void writeVersion(); |
| 127 void writeInt32(int32_t value); | 124 void writeInt32(int32_t value); |
| 128 void writeUint32(uint32_t value); | 125 void writeUint32(uint32_t value); |
| 129 void writeDate(double numberValue); | 126 void writeDate(double numberValue); |
| 130 void writeNumber(double number); | 127 void writeNumber(double number); |
| 131 void writeNumberObject(double number); | 128 void writeNumberObject(double number); |
| 132 void writeBlob(const String& uuid, const String& type, unsigned long long si
ze); | 129 void writeBlob(const String& uuid, const String& type, unsigned long long si
ze); |
| 133 void writeBlobIndex(int blobIndex); | 130 void writeBlobIndex(int blobIndex); |
| 134 void writeDOMFileSystem(int type, const String& name, const String& url); | |
| 135 void writeFile(const File&); | 131 void writeFile(const File&); |
| 136 void writeFileIndex(int blobIndex); | 132 void writeFileIndex(int blobIndex); |
| 137 void writeFileList(const FileList&); | 133 void writeFileList(const FileList&); |
| 138 void writeFileListIndex(const Vector<int>& blobIndices); | 134 void writeFileListIndex(const Vector<int>& blobIndices); |
| 139 bool writeCryptoKey(const WebCryptoKey&); | |
| 140 void writeArrayBuffer(const ArrayBuffer&); | 135 void writeArrayBuffer(const ArrayBuffer&); |
| 141 void writeArrayBufferView(const ArrayBufferView&); | 136 void writeArrayBufferView(const ArrayBufferView&); |
| 142 void writeImageData(uint32_t width, uint32_t height, const uint8_t* pixelDat
a, uint32_t pixelDataLength); | 137 void writeImageData(uint32_t width, uint32_t height, const uint8_t* pixelDat
a, uint32_t pixelDataLength); |
| 143 void writeRegExp(v8::Local<v8::String> pattern, v8::RegExp::Flags); | 138 void writeRegExp(v8::Local<v8::String> pattern, v8::RegExp::Flags); |
| 144 void writeTransferredMessagePort(uint32_t index); | 139 void writeTransferredMessagePort(uint32_t index); |
| 145 void writeTransferredArrayBuffer(uint32_t index); | 140 void writeTransferredArrayBuffer(uint32_t index); |
| 146 void writeObjectReference(uint32_t reference); | 141 void writeObjectReference(uint32_t reference); |
| 147 void writeObject(uint32_t numProperties); | 142 void writeObject(uint32_t numProperties); |
| 148 void writeSparseArray(uint32_t numProperties, uint32_t length); | 143 void writeSparseArray(uint32_t numProperties, uint32_t length); |
| 149 void writeDenseArray(uint32_t numProperties, uint32_t length); | 144 void writeDenseArray(uint32_t numProperties, uint32_t length); |
| 150 String takeWireString(); | 145 String takeWireString(); |
| 151 void writeReferenceCount(uint32_t numberOfReferences); | 146 void writeReferenceCount(uint32_t numberOfReferences); |
| 152 void writeGenerateFreshObject(); | 147 void writeGenerateFreshObject(); |
| 153 void writeGenerateFreshSparseArray(uint32_t length); | 148 void writeGenerateFreshSparseArray(uint32_t length); |
| 154 void writeGenerateFreshDenseArray(uint32_t length); | 149 void writeGenerateFreshDenseArray(uint32_t length); |
| 155 | 150 |
| 156 protected: | 151 protected: |
| 157 void doWriteFile(const File&); | 152 void doWriteFile(const File&); |
| 158 void doWriteArrayBuffer(const ArrayBuffer&); | 153 void doWriteArrayBuffer(const ArrayBuffer&); |
| 159 void doWriteString(const char* data, int length); | 154 void doWriteString(const char* data, int length); |
| 160 void doWriteWebCoreString(const String&); | 155 void doWriteWebCoreString(const String&); |
| 161 void doWriteHmacKey(const WebCryptoKey&); | |
| 162 void doWriteAesKey(const WebCryptoKey&); | |
| 163 void doWriteRsaHashedKey(const WebCryptoKey&); | |
| 164 void doWriteEcKey(const WebCryptoKey&); | |
| 165 void doWriteAlgorithmId(WebCryptoAlgorithmId); | |
| 166 void doWriteAsymmetricKeyType(WebCryptoKeyType); | |
| 167 void doWriteNamedCurve(WebCryptoNamedCurve); | |
| 168 void doWriteKeyUsages(const WebCryptoKeyUsageMask usages, bool extractable); | |
| 169 int bytesNeededToWireEncode(uint32_t value); | 156 int bytesNeededToWireEncode(uint32_t value); |
| 170 | 157 |
| 171 template<class T> | 158 template<class T> |
| 172 void doWriteUintHelper(T value) | 159 void doWriteUintHelper(T value) |
| 173 { | 160 { |
| 174 while (true) { | 161 while (true) { |
| 175 uint8_t b = (value & SerializedScriptValue::varIntMask); | 162 uint8_t b = (value & SerializedScriptValue::varIntMask); |
| 176 value >>= SerializedScriptValue::varIntShift; | 163 value >>= SerializedScriptValue::varIntShift; |
| 177 if (!value) { | 164 if (!value) { |
| 178 append(b); | 165 append(b); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 JSException | 198 JSException |
| 212 }; | 199 }; |
| 213 | 200 |
| 214 Serializer(Writer&, MessagePortArray* messagePorts, ArrayBufferArray* arrayB
uffers, WebBlobInfoArray*, BlobDataHandleMap& blobDataHandles, v8::TryCatch&, Sc
riptState*); | 201 Serializer(Writer&, MessagePortArray* messagePorts, ArrayBufferArray* arrayB
uffers, WebBlobInfoArray*, BlobDataHandleMap& blobDataHandles, v8::TryCatch&, Sc
riptState*); |
| 215 v8::Isolate* isolate() { return m_scriptState->isolate(); } | 202 v8::Isolate* isolate() { return m_scriptState->isolate(); } |
| 216 | 203 |
| 217 Status serialize(v8::Handle<v8::Value>); | 204 Status serialize(v8::Handle<v8::Value>); |
| 218 String errorMessage() { return m_errorMessage; } | 205 String errorMessage() { return m_errorMessage; } |
| 219 | 206 |
| 220 // Functions used by serialization states. | 207 // Functions used by serialization states. |
| 221 Serializer::StateBase* doSerialize(v8::Handle<v8::Value>, Serializer::StateB
ase* next); | 208 virtual Serializer::StateBase* doSerialize(v8::Handle<v8::Value>, Serializer
::StateBase* next); |
| 222 | 209 |
| 223 StateBase* doSerializeArrayBuffer(v8::Handle<v8::Value> arrayBuffer, StateBa
se* next); | 210 StateBase* doSerializeArrayBuffer(v8::Handle<v8::Value> arrayBuffer, StateBa
se* next); |
| 224 StateBase* checkException(StateBase*); | 211 StateBase* checkException(StateBase*); |
| 225 StateBase* writeObject(uint32_t numProperties, StateBase*); | 212 StateBase* writeObject(uint32_t numProperties, StateBase*); |
| 226 StateBase* writeSparseArray(uint32_t numProperties, uint32_t length, StateBa
se*); | 213 StateBase* writeSparseArray(uint32_t numProperties, uint32_t length, StateBa
se*); |
| 227 StateBase* writeDenseArray(uint32_t numProperties, uint32_t length, StateBas
e*); | 214 StateBase* writeDenseArray(uint32_t numProperties, uint32_t length, StateBas
e*); |
| 228 | 215 |
| 229 protected: | 216 protected: |
| 230 class StateBase { | 217 class StateBase { |
| 231 WTF_MAKE_NONCOPYABLE(StateBase); | 218 WTF_MAKE_NONCOPYABLE(StateBase); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 delete state; | 355 delete state; |
| 369 return next; | 356 return next; |
| 370 } | 357 } |
| 371 | 358 |
| 372 bool checkComposite(StateBase* top); | 359 bool checkComposite(StateBase* top); |
| 373 void writeString(v8::Handle<v8::Value>); | 360 void writeString(v8::Handle<v8::Value>); |
| 374 void writeStringObject(v8::Handle<v8::Value>); | 361 void writeStringObject(v8::Handle<v8::Value>); |
| 375 void writeNumberObject(v8::Handle<v8::Value>); | 362 void writeNumberObject(v8::Handle<v8::Value>); |
| 376 void writeBooleanObject(v8::Handle<v8::Value>); | 363 void writeBooleanObject(v8::Handle<v8::Value>); |
| 377 StateBase* writeBlob(v8::Handle<v8::Value>, StateBase* next); | 364 StateBase* writeBlob(v8::Handle<v8::Value>, StateBase* next); |
| 378 StateBase* writeDOMFileSystem(v8::Handle<v8::Value>, StateBase* next); | |
| 379 StateBase* writeFile(v8::Handle<v8::Value>, StateBase* next); | 365 StateBase* writeFile(v8::Handle<v8::Value>, StateBase* next); |
| 380 StateBase* writeFileList(v8::Handle<v8::Value>, StateBase* next); | 366 StateBase* writeFileList(v8::Handle<v8::Value>, StateBase* next); |
| 381 bool writeCryptoKey(v8::Handle<v8::Value>); | |
| 382 void writeImageData(v8::Handle<v8::Value>); | 367 void writeImageData(v8::Handle<v8::Value>); |
| 383 void writeRegExp(v8::Handle<v8::Value>); | 368 void writeRegExp(v8::Handle<v8::Value>); |
| 384 StateBase* writeAndGreyArrayBufferView(v8::Handle<v8::Object>, StateBase* ne
xt); | 369 StateBase* writeAndGreyArrayBufferView(v8::Handle<v8::Object>, StateBase* ne
xt); |
| 385 StateBase* writeArrayBuffer(v8::Handle<v8::Value>, StateBase* next); | 370 StateBase* writeArrayBuffer(v8::Handle<v8::Value>, StateBase* next); |
| 386 StateBase* writeTransferredArrayBuffer(v8::Handle<v8::Value>, uint32_t index
, StateBase* next); | 371 StateBase* writeTransferredArrayBuffer(v8::Handle<v8::Value>, uint32_t index
, StateBase* next); |
| 387 static bool shouldSerializeDensely(uint32_t length, uint32_t propertyCount); | 372 static bool shouldSerializeDensely(uint32_t length, uint32_t propertyCount); |
| 388 | 373 |
| 389 StateBase* startArrayState(v8::Handle<v8::Array>, StateBase* next); | 374 StateBase* startArrayState(v8::Handle<v8::Array>, StateBase* next); |
| 390 StateBase* startObjectState(v8::Handle<v8::Object>, StateBase* next); | 375 StateBase* startObjectState(v8::Handle<v8::Object>, StateBase* next); |
| 391 | 376 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 unsigned position() const { return m_position; } | 453 unsigned position() const { return m_position; } |
| 469 | 454 |
| 470 const uint8_t* allocate(uint32_t size) | 455 const uint8_t* allocate(uint32_t size) |
| 471 { | 456 { |
| 472 const uint8_t* allocated = m_buffer + m_position; | 457 const uint8_t* allocated = m_buffer + m_position; |
| 473 m_position += size; | 458 m_position += size; |
| 474 return allocated; | 459 return allocated; |
| 475 } | 460 } |
| 476 | 461 |
| 477 public: | 462 public: |
| 478 bool read(v8::Handle<v8::Value>*, CompositeCreator&); | 463 virtual bool read(v8::Handle<v8::Value>*, CompositeCreator&); |
| 479 bool readVersion(uint32_t& version); | 464 bool readVersion(uint32_t& version); |
| 480 void setVersion(uint32_t); | 465 void setVersion(uint32_t); |
| 481 | 466 |
| 482 private: | 467 protected: |
| 468 bool readWithTag(SerializationTag, v8::Handle<v8::Value>*, CompositeCreator&
); |
| 469 |
| 483 bool readTag(SerializationTag*); | 470 bool readTag(SerializationTag*); |
| 484 bool readWebCoreString(String*); | 471 bool readWebCoreString(String*); |
| 485 bool readUint32(v8::Handle<v8::Value>*); | 472 bool readUint32(v8::Handle<v8::Value>*); |
| 473 |
| 474 bool doReadUint32(uint32_t* value); |
| 475 |
| 476 private: |
| 486 void undoReadTag(); | 477 void undoReadTag(); |
| 487 bool readArrayBufferViewSubTag(ArrayBufferViewSubTag*); | 478 bool readArrayBufferViewSubTag(ArrayBufferViewSubTag*); |
| 488 bool readString(v8::Handle<v8::Value>*); | 479 bool readString(v8::Handle<v8::Value>*); |
| 489 bool readUCharString(v8::Handle<v8::Value>*); | 480 bool readUCharString(v8::Handle<v8::Value>*); |
| 490 bool readStringObject(v8::Handle<v8::Value>*); | 481 bool readStringObject(v8::Handle<v8::Value>*); |
| 491 bool readInt32(v8::Handle<v8::Value>*); | 482 bool readInt32(v8::Handle<v8::Value>*); |
| 492 bool readDate(v8::Handle<v8::Value>*); | 483 bool readDate(v8::Handle<v8::Value>*); |
| 493 bool readNumber(v8::Handle<v8::Value>*); | 484 bool readNumber(v8::Handle<v8::Value>*); |
| 494 bool readNumberObject(v8::Handle<v8::Value>*); | 485 bool readNumberObject(v8::Handle<v8::Value>*); |
| 495 bool readImageData(v8::Handle<v8::Value>*); | 486 bool readImageData(v8::Handle<v8::Value>*); |
| 496 PassRefPtr<ArrayBuffer> doReadArrayBuffer(); | 487 PassRefPtr<ArrayBuffer> doReadArrayBuffer(); |
| 497 bool readArrayBuffer(v8::Handle<v8::Value>*); | 488 bool readArrayBuffer(v8::Handle<v8::Value>*); |
| 498 bool readArrayBufferView(v8::Handle<v8::Value>*, CompositeCreator&); | 489 bool readArrayBufferView(v8::Handle<v8::Value>*, CompositeCreator&); |
| 499 bool readRegExp(v8::Handle<v8::Value>*); | 490 bool readRegExp(v8::Handle<v8::Value>*); |
| 500 bool readBlob(v8::Handle<v8::Value>*, bool isIndexed); | 491 bool readBlob(v8::Handle<v8::Value>*, bool isIndexed); |
| 501 bool readDOMFileSystem(v8::Handle<v8::Value>*); | |
| 502 bool readFile(v8::Handle<v8::Value>*, bool isIndexed); | 492 bool readFile(v8::Handle<v8::Value>*, bool isIndexed); |
| 503 bool readFileList(v8::Handle<v8::Value>*, bool isIndexed); | 493 bool readFileList(v8::Handle<v8::Value>*, bool isIndexed); |
| 504 bool readCryptoKey(v8::Handle<v8::Value>*); | |
| 505 File* readFileHelper(); | 494 File* readFileHelper(); |
| 506 File* readFileIndexHelper(); | 495 File* readFileIndexHelper(); |
| 507 | 496 |
| 508 template<class T> | 497 template<class T> |
| 509 bool doReadUintHelper(T* value) | 498 bool doReadUintHelper(T* value) |
| 510 { | 499 { |
| 511 *value = 0; | 500 *value = 0; |
| 512 uint8_t currentByte; | 501 uint8_t currentByte; |
| 513 int shift = 0; | 502 int shift = 0; |
| 514 do { | 503 do { |
| 515 if (m_position >= m_length) | 504 if (m_position >= m_length) |
| 516 return false; | 505 return false; |
| 517 currentByte = m_buffer[m_position++]; | 506 currentByte = m_buffer[m_position++]; |
| 518 *value |= ((currentByte & SerializedScriptValue::varIntMask) << shif
t); | 507 *value |= ((currentByte & SerializedScriptValue::varIntMask) << shif
t); |
| 519 shift += SerializedScriptValue::varIntShift; | 508 shift += SerializedScriptValue::varIntShift; |
| 520 } while (currentByte & (1 << SerializedScriptValue::varIntShift)); | 509 } while (currentByte & (1 << SerializedScriptValue::varIntShift)); |
| 521 return true; | 510 return true; |
| 522 } | 511 } |
| 523 | 512 |
| 524 bool doReadUint32(uint32_t* value); | |
| 525 bool doReadUint64(uint64_t* value); | 513 bool doReadUint64(uint64_t* value); |
| 526 bool doReadNumber(double* number); | 514 bool doReadNumber(double* number); |
| 527 PassRefPtr<BlobDataHandle> getOrCreateBlobDataHandle(const String& uuid, con
st String& type, long long size = -1); | 515 PassRefPtr<BlobDataHandle> getOrCreateBlobDataHandle(const String& uuid, con
st String& type, long long size = -1); |
| 528 bool doReadHmacKey(WebCryptoKeyAlgorithm&, WebCryptoKeyType&); | |
| 529 bool doReadAesKey(WebCryptoKeyAlgorithm&, WebCryptoKeyType&); | |
| 530 bool doReadRsaHashedKey(WebCryptoKeyAlgorithm&, WebCryptoKeyType&); | |
| 531 bool doReadEcKey(WebCryptoKeyAlgorithm&, WebCryptoKeyType&); | |
| 532 bool doReadAlgorithmId(WebCryptoAlgorithmId&); | |
| 533 bool doReadAsymmetricKeyType(WebCryptoKeyType&); | |
| 534 bool doReadNamedCurve(WebCryptoNamedCurve&); | |
| 535 bool doReadKeyUsages(WebCryptoKeyUsageMask& usages, bool& extractable); | |
| 536 | 516 |
| 537 private: | 517 private: |
| 538 RefPtr<ScriptState> m_scriptState; | 518 RefPtr<ScriptState> m_scriptState; |
| 539 const uint8_t* m_buffer; | 519 const uint8_t* m_buffer; |
| 540 const unsigned m_length; | 520 const unsigned m_length; |
| 541 unsigned m_position; | 521 unsigned m_position; |
| 542 uint32_t m_version; | 522 uint32_t m_version; |
| 543 const WebBlobInfoArray* m_blobInfo; | 523 const WebBlobInfoArray* m_blobInfo; |
| 544 const BlobDataHandleMap& m_blobDataHandles; | 524 const BlobDataHandleMap& m_blobDataHandles; |
| 545 }; | 525 }; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 566 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8
::Handle<v8::Value>*) override; | 546 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8
::Handle<v8::Value>*) override; |
| 567 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8:
:Handle<v8::Value>*) override; | 547 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8:
:Handle<v8::Value>*) override; |
| 568 virtual void pushObjectReference(const v8::Handle<v8::Value>&) override; | 548 virtual void pushObjectReference(const v8::Handle<v8::Value>&) override; |
| 569 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val
ue>*) override; | 549 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val
ue>*) override; |
| 570 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Handle<v8::Val
ue>*) override; | 550 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Handle<v8::Val
ue>*) override; |
| 571 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<
v8::Value>*) override; | 551 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<
v8::Value>*) override; |
| 572 virtual uint32_t objectReferenceCount() override; | 552 virtual uint32_t objectReferenceCount() override; |
| 573 | 553 |
| 574 protected: | 554 protected: |
| 575 Reader& reader() { return m_reader; } | 555 Reader& reader() { return m_reader; } |
| 576 bool read(v8::Local<v8::Value>*); | 556 virtual bool read(v8::Local<v8::Value>*); |
| 577 | 557 |
| 578 private: | 558 private: |
| 579 bool initializeObject(v8::Handle<v8::Object>, uint32_t numProperties, v8::Ha
ndle<v8::Value>*); | 559 bool initializeObject(v8::Handle<v8::Object>, uint32_t numProperties, v8::Ha
ndle<v8::Value>*); |
| 580 bool doDeserialize(); | 560 bool doDeserialize(); |
| 581 void push(v8::Local<v8::Value> value) { m_stack.append(value); }; | 561 void push(v8::Local<v8::Value> value) { m_stack.append(value); }; |
| 582 void pop(unsigned length) | 562 void pop(unsigned length) |
| 583 { | 563 { |
| 584 ASSERT(length <= m_stack.size()); | 564 ASSERT(length <= m_stack.size()); |
| 585 m_stack.shrink(m_stack.size() - length); | 565 m_stack.shrink(m_stack.size() - length); |
| 586 } | 566 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 598 ArrayBufferContentsArray* m_arrayBufferContents; | 578 ArrayBufferContentsArray* m_arrayBufferContents; |
| 599 Vector<v8::Handle<v8::Object> > m_arrayBuffers; | 579 Vector<v8::Handle<v8::Object> > m_arrayBuffers; |
| 600 uint32_t m_version; | 580 uint32_t m_version; |
| 601 }; | 581 }; |
| 602 | 582 |
| 603 } // namespace SerializedScriptValueInternal | 583 } // namespace SerializedScriptValueInternal |
| 604 | 584 |
| 605 } // namespace blink | 585 } // namespace blink |
| 606 | 586 |
| 607 #endif // ScriptValueSerializer_h | 587 #endif // ScriptValueSerializer_h |
| OLD | NEW |