15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef DOMFileSystem_h
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DOMFileSystem_h
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptWrappable.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ActiveDOMObject.h"
361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContext.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContextTask.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/filesystem/DOMFileSystemBase.h"
393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "modules/filesystem/EntriesCallback.h"
4010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/heap/Handle.h"
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DirectoryEntry;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class File;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FileCallback;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FileEntry;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FileWriterCallback;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMFileSystem FINAL : public DOMFileSystemBase, public ScriptWrappable, public ActiveDOMObject {
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static DOMFileSystem* create(ExecutionContext*, const String& name, FileSystemType, const KURL& rootURL);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Creates a new isolated file system for the given filesystemId.
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    static DOMFileSystem* createIsolatedFileSystem(ExecutionContext*, const String& filesystemId);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DirectoryEntry* root();
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // DOMFileSystemBase overrides.
618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    virtual void addPendingCallbacks() OVERRIDE;
628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    virtual void removePendingCallbacks() OVERRIDE;
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void reportError(ErrorCallback*, PassRefPtrWillBeRawPtr<FileError>) OVERRIDE;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // ActiveDOMObject overrides.
6607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    virtual bool hasPendingActivity() const OVERRIDE;
6707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void createWriter(const FileEntry*, FileWriterCallback*, ErrorCallback*);
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void createFile(const FileEntry*, FileCallback*, ErrorCallback*);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Schedule a callback. This should not cross threads (should be called on the same context thread).
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: move this to a more generic place.
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename CB, typename CBArg>
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static void scheduleCallback(ExecutionContext*, CB*, PassRefPtrWillBeRawPtr<CBArg>);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename CB, typename CBArg>
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static void scheduleCallback(ExecutionContext*, CB*, CBArg*);
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    template <typename CB, typename CBArg>
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static void scheduleCallback(ExecutionContext*, CB*, const HeapVector<CBArg>&);
81aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
82aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    template <typename CB, typename CBArg>
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static void scheduleCallback(ExecutionContext*, CB*, const CBArg&);
843c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
85d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    template <typename CB>
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static void scheduleCallback(ExecutionContext*, CB*);
87d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
883c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    template <typename CB, typename CBArg>
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void scheduleCallback(CB* callback, PassRefPtrWillBeRawPtr<CBArg> callbackArg)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        scheduleCallback(executionContext(), callback, callbackArg);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
943c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    template <typename CB, typename CBArg>
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void scheduleCallback(CB* callback, CBArg* callbackArg)
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        scheduleCallback(executionContext(), callback, callbackArg);
985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    template <typename CB, typename CBArg>
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void scheduleCallback(CB* callback, const CBArg& callbackArg)
1023c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    {
1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        scheduleCallback(executionContext(), callback, callbackArg);
1043c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    }
1053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    DOMFileSystem(ExecutionContext*, const String& name, FileSystemType, const KURL& rootURL);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    class DispatchCallbackTaskBase : public ExecutionContextTask {
110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    public:
111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        DispatchCallbackTaskBase()
112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            : m_taskName("FileSystem")
113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {
114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        virtual const String& taskNameForInstrumentation() const OVERRIDE
117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        {
118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return m_taskName;
119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    private:
122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        const String m_taskName;
123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    };
124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A helper template to schedule a callback task.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    template <typename CB, typename CBArg>
127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    class DispatchCallbackRefPtrArgTask FINAL : public DispatchCallbackTaskBase {
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        DispatchCallbackRefPtrArgTask(CB* callback, PassRefPtrWillBeRawPtr<CBArg> arg)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : m_callback(callback)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , m_callbackArg(arg)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        virtual void performTask(ExecutionContext*) OVERRIDE
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_callback->handleEvent(m_callbackArg.get());
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Persistent<CB> m_callback;
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        RefPtrWillBePersistent<CBArg> m_callbackArg;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1453c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    template <typename CB, typename CBArg>
146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    class DispatchCallbackPtrArgTask FINAL : public DispatchCallbackTaskBase {
1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    public:
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        DispatchCallbackPtrArgTask(CB* callback, CBArg* arg)
1495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            : m_callback(callback)
1505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            , m_callbackArg(arg)
1515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        {
1525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
1535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        virtual void performTask(ExecutionContext*) OVERRIDE
1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        {
1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_callback->handleEvent(m_callbackArg.get());
1575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
1585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    private:
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Persistent<CB> m_callback;
1615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        Persistent<CBArg> m_callbackArg;
1625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    };
1635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    template <typename CB, typename CBArg>
165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    class DispatchCallbackNonPtrArgTask FINAL : public DispatchCallbackTaskBase {
1663c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    public:
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        DispatchCallbackNonPtrArgTask(CB* callback, const CBArg& arg)
1683c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            : m_callback(callback)
1693c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            , m_callbackArg(arg)
1703c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        {
1713c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        }
1723c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
17309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        virtual void performTask(ExecutionContext*) OVERRIDE
1743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        {
1753c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch            m_callback->handleEvent(m_callbackArg);
1763c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        }
1773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1783c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    private:
1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Persistent<CB> m_callback;
1803c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        CBArg m_callbackArg;
1813c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    };
18207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
183d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    template <typename CB>
184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    class DispatchCallbackNoArgTask FINAL : public DispatchCallbackTaskBase {
185d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    public:
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        DispatchCallbackNoArgTask(CB* callback)
187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            : m_callback(callback)
188d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        {
189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
191d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        virtual void performTask(ExecutionContext*) OVERRIDE
192d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        {
193d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            m_callback->handleEvent();
194d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        }
195d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
196d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    private:
1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        Persistent<CB> m_callback;
198d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    };
199d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
20007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    int m_numberOfPendingCallbacks;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <typename CB, typename CBArg>
2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, PassRefPtrWillBeRawPtr<CBArg> arg)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(executionContext->isContextThread());
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (callback)
2085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        executionContext->postTask(adoptPtr(new DispatchCallbackRefPtrArgTask<CB, CBArg>(callback, arg)));
2095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
2105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)template <typename CB, typename CBArg>
2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, CBArg* arg)
2135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
2145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    ASSERT(executionContext->isContextThread());
2155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (callback)
2165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        executionContext->postTask(adoptPtr(new DispatchCallbackPtrArgTask<CB, CBArg>(callback, arg)));
2173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch}
2183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
2193c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochtemplate <typename CB, typename CBArg>
2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, const HeapVector<CBArg>& arg)
221aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
222aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    ASSERT(executionContext->isContextThread());
223aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (callback)
224aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        executionContext->postTask(adoptPtr(new DispatchCallbackNonPtrArgTask<CB, PersistentHeapVector<CBArg> >(callback, arg)));
225aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
226aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
227aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochtemplate <typename CB, typename CBArg>
2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback, const CBArg& arg)
2293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch{
2301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(executionContext->isContextThread());
2313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (callback)
2321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        executionContext->postTask(adoptPtr(new DispatchCallbackNonPtrArgTask<CB, CBArg>(callback, arg)));
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)template <typename CB>
2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid DOMFileSystem::scheduleCallback(ExecutionContext* executionContext, CB* callback)
237d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
238d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT(executionContext->isContextThread());
239d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (callback)
240d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        executionContext->postTask(adoptPtr(new DispatchCallbackNoArgTask<CB>(callback)));
241d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
242d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // DOMFileSystem_h
246