Chromium Code Reviews| 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 |
| 739 m_writer.writeTransferredMessagePort(messagePortIndex); | 736 uint32_t arrayBufferIndex; |
| 740 } else { | 737 if (V8ArrayBufferView::hasInstance(value, isolate())) { |
| 741 return handleError(DataCloneError, "A MessagePort could not be clone d.", next); | 738 return writeAndGreyArrayBufferView(jsObject, next); |
| 739 } else if (V8MessagePort::hasInstance(value, isolate())) { | |
| 740 uint32_t messagePortIndex; | |
| 741 if (m_transferredMessagePorts.tryGet(jsObject, &messagePortIndex)) { | |
| 742 m_writer.writeTransferredMessagePort(messagePortIndex); | |
|
jsbell
2015/08/19 01:24:11
This needs an early exit here
adamk
2015/08/19 20:19:34
Switched the logic around here to return if tryGet
jsbell
2015/08/19 20:53:15
A MessagePort can't be just cloned, it must be tra
| |
| 743 } else { | |
| 744 return handleError(DataCloneError, "A MessagePort could not be c loned.", next); | |
| 745 } | |
| 746 } else if (V8ArrayBuffer::hasInstance(value, isolate()) && m_transferred ArrayBuffers.tryGet(jsObject, &arrayBufferIndex)) { | |
| 747 return writeTransferredArrayBuffer(value, arrayBufferIndex, next); | |
| 748 } else if (V8SharedArrayBuffer::hasInstance(value, isolate()) && m_trans ferredArrayBuffers.tryGet(jsObject, &arrayBufferIndex)) { | |
| 749 return writeTransferredSharedArrayBuffer(value, arrayBufferIndex, ne xt); | |
| 742 } | 750 } |
| 743 } else if (V8ArrayBuffer::hasInstance(value, isolate()) && m_transferredArra yBuffers.tryGet(value.As<v8::Object>(), &arrayBufferIndex)) { | 751 |
| 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); | 752 greyObject(jsObject); |
| 752 if (value->IsDate()) { | 753 if (value->IsDate()) { |
| 753 m_writer.writeDate(value.As<v8::Date>()->ValueOf()); | 754 m_writer.writeDate(value.As<v8::Date>()->ValueOf()); |
|
jsbell
2015/08/19 01:24:11
this needs an early exit, or the "return startObje
adamk
2015/08/19 20:19:34
Oops, didn't see that still needed to be in an 'el
| |
| 754 } else if (value->IsStringObject()) { | 755 } else if (value->IsStringObject()) { |
| 755 writeStringObject(value); | 756 writeStringObject(value); |
|
jsbell
2015/08/19 01:24:11
ditto
| |
| 756 } else if (value->IsNumberObject()) { | 757 } else if (value->IsNumberObject()) { |
| 757 writeNumberObject(value); | 758 writeNumberObject(value); |
|
jsbell
2015/08/19 01:24:11
ditto
| |
| 758 } else if (value->IsBooleanObject()) { | 759 } else if (value->IsBooleanObject()) { |
| 759 writeBooleanObject(value); | 760 writeBooleanObject(value); |
|
jsbell
2015/08/19 01:24:11
ditto
| |
| 760 } else if (value->IsArray()) { | 761 } else if (value->IsArray()) { |
| 761 return startArrayState(value.As<v8::Array>(), next); | 762 return startArrayState(value.As<v8::Array>(), next); |
| 762 } else if (value->IsMap()) { | 763 } else if (value->IsMap()) { |
| 763 return startMapState(value.As<v8::Map>(), next); | 764 return startMapState(value.As<v8::Map>(), next); |
| 764 } else if (value->IsSet()) { | 765 } else if (value->IsSet()) { |
| 765 return startSetState(value.As<v8::Set>(), next); | 766 return startSetState(value.As<v8::Set>(), next); |
| 766 } else if (V8File::hasInstance(value, isolate())) { | 767 } else if (V8File::hasInstance(value, isolate())) { |
| 767 return writeFile(value, next); | 768 return writeFile(value, next); |
| 768 } else if (V8Blob::hasInstance(value, isolate())) { | 769 } else if (V8Blob::hasInstance(value, isolate())) { |
| 769 return writeBlob(value, next); | 770 return writeBlob(value, next); |
| 770 } else if (V8FileList::hasInstance(value, isolate())) { | 771 } else if (V8FileList::hasInstance(value, isolate())) { |
| 771 return writeFileList(value, next); | 772 return writeFileList(value, next); |
| 772 } else if (V8ImageData::hasInstance(value, isolate())) { | 773 } else if (V8ImageData::hasInstance(value, isolate())) { |
| 773 writeImageData(value); | 774 writeImageData(value); |
|
jsbell
2015/08/19 01:24:11
ditto
| |
| 774 } else if (value->IsRegExp()) { | 775 } else if (value->IsRegExp()) { |
| 775 writeRegExp(value); | 776 writeRegExp(value); |
|
jsbell
2015/08/19 01:24:11
ditto
| |
| 776 } else if (V8ArrayBuffer::hasInstance(value, isolate())) { | 777 } else if (V8ArrayBuffer::hasInstance(value, isolate())) { |
| 777 return writeArrayBuffer(value, next); | 778 return writeArrayBuffer(value, next); |
| 778 } else if (V8CompositorProxy::hasInstance(value, isolate())) { | 779 } else if (V8CompositorProxy::hasInstance(value, isolate())) { |
| 779 return writeCompositorProxy(value, next); | 780 return writeCompositorProxy(value, next); |
| 780 } else if (value->IsObject()) { | 781 } else if (isHostObject(jsObject) || jsObject->IsCallable() || value->Is NativeError()) { |
| 781 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError()) | 782 return handleError(DataCloneError, "An object could not be cloned.", next); |
| 782 return handleError(DataCloneError, "An object could not be clone d.", next); | |
| 783 return startObjectState(jsObject, next); | |
| 784 } else { | |
| 785 return handleError(DataCloneError, "A value could not be cloned.", n ext); | |
| 786 } | 783 } |
| 784 return startObjectState(jsObject, next); | |
| 785 } else { | |
| 786 return handleError(DataCloneError, "A value could not be cloned.", next) ; | |
| 787 } | 787 } |
| 788 return 0; | 788 return 0; |
|
jsbell
2015/08/19 01:24:11
nullptr, while you're here?
adamk
2015/08/19 20:19:34
Done.
| |
| 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 |