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 |