Upstream version 7.36.149.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/DatabaseError.h"
31 #include "platform/heap/Handle.h"
32 #include "wtf/Assertions.h"
33 #include "wtf/HashMap.h"
34 #include "wtf/PassRefPtr.h"
35 #include "wtf/ThreadingPrimitives.h"
36 #include "wtf/text/WTFString.h"
37
38 namespace WebCore {
39
40 class AbstractDatabaseServer;
41 class Database;
42 class DatabaseBackendBase;
43 class DatabaseCallback;
44 class DatabaseContext;
45 class DatabaseSync;
46 class TaskSynchronizer;
47 class ExceptionState;
48 class SecurityOrigin;
49 class ExecutionContext;
50
51 typedef int ExceptionCode;
52
53 class DatabaseManager {
54     WTF_MAKE_NONCOPYABLE(DatabaseManager); WTF_MAKE_FAST_ALLOCATED;
55 public:
56     static DatabaseManager& manager();
57
58     // These 2 methods are for DatabaseContext (un)registration, and should only
59     // be called by the DatabaseContext constructor and destructor.
60     void registerDatabaseContext(DatabaseContext*);
61     void unregisterDatabaseContext(DatabaseContext*);
62
63 #if !ASSERT_DISABLED
64     void didConstructDatabaseContext();
65     void didDestructDatabaseContext();
66 #else
67     void didConstructDatabaseContext() { }
68     void didDestructDatabaseContext() { }
69 #endif
70
71     static void throwExceptionForDatabaseError(DatabaseError, const String& errorMessage, ExceptionState&);
72
73     PassRefPtrWillBeRawPtr<Database> openDatabase(ExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback>, DatabaseError&, String& errorMessage);
74     PassRefPtrWillBeRawPtr<DatabaseSync> openDatabaseSync(ExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback>, DatabaseError&, String& errorMessage);
75
76     String fullPathForDatabase(SecurityOrigin*, const String& name, bool createIfDoesNotExist = true);
77
78     void closeDatabasesImmediately(const String& originIdentifier, const String& name);
79
80     void interruptAllDatabasesForContext(DatabaseContext*);
81
82 private:
83     DatabaseManager();
84     ~DatabaseManager();
85
86     // This gets a DatabaseContext for the specified ExecutionContext.
87     // If one doesn't already exist, it will create a new one.
88     DatabaseContext* databaseContextFor(ExecutionContext*);
89     // This gets a DatabaseContext for the specified ExecutionContext if
90     // it already exist previously. Otherwise, it returns 0.
91     DatabaseContext* existingDatabaseContextFor(ExecutionContext*);
92
93     PassRefPtrWillBeRawPtr<DatabaseBackendBase> openDatabaseBackend(ExecutionContext*,
94         DatabaseType, const String& name, const String& expectedVersion, const String& displayName,
95         unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&, String& errorMessage);
96
97     static void logErrorMessage(ExecutionContext*, const String& message);
98
99     AbstractDatabaseServer* m_server;
100
101     // Access to the following fields require locking m_contextMapLock:
102 #if ENABLE(OILPAN)
103     // We can't use PersistentHeapHashMap because multiple threads update the map.
104     typedef HashMap<ExecutionContext*, OwnPtr<Persistent<DatabaseContext> > > ContextMap;
105 #else
106     typedef HashMap<ExecutionContext*, RefPtr<DatabaseContext> > ContextMap;
107 #endif
108     ContextMap m_contextMap;
109 #if !ASSERT_DISABLED
110     int m_databaseContextRegisteredCount;
111     int m_databaseContextInstanceCount;
112 #endif
113     Mutex m_contextMapLock;
114 };
115
116 } // namespace WebCore
117
118 #endif // DatabaseManager_h