| 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 "config.h" | 5 #include "config.h" |
| 6 #include "bindings/core/v8/ScriptValueSerializer.h" | 6 #include "bindings/core/v8/ScriptValueSerializer.h" |
| 7 | 7 |
| 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 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 ASSERT(!value->IsString()); | 705 ASSERT(!value->IsString()); |
| 706 m_writer.writeObjectReference(objectReference); | 706 m_writer.writeObjectReference(objectReference); |
| 707 } else { | 707 } else { |
| 708 return doSerializeValue(value, next); | 708 return doSerializeValue(value, next); |
| 709 } | 709 } |
| 710 return 0; | 710 return 0; |
| 711 } | 711 } |
| 712 | 712 |
| 713 ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeValue(v8::Lo
cal<v8::Value> value, ScriptValueSerializer::StateBase* next) | 713 ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeValue(v8::Lo
cal<v8::Value> value, ScriptValueSerializer::StateBase* next) |
| 714 { | 714 { |
| 715 uint32_t arrayBufferIndex; | |
| 716 if (value.IsEmpty()) | 715 if (value.IsEmpty()) |
| 717 return handleError(InputError, "The empty property name cannot be cloned
.", next); | 716 return handleError(InputError, "The empty property name cannot be cloned
.", next); |
| 718 if (value->IsUndefined()) { | 717 if (value->IsUndefined()) { |
| 719 m_writer.writeUndefined(); | 718 m_writer.writeUndefined(); |
| 720 } else if (value->IsNull()) { | 719 } else if (value->IsNull()) { |
| 721 m_writer.writeNull(); | 720 m_writer.writeNull(); |
| 722 } else if (value->IsTrue()) { | 721 } else if (value->IsTrue()) { |
| 723 m_writer.writeTrue(); | 722 m_writer.writeTrue(); |
| 724 } else if (value->IsFalse()) { | 723 } else if (value->IsFalse()) { |
| 725 m_writer.writeFalse(); | 724 m_writer.writeFalse(); |
| 726 } else if (value->IsInt32()) { | 725 } else if (value->IsInt32()) { |
| 727 m_writer.writeInt32(value.As<v8::Int32>()->Value()); | 726 m_writer.writeInt32(value.As<v8::Int32>()->Value()); |
| 728 } else if (value->IsUint32()) { | 727 } else if (value->IsUint32()) { |
| 729 m_writer.writeUint32(value.As<v8::Uint32>()->Value()); | 728 m_writer.writeUint32(value.As<v8::Uint32>()->Value()); |
| 730 } else if (value->IsNumber()) { | 729 } else if (value->IsNumber()) { |
| 731 m_writer.writeNumber(value.As<v8::Number>()->Value()); | 730 m_writer.writeNumber(value.As<v8::Number>()->Value()); |
| 732 } else if (V8ArrayBufferView::hasInstance(value, isolate())) { | |
| 733 return writeAndGreyArrayBufferView(value.As<v8::Object>(), next); | |
| 734 } else if (value->IsString()) { | 731 } else if (value->IsString()) { |
| 735 writeString(value); | 732 writeString(value); |
| 736 } else if (V8MessagePort::hasInstance(value, isolate())) { | 733 } else if (value->IsObject()) { |
| 737 uint32_t messagePortIndex; | 734 v8::Local<v8::Object> jsObject = value.As<v8::Object>(); |
| 738 if (m_transferredMessagePorts.tryGet(value.As<v8::Object>(), &messagePor
tIndex)) { | 735 |
| 736 uint32_t arrayBufferIndex; |
| 737 if (V8ArrayBufferView::hasInstance(value, isolate())) { |
| 738 return writeAndGreyArrayBufferView(jsObject, next); |
| 739 } else if (V8MessagePort::hasInstance(value, isolate())) { |
| 740 uint32_t messagePortIndex; |
| 741 if (!m_transferredMessagePorts.tryGet(jsObject, &messagePortIndex)) |
| 742 return handleError(DataCloneError, "A MessagePort could not be c
loned.", next); |
| 739 m_writer.writeTransferredMessagePort(messagePortIndex); | 743 m_writer.writeTransferredMessagePort(messagePortIndex); |
| 740 } else { | 744 return nullptr; |
| 741 return handleError(DataCloneError, "A MessagePort could not be clone
d.", next); | 745 } else if (V8ArrayBuffer::hasInstance(value, isolate()) && m_transferred
ArrayBuffers.tryGet(jsObject, &arrayBufferIndex)) { |
| 746 return writeTransferredArrayBuffer(value, arrayBufferIndex, next); |
| 747 } else if (V8SharedArrayBuffer::hasInstance(value, isolate()) && m_trans
ferredArrayBuffers.tryGet(jsObject, &arrayBufferIndex)) { |
| 748 return writeTransferredSharedArrayBuffer(value, arrayBufferIndex, ne
xt); |
| 742 } | 749 } |
| 743 } else if (V8ArrayBuffer::hasInstance(value, isolate()) && m_transferredArra
yBuffers.tryGet(value.As<v8::Object>(), &arrayBufferIndex)) { | 750 |
| 744 return writeTransferredArrayBuffer(value, arrayBufferIndex, next); | |
| 745 } else if (V8SharedArrayBuffer::hasInstance(value, isolate()) && m_transferr
edArrayBuffers.tryGet(value.As<v8::Object>(), &arrayBufferIndex)) { | |
| 746 return writeTransferredSharedArrayBuffer(value, arrayBufferIndex, next); | |
| 747 } else { | |
| 748 v8::Local<v8::Object> jsObject = value.As<v8::Object>(); | |
| 749 if (jsObject.IsEmpty()) | |
| 750 return handleError(DataCloneError, "An object could not be cloned.",
next); | |
| 751 greyObject(jsObject); | 751 greyObject(jsObject); |
| 752 if (value->IsDate()) { | 752 if (value->IsDate()) { |
| 753 m_writer.writeDate(value.As<v8::Date>()->ValueOf()); | 753 m_writer.writeDate(value.As<v8::Date>()->ValueOf()); |
| 754 } else if (value->IsStringObject()) { | 754 } else if (value->IsStringObject()) { |
| 755 writeStringObject(value); | 755 writeStringObject(value); |
| 756 } else if (value->IsNumberObject()) { | 756 } else if (value->IsNumberObject()) { |
| 757 writeNumberObject(value); | 757 writeNumberObject(value); |
| 758 } else if (value->IsBooleanObject()) { | 758 } else if (value->IsBooleanObject()) { |
| 759 writeBooleanObject(value); | 759 writeBooleanObject(value); |
| 760 } else if (value->IsArray()) { | 760 } else if (value->IsArray()) { |
| 761 return startArrayState(value.As<v8::Array>(), next); | 761 return startArrayState(value.As<v8::Array>(), next); |
| 762 } else if (value->IsMap()) { | 762 } else if (value->IsMap()) { |
| 763 return startMapState(value.As<v8::Map>(), next); | 763 return startMapState(value.As<v8::Map>(), next); |
| 764 } else if (value->IsSet()) { | 764 } else if (value->IsSet()) { |
| 765 return startSetState(value.As<v8::Set>(), next); | 765 return startSetState(value.As<v8::Set>(), next); |
| 766 } else if (V8File::hasInstance(value, isolate())) { | 766 } else if (V8File::hasInstance(value, isolate())) { |
| 767 return writeFile(value, next); | 767 return writeFile(value, next); |
| 768 } else if (V8Blob::hasInstance(value, isolate())) { | 768 } else if (V8Blob::hasInstance(value, isolate())) { |
| 769 return writeBlob(value, next); | 769 return writeBlob(value, next); |
| 770 } else if (V8FileList::hasInstance(value, isolate())) { | 770 } else if (V8FileList::hasInstance(value, isolate())) { |
| 771 return writeFileList(value, next); | 771 return writeFileList(value, next); |
| 772 } else if (V8ImageData::hasInstance(value, isolate())) { | 772 } else if (V8ImageData::hasInstance(value, isolate())) { |
| 773 writeImageData(value); | 773 writeImageData(value); |
| 774 } else if (value->IsRegExp()) { | 774 } else if (value->IsRegExp()) { |
| 775 writeRegExp(value); | 775 writeRegExp(value); |
| 776 } else if (V8ArrayBuffer::hasInstance(value, isolate())) { | 776 } else if (V8ArrayBuffer::hasInstance(value, isolate())) { |
| 777 return writeArrayBuffer(value, next); | 777 return writeArrayBuffer(value, next); |
| 778 } else if (V8CompositorProxy::hasInstance(value, isolate())) { | 778 } else if (V8CompositorProxy::hasInstance(value, isolate())) { |
| 779 return writeCompositorProxy(value, next); | 779 return writeCompositorProxy(value, next); |
| 780 } else if (value->IsObject()) { | 780 } else if (isHostObject(jsObject) || jsObject->IsCallable() || value->Is
NativeError()) { |
| 781 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat
iveError()) | 781 return handleError(DataCloneError, "An object could not be cloned.",
next); |
| 782 return handleError(DataCloneError, "An object could not be clone
d.", next); | 782 } else { |
| 783 return startObjectState(jsObject, next); | 783 return startObjectState(jsObject, next); |
| 784 } else { | |
| 785 return handleError(DataCloneError, "A value could not be cloned.", n
ext); | |
| 786 } | 784 } |
| 785 } else { |
| 786 return handleError(DataCloneError, "A value could not be cloned.", next)
; |
| 787 } | 787 } |
| 788 return 0; | 788 return nullptr; |
| 789 } | 789 } |
| 790 | 790 |
| 791 ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeArrayBuffer(
v8::Local<v8::Value> arrayBuffer, ScriptValueSerializer::StateBase* next) | 791 ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeArrayBuffer(
v8::Local<v8::Value> arrayBuffer, ScriptValueSerializer::StateBase* next) |
| 792 { | 792 { |
| 793 return doSerialize(arrayBuffer, next); | 793 return doSerialize(arrayBuffer, next); |
| 794 } | 794 } |
| 795 | 795 |
| 796 ScriptValueSerializer::StateBase* ScriptValueSerializer::checkException(ScriptVa
lueSerializer::StateBase* state) | 796 ScriptValueSerializer::StateBase* ScriptValueSerializer::checkException(ScriptVa
lueSerializer::StateBase* state) |
| 797 { | 797 { |
| 798 return m_tryCatch.HasCaught() ? handleError(JSException, "", state) : 0; | 798 return m_tryCatch.HasCaught() ? handleError(JSException, "", state) : 0; |
| (...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2158 return false; | 2158 return false; |
| 2159 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 2159 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
| 2160 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 2160 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
| 2161 if (objectReference >= m_objectPool.size()) | 2161 if (objectReference >= m_objectPool.size()) |
| 2162 return false; | 2162 return false; |
| 2163 *object = m_objectPool[objectReference]; | 2163 *object = m_objectPool[objectReference]; |
| 2164 return true; | 2164 return true; |
| 2165 } | 2165 } |
| 2166 | 2166 |
| 2167 } // namespace blink | 2167 } // namespace blink |
| OLD | NEW |