| 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/SerializedScriptValueFactory.h" | 5 #include "bindings/core/v8/SerializedScriptValueFactory.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
| 8 #include "bindings/core/v8/ScriptValueSerializer.h" | 8 #include "bindings/core/v8/ScriptValueSerializer.h" |
| 9 #include "bindings/core/v8/Transferables.h" | 9 #include "bindings/core/v8/Transferables.h" |
| 10 #include "bindings/core/v8/V8ArrayBuffer.h" |
| 11 #include "bindings/core/v8/V8ImageBitmap.h" |
| 12 #include "bindings/core/v8/V8MessagePort.h" |
| 13 #include "bindings/core/v8/V8SharedArrayBuffer.h" |
| 10 #include "core/dom/DOMArrayBuffer.h" | 14 #include "core/dom/DOMArrayBuffer.h" |
| 11 #include "core/dom/MessagePort.h" | 15 #include "core/dom/MessagePort.h" |
| 12 #include "core/frame/ImageBitmap.h" | 16 #include "core/frame/ImageBitmap.h" |
| 13 #include "wtf/ByteOrder.h" | 17 #include "wtf/ByteOrder.h" |
| 14 #include "wtf/text/StringBuffer.h" | 18 #include "wtf/text/StringBuffer.h" |
| 15 | 19 |
| 16 namespace blink { | 20 namespace blink { |
| 17 | 21 |
| 18 SerializedScriptValueFactory* SerializedScriptValueFactory::m_instance = 0; | 22 SerializedScriptValueFactory* SerializedScriptValueFactory::m_instance = 0; |
| 19 | 23 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 31 exceptionState.rethrowV8Exception(tryCatch.Exception()); | 35 exceptionState.rethrowV8Exception(tryCatch.Exception()); |
| 32 return serializedValue.release(); | 36 return serializedValue.release(); |
| 33 } | 37 } |
| 34 } | 38 } |
| 35 switch (status) { | 39 switch (status) { |
| 36 case ScriptValueSerializer::InputError: | 40 case ScriptValueSerializer::InputError: |
| 37 case ScriptValueSerializer::DataCloneError: | 41 case ScriptValueSerializer::DataCloneError: |
| 38 exceptionState.throwDOMException(ScriptValueSerializer::DataCloneError,
errorMessage); | 42 exceptionState.throwDOMException(ScriptValueSerializer::DataCloneError,
errorMessage); |
| 39 return serializedValue.release(); | 43 return serializedValue.release(); |
| 40 case ScriptValueSerializer::Success: | 44 case ScriptValueSerializer::Success: |
| 41 transferData(serializedValue.get(), writer, transferables, exceptionStat
e, isolate); | 45 transferData(isolate, transferables, exceptionState, serializedValue.get
(), writer); |
| 42 return serializedValue.release(); | 46 return serializedValue.release(); |
| 43 case ScriptValueSerializer::JSException: | 47 case ScriptValueSerializer::JSException: |
| 44 ASSERT_NOT_REACHED(); | 48 ASSERT_NOT_REACHED(); |
| 45 break; | 49 break; |
| 46 } | 50 } |
| 47 ASSERT_NOT_REACHED(); | 51 ASSERT_NOT_REACHED(); |
| 48 return serializedValue.release(); | 52 return serializedValue.release(); |
| 49 } | 53 } |
| 50 | 54 |
| 51 PassRefPtr<SerializedScriptValue> SerializedScriptValueFactory::create(v8::Isola
te* isolate, v8::Local<v8::Value> value, Transferables* transferables, Exception
State& exceptionState) | 55 PassRefPtr<SerializedScriptValue> SerializedScriptValueFactory::create(v8::Isola
te* isolate, v8::Local<v8::Value> value, Transferables* transferables, Exception
State& exceptionState) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 writer.writeWebCoreString(data); | 100 writer.writeWebCoreString(data); |
| 97 String wireData = writer.takeWireString(); | 101 String wireData = writer.takeWireString(); |
| 98 return createFromWire(wireData); | 102 return createFromWire(wireData); |
| 99 } | 103 } |
| 100 | 104 |
| 101 PassRefPtr<SerializedScriptValue> SerializedScriptValueFactory::create() | 105 PassRefPtr<SerializedScriptValue> SerializedScriptValueFactory::create() |
| 102 { | 106 { |
| 103 return adoptRef(new SerializedScriptValue()); | 107 return adoptRef(new SerializedScriptValue()); |
| 104 } | 108 } |
| 105 | 109 |
| 106 void SerializedScriptValueFactory::transferData(SerializedScriptValue* serialize
dValue, SerializedScriptValueWriter& writer, Transferables* transferables, Excep
tionState& exceptionState, v8::Isolate* isolate) | 110 void SerializedScriptValueFactory::transferData(v8::Isolate* isolate, Transferab
les* transferables, ExceptionState& exceptionState, SerializedScriptValue* seria
lizedValue, SerializedScriptValueWriter& writer) |
| 107 { | 111 { |
| 108 serializedValue->setData(writer.takeWireString()); | 112 serializedValue->setData(writer.takeWireString()); |
| 109 ASSERT(serializedValue->data().impl()->hasOneRef()); | 113 ASSERT(serializedValue->data().impl()->hasOneRef()); |
| 110 if (!transferables) | 114 if (!transferables) |
| 111 return; | 115 return; |
| 112 | 116 |
| 113 serializedValue->transferImageBitmaps(isolate, transferables->imageBitmaps,
exceptionState); | 117 serializedValue->transferImageBitmaps(isolate, transferables->imageBitmaps,
exceptionState); |
| 114 if (exceptionState.hadException()) | 118 if (exceptionState.hadException()) |
| 115 return; | 119 return; |
| 116 serializedValue->transferArrayBuffers(isolate, transferables->arrayBuffers,
exceptionState); | 120 serializedValue->transferArrayBuffers(isolate, transferables->arrayBuffers,
exceptionState); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 // information stored in m_data isn't even encoded in UTF-16. Instead, | 152 // information stored in m_data isn't even encoded in UTF-16. Instead, |
| 149 // unicode characters are encoded as UTF-8 with two code units per UChar. | 153 // unicode characters are encoded as UTF-8 with two code units per UChar. |
| 150 SerializedScriptValueReader reader(reinterpret_cast<const uint8_t*>(data.imp
l()->characters16()), 2 * data.length(), blobInfo, blobDataHandles, ScriptState:
:current(isolate)); | 154 SerializedScriptValueReader reader(reinterpret_cast<const uint8_t*>(data.imp
l()->characters16()), 2 * data.length(), blobInfo, blobDataHandles, ScriptState:
:current(isolate)); |
| 151 ScriptValueDeserializer deserializer(reader, messagePorts, arrayBufferConten
tsArray, imageBitmapContentsArray); | 155 ScriptValueDeserializer deserializer(reader, messagePorts, arrayBufferConten
tsArray, imageBitmapContentsArray); |
| 152 | 156 |
| 153 // deserialize() can run arbitrary script (e.g., setters), which could resul
t in |this| being destroyed. | 157 // deserialize() can run arbitrary script (e.g., setters), which could resul
t in |this| being destroyed. |
| 154 // Holding a RefPtr ensures we are alive (along with our internal data) thro
ughout the operation. | 158 // Holding a RefPtr ensures we are alive (along with our internal data) thro
ughout the operation. |
| 155 return deserializer.deserialize(); | 159 return deserializer.deserialize(); |
| 156 } | 160 } |
| 157 | 161 |
| 162 bool SerializedScriptValueFactory::extractTransferables(v8::Isolate* isolate, Tr
ansferables& transferables, ExceptionState& exceptionState, v8::Local<v8::Value>
& transferableObject, unsigned index) |
| 163 { |
| 164 // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. |
| 165 if (V8MessagePort::hasInstance(transferableObject, isolate)) { |
| 166 MessagePort* port = V8MessagePort::toImpl(v8::Local<v8::Object>::Cast(tr
ansferableObject)); |
| 167 // Check for duplicate MessagePorts. |
| 168 if (transferables.messagePorts.contains(port)) { |
| 169 exceptionState.throwDOMException(DataCloneError, "Message port at in
dex " + String::number(index) + " is a duplicate of an earlier port."); |
| 170 return false; |
| 171 } |
| 172 transferables.messagePorts.append(port); |
| 173 return true; |
| 174 } |
| 175 if (V8ArrayBuffer::hasInstance(transferableObject, isolate)) { |
| 176 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(v8::Local<v8::Object
>::Cast(transferableObject)); |
| 177 if (transferables.arrayBuffers.contains(arrayBuffer)) { |
| 178 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at ind
ex " + String::number(index) + " is a duplicate of an earlier ArrayBuffer."); |
| 179 return false; |
| 180 } |
| 181 transferables.arrayBuffers.append(arrayBuffer); |
| 182 return true; |
| 183 } |
| 184 if (V8SharedArrayBuffer::hasInstance(transferableObject, isolate)) { |
| 185 DOMSharedArrayBuffer* sharedArrayBuffer = V8SharedArrayBuffer::toImpl(v8
::Local<v8::Object>::Cast(transferableObject)); |
| 186 if (transferables.arrayBuffers.contains(sharedArrayBuffer)) { |
| 187 exceptionState.throwDOMException(DataCloneError, "SharedArrayBuffer
at index " + String::number(index) + " is a duplicate of an earlier SharedArrayB
uffer."); |
| 188 return false; |
| 189 } |
| 190 transferables.arrayBuffers.append(sharedArrayBuffer); |
| 191 return true; |
| 192 } |
| 193 if (V8ImageBitmap::hasInstance(transferableObject, isolate)) { |
| 194 ImageBitmap* imageBitmap = V8ImageBitmap::toImpl(v8::Local<v8::Object>::
Cast(transferableObject)); |
| 195 if (transferables.imageBitmaps.contains(imageBitmap)) { |
| 196 exceptionState.throwDOMException(DataCloneError, "ImageBitmap at ind
ex " + String::number(index) + " is a duplicate of an earlier ImageBitmap."); |
| 197 return false; |
| 198 } |
| 199 transferables.imageBitmaps.append(imageBitmap); |
| 200 return true; |
| 201 } |
| 202 return false; |
| 203 } |
| 158 | 204 |
| 159 } // namespace blink | 205 } // namespace blink |
| OLD | NEW |