| 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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 std::unique_ptr<SerializedScriptValue::ImageBitmapContentsArray> | 207 std::unique_ptr<SerializedScriptValue::ImageBitmapContentsArray> |
| 208 SerializedScriptValue::transferImageBitmapContents( | 208 SerializedScriptValue::transferImageBitmapContents( |
| 209 v8::Isolate* isolate, | 209 v8::Isolate* isolate, |
| 210 const ImageBitmapArray& imageBitmaps, | 210 const ImageBitmapArray& imageBitmaps, |
| 211 ExceptionState& exceptionState) { | 211 ExceptionState& exceptionState) { |
| 212 if (!imageBitmaps.size()) | 212 if (!imageBitmaps.size()) |
| 213 return nullptr; | 213 return nullptr; |
| 214 | 214 |
| 215 for (size_t i = 0; i < imageBitmaps.size(); ++i) { | 215 for (size_t i = 0; i < imageBitmaps.size(); ++i) { |
| 216 if (imageBitmaps[i]->isNeutered()) { | 216 if (imageBitmaps[i]->isNeutered()) { |
| 217 exceptionState.throwDOMException( | 217 exceptionState.throwDOMException(DataCloneError, |
| 218 DataCloneError, "ImageBitmap at index " + String::number(i) + | 218 "ImageBitmap at index " + |
| 219 " is already detached."); | 219 String::number(i) + |
| 220 " is already detached."); |
| 220 return nullptr; | 221 return nullptr; |
| 221 } | 222 } |
| 222 } | 223 } |
| 223 | 224 |
| 224 std::unique_ptr<ImageBitmapContentsArray> contents = | 225 std::unique_ptr<ImageBitmapContentsArray> contents = |
| 225 WTF::wrapUnique(new ImageBitmapContentsArray); | 226 WTF::wrapUnique(new ImageBitmapContentsArray); |
| 226 HeapHashSet<Member<ImageBitmap>> visited; | 227 HeapHashSet<Member<ImageBitmap>> visited; |
| 227 for (size_t i = 0; i < imageBitmaps.size(); ++i) { | 228 for (size_t i = 0; i < imageBitmaps.size(); ++i) { |
| 228 if (visited.contains(imageBitmaps[i])) | 229 if (visited.contains(imageBitmaps[i])) |
| 229 continue; | 230 continue; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 247 const OffscreenCanvasArray& offscreenCanvases, | 248 const OffscreenCanvasArray& offscreenCanvases, |
| 248 ExceptionState& exceptionState) { | 249 ExceptionState& exceptionState) { |
| 249 if (!offscreenCanvases.size()) | 250 if (!offscreenCanvases.size()) |
| 250 return; | 251 return; |
| 251 | 252 |
| 252 HeapHashSet<Member<OffscreenCanvas>> visited; | 253 HeapHashSet<Member<OffscreenCanvas>> visited; |
| 253 for (size_t i = 0; i < offscreenCanvases.size(); i++) { | 254 for (size_t i = 0; i < offscreenCanvases.size(); i++) { |
| 254 if (visited.contains(offscreenCanvases[i].get())) | 255 if (visited.contains(offscreenCanvases[i].get())) |
| 255 continue; | 256 continue; |
| 256 if (offscreenCanvases[i]->isNeutered()) { | 257 if (offscreenCanvases[i]->isNeutered()) { |
| 257 exceptionState.throwDOMException( | 258 exceptionState.throwDOMException(DataCloneError, |
| 258 DataCloneError, "OffscreenCanvas at index " + String::number(i) + | 259 "OffscreenCanvas at index " + |
| 259 " is already detached."); | 260 String::number(i) + |
| 261 " is already detached."); |
| 260 return; | 262 return; |
| 261 } | 263 } |
| 262 if (offscreenCanvases[i]->renderingContext()) { | 264 if (offscreenCanvases[i]->renderingContext()) { |
| 263 exceptionState.throwDOMException( | 265 exceptionState.throwDOMException(DataCloneError, |
| 264 DataCloneError, "OffscreenCanvas at index " + String::number(i) + | 266 "OffscreenCanvas at index " + |
| 265 " has an associated context."); | 267 String::number(i) + |
| 268 " has an associated context."); |
| 266 return; | 269 return; |
| 267 } | 270 } |
| 268 visited.insert(offscreenCanvases[i].get()); | 271 visited.insert(offscreenCanvases[i].get()); |
| 269 offscreenCanvases[i].get()->setNeutered(); | 272 offscreenCanvases[i].get()->setNeutered(); |
| 270 } | 273 } |
| 271 } | 274 } |
| 272 | 275 |
| 273 void SerializedScriptValue::transferArrayBuffers( | 276 void SerializedScriptValue::transferArrayBuffers( |
| 274 v8::Isolate* isolate, | 277 v8::Isolate* isolate, |
| 275 const ArrayBufferArray& arrayBuffers, | 278 const ArrayBufferArray& arrayBuffers, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 " value."); | 330 " value."); |
| 328 return false; | 331 return false; |
| 329 } | 332 } |
| 330 // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. | 333 // Validation of Objects implementing an interface, per WebIDL spec 4.1.15. |
| 331 if (V8MessagePort::hasInstance(transferableObject, isolate)) { | 334 if (V8MessagePort::hasInstance(transferableObject, isolate)) { |
| 332 MessagePort* port = V8MessagePort::toImpl( | 335 MessagePort* port = V8MessagePort::toImpl( |
| 333 v8::Local<v8::Object>::Cast(transferableObject)); | 336 v8::Local<v8::Object>::Cast(transferableObject)); |
| 334 // Check for duplicate MessagePorts. | 337 // Check for duplicate MessagePorts. |
| 335 if (transferables.messagePorts.contains(port)) { | 338 if (transferables.messagePorts.contains(port)) { |
| 336 exceptionState.throwDOMException( | 339 exceptionState.throwDOMException( |
| 337 DataCloneError, "Message port at index " + String::number(i) + | 340 DataCloneError, |
| 338 " is a duplicate of an earlier port."); | 341 "Message port at index " + String::number(i) + |
| 342 " is a duplicate of an earlier port."); |
| 339 return false; | 343 return false; |
| 340 } | 344 } |
| 341 transferables.messagePorts.push_back(port); | 345 transferables.messagePorts.push_back(port); |
| 342 } else if (transferableObject->IsArrayBuffer()) { | 346 } else if (transferableObject->IsArrayBuffer()) { |
| 343 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl( | 347 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl( |
| 344 v8::Local<v8::Object>::Cast(transferableObject)); | 348 v8::Local<v8::Object>::Cast(transferableObject)); |
| 345 if (transferables.arrayBuffers.contains(arrayBuffer)) { | 349 if (transferables.arrayBuffers.contains(arrayBuffer)) { |
| 346 exceptionState.throwDOMException( | 350 exceptionState.throwDOMException( |
| 347 DataCloneError, "ArrayBuffer at index " + String::number(i) + | 351 DataCloneError, |
| 348 " is a duplicate of an earlier ArrayBuffer."); | 352 "ArrayBuffer at index " + String::number(i) + |
| 353 " is a duplicate of an earlier ArrayBuffer."); |
| 349 return false; | 354 return false; |
| 350 } | 355 } |
| 351 transferables.arrayBuffers.push_back(arrayBuffer); | 356 transferables.arrayBuffers.push_back(arrayBuffer); |
| 352 } else if (transferableObject->IsSharedArrayBuffer()) { | 357 } else if (transferableObject->IsSharedArrayBuffer()) { |
| 353 DOMSharedArrayBuffer* sharedArrayBuffer = V8SharedArrayBuffer::toImpl( | 358 DOMSharedArrayBuffer* sharedArrayBuffer = V8SharedArrayBuffer::toImpl( |
| 354 v8::Local<v8::Object>::Cast(transferableObject)); | 359 v8::Local<v8::Object>::Cast(transferableObject)); |
| 355 if (transferables.arrayBuffers.contains(sharedArrayBuffer)) { | 360 if (transferables.arrayBuffers.contains(sharedArrayBuffer)) { |
| 356 exceptionState.throwDOMException( | 361 exceptionState.throwDOMException( |
| 357 DataCloneError, | 362 DataCloneError, |
| 358 "SharedArrayBuffer at index " + String::number(i) + | 363 "SharedArrayBuffer at index " + String::number(i) + |
| 359 " is a duplicate of an earlier SharedArrayBuffer."); | 364 " is a duplicate of an earlier SharedArrayBuffer."); |
| 360 return false; | 365 return false; |
| 361 } | 366 } |
| 362 transferables.arrayBuffers.push_back(sharedArrayBuffer); | 367 transferables.arrayBuffers.push_back(sharedArrayBuffer); |
| 363 } else if (V8ImageBitmap::hasInstance(transferableObject, isolate)) { | 368 } else if (V8ImageBitmap::hasInstance(transferableObject, isolate)) { |
| 364 ImageBitmap* imageBitmap = V8ImageBitmap::toImpl( | 369 ImageBitmap* imageBitmap = V8ImageBitmap::toImpl( |
| 365 v8::Local<v8::Object>::Cast(transferableObject)); | 370 v8::Local<v8::Object>::Cast(transferableObject)); |
| 366 if (transferables.imageBitmaps.contains(imageBitmap)) { | 371 if (transferables.imageBitmaps.contains(imageBitmap)) { |
| 367 exceptionState.throwDOMException( | 372 exceptionState.throwDOMException( |
| 368 DataCloneError, "ImageBitmap at index " + String::number(i) + | 373 DataCloneError, |
| 369 " is a duplicate of an earlier ImageBitmap."); | 374 "ImageBitmap at index " + String::number(i) + |
| 375 " is a duplicate of an earlier ImageBitmap."); |
| 370 return false; | 376 return false; |
| 371 } | 377 } |
| 372 transferables.imageBitmaps.push_back(imageBitmap); | 378 transferables.imageBitmaps.push_back(imageBitmap); |
| 373 } else if (V8OffscreenCanvas::hasInstance(transferableObject, isolate)) { | 379 } else if (V8OffscreenCanvas::hasInstance(transferableObject, isolate)) { |
| 374 OffscreenCanvas* offscreenCanvas = V8OffscreenCanvas::toImpl( | 380 OffscreenCanvas* offscreenCanvas = V8OffscreenCanvas::toImpl( |
| 375 v8::Local<v8::Object>::Cast(transferableObject)); | 381 v8::Local<v8::Object>::Cast(transferableObject)); |
| 376 if (transferables.offscreenCanvases.contains(offscreenCanvas)) { | 382 if (transferables.offscreenCanvases.contains(offscreenCanvas)) { |
| 377 exceptionState.throwDOMException( | 383 exceptionState.throwDOMException( |
| 378 DataCloneError, | 384 DataCloneError, |
| 379 "OffscreenCanvas at index " + String::number(i) + | 385 "OffscreenCanvas at index " + String::number(i) + |
| (...skipping 15 matching lines...) Expand all Loading... |
| 395 v8::Isolate* isolate, | 401 v8::Isolate* isolate, |
| 396 const ArrayBufferArray& arrayBuffers, | 402 const ArrayBufferArray& arrayBuffers, |
| 397 ExceptionState& exceptionState) { | 403 ExceptionState& exceptionState) { |
| 398 if (!arrayBuffers.size()) | 404 if (!arrayBuffers.size()) |
| 399 return nullptr; | 405 return nullptr; |
| 400 | 406 |
| 401 for (auto it = arrayBuffers.begin(); it != arrayBuffers.end(); ++it) { | 407 for (auto it = arrayBuffers.begin(); it != arrayBuffers.end(); ++it) { |
| 402 DOMArrayBufferBase* arrayBuffer = *it; | 408 DOMArrayBufferBase* arrayBuffer = *it; |
| 403 if (arrayBuffer->isNeutered()) { | 409 if (arrayBuffer->isNeutered()) { |
| 404 size_t index = std::distance(arrayBuffers.begin(), it); | 410 size_t index = std::distance(arrayBuffers.begin(), it); |
| 405 exceptionState.throwDOMException( | 411 exceptionState.throwDOMException(DataCloneError, |
| 406 DataCloneError, "ArrayBuffer at index " + String::number(index) + | 412 "ArrayBuffer at index " + |
| 407 " is already neutered."); | 413 String::number(index) + |
| 414 " is already neutered."); |
| 408 return nullptr; | 415 return nullptr; |
| 409 } | 416 } |
| 410 } | 417 } |
| 411 | 418 |
| 412 std::unique_ptr<ArrayBufferContentsArray> contents = | 419 std::unique_ptr<ArrayBufferContentsArray> contents = |
| 413 WTF::wrapUnique(new ArrayBufferContentsArray(arrayBuffers.size())); | 420 WTF::wrapUnique(new ArrayBufferContentsArray(arrayBuffers.size())); |
| 414 | 421 |
| 415 HeapHashSet<Member<DOMArrayBufferBase>> visited; | 422 HeapHashSet<Member<DOMArrayBufferBase>> visited; |
| 416 for (auto it = arrayBuffers.begin(); it != arrayBuffers.end(); ++it) { | 423 for (auto it = arrayBuffers.begin(); it != arrayBuffers.end(); ++it) { |
| 417 DOMArrayBufferBase* arrayBuffer = *it; | 424 DOMArrayBufferBase* arrayBuffer = *it; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 436 bool isNeuterable = true; | 443 bool isNeuterable = true; |
| 437 for (const auto& bufferHandle : bufferHandles) | 444 for (const auto& bufferHandle : bufferHandles) |
| 438 isNeuterable &= bufferHandle->IsNeuterable(); | 445 isNeuterable &= bufferHandle->IsNeuterable(); |
| 439 | 446 |
| 440 DOMArrayBufferBase* toTransfer = arrayBuffer; | 447 DOMArrayBufferBase* toTransfer = arrayBuffer; |
| 441 if (!isNeuterable) { | 448 if (!isNeuterable) { |
| 442 toTransfer = DOMArrayBuffer::create( | 449 toTransfer = DOMArrayBuffer::create( |
| 443 arrayBuffer->buffer()->data(), arrayBuffer->buffer()->byteLength()); | 450 arrayBuffer->buffer()->data(), arrayBuffer->buffer()->byteLength()); |
| 444 } | 451 } |
| 445 if (!toTransfer->transfer(contents->at(index))) { | 452 if (!toTransfer->transfer(contents->at(index))) { |
| 446 exceptionState.throwDOMException( | 453 exceptionState.throwDOMException(DataCloneError, |
| 447 DataCloneError, "ArrayBuffer at index " + String::number(index) + | 454 "ArrayBuffer at index " + |
| 448 " could not be transferred."); | 455 String::number(index) + |
| 456 " could not be transferred."); |
| 449 return nullptr; | 457 return nullptr; |
| 450 } | 458 } |
| 451 | 459 |
| 452 if (isNeuterable) { | 460 if (isNeuterable) { |
| 453 for (const auto& bufferHandle : bufferHandles) | 461 for (const auto& bufferHandle : bufferHandles) |
| 454 bufferHandle->Neuter(); | 462 bufferHandle->Neuter(); |
| 455 } | 463 } |
| 456 } | 464 } |
| 457 } | 465 } |
| 458 return contents; | 466 return contents; |
| 459 } | 467 } |
| 460 | 468 |
| 461 void SerializedScriptValue::registerMemoryAllocatedWithCurrentScriptContext() { | 469 void SerializedScriptValue::registerMemoryAllocatedWithCurrentScriptContext() { |
| 462 if (m_externallyAllocatedMemory) | 470 if (m_externallyAllocatedMemory) |
| 463 return; | 471 return; |
| 464 | 472 |
| 465 m_externallyAllocatedMemory = static_cast<intptr_t>(dataLengthInBytes()); | 473 m_externallyAllocatedMemory = static_cast<intptr_t>(dataLengthInBytes()); |
| 466 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( | 474 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory( |
| 467 m_externallyAllocatedMemory); | 475 m_externallyAllocatedMemory); |
| 468 } | 476 } |
| 469 | 477 |
| 470 } // namespace blink | 478 } // namespace blink |
| OLD | NEW |