| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "bindings/core/v8/SerializedScriptValue.h" | 31 #include "bindings/core/v8/SerializedScriptValue.h" |
| 32 | 32 |
| 33 #include <memory> | 33 #include <memory> |
| 34 #include "bindings/core/v8/DOMDataStore.h" | 34 #include "bindings/core/v8/DOMDataStore.h" |
| 35 #include "bindings/core/v8/DOMWrapperWorld.h" | 35 #include "bindings/core/v8/DOMWrapperWorld.h" |
| 36 #include "bindings/core/v8/ExceptionState.h" | 36 #include "bindings/core/v8/ExceptionState.h" |
| 37 #include "bindings/core/v8/IDLTypes.h" |
| 38 #include "bindings/core/v8/NativeValueTraitsImpl.h" |
| 37 #include "bindings/core/v8/ScriptState.h" | 39 #include "bindings/core/v8/ScriptState.h" |
| 38 #include "bindings/core/v8/SerializedScriptValueFactory.h" | 40 #include "bindings/core/v8/SerializedScriptValueFactory.h" |
| 39 #include "bindings/core/v8/Transferables.h" | 41 #include "bindings/core/v8/Transferables.h" |
| 40 #include "bindings/core/v8/V8ArrayBuffer.h" | 42 #include "bindings/core/v8/V8ArrayBuffer.h" |
| 41 #include "bindings/core/v8/V8ImageBitmap.h" | 43 #include "bindings/core/v8/V8ImageBitmap.h" |
| 42 #include "bindings/core/v8/V8MessagePort.h" | 44 #include "bindings/core/v8/V8MessagePort.h" |
| 43 #include "bindings/core/v8/V8OffscreenCanvas.h" | 45 #include "bindings/core/v8/V8OffscreenCanvas.h" |
| 44 #include "bindings/core/v8/V8SharedArrayBuffer.h" | 46 #include "bindings/core/v8/V8SharedArrayBuffer.h" |
| 45 #include "core/dom/DOMArrayBuffer.h" | 47 #include "core/dom/DOMArrayBuffer.h" |
| 46 #include "core/dom/DOMSharedArrayBuffer.h" | 48 #include "core/dom/DOMSharedArrayBuffer.h" |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 | 268 |
| 267 bool SerializedScriptValue::ExtractTransferables( | 269 bool SerializedScriptValue::ExtractTransferables( |
| 268 v8::Isolate* isolate, | 270 v8::Isolate* isolate, |
| 269 v8::Local<v8::Value> value, | 271 v8::Local<v8::Value> value, |
| 270 int argument_index, | 272 int argument_index, |
| 271 Transferables& transferables, | 273 Transferables& transferables, |
| 272 ExceptionState& exception_state) { | 274 ExceptionState& exception_state) { |
| 273 if (value.IsEmpty() || value->IsUndefined()) | 275 if (value.IsEmpty() || value->IsUndefined()) |
| 274 return true; | 276 return true; |
| 275 | 277 |
| 276 uint32_t length = 0; | 278 Vector<v8::Local<v8::Value>> transferable_array = |
| 277 if (value->IsArray()) { | 279 NativeValueTraits<IDLSequence<v8::Local<v8::Value>>>::NativeValue( |
| 278 v8::Local<v8::Array> array = v8::Local<v8::Array>::Cast(value); | 280 isolate, value, exception_state); |
| 279 length = array->Length(); | |
| 280 } else if (!ToV8Sequence(value, length, isolate, exception_state)) { | |
| 281 if (!exception_state.HadException()) | |
| 282 exception_state.ThrowTypeError( | |
| 283 ExceptionMessages::NotAnArrayTypeArgumentOrValue(argument_index + 1)); | |
| 284 return false; | |
| 285 } | |
| 286 | |
| 287 v8::Local<v8::Object> transferable_array = v8::Local<v8::Object>::Cast(value); | |
| 288 | 281 |
| 289 // Validate the passed array of transferables. | 282 // Validate the passed array of transferables. |
| 290 for (unsigned i = 0; i < length; ++i) { | 283 uint32_t i = 0; |
| 291 v8::Local<v8::Value> transferable_object; | 284 for (const auto& transferable_object : transferable_array) { |
| 292 if (!transferable_array->Get(isolate->GetCurrentContext(), i) | |
| 293 .ToLocal(&transferable_object)) | |
| 294 return false; | |
| 295 // Validation of non-null objects, per HTML5 spec 10.3.3. | 285 // Validation of non-null objects, per HTML5 spec 10.3.3. |
| 296 if (IsUndefinedOrNull(transferable_object)) { | 286 if (IsUndefinedOrNull(transferable_object)) { |
| 297 exception_state.ThrowTypeError( | 287 exception_state.ThrowTypeError( |
| 298 "Value at index " + String::Number(i) + " is an untransferable " + | 288 "Value at index " + String::Number(i) + " is an untransferable " + |
| 299 (transferable_object->IsUndefined() ? "'undefined'" : "'null'") + | 289 (transferable_object->IsUndefined() ? "'undefined'" : "'null'") + |
| 300 " value."); | 290 " value."); |
| 301 return false; | 291 return false; |
| 302 } | 292 } |
| 303 // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. | 293 // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. |
| 304 if (V8MessagePort::hasInstance(transferable_object, isolate)) { | 294 if (V8MessagePort::hasInstance(transferable_object, isolate)) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 "OffscreenCanvas at index " + String::Number(i) + | 342 "OffscreenCanvas at index " + String::Number(i) + |
| 353 " is a duplicate of an earlier OffscreenCanvas."); | 343 " is a duplicate of an earlier OffscreenCanvas."); |
| 354 return false; | 344 return false; |
| 355 } | 345 } |
| 356 transferables.offscreen_canvases.push_back(offscreen_canvas); | 346 transferables.offscreen_canvases.push_back(offscreen_canvas); |
| 357 } else { | 347 } else { |
| 358 exception_state.ThrowTypeError("Value at index " + String::Number(i) + | 348 exception_state.ThrowTypeError("Value at index " + String::Number(i) + |
| 359 " does not have a transferable type."); | 349 " does not have a transferable type."); |
| 360 return false; | 350 return false; |
| 361 } | 351 } |
| 352 i++; |
| 362 } | 353 } |
| 363 return true; | 354 return true; |
| 364 } | 355 } |
| 365 | 356 |
| 366 std::unique_ptr<SerializedScriptValue::ArrayBufferContentsArray> | 357 std::unique_ptr<SerializedScriptValue::ArrayBufferContentsArray> |
| 367 SerializedScriptValue::TransferArrayBufferContents( | 358 SerializedScriptValue::TransferArrayBufferContents( |
| 368 v8::Isolate* isolate, | 359 v8::Isolate* isolate, |
| 369 const ArrayBufferArray& array_buffers, | 360 const ArrayBufferArray& array_buffers, |
| 370 ExceptionState& exception_state) { | 361 ExceptionState& exception_state) { |
| 371 if (!array_buffers.size()) | 362 if (!array_buffers.size()) |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 // Only (re)register allocation cost for transferables if this | 453 // Only (re)register allocation cost for transferables if this |
| 463 // SerializedScriptValue has explicitly unregistered them before. | 454 // SerializedScriptValue has explicitly unregistered them before. |
| 464 if (array_buffer_contents_array_ && | 455 if (array_buffer_contents_array_ && |
| 465 transferables_need_external_allocation_registration_) { | 456 transferables_need_external_allocation_registration_) { |
| 466 for (auto& buffer : *array_buffer_contents_array_) | 457 for (auto& buffer : *array_buffer_contents_array_) |
| 467 buffer.RegisterExternalAllocationWithCurrentContext(); | 458 buffer.RegisterExternalAllocationWithCurrentContext(); |
| 468 } | 459 } |
| 469 } | 460 } |
| 470 | 461 |
| 471 } // namespace blink | 462 } // namespace blink |
| OLD | NEW |