Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(446)

Side by Side Diff: Source/bindings/core/v8/ScriptValueSerializer.cpp

Issue 1297223004: ScriptValueSerializer should throw, not crash, when handling unknown types (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« LayoutTests/fast/js/structured-clone.html ('K') | « LayoutTests/fast/js/structured-clone.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698