Changeset 230348 in webkit
- Timestamp:
- Apr 6, 2018 12:20:35 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r230330 r230348 1 2018-04-06 Ms2ger <Ms2ger@igalia.com> 2 3 Support transferring ImageBitmap objects 4 https://bugs.webkit.org/show_bug.cgi?id=183131 5 6 Reviewed by Dean Jackson. 7 8 * web-platform-tests/2dcontext/imagebitmap/createImageBitmap-transfer-expected.txt: Added. 9 * web-platform-tests/2dcontext/imagebitmap/createImageBitmap-transfer.html: Added. 10 * web-platform-tests/2dcontext/imagebitmap/transfer-worker.js: Added. 11 1 12 2018-04-06 Brendan McLoughlin <brendan@bocoup.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r230347 r230348 1 2018-04-06 Ms2ger <Ms2ger@igalia.com> 2 3 Support transferring ImageBitmap objects 4 https://bugs.webkit.org/show_bug.cgi?id=183131 5 6 Reviewed by Dean Jackson. 7 8 Test: imported/w3c/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-transfer.html 9 10 * bindings/js/SerializedScriptValue.cpp: 11 (WebCore::CloneSerializer::serialize): thread through ImageBitmaps. 12 (WebCore::CloneSerializer::CloneSerializer): thread through ImageBitmaps. 13 (WebCore::CloneSerializer::fillTransferMap): don't require a mutable reference. 14 (WebCore::CloneSerializer::dumpImageBitmap): add. 15 (WebCore::CloneSerializer::dumpIfTerminal): check for ImageBitmap. 16 (WebCore::CloneDeserializer::deserialize): thread through ImageBitmaps. 17 (WebCore::CloneDeserializer::CloneDeserializer): thread through ImageBitmaps. 18 (WebCore::CloneDeserializer::readImageBitmap): add. 19 (WebCore::CloneDeserializer::readTerminal): check for ImageBitmap. 20 (WebCore::SerializedScriptValue::SerializedScriptValue): thread through ImageBitmaps. 21 (WebCore::SerializedScriptValue::create): thread through ImageBitmaps. 22 (WebCore::containsDuplicates): add. 23 (WebCore::SerializedScriptValue::deserialize): handle ImageBitmap arguments. 24 * bindings/js/SerializedScriptValue.h: update signatures, add member. 25 * html/ImageBitmap.cpp: 26 (WebCore::ImageBitmap::create): add. 27 (WebCore::ImageBitmap::detachBitmaps): add. 28 * html/ImageBitmap.h: add signatures. 29 1 30 2018-04-06 Said Abou-Hallawa <sabouhallawa@apple.com> 2 31 -
trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp
r229416 r230348 47 47 #include "JSFile.h" 48 48 #include "JSFileList.h" 49 #include "JSImageBitmap.h" 49 50 #include "JSImageData.h" 50 51 #include "JSMessagePort.h" … … 161 162 DOMMatrixTag = 41, 162 163 DOMQuadTag = 42, 164 ImageBitmapTransferTag = 43, 163 165 ErrorTag = 255 164 166 }; … … 340 342 * | DOMMatrix 341 343 * | DOMQuad 344 * | ImageBitmapTransferTag <value:uint32_t> 342 345 * 343 346 * Inside wrapped crypto key, data is serialized in this format: … … 531 534 class CloneSerializer : CloneBase { 532 535 public: 533 static SerializationReturnCode serialize(ExecState* exec, JSValue value, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, 536 static SerializationReturnCode serialize(ExecState* exec, JSValue value, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, const Vector<RefPtr<ImageBitmap>>& imageBitmaps, 534 537 #if ENABLE(WEBASSEMBLY) 535 538 WasmModuleArray& wasmModules, … … 537 540 Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers) 538 541 { 539 CloneSerializer serializer(exec, messagePorts, arrayBuffers, 542 CloneSerializer serializer(exec, messagePorts, arrayBuffers, imageBitmaps, 540 543 #if ENABLE(WEBASSEMBLY) 541 544 wasmModules, … … 564 567 typedef HashMap<JSObject*, uint32_t> ObjectPool; 565 568 566 CloneSerializer(ExecState* exec, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, 569 CloneSerializer(ExecState* exec, Vector<RefPtr<MessagePort>>& messagePorts, Vector<RefPtr<JSC::ArrayBuffer>>& arrayBuffers, const Vector<RefPtr<ImageBitmap>>& imageBitmaps, 567 570 #if ENABLE(WEBASSEMBLY) 568 571 WasmModuleArray& wasmModules, … … 582 585 fillTransferMap(messagePorts, m_transferredMessagePorts); 583 586 fillTransferMap(arrayBuffers, m_transferredArrayBuffers); 587 fillTransferMap(imageBitmaps, m_transferredImageBitmaps); 584 588 } 585 589 586 590 template <class T> 587 void fillTransferMap( Vector<RefPtr<T>>& input, ObjectPool& result)591 void fillTransferMap(const Vector<RefPtr<T>>& input, ObjectPool& result) 588 592 { 589 593 if (input.isEmpty()) … … 871 875 dumpDOMPoint(quad.p3()); 872 876 dumpDOMPoint(quad.p4()); 877 } 878 879 void dumpImageBitmap(JSObject* obj, SerializationReturnCode& code) 880 { 881 auto index = m_transferredImageBitmaps.find(obj); 882 if (index != m_transferredImageBitmaps.end()) { 883 write(ImageBitmapTransferTag); 884 write(index->value); 885 return; 886 } 887 888 // Copying ImageBitmaps is not yet supported. 889 code = SerializationReturnCode::ValidationError; 873 890 } 874 891 … … 1023 1040 #endif 1024 1041 ArrayBufferContentsArray dummySharedBuffers; 1025 CloneSerializer rawKeySerializer(m_exec, dummyMessagePorts, dummyArrayBuffers, 1042 CloneSerializer rawKeySerializer(m_exec, dummyMessagePorts, dummyArrayBuffers, { }, 1026 1043 #if ENABLE(WEBASSEMBLY) 1027 1044 dummyModules, … … 1063 1080 if (obj->inherits<JSDOMQuad>(vm)) { 1064 1081 dumpDOMQuad(obj); 1082 return true; 1083 } 1084 if (obj->inherits(vm, JSImageBitmap::info())) { 1085 dumpImageBitmap(obj, code); 1065 1086 return true; 1066 1087 } … … 1410 1431 ObjectPool m_transferredMessagePorts; 1411 1432 ObjectPool m_transferredArrayBuffers; 1433 ObjectPool m_transferredImageBitmaps; 1412 1434 typedef HashMap<RefPtr<UniquedStringImpl>, uint32_t, IdentifierRepHash> StringConstantPool; 1413 1435 StringConstantPool m_constantPool; … … 1689 1711 } 1690 1712 1691 static DeserializationResult deserialize(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContentsArray, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers1713 static DeserializationResult deserialize(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers, ArrayBufferContentsArray* arrayBufferContentsArray, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers 1692 1714 #if ENABLE(WEBASSEMBLY) 1693 1715 , WasmModuleArray* wasmModules … … 1697 1719 if (!buffer.size()) 1698 1720 return std::make_pair(jsNull(), SerializationReturnCode::UnspecifiedError); 1699 CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, blobFilePaths, sharedBuffers 1721 CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, blobFilePaths, sharedBuffers, WTFMove(imageBuffers) 1700 1722 #if ENABLE(WEBASSEMBLY) 1701 1723 , wasmModules … … 1746 1768 }; 1747 1769 1748 CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, 1770 CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers, 1749 1771 #if ENABLE(WEBASSEMBLY) 1750 1772 WasmModuleArray* wasmModules, … … 1760 1782 , m_arrayBufferContents(arrayBufferContents) 1761 1783 , m_arrayBuffers(arrayBufferContents ? arrayBufferContents->size() : 0) 1784 , m_imageBuffers(WTFMove(imageBuffers)) 1785 , m_imageBitmaps(m_imageBuffers.size()) 1762 1786 #if ENABLE(WEBASSEMBLY) 1763 1787 , m_wasmModules(wasmModules) … … 1768 1792 } 1769 1793 1770 CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers 1794 CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers 1771 1795 #if ENABLE(WEBASSEMBLY) 1772 1796 , WasmModuleArray* wasmModules … … 1785 1809 , m_blobFilePaths(blobFilePaths) 1786 1810 , m_sharedBuffers(sharedBuffers) 1811 , m_imageBuffers(WTFMove(imageBuffers)) 1812 , m_imageBitmaps(m_imageBuffers.size()) 1787 1813 #if ENABLE(WEBASSEMBLY) 1788 1814 , m_wasmModules(wasmModules) … … 2599 2625 } 2600 2626 2627 JSValue readImageBitmap() 2628 { 2629 uint32_t index; 2630 bool indexSuccessfullyRead = read(index); 2631 if (!indexSuccessfullyRead || index >= m_imageBuffers.size()) { 2632 fail(); 2633 return JSValue(); 2634 } 2635 2636 if (!m_imageBitmaps[index]) 2637 m_imageBitmaps[index] = ImageBitmap::create(WTFMove(m_imageBuffers.at(index))); 2638 2639 auto bitmap = m_imageBitmaps[index].get(); 2640 return getJSValue(bitmap); 2641 } 2642 2601 2643 JSValue readTerminal() 2602 2644 { … … 2860 2902 JSValue cryptoKey; 2861 2903 Vector<RefPtr<MessagePort>> dummyMessagePorts; 2862 CloneDeserializer rawKeyDeserializer(m_exec, m_globalObject, dummyMessagePorts, nullptr, 2904 CloneDeserializer rawKeyDeserializer(m_exec, m_globalObject, dummyMessagePorts, nullptr, { }, 2863 2905 #if ENABLE(WEBASSEMBLY) 2864 2906 nullptr, … … 2887 2929 case DOMQuadTag: 2888 2930 return readDOMQuad(); 2931 case ImageBitmapTransferTag: 2932 return readImageBitmap(); 2889 2933 default: 2890 2934 m_ptr--; // Push the tag back … … 2914 2958 Vector<String> m_blobFilePaths; 2915 2959 ArrayBufferContentsArray* m_sharedBuffers; 2960 Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> m_imageBuffers; 2961 Vector<RefPtr<ImageBitmap>> m_imageBitmaps; 2916 2962 #if ENABLE(WEBASSEMBLY) 2917 2963 WasmModuleArray* m_wasmModules; … … 3124 3170 } 3125 3171 3126 SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray 3172 SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers 3127 3173 #if ENABLE(WEBASSEMBLY) 3128 3174 , std::unique_ptr<WasmModuleArray> wasmModulesArray … … 3132 3178 , m_arrayBufferContentsArray(WTFMove(arrayBufferContentsArray)) 3133 3179 , m_sharedBufferContentsArray(WTFMove(sharedBufferContentsArray)) 3180 , m_imageBuffers(WTFMove(imageBuffers)) 3134 3181 #if ENABLE(WEBASSEMBLY) 3135 3182 , m_wasmModulesArray(WTFMove(wasmModulesArray)) … … 3218 3265 Vector<String> blobURLs; 3219 3266 Vector<RefPtr<MessagePort>> dummyMessagePorts; 3267 Vector<RefPtr<ImageBitmap>> dummyImageBitmaps; 3220 3268 Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers; 3221 3269 #if ENABLE(WEBASSEMBLY) … … 3223 3271 #endif 3224 3272 ArrayBufferContentsArray dummySharedBuffers; 3225 auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers, 3273 auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers, dummyImageBitmaps, 3226 3274 #if ENABLE(WEBASSEMBLY) 3227 3275 dummyModules, … … 3239 3287 return nullptr; 3240 3288 3241 return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr 3289 return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr, { } 3242 3290 #if ENABLE(WEBASSEMBLY) 3243 3291 , nullptr 3244 3292 #endif 3245 3293 )); 3294 } 3295 3296 static bool containsDuplicates(const Vector<RefPtr<ImageBitmap>>& imageBitmaps) 3297 { 3298 HashSet<ImageBitmap*> visited; 3299 for (auto& imageBitmap : imageBitmaps) { 3300 if (!visited.add(imageBitmap.get())) 3301 return true; 3302 } 3303 return false; 3246 3304 } 3247 3305 … … 3250 3308 VM& vm = state.vm(); 3251 3309 Vector<RefPtr<JSC::ArrayBuffer>> arrayBuffers; 3310 Vector<RefPtr<ImageBitmap>> imageBitmaps; 3252 3311 for (auto& transferable : transferList) { 3253 3312 if (auto arrayBuffer = toPossiblySharedArrayBuffer(vm, transferable.get())) { … … 3268 3327 } 3269 3328 3329 if (auto imageBitmap = JSImageBitmap::toWrapped(vm, transferable.get())) { 3330 if (imageBitmap->isDetached()) 3331 return Exception { DataCloneError }; 3332 3333 imageBitmaps.append(WTFMove(imageBitmap)); 3334 continue; 3335 } 3336 3270 3337 return Exception { DataCloneError }; 3271 3338 } 3339 3340 if (containsDuplicates(imageBitmaps)) 3341 return Exception { DataCloneError }; 3272 3342 3273 3343 Vector<uint8_t> buffer; … … 3277 3347 #endif 3278 3348 std::unique_ptr<ArrayBufferContentsArray> sharedBuffers = std::make_unique<ArrayBufferContentsArray>(); 3279 auto code = CloneSerializer::serialize(&state, value, messagePorts, arrayBuffers, 3349 auto code = CloneSerializer::serialize(&state, value, messagePorts, arrayBuffers, imageBitmaps, 3280 3350 #if ENABLE(WEBASSEMBLY) 3281 3351 wasmModules, … … 3290 3360 return arrayBufferContentsArray.releaseException(); 3291 3361 3292 return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr 3362 auto imageBuffers = ImageBitmap::detachBitmaps(WTFMove(imageBitmaps)); 3363 3364 return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr, WTFMove(imageBuffers) 3293 3365 #if ENABLE(WEBASSEMBLY) 3294 3366 , std::make_unique<WasmModuleArray>(wasmModules) … … 3343 3415 JSValue SerializedScriptValue::deserialize(ExecState& exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode throwExceptions) 3344 3416 { 3345 DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths, m_sharedBufferContentsArray.get()3417 DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, WTFMove(m_imageBuffers), m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths, m_sharedBufferContentsArray.get() 3346 3418 #if ENABLE(WEBASSEMBLY) 3347 3419 , m_wasmModulesArray.get() -
trunk/Source/WebCore/bindings/js/SerializedScriptValue.h
r228218 r230348 28 28 29 29 #include "ExceptionOr.h" 30 #include "ImageBuffer.h" 30 31 #include <JavaScriptCore/ArrayBuffer.h> 31 32 #include <JavaScriptCore/JSCJSValue.h> … … 47 48 48 49 class IDBValue; 50 class ImageBitmap; 49 51 class MessagePort; 50 52 class SharedBuffer; … … 104 106 private: 105 107 WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&); 106 SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>, std::unique_ptr<ArrayBufferContentsArray> sharedBuffers 108 SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>, std::unique_ptr<ArrayBufferContentsArray> sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers 107 109 #if ENABLE(WEBASSEMBLY) 108 110 , std::unique_ptr<WasmModuleArray> … … 113 115 std::unique_ptr<ArrayBufferContentsArray> m_arrayBufferContentsArray; 114 116 std::unique_ptr<ArrayBufferContentsArray> m_sharedBufferContentsArray; 117 Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> m_imageBuffers; 115 118 #if ENABLE(WEBASSEMBLY) 116 119 std::unique_ptr<WasmModuleArray> m_wasmModulesArray; -
trunk/Source/WebCore/html/ImageBitmap.cpp
r228186 r230348 60 60 } 61 61 62 Ref<ImageBitmap> ImageBitmap::create(std::pair<std::unique_ptr<ImageBuffer>, bool>&& buffer) 63 { 64 auto imageBitmap = create(WTFMove(buffer.first)); 65 imageBitmap->m_originClean = buffer.second; 66 return imageBitmap; 67 } 68 62 69 Ref<ImageBitmap> ImageBitmap::create(std::unique_ptr<ImageBuffer>&& buffer) 63 70 { … … 73 80 ); 74 81 } 82 83 Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> ImageBitmap::detachBitmaps(Vector<RefPtr<ImageBitmap>>&& bitmaps) 84 { 85 Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> buffers; 86 for (auto& bitmap : bitmaps) 87 buffers.append(std::make_pair(bitmap->transferOwnershipAndClose(), bitmap->originClean())); 88 return buffers; 89 } 90 75 91 76 92 void ImageBitmap::createPromise(ScriptExecutionContext& scriptExecutionContext, ImageBitmap::Source&& source, ImageBitmapOptions&& options, int sx, int sy, int sw, int sh, ImageBitmap::Promise&& promise) -
trunk/Source/WebCore/html/ImageBitmap.h
r228153 r230348 65 65 66 66 static Ref<ImageBitmap> create(IntSize); 67 static Ref<ImageBitmap> create(std::pair<std::unique_ptr<ImageBuffer>, bool>&&); 67 68 68 69 ~ImageBitmap(); … … 79 80 80 81 std::unique_ptr<ImageBuffer> transferOwnershipAndClose(); 82 83 static Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> detachBitmaps(Vector<RefPtr<ImageBitmap>>&&); 81 84 82 85 private:
Note: See TracChangeset
for help on using the changeset viewer.