Changeset 230348 in webkit


Ignore:
Timestamp:
Apr 6, 2018 12:20:35 PM (6 years ago)
Author:
Ms2ger@igalia.com
Message:

Support transferring ImageBitmap objects
https://bugs.webkit.org/show_bug.cgi?id=183131

Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

  • web-platform-tests/2dcontext/imagebitmap/createImageBitmap-transfer-expected.txt: Added.
  • web-platform-tests/2dcontext/imagebitmap/createImageBitmap-transfer.html: Added.
  • web-platform-tests/2dcontext/imagebitmap/transfer-worker.js: Added.

Source/WebCore:

Test: imported/w3c/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-transfer.html

  • bindings/js/SerializedScriptValue.cpp:

(WebCore::CloneSerializer::serialize): thread through ImageBitmaps.
(WebCore::CloneSerializer::CloneSerializer): thread through ImageBitmaps.
(WebCore::CloneSerializer::fillTransferMap): don't require a mutable reference.
(WebCore::CloneSerializer::dumpImageBitmap): add.
(WebCore::CloneSerializer::dumpIfTerminal): check for ImageBitmap.
(WebCore::CloneDeserializer::deserialize): thread through ImageBitmaps.
(WebCore::CloneDeserializer::CloneDeserializer): thread through ImageBitmaps.
(WebCore::CloneDeserializer::readImageBitmap): add.
(WebCore::CloneDeserializer::readTerminal): check for ImageBitmap.
(WebCore::SerializedScriptValue::SerializedScriptValue): thread through ImageBitmaps.
(WebCore::SerializedScriptValue::create): thread through ImageBitmaps.
(WebCore::containsDuplicates): add.
(WebCore::SerializedScriptValue::deserialize): handle ImageBitmap arguments.

  • bindings/js/SerializedScriptValue.h: update signatures, add member.
  • html/ImageBitmap.cpp:

(WebCore::ImageBitmap::create): add.
(WebCore::ImageBitmap::detachBitmaps): add.

  • html/ImageBitmap.h: add signatures.
