Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / webdatabase / DatabaseManager.h
1 /*
2  * Copyright (C) 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef DatabaseManager_h
27 #define DatabaseManager_h
28
29 #include "modules/webdatabase/DatabaseBasicTypes.h"
30 #include "modules/webdatabase/DatabaseContext.h"
31 #include "modules/webdatabase/DatabaseError.h"
32 #include "platform/heap/Handle.h"
33 #include "wtf/Assertions.h"
34 #include "wtf/HashMap.h"
35 #include "wtf/PassRefPtr.h"
36 #include "wtf/ThreadingPrimitives.h"
37 #include "wtf/text/WTFString.h"
38
39 namespace blink {
40
41 class AbstractDatabaseServer;
42 class Database;
43 class DatabaseBackendBase;
44 class DatabaseCallback;
45 class DatabaseContext;
46 class DatabaseSync;
47 class TaskSynchronizer;
48 class ExceptionState;
49 class SecurityOrigin;
50 class ExecutionContext;
51
52 typedef int ExceptionCode;
53
54 class DatabaseManager {
55     WTF_MAKE_NONCOPYABLE(DatabaseManager); WTF_MAKE_FAST_ALLOCATED;
56 public:
57     static DatabaseManager& manager();
58
59     // These 2 methods are for DatabaseContext (un)registration, and should only
60     // be called by the DatabaseContext constructor and destructor.
61     void registerDatabaseContext(DatabaseContext*);
62     void unregisterDatabaseContext(DatabaseContext*);
63
64 #if ENABLE(ASSERT)
65     void didConstructDatabaseContext();
66     void didDestructDatabaseContext();
67 #else
68     void didConstructDatabaseContext() { }
69     void didDestructDatabaseContext() { }
70 #endif
71
72     static void throwExceptionForDatabaseError(DatabaseError, const String& errorMessage, ExceptionState&);
73
74     PassRefPtrWillBeRawPtr<Database> openDatabase(ExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback>, DatabaseError&, String& errorMessage);
75     PassRefPtrWillBeRawPtr<DatabaseSync> openDatabaseSync(ExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback>, DatabaseError&, String& errorMessage);
76
77     String fullPathForDatabase(SecurityOrigin*, const String& name, bool createIfDoesNotExist = true);
78
79     void closeDatabasesImmediately(const String& originIdentifier, const String& name);
80
81     void interruptAllDatabasesForContext(DatabaseContext*);
82
83 private:
84     DatabaseManager();
85     ~DatabaseManager();
86
87     // This gets a DatabaseContext for the specified ExecutionContext.
88     // If one doesn't already exist, it will create a new one.
89     DatabaseContext* databaseContextFor(ExecutionContext*);
90     // This gets a DatabaseContext for the specified ExecutionContext if
91     // it already exist previously. Otherwise, it returns 0.
92     DatabaseContext* existingDatabaseContextFor(ExecutionContext*);
93
94     PassRefPtrWillBeRawPtr<DatabaseBackendBase> openDatabaseBackend(ExecutionContext*,
95         DatabaseType, const String& name, const String& expectedVersion, const String& displayName,
96         unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&, String& errorMessage);
97
98     static void logErrorMessage(ExecutionContext*, const String& message);
99
100     AbstractDatabaseServer* m_server;
101
102     // Access to the following fields require locking m_contextMapLock:
103 #if ENABLE(OILPAN)
104     // We can't use PersistentHeapHashMap because multiple threads update the map.
105     typedef HashMap<ExecutionContext*, OwnPtr<Persistent<DatabaseContext> > > ContextMap;
106 #else
107     typedef HashMap<ExecutionContext*, RefPtr<DatabaseContext> > ContextMap;
108 #endif
109     ContextMap m_contextMap;
110 #if ENABLE(ASSERT)
111     int m_databaseContextRegisteredCount;
112     int m_databaseContextInstanceCount;
113 #endif
114     Mutex m_contextMapLock;
115 };
116
117 } // namespace blink
118
119 #endif // DatabaseManager_h