diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/Modules/webdatabase/DatabaseManager.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/Modules/webdatabase/DatabaseManager.h')
-rw-r--r-- | Source/WebCore/Modules/webdatabase/DatabaseManager.h | 131 |
1 files changed, 31 insertions, 100 deletions
diff --git a/Source/WebCore/Modules/webdatabase/DatabaseManager.h b/Source/WebCore/Modules/webdatabase/DatabaseManager.h index 805b32c94..2ca2d077c 100644 --- a/Source/WebCore/Modules/webdatabase/DatabaseManager.h +++ b/Source/WebCore/Modules/webdatabase/DatabaseManager.h @@ -20,144 +20,75 @@ * 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/Lock.h> #include <wtf/Threading.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: - static DatabaseManager& manager(); + WEBCORE_EXPORT static DatabaseManager& singleton(); - void initialize(const String& databasePath); - void setClient(DatabaseManagerClient*); - String databaseDirectoryPath() const; - void setDatabaseDirectoryPath(const String&); + WEBCORE_EXPORT void initialize(const String& databasePath); + WEBCORE_EXPORT void setClient(DatabaseManagerClient*); bool isAvailable(); - void setIsAvailable(bool); + 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); - 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*); - void origins(Vector<RefPtr<SecurityOrigin>>& result); - bool databaseNamesForOrigin(SecurityOrigin*, Vector<String>& result); - DatabaseDetails detailsForNameAndOrigin(const String&, SecurityOrigin*); +private: + DatabaseManager() = default; + ~DatabaseManager() = delete; - unsigned long long usageForOrigin(SecurityOrigin*); - 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); - void setQuota(SecurityOrigin*, unsigned long long); + class ProposedDatabase; + void addProposedDatabase(ProposedDatabase&); + void removeProposedDatabase(ProposedDatabase&); - void deleteAllDatabases(); - bool deleteOrigin(SecurityOrigin*); - 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 |