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 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 CustomCountHistogram domWrapperCount{"Blink.ScriptValueSerializer.DOMWra
pperCount", 0, 100000, 50}; | 728 CustomCountHistogram domWrapperCount{"Blink.ScriptValueSerializer.DOMWra
pperCount", 0, 100000, 50}; |
729 }; | 729 }; |
730 DEFINE_THREAD_SAFE_STATIC_LOCAL(ObjectCountHistograms, histograms, new Objec
tCountHistograms); | 730 DEFINE_THREAD_SAFE_STATIC_LOCAL(ObjectCountHistograms, histograms, new Objec
tCountHistograms); |
731 histograms.primitiveCount.count(primitiveCount); | 731 histograms.primitiveCount.count(primitiveCount); |
732 histograms.jsObjectCount.count(jsObjectCount); | 732 histograms.jsObjectCount.count(jsObjectCount); |
733 histograms.domWrapperCount.count(domWrapperCount); | 733 histograms.domWrapperCount.count(domWrapperCount); |
734 } | 734 } |
735 | 735 |
736 PassRefPtr<SerializedScriptValue> ScriptValueSerializer::serialize(v8::Local<v8:
:Value> value, Transferables* transferables, ExceptionState& exceptionState) | 736 PassRefPtr<SerializedScriptValue> ScriptValueSerializer::serialize(v8::Local<v8:
:Value> value, Transferables* transferables, ExceptionState& exceptionState) |
737 { | 737 { |
738 if (RuntimeEnabledFeatures::v8BasedStructuredCloneEnabled()) { | |
739 v8::HandleScope scope(isolate()); | |
740 v8::ValueSerializer serializer(isolate()); | |
741 serializer.WriteHeader(); | |
742 bool wroteValue; | |
743 if (!serializer.WriteValue(context(), value).To(&wroteValue)) { | |
744 // TODO(jbroman): Revisit how DataCloneError is thrown. | |
745 // https://crbug.com/641964 | |
746 if (m_tryCatch.HasCaught()) { | |
747 exceptionState.rethrowV8Exception(m_tryCatch.Exception()); | |
748 } else { | |
749 exceptionState.throwDOMException(DataCloneError, "An object coul
d not be cloned."); | |
750 } | |
751 return nullptr; | |
752 } | |
753 DCHECK(wroteValue); | |
754 std::vector<uint8_t> buffer = serializer.ReleaseBuffer(); | |
755 // TODO(jbroman): Remove this old conversion to WTF::String. | |
756 if (buffer.size() % 2) | |
757 buffer.push_back(0); | |
758 return SerializedScriptValue::create(String(reinterpret_cast<const UChar
*>(&buffer[0]), buffer.size() / 2)); | |
759 } | |
760 | |
761 m_primitiveCount = m_jsObjectCount = m_domWrapperCount = 0; | 738 m_primitiveCount = m_jsObjectCount = m_domWrapperCount = 0; |
762 | 739 |
763 DCHECK(!m_blobDataHandles); | 740 DCHECK(!m_blobDataHandles); |
764 | 741 |
765 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat
e(); | 742 RefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::creat
e(); |
766 | 743 |
767 m_blobDataHandles = &serializedValue->blobDataHandles(); | 744 m_blobDataHandles = &serializedValue->blobDataHandles(); |
768 if (transferables) | 745 if (transferables) |
769 copyTransferables(*transferables); | 746 copyTransferables(*transferables); |
770 | 747 |
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2143 if (it != m_blobDataHandles.end()) { | 2120 if (it != m_blobDataHandles.end()) { |
2144 // make assertions about type and size? | 2121 // make assertions about type and size? |
2145 return it->value; | 2122 return it->value; |
2146 } | 2123 } |
2147 return BlobDataHandle::create(uuid, type, size); | 2124 return BlobDataHandle::create(uuid, type, size); |
2148 } | 2125 } |
2149 | 2126 |
2150 v8::Local<v8::Value> ScriptValueDeserializer::deserialize() | 2127 v8::Local<v8::Value> ScriptValueDeserializer::deserialize() |
2151 { | 2128 { |
2152 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2129 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
2153 | |
2154 if (RuntimeEnabledFeatures::v8BasedStructuredCloneEnabled()) { | |
2155 v8::EscapableHandleScope scope(isolate); | |
2156 v8::TryCatch tryCatch(isolate); | |
2157 v8::ValueDeserializer deserializer(isolate, m_reader.buffer(), m_reader.
length()); | |
2158 deserializer.SetSupportsLegacyWireFormat(true); | |
2159 bool readHeader; | |
2160 if (!deserializer.ReadHeader().To(&readHeader)) | |
2161 return v8::Null(isolate); | |
2162 DCHECK(readHeader); | |
2163 v8::Local<v8::Context> context = m_reader.getScriptState()->context(); | |
2164 v8::Local<v8::Value> value; | |
2165 if (!deserializer.ReadValue(context).ToLocal(&value)) | |
2166 return v8::Null(isolate); | |
2167 return scope.Escape(value); | |
2168 } | |
2169 | |
2170 if (!m_reader.readVersion(m_version) || m_version > SerializedScriptValue::w
ireFormatVersion) | 2130 if (!m_reader.readVersion(m_version) || m_version > SerializedScriptValue::w
ireFormatVersion) |
2171 return v8::Null(isolate); | 2131 return v8::Null(isolate); |
2172 m_reader.setVersion(m_version); | 2132 m_reader.setVersion(m_version); |
2173 v8::EscapableHandleScope scope(isolate); | 2133 v8::EscapableHandleScope scope(isolate); |
2174 while (!m_reader.isEof()) { | 2134 while (!m_reader.isEof()) { |
2175 if (!doDeserialize()) | 2135 if (!doDeserialize()) |
2176 return v8::Null(isolate); | 2136 return v8::Null(isolate); |
2177 } | 2137 } |
2178 if (stackDepth() != 1 || m_openCompositeReferenceStack.size()) | 2138 if (stackDepth() != 1 || m_openCompositeReferenceStack.size()) |
2179 return v8::Null(isolate); | 2139 return v8::Null(isolate); |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2487 return false; | 2447 return false; |
2488 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 2448 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
2489 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 2449 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
2490 if (objectReference >= m_objectPool.size()) | 2450 if (objectReference >= m_objectPool.size()) |
2491 return false; | 2451 return false; |
2492 *object = m_objectPool[objectReference]; | 2452 *object = m_objectPool[objectReference]; |
2493 return true; | 2453 return true; |
2494 } | 2454 } |
2495 | 2455 |
2496 } // namespace blink | 2456 } // namespace blink |
OLD | NEW |