Diff
Modified: branches/safari-607-branch/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp (244130 => 244131)
--- branches/safari-607-branch/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp 2019-04-10 17:11:26 UTC (rev 244131)
@@ -80,6 +80,11 @@
staticTracker = new DatabaseTracker(databasePath);
}
+bool DatabaseTracker::isInitialized()
+{
+ return !!staticTracker;
+}
+
DatabaseTracker& DatabaseTracker::singleton()
{
if (!staticTracker)
Modified: branches/safari-607-branch/Source/WebCore/Modules/webdatabase/DatabaseTracker.h (244130 => 244131)
--- branches/safari-607-branch/Source/WebCore/Modules/webdatabase/DatabaseTracker.h 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebCore/Modules/webdatabase/DatabaseTracker.h 2019-04-10 17:11:26 UTC (rev 244131)
@@ -59,6 +59,7 @@
static void initializeTracker(const String& databasePath);
WEBCORE_EXPORT static DatabaseTracker& singleton();
+ WEBCORE_EXPORT static bool isInitialized();
// This singleton will potentially be used from multiple worker threads and the page's context thread simultaneously. To keep this safe, it's
// currently using 4 locks. In order to avoid deadlock when taking multiple locks, you must take them in the correct order:
// m_databaseGuard before quotaManager if both locks are needed.
Modified: branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabase.cpp (244130 => 244131)
--- branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabase.cpp 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabase.cpp 2019-04-10 17:11:26 UTC (rev 244131)
@@ -71,6 +71,15 @@
});
}
+static bool isDatabaseOpeningForbidden = false;
+static Lock isDatabaseOpeningForbiddenMutex;
+
+void SQLiteDatabase::setIsDatabaseOpeningForbidden(bool isForbidden)
+{
+ std::lock_guard<Lock> lock(isDatabaseOpeningForbiddenMutex);
+ isDatabaseOpeningForbidden = isForbidden;
+}
+
SQLiteDatabase::SQLiteDatabase() = default;
SQLiteDatabase::~SQLiteDatabase()
@@ -84,14 +93,17 @@
close();
- m_openError = SQLiteFileSystem::openDatabase(filename, &m_db, forWebSQLDatabase);
- if (m_openError != SQLITE_OK) {
- m_openErrorMessage = m_db ? sqlite3_errmsg(m_db) : "sqlite_open returned null";
- LOG_ERROR("SQLite database failed to load from %s\nCause - %s", filename.ascii().data(),
- m_openErrorMessage.data());
- sqlite3_close(m_db);
- m_db = 0;
- return false;
+ {
+ std::lock_guard<Lock> lock(isDatabaseOpeningForbiddenMutex);
+ m_openError = SQLiteFileSystem::openDatabase(filename, &m_db, forWebSQLDatabase);
+ if (m_openError != SQLITE_OK) {
+ m_openErrorMessage = m_db ? sqlite3_errmsg(m_db) : "sqlite_open returned null";
+ LOG_ERROR("SQLite database failed to load from %s\nCause - %s", filename.ascii().data(),
+ m_openErrorMessage.data());
+ sqlite3_close(m_db);
+ m_db = 0;
+ return false;
+ }
}
overrideUnauthorizedFunctions();
Modified: branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabase.h (244130 => 244131)
--- branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabase.h 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabase.h 2019-04-10 17:11:26 UTC (rev 244131)
@@ -136,6 +136,8 @@
WEBCORE_EXPORT void disableThreadingChecks() {}
#endif
+ WEBCORE_EXPORT static void setIsDatabaseOpeningForbidden(bool);
+
private:
static int authorizerFunction(void*, int, const char*, const char*, const char*, const char*);
Modified: branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabaseTracker.cpp (244130 => 244131)
--- branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabaseTracker.cpp 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebCore/platform/sql/SQLiteDatabaseTracker.cpp 2019-04-10 17:11:26 UTC (rev 244131)
@@ -40,18 +40,16 @@
void setClient(SQLiteDatabaseTrackerClient* client)
{
- ASSERT(client);
- ASSERT(!s_staticSQLiteDatabaseTrackerClient || s_staticSQLiteDatabaseTrackerClient == client);
+ std::lock_guard<Lock> lock(transactionInProgressMutex);
s_staticSQLiteDatabaseTrackerClient = client;
}
void incrementTransactionInProgressCount()
{
+ std::lock_guard<Lock> lock(transactionInProgressMutex);
if (!s_staticSQLiteDatabaseTrackerClient)
return;
- std::lock_guard<Lock> lock(transactionInProgressMutex);
-
s_transactionInProgressCounter++;
if (s_transactionInProgressCounter == 1)
s_staticSQLiteDatabaseTrackerClient->willBeginFirstTransaction();
@@ -59,11 +57,10 @@
void decrementTransactionInProgressCount()
{
+ std::lock_guard<Lock> lock(transactionInProgressMutex);
if (!s_staticSQLiteDatabaseTrackerClient)
return;
- std::lock_guard<Lock> lock(transactionInProgressMutex);
-
ASSERT(s_transactionInProgressCounter);
s_transactionInProgressCounter--;
@@ -74,6 +71,7 @@
#if !ASSERT_DISABLED
bool hasTransactionInProgress()
{
+ std::lock_guard<Lock> lock(transactionInProgressMutex);
return !s_staticSQLiteDatabaseTrackerClient || s_transactionInProgressCounter > 0;
}
#endif
Modified: branches/safari-607-branch/Source/WebKit/Shared/WebSQLiteDatabaseTracker.cpp (244130 => 244131)
--- branches/safari-607-branch/Source/WebKit/Shared/WebSQLiteDatabaseTracker.cpp 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebKit/Shared/WebSQLiteDatabaseTracker.cpp 2019-04-10 17:11:26 UTC (rev 244131)
@@ -52,6 +52,15 @@
SQLiteDatabaseTracker::setClient(this);
}
+WebSQLiteDatabaseTracker::~WebSQLiteDatabaseTracker()
+{
+ ASSERT(RunLoop::isMain());
+ SQLiteDatabaseTracker::setClient(nullptr);
+
+ if (m_hysteresis.state() == PAL::HysteresisState::Started)
+ hysteresisUpdated(PAL::HysteresisState::Stopped);
+}
+
void WebSQLiteDatabaseTracker::willBeginFirstTransaction()
{
callOnMainThread([this] {
Modified: branches/safari-607-branch/Source/WebKit/Shared/WebSQLiteDatabaseTracker.h (244130 => 244131)
--- branches/safari-607-branch/Source/WebKit/Shared/WebSQLiteDatabaseTracker.h 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebKit/Shared/WebSQLiteDatabaseTracker.h 2019-04-10 17:11:26 UTC (rev 244131)
@@ -42,6 +42,8 @@
explicit WebSQLiteDatabaseTracker(NetworkProcess&);
explicit WebSQLiteDatabaseTracker(WebProcess&);
+ ~WebSQLiteDatabaseTracker();
+
// WebCore::SQLiteDatabaseTrackerClient
void willBeginFirstTransaction() override;
void didFinishLastTransaction() override;
Modified: branches/safari-607-branch/Source/WebKit/WebProcess/WebProcess.cpp (244130 => 244131)
--- branches/safari-607-branch/Source/WebKit/WebProcess/WebProcess.cpp 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebKit/WebProcess/WebProcess.cpp 2019-04-10 17:11:26 UTC (rev 244131)
@@ -136,6 +136,10 @@
#include "UserMediaCaptureManager.h"
#endif
+#if PLATFORM(IOS_FAMILY)
+#include "WebSQLiteDatabaseTracker.h"
+#endif
+
#if ENABLE(SEC_ITEM_SHIM)
#include "SecItemShim.h"
#endif
@@ -183,7 +187,7 @@
#endif
, m_nonVisibleProcessCleanupTimer(*this, &WebProcess::nonVisibleProcessCleanupTimerFired)
#if PLATFORM(IOS_FAMILY)
- , m_webSQLiteDatabaseTracker(*this)
+ , m_webSQLiteDatabaseTracker(std::make_unique<WebSQLiteDatabaseTracker>(*this))
#endif
{
// Initialize our platform strategies.
@@ -1447,6 +1451,10 @@
#endif
#if PLATFORM(IOS_FAMILY)
+ m_webSQLiteDatabaseTracker = nullptr;
+ SQLiteDatabase::setIsDatabaseOpeningForbidden(true);
+ if (DatabaseTracker::isInitialized())
+ DatabaseTracker::singleton().closeAllDatabases(CurrentQueryBehavior::Interrupt);
accessibilityProcessSuspendedNotification(true);
#endif
@@ -1474,7 +1482,6 @@
}
RELEASE_LOG(ProcessSuspension, "%p - WebProcess::processWillSuspendImminently()", this);
- DatabaseTracker::singleton().closeAllDatabases(CurrentQueryBehavior::Interrupt);
actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend::No);
handled = true;
}
@@ -1491,6 +1498,8 @@
unfreezeAllLayerTrees();
#if PLATFORM(IOS_FAMILY)
+ m_webSQLiteDatabaseTracker = std::make_unique<WebSQLiteDatabaseTracker>(*this);
+ SQLiteDatabase::setIsDatabaseOpeningForbidden(false);
accessibilityProcessSuspendedNotification(false);
#endif
@@ -1558,6 +1567,8 @@
unfreezeAllLayerTrees();
#if PLATFORM(IOS_FAMILY)
+ m_webSQLiteDatabaseTracker = std::make_unique<WebSQLiteDatabaseTracker>(*this);
+ SQLiteDatabase::setIsDatabaseOpeningForbidden(false);
accessibilityProcessSuspendedNotification(false);
#endif
}
Modified: branches/safari-607-branch/Source/WebKit/WebProcess/WebProcess.h (244130 => 244131)
--- branches/safari-607-branch/Source/WebKit/WebProcess/WebProcess.h 2019-04-10 17:11:23 UTC (rev 244130)
+++ branches/safari-607-branch/Source/WebKit/WebProcess/WebProcess.h 2019-04-10 17:11:26 UTC (rev 244131)
@@ -52,10 +52,6 @@
#include <wtf/MachSendRight.h>
#endif
-#if PLATFORM(IOS_FAMILY)
-#include "WebSQLiteDatabaseTracker.h"
-#endif
-
namespace API {
class Object;
}
@@ -106,6 +102,7 @@
struct WebPageCreationParameters;
struct WebPageGroupData;
struct WebPreferencesStore;
+class WebSQLiteDatabaseTracker
struct WebProcessCreationParameters;
struct WebsiteData;
struct WebsiteDataStoreParameters;
@@ -467,7 +464,7 @@
RefPtr<WebCore::ApplicationCacheStorage> m_applicationCacheStorage;
#if PLATFORM(IOS_FAMILY)
- WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
+ std::unique_ptr<WebSQLiteDatabaseTracker> m_webSQLiteDatabaseTracker;
#endif
enum PageMarkingLayersAsVolatileCounterType { };