| 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/core/v8/ScriptValueSerializer.h" | 5 #include "bindings/core/v8/ScriptValueSerializer.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/Transferables.h" | 7 #include "bindings/core/v8/Transferables.h" |
| 8 #include "bindings/core/v8/V8ArrayBuffer.h" | 8 #include "bindings/core/v8/V8ArrayBuffer.h" |
| 9 #include "bindings/core/v8/V8ArrayBufferView.h" | 9 #include "bindings/core/v8/V8ArrayBufferView.h" |
| 10 #include "bindings/core/v8/V8Blob.h" | 10 #include "bindings/core/v8/V8Blob.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 | 71 |
| 72 bool shouldCheckForCycles(int depth) | 72 bool shouldCheckForCycles(int depth) |
| 73 { | 73 { |
| 74 ASSERT(depth >= 0); | 74 ASSERT(depth >= 0); |
| 75 // Since we are not required to spot the cycle as soon as it | 75 // Since we are not required to spot the cycle as soon as it |
| 76 // happens we can check for cycles only when the current depth | 76 // happens we can check for cycles only when the current depth |
| 77 // is a power of two. | 77 // is a power of two. |
| 78 return !(depth & (depth - 1)); | 78 return !(depth & (depth - 1)); |
| 79 } | 79 } |
| 80 | 80 |
| 81 v8::Local<v8::Object> toV8Object(MessagePort* impl, v8::Local<v8::Object> creati
onContext, v8::Isolate* isolate) | |
| 82 { | |
| 83 if (!impl) | |
| 84 return v8::Local<v8::Object>(); | |
| 85 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); | |
| 86 if (wrapper.IsEmpty()) | |
| 87 return v8::Local<v8::Object>(); | |
| 88 DCHECK(wrapper->IsObject()); | |
| 89 return wrapper.As<v8::Object>(); | |
| 90 } | |
| 91 | |
| 92 v8::Local<v8::Object> toV8Object(ImageBitmap* impl, v8::Local<v8::Object> creati
onContext, v8::Isolate* isolate) | |
| 93 { | |
| 94 if (!impl) | |
| 95 return v8::Local<v8::Object>(); | |
| 96 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); | |
| 97 if (wrapper.IsEmpty()) | |
| 98 return v8::Local<v8::Object>(); | |
| 99 return wrapper.As<v8::Object>(); | |
| 100 } | |
| 101 | |
| 102 v8::Local<v8::Object> toV8Object(OffscreenCanvas* impl, v8::Local<v8::Object> cr
eationContext, v8::Isolate* isolate) | |
| 103 { | |
| 104 if (!impl) | |
| 105 return v8::Local<v8::Object>(); | |
| 106 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); | |
| 107 if (wrapper.IsEmpty()) | |
| 108 return v8::Local<v8::Object>(); | |
| 109 return wrapper.As<v8::Object>(); | |
| 110 } | |
| 111 | |
| 112 v8::Local<v8::Object> toV8Object(DOMArrayBufferBase* impl, v8::Local<v8::Object>
creationContext, v8::Isolate* isolate) | |
| 113 { | |
| 114 if (!impl) | |
| 115 return v8::Local<v8::Object>(); | |
| 116 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); | |
| 117 if (wrapper.IsEmpty()) | |
| 118 return v8::Local<v8::Object>(); | |
| 119 return wrapper.As<v8::Object>(); | |
| 120 } | |
| 121 | |
| 122 // Returns true if the provided object is to be considered a 'host object', as u
sed in the | 81 // Returns true if the provided object is to be considered a 'host object', as u
sed in the |
| 123 // HTML5 structured clone algorithm. | 82 // HTML5 structured clone algorithm. |
| 124 bool isHostObject(v8::Local<v8::Object> object) | 83 bool isHostObject(v8::Local<v8::Object> object) |
| 125 { | 84 { |
| 126 // If the object has any internal fields, then we won't be able to serialize
or deserialize | 85 // If the object has any internal fields, then we won't be able to serialize
or deserialize |
| 127 // them; conveniently, this is also a quick way to detect DOM wrapper object
s, because | 86 // them; conveniently, this is also a quick way to detect DOM wrapper object
s, because |
| 128 // the mechanism for these relies on data stored in these fields. We should | 87 // the mechanism for these relies on data stored in these fields. We should |
| 129 // catch external array data as a special case. | 88 // catch external array data as a special case. |
| 130 return object->InternalFieldCount(); | 89 return object->InternalFieldCount(); |
| 131 } | 90 } |
| (...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 | 681 |
| 723 void ScriptValueSerializer::copyTransferables(const Transferables& transferables
) | 682 void ScriptValueSerializer::copyTransferables(const Transferables& transferables
) |
| 724 { | 683 { |
| 725 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); | 684 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); |
| 726 | 685 |
| 727 // Also kept in separate ObjectPools, iterate and copy the contents | 686 // Also kept in separate ObjectPools, iterate and copy the contents |
| 728 // of each kind of transferable vector. | 687 // of each kind of transferable vector. |
| 729 | 688 |
| 730 const auto& messagePorts = transferables.messagePorts; | 689 const auto& messagePorts = transferables.messagePorts; |
| 731 for (size_t i = 0; i < messagePorts.size(); ++i) { | 690 for (size_t i = 0; i < messagePorts.size(); ++i) { |
| 732 v8::Local<v8::Object> v8MessagePort = toV8Object(messagePorts[i].get(),
creationContext, isolate()); | 691 v8::Local<v8::Object> v8MessagePort = toV8(messagePorts[i].get(), creati
onContext, isolate()).As<v8::Object>(); |
| 733 m_transferredMessagePorts.set(v8MessagePort, i); | 692 m_transferredMessagePorts.set(v8MessagePort, i); |
| 734 } | 693 } |
| 735 | 694 |
| 736 const auto& arrayBuffers = transferables.arrayBuffers; | 695 const auto& arrayBuffers = transferables.arrayBuffers; |
| 737 for (size_t i = 0; i < arrayBuffers.size(); ++i) { | 696 for (size_t i = 0; i < arrayBuffers.size(); ++i) { |
| 738 v8::Local<v8::Object> v8ArrayBuffer = toV8Object(arrayBuffers[i].get(),
creationContext, isolate()); | 697 v8::Local<v8::Object> v8ArrayBuffer = toV8(arrayBuffers[i].get(), creati
onContext, isolate()).As<v8::Object>(); |
| 739 // Coalesce multiple occurences of the same buffer to the first index. | 698 // Coalesce multiple occurences of the same buffer to the first index. |
| 740 if (!m_transferredArrayBuffers.contains(v8ArrayBuffer)) | 699 if (!m_transferredArrayBuffers.contains(v8ArrayBuffer)) |
| 741 m_transferredArrayBuffers.set(v8ArrayBuffer, i); | 700 m_transferredArrayBuffers.set(v8ArrayBuffer, i); |
| 742 } | 701 } |
| 743 | 702 |
| 744 const auto& imageBitmaps = transferables.imageBitmaps; | 703 const auto& imageBitmaps = transferables.imageBitmaps; |
| 745 for (size_t i = 0; i < imageBitmaps.size(); ++i) { | 704 for (size_t i = 0; i < imageBitmaps.size(); ++i) { |
| 746 v8::Local<v8::Object> v8ImageBitmap = toV8Object(imageBitmaps[i].get(),
creationContext, isolate()); | 705 v8::Local<v8::Object> v8ImageBitmap = toV8(imageBitmaps[i].get(), creati
onContext, isolate()).As<v8::Object>(); |
| 747 if (!m_transferredImageBitmaps.contains(v8ImageBitmap)) | 706 if (!m_transferredImageBitmaps.contains(v8ImageBitmap)) |
| 748 m_transferredImageBitmaps.set(v8ImageBitmap, i); | 707 m_transferredImageBitmaps.set(v8ImageBitmap, i); |
| 749 } | 708 } |
| 750 | 709 |
| 751 const auto& offscreenCanvases = transferables.offscreenCanvases; | 710 const auto& offscreenCanvases = transferables.offscreenCanvases; |
| 752 for (size_t i = 0; i < offscreenCanvases.size(); ++i) { | 711 for (size_t i = 0; i < offscreenCanvases.size(); ++i) { |
| 753 v8::Local<v8::Object> v8OffscreenCanvas = toV8Object(offscreenCanvases[i
].get(), creationContext, isolate()); | 712 v8::Local<v8::Object> v8OffscreenCanvas = toV8(offscreenCanvases[i].get(
), creationContext, isolate()).As<v8::Object>(); |
| 754 if (!m_transferredOffscreenCanvas.contains(v8OffscreenCanvas)) | 713 if (!m_transferredOffscreenCanvas.contains(v8OffscreenCanvas)) |
| 755 m_transferredOffscreenCanvas.set(v8OffscreenCanvas, i); | 714 m_transferredOffscreenCanvas.set(v8OffscreenCanvas, i); |
| 756 } | 715 } |
| 757 } | 716 } |
| 758 | 717 |
| 759 PassRefPtr<SerializedScriptValue> ScriptValueSerializer::serialize(v8::Local<v8:
:Value> value, Transferables* transferables, ExceptionState& exceptionState) | 718 PassRefPtr<SerializedScriptValue> ScriptValueSerializer::serialize(v8::Local<v8:
:Value> value, Transferables* transferables, ExceptionState& exceptionState) |
| 760 { | 719 { |
| 761 DCHECK(!m_blobDataHandles); | 720 DCHECK(!m_blobDataHandles); |
| 762 | 721 |
| 763 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat
e(); | 722 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat
e(); |
| (...skipping 1682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2446 return false; | 2405 return false; |
| 2447 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 2406 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
| 2448 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 2407 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
| 2449 if (objectReference >= m_objectPool.size()) | 2408 if (objectReference >= m_objectPool.size()) |
| 2450 return false; | 2409 return false; |
| 2451 *object = m_objectPool[objectReference]; | 2410 *object = m_objectPool[objectReference]; |
| 2452 return true; | 2411 return true; |
| 2453 } | 2412 } |
| 2454 | 2413 |
| 2455 } // namespace blink | 2414 } // namespace blink |
| OLD | NEW |