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/ScriptValueSerializer.h" | 5 #include "bindings/core/v8/ScriptValueSerializer.h" |
6 | 6 |
7 #include "bindings/core/v8/Transferables.h" | 7 #include "bindings/core/v8/Transferables.h" |
8 #include "bindings/core/v8/V8ArrayBuffer.h" | 8 #include "bindings/core/v8/V8ArrayBuffer.h" |
9 #include "bindings/core/v8/V8ArrayBufferView.h" | 9 #include "bindings/core/v8/V8ArrayBufferView.h" |
10 #include "bindings/core/v8/V8Blob.h" | 10 #include "bindings/core/v8/V8Blob.h" |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 void SerializedScriptValueWriter::writeTransferredImageBitmap(uint32_t index) { | 360 void SerializedScriptValueWriter::writeTransferredImageBitmap(uint32_t index) { |
361 append(ImageBitmapTransferTag); | 361 append(ImageBitmapTransferTag); |
362 doWriteUint32(index); | 362 doWriteUint32(index); |
363 } | 363 } |
364 | 364 |
365 void SerializedScriptValueWriter::writeTransferredOffscreenCanvas( | 365 void SerializedScriptValueWriter::writeTransferredOffscreenCanvas( |
366 uint32_t width, | 366 uint32_t width, |
367 uint32_t height, | 367 uint32_t height, |
368 uint32_t canvasId, | 368 uint32_t canvasId, |
369 uint32_t clientId, | 369 uint32_t clientId, |
370 uint32_t sinkId, | 370 uint32_t sinkId) { |
371 uint32_t localId, | |
372 uint64_t nonceHigh, | |
373 uint64_t nonceLow) { | |
374 append(OffscreenCanvasTransferTag); | 371 append(OffscreenCanvasTransferTag); |
375 doWriteUint32(width); | 372 doWriteUint32(width); |
376 doWriteUint32(height); | 373 doWriteUint32(height); |
377 doWriteUint32(canvasId); | 374 doWriteUint32(canvasId); |
378 doWriteUint32(clientId); | 375 doWriteUint32(clientId); |
379 doWriteUint32(sinkId); | 376 doWriteUint32(sinkId); |
380 doWriteUint32(localId); | |
381 doWriteUint64(nonceHigh); | |
382 doWriteUint64(nonceLow); | |
383 } | 377 } |
384 | 378 |
385 void SerializedScriptValueWriter::writeTransferredSharedArrayBuffer( | 379 void SerializedScriptValueWriter::writeTransferredSharedArrayBuffer( |
386 uint32_t index) { | 380 uint32_t index) { |
387 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); | 381 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); |
388 append(SharedArrayBufferTransferTag); | 382 append(SharedArrayBufferTransferTag); |
389 doWriteUint32(index); | 383 doWriteUint32(index); |
390 } | 384 } |
391 | 385 |
392 void SerializedScriptValueWriter::writeObjectReference(uint32_t reference) { | 386 void SerializedScriptValueWriter::writeObjectReference(uint32_t reference) { |
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 return handleError( | 1289 return handleError( |
1296 Status::DataCloneError, | 1290 Status::DataCloneError, |
1297 "An OffscreenCanvas is detached and could not be cloned.", next); | 1291 "An OffscreenCanvas is detached and could not be cloned.", next); |
1298 if (offscreenCanvas->renderingContext()) | 1292 if (offscreenCanvas->renderingContext()) |
1299 return handleError(Status::DataCloneError, | 1293 return handleError(Status::DataCloneError, |
1300 "An OffscreenCanvas with a context could not be cloned.", | 1294 "An OffscreenCanvas with a context could not be cloned.", |
1301 next); | 1295 next); |
1302 m_writer.writeTransferredOffscreenCanvas( | 1296 m_writer.writeTransferredOffscreenCanvas( |
1303 offscreenCanvas->width(), offscreenCanvas->height(), | 1297 offscreenCanvas->width(), offscreenCanvas->height(), |
1304 offscreenCanvas->placeholderCanvasId(), offscreenCanvas->clientId(), | 1298 offscreenCanvas->placeholderCanvasId(), offscreenCanvas->clientId(), |
1305 offscreenCanvas->sinkId(), offscreenCanvas->localId(), | 1299 offscreenCanvas->sinkId()); |
1306 offscreenCanvas->nonceHigh(), offscreenCanvas->nonceLow()); | |
1307 return nullptr; | 1300 return nullptr; |
1308 } | 1301 } |
1309 | 1302 |
1310 ScriptValueSerializer::StateBase* | 1303 ScriptValueSerializer::StateBase* |
1311 ScriptValueSerializer::writeTransferredSharedArrayBuffer( | 1304 ScriptValueSerializer::writeTransferredSharedArrayBuffer( |
1312 v8::Local<v8::Value> value, | 1305 v8::Local<v8::Value> value, |
1313 uint32_t index, | 1306 uint32_t index, |
1314 StateBase* next) { | 1307 StateBase* next) { |
1315 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); | 1308 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); |
1316 DOMSharedArrayBuffer* sharedArrayBuffer = | 1309 DOMSharedArrayBuffer* sharedArrayBuffer = |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1676 uint32_t index; | 1669 uint32_t index; |
1677 if (!doReadUint32(&index)) | 1670 if (!doReadUint32(&index)) |
1678 return false; | 1671 return false; |
1679 if (!deserializer.tryGetTransferredImageBitmap(index, value)) | 1672 if (!deserializer.tryGetTransferredImageBitmap(index, value)) |
1680 return false; | 1673 return false; |
1681 break; | 1674 break; |
1682 } | 1675 } |
1683 case OffscreenCanvasTransferTag: { | 1676 case OffscreenCanvasTransferTag: { |
1684 if (!m_version) | 1677 if (!m_version) |
1685 return false; | 1678 return false; |
1686 uint32_t width, height, canvasId, clientId, sinkId, localId; | 1679 uint32_t width, height, canvasId, clientId, sinkId; |
1687 uint64_t nonceHigh, nonceLow; | |
1688 if (!doReadUint32(&width)) | 1680 if (!doReadUint32(&width)) |
1689 return false; | 1681 return false; |
1690 if (!doReadUint32(&height)) | 1682 if (!doReadUint32(&height)) |
1691 return false; | 1683 return false; |
1692 if (!doReadUint32(&canvasId)) | 1684 if (!doReadUint32(&canvasId)) |
1693 return false; | 1685 return false; |
1694 if (!doReadUint32(&clientId)) | 1686 if (!doReadUint32(&clientId)) |
1695 return false; | 1687 return false; |
1696 if (!doReadUint32(&sinkId)) | 1688 if (!doReadUint32(&sinkId)) |
1697 return false; | 1689 return false; |
1698 if (!doReadUint32(&localId)) | |
1699 return false; | |
1700 if (!doReadUint64(&nonceHigh) || !doReadUint64(&nonceLow)) | |
1701 return false; | |
1702 if (!deserializer.tryGetTransferredOffscreenCanvas( | 1690 if (!deserializer.tryGetTransferredOffscreenCanvas( |
1703 width, height, canvasId, clientId, sinkId, localId, nonceHigh, | 1691 width, height, canvasId, clientId, sinkId, value)) |
1704 nonceLow, value)) | |
1705 return false; | 1692 return false; |
1706 break; | 1693 break; |
1707 } | 1694 } |
1708 case SharedArrayBufferTransferTag: { | 1695 case SharedArrayBufferTransferTag: { |
1709 if (!m_version) | 1696 if (!m_version) |
1710 return false; | 1697 return false; |
1711 uint32_t index; | 1698 uint32_t index; |
1712 if (!doReadUint32(&index)) | 1699 if (!doReadUint32(&index)) |
1713 return false; | 1700 return false; |
1714 if (!deserializer.tryGetTransferredSharedArrayBuffer(index, value)) | 1701 if (!deserializer.tryGetTransferredSharedArrayBuffer(index, value)) |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2560 *object = result; | 2547 *object = result; |
2561 return true; | 2548 return true; |
2562 } | 2549 } |
2563 | 2550 |
2564 bool ScriptValueDeserializer::tryGetTransferredOffscreenCanvas( | 2551 bool ScriptValueDeserializer::tryGetTransferredOffscreenCanvas( |
2565 uint32_t width, | 2552 uint32_t width, |
2566 uint32_t height, | 2553 uint32_t height, |
2567 uint32_t canvasId, | 2554 uint32_t canvasId, |
2568 uint32_t clientId, | 2555 uint32_t clientId, |
2569 uint32_t sinkId, | 2556 uint32_t sinkId, |
2570 uint32_t localId, | |
2571 uint64_t nonceHigh, | |
2572 uint64_t nonceLow, | |
2573 v8::Local<v8::Value>* object) { | 2557 v8::Local<v8::Value>* object) { |
2574 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); | 2558 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); |
2575 offscreenCanvas->setPlaceholderCanvasId(canvasId); | 2559 offscreenCanvas->setPlaceholderCanvasId(canvasId); |
2576 offscreenCanvas->setSurfaceId(clientId, sinkId, localId, nonceHigh, nonceLow); | 2560 offscreenCanvas->setFrameSinkId(clientId, sinkId); |
2577 *object = toV8(offscreenCanvas, m_reader.getScriptState()); | 2561 *object = toV8(offscreenCanvas, m_reader.getScriptState()); |
2578 if ((*object).IsEmpty()) | 2562 if ((*object).IsEmpty()) |
2579 return false; | 2563 return false; |
2580 return true; | 2564 return true; |
2581 } | 2565 } |
2582 | 2566 |
2583 bool ScriptValueDeserializer::tryGetObjectFromObjectReference( | 2567 bool ScriptValueDeserializer::tryGetObjectFromObjectReference( |
2584 uint32_t reference, | 2568 uint32_t reference, |
2585 v8::Local<v8::Value>* object) { | 2569 v8::Local<v8::Value>* object) { |
2586 if (reference >= m_objectPool.size()) | 2570 if (reference >= m_objectPool.size()) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2652 m_openCompositeReferenceStack[m_openCompositeReferenceStack.size() - 1]; | 2636 m_openCompositeReferenceStack[m_openCompositeReferenceStack.size() - 1]; |
2653 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - | 2637 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - |
2654 1); | 2638 1); |
2655 if (objectReference >= m_objectPool.size()) | 2639 if (objectReference >= m_objectPool.size()) |
2656 return false; | 2640 return false; |
2657 *object = m_objectPool[objectReference]; | 2641 *object = m_objectPool[objectReference]; |
2658 return true; | 2642 return true; |
2659 } | 2643 } |
2660 | 2644 |
2661 } // namespace blink | 2645 } // namespace blink |
OLD | NEW |