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