Remove excessive headers from WebCore/{Modules,animation,crypto,domjit}
[WebKit-https.git] / Source / WebCore / Modules / webdatabase / DatabaseManager.h
index 5b063ba..97db0eb 100644 (file)
  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef DatabaseManager_h
-#define DatabaseManager_h
+#pragma once
 
-#if ENABLE(SQL_DATABASE)
-
-#include "DatabaseBasicTypes.h"
 #include "DatabaseDetails.h"
-#include "DatabaseError.h"
-#include <mutex>
+#include "ExceptionOr.h"
 #include <wtf/Assertions.h>
-#include <wtf/HashMap.h>
 #include <wtf/HashSet.h>
-#include <wtf/PassRefPtr.h>
-#include <wtf/Threading.h>
+#include <wtf/Lock.h>
 
 namespace WebCore {
 
-class AbstractDatabaseServer;
 class Database;
-class DatabaseBackendBase;
 class DatabaseCallback;
 class DatabaseContext;
 class DatabaseManagerClient;
-class DatabaseSync;
 class DatabaseTaskSynchronizer;
+class Exception;
 class SecurityOrigin;
 class ScriptExecutionContext;
+struct SecurityOriginData;
 
 class DatabaseManager {
-    WTF_MAKE_NONCOPYABLE(DatabaseManager); WTF_MAKE_FAST_ALLOCATED;
+    WTF_MAKE_NONCOPYABLE(DatabaseManager);
+    friend class WTF::NeverDestroyed<DatabaseManager>;
 public:
-    WEBCORE_EXPORT static DatabaseManager& manager();
+    WEBCORE_EXPORT static DatabaseManager& singleton();
 
     WEBCORE_EXPORT void initialize(const String& databasePath);
     WEBCORE_EXPORT void setClient(DatabaseManagerClient*);
-    String databaseDirectoryPath() const;
-    void setDatabaseDirectoryPath(const String&);
 
     bool isAvailable();
     WEBCORE_EXPORT void setIsAvailable(bool);
 
     // This gets a DatabaseContext for the specified ScriptExecutionContext.
     // If one doesn't already exist, it will create a new one.
-    PassRefPtr<DatabaseContext> databaseContextFor(ScriptExecutionContext*);
-
-    // These 2 methods are for DatabaseContext (un)registration, and should only
-    // be called by the DatabaseContext constructor and destructor.
-    void registerDatabaseContext(DatabaseContext*);
-    void unregisterDatabaseContext(DatabaseContext*);
+    Ref<DatabaseContext> databaseContext(ScriptExecutionContext&);
 
-#if !ASSERT_DISABLED
-    void didConstructDatabaseContext();
-    void didDestructDatabaseContext();
-#else
-    void didConstructDatabaseContext() { }
-    void didDestructDatabaseContext() { }
-#endif
+    ExceptionOr<Ref<Database>> openDatabase(ScriptExecutionContext&, const String& name, const String& expectedVersion, const String& displayName, unsigned estimatedSize, RefPtr<DatabaseCallback>&&);
 
-    static ExceptionCode exceptionCodeForDatabaseError(DatabaseError);
+    WEBCORE_EXPORT bool hasOpenDatabases(ScriptExecutionContext&);
+    void stopDatabases(ScriptExecutionContext&, DatabaseTaskSynchronizer*);
 
-    PassRefPtr<Database> openDatabase(ScriptExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback>, DatabaseError&);
-    PassRefPtr<DatabaseSync> openDatabaseSync(ScriptExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback>, DatabaseError&);
+    String fullPathForDatabase(SecurityOrigin&, const String& name, bool createIfDoesNotExist = true);
 
-    WEBCORE_EXPORT bool hasOpenDatabases(ScriptExecutionContext*);
-    void stopDatabases(ScriptExecutionContext*, DatabaseTaskSynchronizer*);
+    WEBCORE_EXPORT DatabaseDetails detailsForNameAndOrigin(const String&, SecurityOrigin&);
 
-    String fullPathForDatabase(SecurityOrigin*, const String& name, bool createIfDoesNotExist = true);
-
-    bool hasEntryForOrigin(SecurityOrigin*);
-    WEBCORE_EXPORT void origins(Vector<RefPtr<SecurityOrigin>>& result);
-    WEBCORE_EXPORT bool databaseNamesForOrigin(SecurityOrigin*, Vector<String>& result);
-    WEBCORE_EXPORT DatabaseDetails detailsForNameAndOrigin(const String&, SecurityOrigin*);
+private:
+    DatabaseManager() = default;
+    ~DatabaseManager() = delete;
 
-    WEBCORE_EXPORT unsigned long long usageForOrigin(SecurityOrigin*);
-    WEBCORE_EXPORT unsigned long long quotaForOrigin(SecurityOrigin*);
+    enum OpenAttempt { FirstTryToOpenDatabase, RetryOpenDatabase };
+    ExceptionOr<Ref<Database>> openDatabaseBackend(ScriptExecutionContext&, const String& name, const String& expectedVersion, const String& displayName, unsigned estimatedSize, bool setVersionInNewDatabase);
+    ExceptionOr<Ref<Database>> tryToOpenDatabaseBackend(ScriptExecutionContext&, const String& name, const String& expectedVersion, const String& displayName, unsigned estimatedSize, bool setVersionInNewDatabase, OpenAttempt);
 
-    WEBCORE_EXPORT void setQuota(SecurityOrigin*, unsigned long long);
+    class ProposedDatabase;
+    void addProposedDatabase(ProposedDatabase&);
+    void removeProposedDatabase(ProposedDatabase&);
 
-    WEBCORE_EXPORT void deleteAllDatabases();
-    WEBCORE_EXPORT bool deleteOrigin(SecurityOrigin*);
-    WEBCORE_EXPORT bool deleteDatabase(SecurityOrigin*, const String& name);
+    static void logErrorMessage(ScriptExecutionContext&, const String& message);
 
-    void interruptAllDatabasesForContext(ScriptExecutionContext*);
+    DatabaseManagerClient* m_client { nullptr };
+    bool m_databaseIsAvailable { true };
 
-private:
-    class ProposedDatabase {
-    public:
-        ProposedDatabase(DatabaseManager&, SecurityOrigin*,
-            const String& name, const String& displayName, unsigned long estimatedSize);
-        ~ProposedDatabase();
-
-        SecurityOrigin* origin() { return m_origin.get(); }
-        DatabaseDetails& details() { return m_details; }
-
-    private:
-        DatabaseManager& m_manager;
-        RefPtr<SecurityOrigin> m_origin;
-        DatabaseDetails m_details;
-    };
-
-    DatabaseManager();
-    ~DatabaseManager() { }
-
-    // This gets a DatabaseContext for the specified ScriptExecutionContext if
-    // it already exist previously. Otherwise, it returns 0.
-    PassRefPtr<DatabaseContext> existingDatabaseContextFor(ScriptExecutionContext*);
-
-    PassRefPtr<DatabaseBackendBase> openDatabaseBackend(ScriptExecutionContext*,
-        DatabaseType, const String& name, const String& expectedVersion, const String& displayName,
-        unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&, String& errorMessage);
-
-    void addProposedDatabase(ProposedDatabase*);
-    void removeProposedDatabase(ProposedDatabase*);
-
-    static void logErrorMessage(ScriptExecutionContext*, const String& message);
-
-    AbstractDatabaseServer* m_server;
-    DatabaseManagerClient* m_client;
-    bool m_databaseIsAvailable;
-
-    // Access to the following fields require locking m_lock below:
-    typedef HashMap<ScriptExecutionContext*, DatabaseContext*> ContextMap;
-    ContextMap m_contextMap;
-#if !ASSERT_DISABLED
-    int m_databaseContextRegisteredCount;
-    int m_databaseContextInstanceCount;
-#endif
+    Lock m_proposedDatabasesMutex;
     HashSet<ProposedDatabase*> m_proposedDatabases;
-
-    // This mutex protects m_contextMap, and m_proposedDatabases.
-    std::mutex m_mutex;
 };
 
 } // namespace WebCore
-
-#endif // ENABLE(SQL_DATABASE)
-
-#endif // DatabaseManager_h