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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp

Issue 1893983002: Simplify handling of Transferable objects while (de)serializing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove Transferable.cpp, not needed after all. Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp
index 1d7b0437c9ca67c6b15ccf9237442931c3473d05..06080d9946bd787b1658361e7d444c96823ee809 100644
--- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp
@@ -36,14 +36,16 @@
#include "bindings/core/v8/ScriptState.h"
#include "bindings/core/v8/ScriptValueSerializer.h"
#include "bindings/core/v8/SerializedScriptValueFactory.h"
-#include "bindings/core/v8/TransferableArrayBuffer.h"
-#include "bindings/core/v8/TransferableImageBitmap.h"
-#include "bindings/core/v8/TransferableMessagePort.h"
+#include "bindings/core/v8/Transferables.h"
#include "bindings/core/v8/V8ArrayBuffer.h"
#include "bindings/core/v8/V8ImageBitmap.h"
#include "bindings/core/v8/V8MessagePort.h"
#include "bindings/core/v8/V8SharedArrayBuffer.h"
+#include "core/dom/DOMArrayBuffer.h"
+#include "core/dom/DOMSharedArrayBuffer.h"
#include "core/dom/ExceptionCode.h"
+#include "core/dom/MessagePort.h"
+#include "core/frame/ImageBitmap.h"
#include "platform/SharedBuffer.h"
#include "platform/blob/BlobData.h"
#include "platform/heap/Handle.h"
@@ -55,6 +57,22 @@
namespace blink {
+SerializedScriptValue::SerializedScriptValue()
+ : m_externallyAllocatedMemory(0)
+{
+}
+
+SerializedScriptValue::~SerializedScriptValue()
+{
+ // If the allocated memory was not registered before, then this class is likely
+ // used in a context other than Worker's onmessage environment and the presence of
+ // current v8 context is not guaranteed. Avoid calling v8 then.
+ if (m_externallyAllocatedMemory) {
+ ASSERT(v8::Isolate::GetCurrent());
+ v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_externallyAllocatedMemory);
+ }
+}
+
PassRefPtr<SerializedScriptValue> SerializedScriptValue::nullValue()
{
SerializedScriptValueWriter writer;
@@ -82,11 +100,6 @@ void SerializedScriptValue::toWireBytes(Vector<char>& result) const
}
}
-SerializedScriptValue::SerializedScriptValue()
- : m_externallyAllocatedMemory(0)
-{
-}
-
static void acculumateArrayBuffersForAllWorlds(v8::Isolate* isolate, DOMArrayBuffer* object, Vector<v8::Local<v8::ArrayBuffer>, 4>& buffers)
{
if (isMainThread()) {
@@ -104,62 +117,62 @@ static void acculumateArrayBuffersForAllWorlds(v8::Isolate* isolate, DOMArrayBuf
}
}
-PassOwnPtr<SerializedScriptValue::ImageBitmapContentsArray> SerializedScriptValue::createImageBitmaps(v8::Isolate* isolate, TransferableImageBitmap* transferableImageBitmaps, ExceptionState& exceptionState)
+void SerializedScriptValue::transferImageBitmaps(v8::Isolate* isolate, const ImageBitmapArray& imageBitmaps, ExceptionState& exceptionState)
{
- HeapVector<Member<ImageBitmap>, 1> imageBitmaps = transferableImageBitmaps->getArray();
- ASSERT(imageBitmaps.size());
+ if (!imageBitmaps.size())
+ return;
- for (size_t i = 0; i < imageBitmaps.size(); i++) {
+ for (size_t i = 0; i < imageBitmaps.size(); ++i) {
if (imageBitmaps[i]->isNeutered()) {
exceptionState.throwDOMException(DataCloneError, "ImageBitmap at index " + String::number(i) + " is already neutered.");
- return nullptr;
+ return;
}
}
OwnPtr<ImageBitmapContentsArray> contents = adoptPtr(new ImageBitmapContentsArray);
HeapHashSet<Member<ImageBitmap>> visited;
- for (size_t i = 0; i < imageBitmaps.size(); i++) {
- if (visited.contains(imageBitmaps[i].get()))
+ for (size_t i = 0; i < imageBitmaps.size(); ++i) {
+ if (visited.contains(imageBitmaps[i]))
continue;
- visited.add(imageBitmaps[i].get());
+ visited.add(imageBitmaps[i]);
contents->append(imageBitmaps[i]->transfer());
}
- return contents.release();
+ m_imageBitmapContentsArray = contents.release();
}
-PassOwnPtr<SerializedScriptValue::ArrayBufferContentsArray> SerializedScriptValue::createArrayBuffers(v8::Isolate* isolate, TransferableArrayBuffer* transferableArrayBuffers, ExceptionState& exceptionState)
+void SerializedScriptValue::transferArrayBuffers(v8::Isolate* isolate, const ArrayBufferArray& arrayBuffers, ExceptionState& exceptionState)
{
- HeapVector<Member<DOMArrayBufferBase>, 1> arrayBuffers = transferableArrayBuffers->getArray();
- ASSERT(arrayBuffers.size());
+ if (!arrayBuffers.size())
+ return;
- for (size_t i = 0; i < arrayBuffers.size(); i++) {
+ for (size_t i = 0; i < arrayBuffers.size(); ++i) {
if (arrayBuffers[i]->isNeutered()) {
exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at index " + String::number(i) + " is already neutered.");
- return nullptr;
+ return;
}
}
OwnPtr<ArrayBufferContentsArray> contents = adoptPtr(new ArrayBufferContentsArray(arrayBuffers.size()));
HeapHashSet<Member<DOMArrayBufferBase>> visited;
- for (size_t i = 0; i < arrayBuffers.size(); i++) {
- if (visited.contains(arrayBuffers[i].get()))
+ for (size_t i = 0; i < arrayBuffers.size(); ++i) {
+ if (visited.contains(arrayBuffers[i]))
continue;
- visited.add(arrayBuffers[i].get());
+ visited.add(arrayBuffers[i]);
if (arrayBuffers[i]->isShared()) {
bool result = arrayBuffers[i]->shareContentsWith(contents->at(i));
if (!result) {
exceptionState.throwDOMException(DataCloneError, "SharedArrayBuffer at index " + String::number(i) + " could not be transferred.");
- return nullptr;
+ return;
}
} else {
Vector<v8::Local<v8::ArrayBuffer>, 4> bufferHandles;
v8::HandleScope handleScope(isolate);
acculumateArrayBuffersForAllWorlds(isolate, static_cast<DOMArrayBuffer*>(arrayBuffers[i].get()), bufferHandles);
bool isNeuterable = true;
- for (size_t j = 0; j < bufferHandles.size(); j++)
+ for (size_t j = 0; j < bufferHandles.size(); ++j)
isNeuterable &= bufferHandles[j]->IsNeuterable();
DOMArrayBufferBase* toTransfer = arrayBuffers[i];
@@ -168,17 +181,16 @@ PassOwnPtr<SerializedScriptValue::ArrayBufferContentsArray> SerializedScriptValu
bool result = toTransfer->transfer(contents->at(i));
if (!result) {
exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at index " + String::number(i) + " could not be transferred.");
- return nullptr;
+ return;
}
if (isNeuterable)
- for (size_t j = 0; j < bufferHandles.size(); j++)
+ for (size_t j = 0; j < bufferHandles.size(); ++j)
bufferHandles[j]->Neuter();
}
}
-
- return contents.release();
+ m_arrayBufferContentsArray = contents.release();
}
SerializedScriptValue::SerializedScriptValue(const String& wireData)
@@ -197,12 +209,10 @@ v8::Local<v8::Value> SerializedScriptValue::deserialize(v8::Isolate* isolate, Me
return SerializedScriptValueFactory::instance().deserialize(this, isolate, messagePorts, blobInfo);
}
-bool SerializedScriptValue::extractTransferables(v8::Isolate* isolate, v8::Local<v8::Value> value, int argumentIndex, TransferableArray& transferables, ExceptionState& exceptionState)
+bool SerializedScriptValue::extractTransferables(v8::Isolate* isolate, v8::Local<v8::Value> value, int argumentIndex, Transferables& transferables, ExceptionState& exceptionState)
{
- if (isUndefinedOrNull(value)) {
- transferables.resize(0);
+ if (isUndefinedOrNull(value))
return true;
- }
uint32_t length = 0;
if (value->IsArray()) {
@@ -214,52 +224,48 @@ bool SerializedScriptValue::extractTransferables(v8::Isolate* isolate, v8::Local
return false;
}
- v8::Local<v8::Object> transferrables = v8::Local<v8::Object>::Cast(value);
+ v8::Local<v8::Object> transferableArray = v8::Local<v8::Object>::Cast(value);
- // Validate the passed array of transferrables.
+ // Validate the passed array of transferables.
for (unsigned i = 0; i < length; ++i) {
- v8::Local<v8::Value> transferrable;
- if (!transferrables->Get(isolate->GetCurrentContext(), i).ToLocal(&transferrable))
+ v8::Local<v8::Value> transferableObject;
+ if (!transferableArray->Get(isolate->GetCurrentContext(), i).ToLocal(&transferableObject))
return false;
// Validation of non-null objects, per HTML5 spec 10.3.3.
- if (isUndefinedOrNull(transferrable)) {
- exceptionState.throwTypeError("Value at index " + String::number(i) + " is an untransferable " + (transferrable->IsUndefined() ? "'undefined'" : "'null'") + " value.");
+ if (isUndefinedOrNull(transferableObject)) {
+ exceptionState.throwTypeError("Value at index " + String::number(i) + " is an untransferable " + (transferableObject->IsUndefined() ? "'undefined'" : "'null'") + " value.");
return false;
}
// Validation of Objects implementing an interface, per WebIDL spec 4.1.15.
- if (V8MessagePort::hasInstance(transferrable, isolate)) {
- MessagePort* port = V8MessagePort::toImpl(v8::Local<v8::Object>::Cast(transferrable));
- TransferableMessagePort* ports = TransferableMessagePort::ensure(transferables);
+ if (V8MessagePort::hasInstance(transferableObject, isolate)) {
+ MessagePort* port = V8MessagePort::toImpl(v8::Local<v8::Object>::Cast(transferableObject));
// Check for duplicate MessagePorts.
- if (ports->contains(port)) {
+ if (transferables.messagePorts.contains(port)) {
exceptionState.throwDOMException(DataCloneError, "Message port at index " + String::number(i) + " is a duplicate of an earlier port.");
return false;
}
- ports->append(port);
- } else if (V8ArrayBuffer::hasInstance(transferrable, isolate)) {
- DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(transferrable));
- TransferableArrayBuffer* arrayBuffers = TransferableArrayBuffer::ensure(transferables);
- if (arrayBuffers->contains(arrayBuffer)) {
+ transferables.messagePorts.append(port);
+ } else if (V8ArrayBuffer::hasInstance(transferableObject, isolate)) {
+ DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(transferableObject));
+ if (transferables.arrayBuffers.contains(arrayBuffer)) {
exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at index " + String::number(i) + " is a duplicate of an earlier ArrayBuffer.");
return false;
}
- arrayBuffers->append(arrayBuffer);
- } else if (V8SharedArrayBuffer::hasInstance(transferrable, isolate)) {
- DOMSharedArrayBuffer* sharedArrayBuffer = V8SharedArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(transferrable));
- TransferableArrayBuffer* arrayBuffers = TransferableArrayBuffer::ensure(transferables);
- if (arrayBuffers->contains(sharedArrayBuffer)) {
+ transferables.arrayBuffers.append(arrayBuffer);
+ } else if (V8SharedArrayBuffer::hasInstance(transferableObject, isolate)) {
+ DOMSharedArrayBuffer* sharedArrayBuffer = V8SharedArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(transferableObject));
+ if (transferables.arrayBuffers.contains(sharedArrayBuffer)) {
exceptionState.throwDOMException(DataCloneError, "SharedArrayBuffer at index " + String::number(i) + " is a duplicate of an earlier SharedArrayBuffer.");
return false;
}
- arrayBuffers->append(sharedArrayBuffer);
- } else if (V8ImageBitmap::hasInstance(transferrable, isolate)) {
- ImageBitmap* imageBitmap = V8ImageBitmap::toImpl(v8::Local<v8::Object>::Cast(transferrable));
- TransferableImageBitmap* imageBitmaps = TransferableImageBitmap::ensure(transferables);
- if (imageBitmaps->contains(imageBitmap)) {
+ transferables.arrayBuffers.append(sharedArrayBuffer);
+ } else if (V8ImageBitmap::hasInstance(transferableObject, isolate)) {
+ ImageBitmap* imageBitmap = V8ImageBitmap::toImpl(v8::Local<v8::Object>::Cast(transferableObject));
+ if (transferables.imageBitmaps.contains(imageBitmap)) {
exceptionState.throwDOMException(DataCloneError, "ImageBitmap at index " + String::number(i) + " is a duplicate of an earlier ImageBitmap.");
return false;
}
- imageBitmaps->append(imageBitmap);
+ transferables.imageBitmaps.append(imageBitmap);
} else {
exceptionState.throwTypeError("Value at index " + String::number(i) + " does not have a transferable type.");
return false;
@@ -281,25 +287,4 @@ bool SerializedScriptValue::containsTransferableArrayBuffer() const
return m_arrayBufferContentsArray && !m_arrayBufferContentsArray->isEmpty();
}
-SerializedScriptValue::~SerializedScriptValue()
-{
- // If the allocated memory was not registered before, then this class is likely
- // used in a context other then Worker's onmessage environment and the presence of
- // current v8 context is not guaranteed. Avoid calling v8 then.
- if (m_externallyAllocatedMemory) {
- ASSERT(v8::Isolate::GetCurrent());
- v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_externallyAllocatedMemory);
- }
-}
-
-void SerializedScriptValue::transferArrayBuffers(v8::Isolate* isolate, TransferableArrayBuffer* transferableArrayBuffers, ExceptionState& exceptionState)
-{
- m_arrayBufferContentsArray = createArrayBuffers(isolate, transferableArrayBuffers, exceptionState);
-}
-
-void SerializedScriptValue::transferImageBitmaps(v8::Isolate* isolate, TransferableImageBitmap* transferableImageBitmaps, ExceptionState& exceptionState)
-{
- m_imageBitmapContentsArray = createImageBitmaps(isolate, transferableImageBitmaps, exceptionState);
-}
-
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698