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
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IDBTransaction_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IDBTransaction_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptState.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ActiveDOMObject.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMError.h"
3206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/EventListener.h"
33d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "modules/EventModules.h"
34d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "modules/EventTargetModules.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBMetadata.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IndexedDB.h"
3710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/heap/Handle.h"
3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebIDBDatabase.h"
3976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "public/platform/WebIDBTypes.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/HashSet.h"
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass DOMError;
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass ExceptionState;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IDBCursor;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IDBDatabase;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IDBObjectStore;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IDBOpenDBRequest;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct IDBObjectStoreMetadata;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass IDBTransaction FINAL
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    : public RefCountedGarbageCollectedWillBeGarbageCollectedFinalized<IDBTransaction>
54f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , public EventTargetWithInlineData
55f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , public ActiveDOMObject {
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    DEFINE_EVENT_TARGET_REFCOUNTING_WILL_BE_REMOVED(RefCountedGarbageCollected<IDBTransaction>);
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(IDBTransaction);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static IDBTransaction* create(ScriptState*, int64_t, const Vector<String>& objectStoreNames, WebIDBTransactionMode, IDBDatabase*);
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static IDBTransaction* create(ScriptState*, int64_t, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata& previousMetadata);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~IDBTransaction();
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    static WebIDBTransactionMode stringToMode(const String&, ExceptionState&);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
676f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // When the connection is closed backend will be 0.
68e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebIDBDatabase* backendDB() const;
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int64_t id() const { return m_id; }
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isActive() const { return m_state == Active; }
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFinished() const { return m_state == Finished; }
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bool isFinishing() const { return m_state == Finishing; }
74e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool isReadOnly() const { return m_mode == WebIDBTransactionModeReadOnly; }
75e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    bool isVersionChange() const { return m_mode == WebIDBTransactionModeVersionChange; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implement the IDBTransaction IDL
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& mode() const;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBDatabase* db() const { return m_database.get(); }
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    PassRefPtrWillBeRawPtr<DOMError> error() const { return m_error; }
81d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBObjectStore* objectStore(const String& name, ExceptionState&);
82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    void abort(ExceptionState&);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void registerRequest(IDBRequest*);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void unregisterRequest(IDBRequest*);
86d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void objectStoreCreated(const String&, IDBObjectStore*);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void objectStoreDeleted(const String&);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setActive(bool);
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setError(PassRefPtrWillBeRawPtr<DOMError>);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_ATTRIBUTE_EVENT_LISTENER(complete);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void onAbort(PassRefPtrWillBeRawPtr<DOMError>);
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void onComplete();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // EventTarget
991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    virtual const AtomicString& interfaceName() const OVERRIDE;
1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    virtual ExecutionContext* executionContext() const OVERRIDE;
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    using EventTarget::dispatchEvent;
103a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    virtual bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>) OVERRIDE;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ActiveDOMObject
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool hasPendingActivity() const OVERRIDE;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void stop() OVERRIDE;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBTransaction(ScriptState*, int64_t, const Vector<String>&, WebIDBTransactionMode, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata&);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void enqueueEvent(PassRefPtrWillBeRawPtr<Event>);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum State {
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Inactive, // Created or started, but not in an event callback
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Active, // Created or started, in creation scope or an event callback
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Finishing, // In the process of aborting or completing.
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Finished, // No more events will fire and no new requests may be filed.
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int64_t m_id;
122d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Member<IDBDatabase> m_database;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<String> m_objectStoreNames;
124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Member<IDBOpenDBRequest> m_openDBRequest;
125e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const WebIDBTransactionMode m_mode;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    State m_state;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasPendingActivity;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_contextStopped;
129f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RefPtrWillBeMember<DOMError> m_error;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
131d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    HeapListHashSet<Member<IDBRequest> > m_requestList;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
133d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    typedef HeapHashMap<String, Member<IDBObjectStore> > IDBObjectStoreMap;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBObjectStoreMap m_objectStoreMap;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    typedef HeapHashSet<Member<IDBObjectStore> > IDBObjectStoreSet;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBObjectStoreSet m_deletedObjectStores;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    typedef HeapHashMap<Member<IDBObjectStore>, IDBObjectStoreMetadata> IDBObjectStoreMetadataMap;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBObjectStoreMetadataMap m_objectStoreCleanupMap;
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IDBDatabaseMetadata m_previousMetadata;
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IDBTransaction_h
147