| 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 #include "bindings/modules/v8/ScriptValueSerializerForModules.h" | 5 #include "bindings/modules/v8/ScriptValueSerializerForModules.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/SerializationTag.h" | 7 #include "bindings/core/v8/SerializationTag.h" |
| 8 #include "bindings/core/v8/V8Binding.h" | 8 #include "bindings/core/v8/V8Binding.h" |
| 9 #include "bindings/modules/v8/TransferablesForModules.h" | |
| 10 #include "bindings/modules/v8/V8CryptoKey.h" | 9 #include "bindings/modules/v8/V8CryptoKey.h" |
| 11 #include "bindings/modules/v8/V8DOMFileSystem.h" | 10 #include "bindings/modules/v8/V8DOMFileSystem.h" |
| 12 #include "bindings/modules/v8/V8OffscreenCanvas.h" | |
| 13 #include "modules/filesystem/DOMFileSystem.h" | 11 #include "modules/filesystem/DOMFileSystem.h" |
| 14 #include "public/platform/Platform.h" | 12 #include "public/platform/Platform.h" |
| 15 | 13 |
| 16 namespace blink { | 14 namespace blink { |
| 17 | 15 |
| 18 enum CryptoKeyAlgorithmTag { | 16 enum CryptoKeyAlgorithmTag { |
| 19 AesCbcTag = 1, | 17 AesCbcTag = 1, |
| 20 HmacTag = 2, | 18 HmacTag = 2, |
| 21 RsaSsaPkcs1v1_5Tag = 3, | 19 RsaSsaPkcs1v1_5Tag = 3, |
| 22 // ID 4 was used by RsaEs, while still behind experimental flag. | 20 // ID 4 was used by RsaEs, while still behind experimental flag. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 NoParamsKeyTag = 6, | 65 NoParamsKeyTag = 6, |
| 68 // Maximum allowed value is 255 | 66 // Maximum allowed value is 255 |
| 69 }; | 67 }; |
| 70 | 68 |
| 71 enum AssymetricCryptoKeyType { | 69 enum AssymetricCryptoKeyType { |
| 72 PublicKeyType = 1, | 70 PublicKeyType = 1, |
| 73 PrivateKeyType = 2, | 71 PrivateKeyType = 2, |
| 74 // Maximum allowed value is 2^32-1 | 72 // Maximum allowed value is 2^32-1 |
| 75 }; | 73 }; |
| 76 | 74 |
| 77 ScriptValueSerializerForModules::ScriptValueSerializerForModules(SerializedScrip
tValueWriter& writer, Transferables* transferables, WebBlobInfoArray* blobInfo,
BlobDataHandleMap& blobDataHandles, v8::TryCatch& tryCatch, ScriptState* scriptS
tate) | 75 |
| 76 ScriptValueSerializerForModules::ScriptValueSerializerForModules(SerializedScrip
tValueWriter& writer, const Transferables* transferables, WebBlobInfoArray* blob
Info, BlobDataHandleMap& blobDataHandles, v8::TryCatch& tryCatch, ScriptState* s
criptState) |
| 78 : ScriptValueSerializer(writer, transferables, blobInfo, blobDataHandles, tr
yCatch, scriptState) | 77 : ScriptValueSerializer(writer, transferables, blobInfo, blobDataHandles, tr
yCatch, scriptState) |
| 79 , m_writer(writer) | |
| 80 { | 78 { |
| 81 ASSERT(!tryCatch.HasCaught()); | |
| 82 if (!transferables) | |
| 83 return; | |
| 84 auto& offscreenCanvases = static_cast<TransferablesForModules*>(transferable
s)->offscreenCanvases; | |
| 85 for (size_t i = 0; i < offscreenCanvases.size(); i++) { | |
| 86 v8::Local<v8::Object> v8OffscreenCanvas; | |
| 87 if (offscreenCanvases[i].get()) { | |
| 88 v8::Local<v8::Value> wrapper = toV8(offscreenCanvases[i].get(), scri
ptState); | |
| 89 if (!wrapper.IsEmpty()) { | |
| 90 v8OffscreenCanvas = wrapper.As<v8::Object>(); | |
| 91 if (!m_transferredOffscreenCanvas.contains(v8OffscreenCanvas)) | |
| 92 m_transferredOffscreenCanvas.set(v8OffscreenCanvas, i); | |
| 93 } | |
| 94 } | |
| 95 } | |
| 96 } | 79 } |
| 97 | 80 |
| 98 ScriptValueSerializer::StateBase* ScriptValueSerializerForModules::writeDOMFileS
ystem(v8::Local<v8::Value> value, ScriptValueSerializer::StateBase* next) | 81 ScriptValueSerializer::StateBase* ScriptValueSerializerForModules::writeDOMFileS
ystem(v8::Local<v8::Value> value, ScriptValueSerializer::StateBase* next) |
| 99 { | 82 { |
| 100 DOMFileSystem* fs = V8DOMFileSystem::toImpl(value.As<v8::Object>()); | 83 DOMFileSystem* fs = V8DOMFileSystem::toImpl(value.As<v8::Object>()); |
| 101 if (!fs) | 84 if (!fs) |
| 102 return 0; | 85 return 0; |
| 103 if (!fs->clonable()) | 86 if (!fs->clonable()) |
| 104 return handleError(DataCloneError, "A FileSystem object could not be clo
ned.", next); | 87 return handleError(DataCloneError, "A FileSystem object could not be clo
ned.", next); |
| 105 | 88 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 116 } | 99 } |
| 117 | 100 |
| 118 void SerializedScriptValueWriterForModules::writeDOMFileSystem(int type, const S
tring& name, const String& url) | 101 void SerializedScriptValueWriterForModules::writeDOMFileSystem(int type, const S
tring& name, const String& url) |
| 119 { | 102 { |
| 120 append(DOMFileSystemTag); | 103 append(DOMFileSystemTag); |
| 121 doWriteUint32(type); | 104 doWriteUint32(type); |
| 122 doWriteWebCoreString(name); | 105 doWriteWebCoreString(name); |
| 123 doWriteWebCoreString(url); | 106 doWriteWebCoreString(url); |
| 124 } | 107 } |
| 125 | 108 |
| 126 void SerializedScriptValueWriterForModules::writeTransferredOffscreenCanvas(uint
32_t index, uint32_t width, uint32_t height, uint32_t id) | |
| 127 { | |
| 128 append(OffscreenCanvasTransferTag); | |
| 129 doWriteUint32(index); | |
| 130 doWriteUint32(width); | |
| 131 doWriteUint32(height); | |
| 132 doWriteUint32(id); | |
| 133 } | |
| 134 | |
| 135 bool SerializedScriptValueWriterForModules::writeCryptoKey(const WebCryptoKey& k
ey) | 109 bool SerializedScriptValueWriterForModules::writeCryptoKey(const WebCryptoKey& k
ey) |
| 136 { | 110 { |
| 137 append(static_cast<uint8_t>(CryptoKeyTag)); | 111 append(static_cast<uint8_t>(CryptoKeyTag)); |
| 138 | 112 |
| 139 switch (key.algorithm().paramsType()) { | 113 switch (key.algorithm().paramsType()) { |
| 140 case WebCryptoKeyAlgorithmParamsTypeAes: | 114 case WebCryptoKeyAlgorithmParamsTypeAes: |
| 141 doWriteAesKey(key); | 115 doWriteAesKey(key); |
| 142 break; | 116 break; |
| 143 case WebCryptoKeyAlgorithmParamsTypeHmac: | 117 case WebCryptoKeyAlgorithmParamsTypeHmac: |
| 144 doWriteHmacKey(key); | 118 doWriteHmacKey(key); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 return handleError(DataCloneError, "An object could not be cloned.",
next); | 299 return handleError(DataCloneError, "An object could not be cloned.",
next); |
| 326 greyObject(jsObject); | 300 greyObject(jsObject); |
| 327 | 301 |
| 328 if (isDOMFileSystem) | 302 if (isDOMFileSystem) |
| 329 return writeDOMFileSystem(value, next); | 303 return writeDOMFileSystem(value, next); |
| 330 | 304 |
| 331 if (!writeCryptoKey(value)) | 305 if (!writeCryptoKey(value)) |
| 332 return handleError(DataCloneError, "Couldn't serialize key data", ne
xt); | 306 return handleError(DataCloneError, "Couldn't serialize key data", ne
xt); |
| 333 return 0; | 307 return 0; |
| 334 } | 308 } |
| 335 v8::Local<v8::Object> jsObject = value.As<v8::Object>(); | |
| 336 uint32_t offscreenCanvasIndex; | |
| 337 if (V8OffscreenCanvas::hasInstance(value, isolate()) && m_transferredOffscre
enCanvas.tryGet(jsObject, &offscreenCanvasIndex)) { | |
| 338 return writeTransferredOffscreenCanvas(value, offscreenCanvasIndex, next
); | |
| 339 } | |
| 340 return ScriptValueSerializer::doSerializeValue(value, next); | 309 return ScriptValueSerializer::doSerializeValue(value, next); |
| 341 } | 310 } |
| 342 | 311 |
| 343 ScriptValueSerializer::StateBase* ScriptValueSerializerForModules::writeTransfer
redOffscreenCanvas(v8::Local<v8::Value> value, uint32_t index, ScriptValueSerial
izer::StateBase* next) | |
| 344 { | |
| 345 OffscreenCanvas* offscreenCanvas = V8OffscreenCanvas::toImpl(value.As<v8::Ob
ject>()); | |
| 346 if (!offscreenCanvas) | |
| 347 return nullptr; | |
| 348 if (offscreenCanvas->isNeutered()) | |
| 349 return handleError(DataCloneError, "An OffscreenCanvas is neutered and c
ould not be cloned.", next); | |
| 350 if (offscreenCanvas->renderingContext()) | |
| 351 return handleError(DataCloneError, "An OffscreenCanvas with a context co
uld not be cloned.", next); | |
| 352 m_writer.writeTransferredOffscreenCanvas(index, offscreenCanvas->width(), of
fscreenCanvas->height(), offscreenCanvas->getAssociatedCanvasId()); | |
| 353 return nullptr; | |
| 354 } | |
| 355 | |
| 356 bool SerializedScriptValueReaderForModules::read(v8::Local<v8::Value>* value, Sc
riptValueCompositeCreator& creator) | 312 bool SerializedScriptValueReaderForModules::read(v8::Local<v8::Value>* value, Sc
riptValueCompositeCreator& creator) |
| 357 { | 313 { |
| 358 SerializationTag tag; | 314 SerializationTag tag; |
| 359 if (!readTag(&tag)) | 315 if (!readTag(&tag)) |
| 360 return false; | 316 return false; |
| 361 switch (tag) { | 317 switch (tag) { |
| 362 case DOMFileSystemTag: | 318 case DOMFileSystemTag: |
| 363 if (!readDOMFileSystem(value)) | 319 if (!readDOMFileSystem(value)) |
| 364 return false; | 320 return false; |
| 365 creator.pushObjectReference(*value); | 321 creator.pushObjectReference(*value); |
| 366 break; | 322 break; |
| 367 case CryptoKeyTag: | 323 case CryptoKeyTag: |
| 368 if (!readCryptoKey(value)) | 324 if (!readCryptoKey(value)) |
| 369 return false; | 325 return false; |
| 370 creator.pushObjectReference(*value); | 326 creator.pushObjectReference(*value); |
| 371 break; | 327 break; |
| 372 case OffscreenCanvasTransferTag: | |
| 373 uint32_t index, width, height, id; | |
| 374 if (!doReadUint32(&index)) | |
| 375 return false; | |
| 376 if (!doReadUint32(&width)) | |
| 377 return false; | |
| 378 if (!doReadUint32(&height)) | |
| 379 return false; | |
| 380 if (!doReadUint32(&id)) | |
| 381 return false; | |
| 382 if (!creator.tryGetTransferredOffscreenCanvas(index, width, height, id,
value)) | |
| 383 return false; | |
| 384 break; | |
| 385 default: | 328 default: |
| 386 return SerializedScriptValueReader::readWithTag(tag, value, creator); | 329 return SerializedScriptValueReader::readWithTag(tag, value, creator); |
| 387 } | 330 } |
| 388 return !value->IsEmpty(); | 331 return !value->IsEmpty(); |
| 389 } | 332 } |
| 390 | 333 |
| 391 bool SerializedScriptValueReaderForModules::readDOMFileSystem(v8::Local<v8::Valu
e>* value) | 334 bool SerializedScriptValueReaderForModules::readDOMFileSystem(v8::Local<v8::Valu
e>* value) |
| 392 { | 335 { |
| 393 uint32_t type; | 336 uint32_t type; |
| 394 String name; | 337 String name; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 if (rawUsages & UnwrapKeyUsage) | 618 if (rawUsages & UnwrapKeyUsage) |
| 676 usages |= WebCryptoKeyUsageUnwrapKey; | 619 usages |= WebCryptoKeyUsageUnwrapKey; |
| 677 if (rawUsages & DeriveBitsUsage) | 620 if (rawUsages & DeriveBitsUsage) |
| 678 usages |= WebCryptoKeyUsageDeriveBits; | 621 usages |= WebCryptoKeyUsageDeriveBits; |
| 679 | 622 |
| 680 return true; | 623 return true; |
| 681 } | 624 } |
| 682 | 625 |
| 683 ScriptValueDeserializerForModules::ScriptValueDeserializerForModules(SerializedS
criptValueReaderForModules& reader, MessagePortArray* messagePorts, ArrayBufferC
ontentsArray* arrayBufferContents, ImageBitmapContentsArray* imageBitmapContents
) | 626 ScriptValueDeserializerForModules::ScriptValueDeserializerForModules(SerializedS
criptValueReaderForModules& reader, MessagePortArray* messagePorts, ArrayBufferC
ontentsArray* arrayBufferContents, ImageBitmapContentsArray* imageBitmapContents
) |
| 684 : ScriptValueDeserializer(reader, messagePorts, arrayBufferContents, imageBi
tmapContents) | 627 : ScriptValueDeserializer(reader, messagePorts, arrayBufferContents, imageBi
tmapContents) |
| 685 , m_reader(reader) | |
| 686 { | 628 { |
| 687 } | 629 } |
| 688 | 630 |
| 689 bool ScriptValueDeserializerForModules::tryGetTransferredOffscreenCanvas(uint32_
t index, uint32_t width, uint32_t height, uint32_t id, v8::Local<v8::Value>* obj
ect) | |
| 690 { | |
| 691 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); | |
| 692 offscreenCanvas->setAssociatedCanvasId(id); | |
| 693 *object = toV8(offscreenCanvas, m_reader.getScriptState()); | |
| 694 if ((*object).IsEmpty()) | |
| 695 return false; | |
| 696 return true; | |
| 697 } | |
| 698 | |
| 699 bool ScriptValueDeserializerForModules::read(v8::Local<v8::Value>* value) | 631 bool ScriptValueDeserializerForModules::read(v8::Local<v8::Value>* value) |
| 700 { | 632 { |
| 701 return toSerializedScriptValueReaderForModules(reader()).read(value, *this); | 633 return toSerializedScriptValueReaderForModules(reader()).read(value, *this); |
| 702 } | 634 } |
| 703 | 635 |
| 704 } // namespace blink | 636 } // namespace blink |
| OLD | NEW |