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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp

Issue 2494823002: V8ScriptValueSerializer: Use PartitionAlloc for the buffer, and avoid copying it into a String. (Closed)
Patch Set: initialize SerializedScriptValue::m_dataBufferSize Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/serialization/V8ScriptValueSerializer.h" 5 #include "bindings/core/v8/serialization/V8ScriptValueSerializer.h"
6 6
7 #include "bindings/core/v8/ToV8.h" 7 #include "bindings/core/v8/ToV8.h"
8 #include "bindings/core/v8/V8Blob.h" 8 #include "bindings/core/v8/V8Blob.h"
9 #include "bindings/core/v8/V8CompositorProxy.h" 9 #include "bindings/core/v8/V8CompositorProxy.h"
10 #include "bindings/core/v8/V8File.h" 10 #include "bindings/core/v8/V8File.h"
11 #include "bindings/core/v8/V8FileList.h" 11 #include "bindings/core/v8/V8FileList.h"
12 #include "bindings/core/v8/V8ImageBitmap.h" 12 #include "bindings/core/v8/V8ImageBitmap.h"
13 #include "bindings/core/v8/V8ImageData.h" 13 #include "bindings/core/v8/V8ImageData.h"
14 #include "bindings/core/v8/V8MessagePort.h" 14 #include "bindings/core/v8/V8MessagePort.h"
15 #include "bindings/core/v8/V8OffscreenCanvas.h" 15 #include "bindings/core/v8/V8OffscreenCanvas.h"
16 #include "core/dom/DOMArrayBufferBase.h" 16 #include "core/dom/DOMArrayBufferBase.h"
17 #include "core/html/ImageData.h" 17 #include "core/html/ImageData.h"
18 #include "platform/RuntimeEnabledFeatures.h" 18 #include "platform/RuntimeEnabledFeatures.h"
19 #include "public/platform/WebBlobInfo.h" 19 #include "public/platform/WebBlobInfo.h"
20 #include "wtf/AutoReset.h" 20 #include "wtf/AutoReset.h"
21 #include "wtf/DateMath.h" 21 #include "wtf/DateMath.h"
22 #include "wtf/allocator/Partitions.h"
22 #include "wtf/text/StringUTF8Adaptor.h" 23 #include "wtf/text/StringUTF8Adaptor.h"
23 24
24 namespace blink { 25 namespace blink {
25 26
26 V8ScriptValueSerializer::V8ScriptValueSerializer( 27 V8ScriptValueSerializer::V8ScriptValueSerializer(
27 RefPtr<ScriptState> scriptState) 28 RefPtr<ScriptState> scriptState)
28 : m_scriptState(std::move(scriptState)), 29 : m_scriptState(std::move(scriptState)),
29 m_serializedScriptValue(SerializedScriptValue::create()), 30 m_serializedScriptValue(SerializedScriptValue::create()),
30 m_serializer(m_scriptState->isolate(), this) { 31 m_serializer(m_scriptState->isolate(), this) {
31 DCHECK(RuntimeEnabledFeatures::v8BasedStructuredCloneEnabled()); 32 DCHECK(RuntimeEnabledFeatures::v8BasedStructuredCloneEnabled());
(...skipping 24 matching lines...) Expand all
56 return nullptr; 57 return nullptr;
57 } 58 }
58 DCHECK(wroteValue); 59 DCHECK(wroteValue);
59 60
60 // Finalize the transfer (e.g. neutering array buffers). 61 // Finalize the transfer (e.g. neutering array buffers).
61 finalizeTransfer(exceptionState); 62 finalizeTransfer(exceptionState);
62 if (exceptionState.hadException()) 63 if (exceptionState.hadException())
63 return nullptr; 64 return nullptr;
64 65
65 // Finalize the results. 66 // Finalize the results.
66 std::vector<uint8_t> buffer = m_serializer.ReleaseBuffer(); 67 std::pair<uint8_t*, size_t> buffer = m_serializer.Release();
67 // Currently, the output must be padded to a multiple of two bytes.
68 // TODO(jbroman): Remove this old conversion to WTF::String.
69 if (buffer.size() % 2)
70 buffer.push_back(0);
71 m_serializedScriptValue->setData( 68 m_serializedScriptValue->setData(
72 String(reinterpret_cast<const UChar*>(&buffer[0]), buffer.size() / 2)); 69 SerializedScriptValue::DataBufferPtr(buffer.first), buffer.second);
73 return std::move(m_serializedScriptValue); 70 return std::move(m_serializedScriptValue);
74 } 71 }
75 72
76 void V8ScriptValueSerializer::prepareTransfer(Transferables* transferables) { 73 void V8ScriptValueSerializer::prepareTransfer(Transferables* transferables) {
77 if (!transferables) 74 if (!transferables)
78 return; 75 return;
79 m_transferables = transferables; 76 m_transferables = transferables;
80 77
81 // Transfer array buffers. 78 // Transfer array buffers.
82 for (uint32_t i = 0; i < transferables->arrayBuffers.size(); i++) { 79 for (uint32_t i = 0; i < transferables->arrayBuffers.size(); i++) {
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 return v8::Just(true); 362 return v8::Just(true);
366 } 363 }
367 if (!exceptionState.hadException()) { 364 if (!exceptionState.hadException()) {
368 StringView interface = wrappable->wrapperTypeInfo()->interfaceName; 365 StringView interface = wrappable->wrapperTypeInfo()->interfaceName;
369 exceptionState.throwDOMException( 366 exceptionState.throwDOMException(
370 DataCloneError, interface + " object could not be cloned."); 367 DataCloneError, interface + " object could not be cloned.");
371 } 368 }
372 return v8::Nothing<bool>(); 369 return v8::Nothing<bool>();
373 } 370 }
374 371
372 void* V8ScriptValueSerializer::ReallocateBufferMemory(void* oldBuffer,
373 size_t size,
374 size_t* actualSize) {
375 *actualSize = WTF::Partitions::bufferActualSize(size);
376 return WTF::Partitions::bufferRealloc(oldBuffer, size,
377 "SerializedScriptValue buffer");
378 }
379
380 void V8ScriptValueSerializer::FreeBufferMemory(void* buffer) {
381 return WTF::Partitions::bufferFree(buffer);
382 }
383
375 } // namespace blink 384 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698