Location:
trunk
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r230330 r230348  
     12018-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
    1122018-04-06  Brendan McLoughlin  <brendan@bocoup.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r230347 r230348  
     12018-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
    1302018-04-06  Said Abou-Hallawa  <sabouhallawa@apple.com>
    231
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp

    r229416 r230348  
    4747#include "JSFile.h"
    4848#include "JSFileList.h"
     49#include "JSImageBitmap.h"
    4950#include "JSImageData.h"
    5051#include "JSMessagePort.h"
     
    161162    DOMMatrixTag = 41,
    162163    DOMQuadTag = 42,
     164    ImageBitmapTransferTag = 43,
    163165    ErrorTag = 255
    164166};
     
    340342 *    | DOMMatrix
    341343 *    | DOMQuad
     344 *    | ImageBitmapTransferTag <value:uint32_t>
    342345 *
    343346 * Inside wrapped crypto key, data is serialized in this format:
     
    531534class CloneSerializer : CloneBase {
    532535public:
    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,
    534537#if ENABLE(WEBASSEMBLY)
    535538            WasmModuleArray& wasmModules,
     
    537540            Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
    538541    {
    539         CloneSerializer serializer(exec, messagePorts, arrayBuffers,
     542        CloneSerializer serializer(exec, messagePorts, arrayBuffers, imageBitmaps,
    540543#if ENABLE(WEBASSEMBLY)
    541544            wasmModules,
     
    564567    typedef HashMap<JSObject*, uint32_t> ObjectPool;
    565568
    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,
    567570#if ENABLE(WEBASSEMBLY)
    568571            WasmModuleArray& wasmModules,
     
    582585        fillTransferMap(messagePorts, m_transferredMessagePorts);
    583586        fillTransferMap(arrayBuffers, m_transferredArrayBuffers);
     587        fillTransferMap(imageBitmaps, m_transferredImageBitmaps);
    584588    }
    585589
    586590    template <class T>
    587     void fillTransferMap(Vector<RefPtr<T>>& input, ObjectPool& result)
     591    void fillTransferMap(const Vector<RefPtr<T>>& input, ObjectPool& result)
    588592    {
    589593        if (input.isEmpty())
     
    871875        dumpDOMPoint(quad.p3());
    872876        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;
    873890    }
    874891
     
    10231040#endif
    10241041                ArrayBufferContentsArray dummySharedBuffers;
    1025                 CloneSerializer rawKeySerializer(m_exec, dummyMessagePorts, dummyArrayBuffers,
     1042                CloneSerializer rawKeySerializer(m_exec, dummyMessagePorts, dummyArrayBuffers, { },
    10261043#if ENABLE(WEBASSEMBLY)
    10271044                    dummyModules,
     
    10631080            if (obj->inherits<JSDOMQuad>(vm)) {
    10641081                dumpDOMQuad(obj);
     1082                return true;
     1083            }
     1084            if (obj->inherits(vm, JSImageBitmap::info())) {
     1085                dumpImageBitmap(obj, code);
    10651086                return true;
    10661087            }
     
    14101431    ObjectPool m_transferredMessagePorts;
    14111432    ObjectPool m_transferredArrayBuffers;
     1433    ObjectPool m_transferredImageBitmaps;
    14121434    typedef HashMap<RefPtr<UniquedStringImpl>, uint32_t, IdentifierRepHash> StringConstantPool;
    14131435    StringConstantPool m_constantPool;
     
    16891711    }
    16901712
    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* sharedBuffers
     1713    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
    16921714#if ENABLE(WEBASSEMBLY)
    16931715        , WasmModuleArray* wasmModules
     
    16971719        if (!buffer.size())
    16981720            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)
    17001722#if ENABLE(WEBASSEMBLY)
    17011723            , wasmModules
     
    17461768    };
    17471769
    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,
    17491771#if ENABLE(WEBASSEMBLY)
    17501772        WasmModuleArray* wasmModules,
     
    17601782        , m_arrayBufferContents(arrayBufferContents)
    17611783        , m_arrayBuffers(arrayBufferContents ? arrayBufferContents->size() : 0)
     1784        , m_imageBuffers(WTFMove(imageBuffers))
     1785        , m_imageBitmaps(m_imageBuffers.size())
    17621786#if ENABLE(WEBASSEMBLY)
    17631787        , m_wasmModules(wasmModules)
     
    17681792    }
    17691793
    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
    17711795#if ENABLE(WEBASSEMBLY)
    17721796        , WasmModuleArray* wasmModules
     
    17851809        , m_blobFilePaths(blobFilePaths)
    17861810        , m_sharedBuffers(sharedBuffers)
     1811        , m_imageBuffers(WTFMove(imageBuffers))
     1812        , m_imageBitmaps(m_imageBuffers.size())
    17871813#if ENABLE(WEBASSEMBLY)
    17881814        , m_wasmModules(wasmModules)
     
    25992625    }
    26002626
     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
    26012643    JSValue readTerminal()
    26022644    {
     
    28602902            JSValue cryptoKey;
    28612903            Vector<RefPtr<MessagePort>> dummyMessagePorts;
    2862             CloneDeserializer rawKeyDeserializer(m_exec, m_globalObject, dummyMessagePorts, nullptr,
     2904            CloneDeserializer rawKeyDeserializer(m_exec, m_globalObject, dummyMessagePorts, nullptr, { },
    28632905#if ENABLE(WEBASSEMBLY)
    28642906                nullptr,
     
    28872929        case DOMQuadTag:
    28882930            return readDOMQuad();
     2931        case ImageBitmapTransferTag:
     2932            return readImageBitmap();
    28892933        default:
    28902934            m_ptr--; // Push the tag back
     
    29142958    Vector<String> m_blobFilePaths;
    29152959    ArrayBufferContentsArray* m_sharedBuffers;
     2960    Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> m_imageBuffers;
     2961    Vector<RefPtr<ImageBitmap>> m_imageBitmaps;
    29162962#if ENABLE(WEBASSEMBLY)
    29172963    WasmModuleArray* m_wasmModules;
     
    31243170}
    31253171
    3126 SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray
     3172SerializedScriptValue::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
    31273173#if ENABLE(WEBASSEMBLY)
    31283174        , std::unique_ptr<WasmModuleArray> wasmModulesArray
     
    31323178    , m_arrayBufferContentsArray(WTFMove(arrayBufferContentsArray))
    31333179    , m_sharedBufferContentsArray(WTFMove(sharedBufferContentsArray))
     3180    , m_imageBuffers(WTFMove(imageBuffers))
    31343181#if ENABLE(WEBASSEMBLY)
    31353182    , m_wasmModulesArray(WTFMove(wasmModulesArray))
     
    32183265    Vector<String> blobURLs;
    32193266    Vector<RefPtr<MessagePort>> dummyMessagePorts;
     3267    Vector<RefPtr<ImageBitmap>> dummyImageBitmaps;
    32203268    Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers;
    32213269#if ENABLE(WEBASSEMBLY)
     
    32233271#endif
    32243272    ArrayBufferContentsArray dummySharedBuffers;
    3225     auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers,
     3273    auto code = CloneSerializer::serialize(&exec, value, dummyMessagePorts, dummyArrayBuffers, dummyImageBitmaps,
    32263274#if ENABLE(WEBASSEMBLY)
    32273275        dummyModules,
     
    32393287        return nullptr;
    32403288
    3241     return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr
     3289    return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr, { }
    32423290#if ENABLE(WEBASSEMBLY)
    32433291        , nullptr
    32443292#endif
    32453293            ));
     3294}
     3295
     3296static 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;
    32463304}
    32473305
     
    32503308    VM& vm = state.vm();
    32513309    Vector<RefPtr<JSC::ArrayBuffer>> arrayBuffers;
     3310    Vector<RefPtr<ImageBitmap>> imageBitmaps;
    32523311    for (auto& transferable : transferList) {
    32533312        if (auto arrayBuffer = toPossiblySharedArrayBuffer(vm, transferable.get())) {
     
    32683327        }
    32693328
     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
    32703337        return Exception { DataCloneError };
    32713338    }
     3339
     3340    if (containsDuplicates(imageBitmaps))
     3341        return Exception { DataCloneError };
    32723342
    32733343    Vector<uint8_t> buffer;
     
    32773347#endif
    32783348    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,
    32803350#if ENABLE(WEBASSEMBLY)
    32813351        wasmModules,
     
    32903360        return arrayBufferContentsArray.releaseException();
    32913361
    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)
    32933365#if ENABLE(WEBASSEMBLY)
    32943366                , std::make_unique<WasmModuleArray>(wasmModules)
     
    33433415JSValue SerializedScriptValue::deserialize(ExecState& exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode throwExceptions)
    33443416{
    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()
    33463418#if ENABLE(WEBASSEMBLY)
    33473419        , m_wasmModulesArray.get()
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.h

    r228218 r230348  
    2828
    2929#include "ExceptionOr.h"
     30#include "ImageBuffer.h"
    3031#include <JavaScriptCore/ArrayBuffer.h>
    3132#include <JavaScriptCore/JSCJSValue.h>
     
    4748
    4849class IDBValue;
     50class ImageBitmap;
    4951class MessagePort;
    5052class SharedBuffer;
     
    104106private:
    105107    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
    107109#if ENABLE(WEBASSEMBLY)
    108110        , std::unique_ptr<WasmModuleArray>
     
    113115    std::unique_ptr<ArrayBufferContentsArray> m_arrayBufferContentsArray;
    114116    std::unique_ptr<ArrayBufferContentsArray> m_sharedBufferContentsArray;
     117    Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> m_imageBuffers;
    115118#if ENABLE(WEBASSEMBLY)
    116119    std::unique_ptr<WasmModuleArray> m_wasmModulesArray;
  • trunk/Source/WebCore/html/ImageBitmap.cpp

    r228186 r230348  
    6060}
    6161
     62Ref<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
    6269Ref<ImageBitmap> ImageBitmap::create(std::unique_ptr<ImageBuffer>&& buffer)
    6370{
     
    7380    );
    7481}
     82
     83Vector<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
    7591
    7692void 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  
    6565
    6666    static Ref<ImageBitmap> create(IntSize);
     67    static Ref<ImageBitmap> create(std::pair<std::unique_ptr<ImageBuffer>, bool>&&);
    6768
    6869    ~ImageBitmap();
     
    7980
    8081    std::unique_ptr<ImageBuffer> transferOwnershipAndClose();
     82
     83    static Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> detachBitmaps(Vector<RefPtr<ImageBitmap>>&&);
    8184
    8285private:
Note: See TracChangeset for help on using the changeset viewer.