From 9bab2acc924790b0a01a08e76f9216acc2d6528b Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 16 May 2019 11:19:49 +0200 Subject: [Backport] WebSQL: Explicitly initialize SQLite, remove deprecated API usage. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I291dd041c5646c4fdd714ff98dd939566861d921 Reviewed-on: https://chromium-review.googlesource.com/892092 Task-number: QTBUG-75853 Reviewed-by: Jüri Valdmann --- .../Source/modules/webdatabase/DatabaseTracker.cpp | 2 +- .../modules/webdatabase/sqlite/SQLiteFileSystem.cpp | 21 ++++++++++++++++++++- .../modules/webdatabase/sqlite/SQLiteFileSystem.h | 21 +++++++++++++++------ .../webdatabase/sqlite/SQLiteFileSystemPosix.cpp | 19 ++++++++++--------- .../webdatabase/sqlite/SQLiteFileSystemWin.cpp | 19 ++++++++++--------- 5 files changed, 56 insertions(+), 26 deletions(-) diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp index 13ea7d8181..f78d90a5df 100644 --- a/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp +++ b/chromium/third_party/WebKit/Source/modules/webdatabase/DatabaseTracker.cpp @@ -66,7 +66,7 @@ DatabaseTracker& DatabaseTracker::tracker() { } DatabaseTracker::DatabaseTracker() { - SQLiteFileSystem::registerSQLiteVFS(); + SQLiteFileSystem::initializeSQLite(); } bool DatabaseTracker::canEstablishDatabase(DatabaseContext* databaseContext, diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp index 9c25341c57..2a6e140f9e 100644 --- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp +++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.cpp @@ -39,9 +39,28 @@ // platform-specific files SQLiteFileSystemChromium{Win|Posix}.cpp namespace blink { -SQLiteFileSystem::SQLiteFileSystem() {} +#if DCHECK_IS_ON() +// static +bool SQLiteFileSystem::initialize_sqlite_called_ = false; +#endif // DCHECK_IS_ON +// static +void SQLiteFileSystem::initializeSQLite() { +#if DCHECK_IS_ON() + DCHECK(!initialize_sqlite_called_) << __func__ << " already called"; + initialize_sqlite_called_ = true; +#endif // DCHECK_IS_ON() + + sqlite3_initialize(); + registerSQLiteVFS(); +} + +// static int SQLiteFileSystem::openDatabase(const String& filename, sqlite3** database) { +#if DCHECK_IS_ON() + DCHECK(initialize_sqlite_called_) + << "InitializeSQLite() must be called before " << __func__; +#endif // DCHECK_IS_ON() SafePointScope scope(BlinkGC::HeapPointersOnStack); return sqlite3_open_v2(filename.utf8().data(), database, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h index 97c0ad83a1..af2bcd9211 100644 --- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h +++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystem.h @@ -42,22 +42,31 @@ namespace blink { // A class that abstracts the file system related operations required // by the WebKit database code. class SQLiteFileSystem { - DISALLOW_NEW(); - public: - // Registers a user-defined SQLite VFS. - static void registerSQLiteVFS(); + // This class is used as a namespace, so instantiating it doesn't make sense. + SQLiteFileSystem() = delete; + + // Initializes SQLite for Blink's use. + // + // This must be called exactly once in each renderer process that uses SQLite. + static void initializeSQLite(); // Opens a database file. // + // initializeSQLite() must be called before this method is called. + // // filemame - The name of the database file. // database - The SQLite structure that represents the database stored // in the given file. static int openDatabase(const String& filename, sqlite3** database); private: - // do not instantiate this class - SQLiteFileSystem(); + // Registers Chromium's VFS with SQLite. + static void registerSQLiteVFS(); + +#if DCHECK_IS_ON() + static bool initialize_sqlite_called_; +#endif // DCHECK_IS_ON() }; // class SQLiteFileSystem } // namespace blink diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp index 77e7b6d904..20d0fd2e0e 100644 --- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp +++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp @@ -321,11 +321,6 @@ int chromiumSleep(sqlite3_vfs* vfs, int microseconds) { return wrappedVfs->xSleep(wrappedVfs, microseconds); } -int chromiumCurrentTime(sqlite3_vfs* vfs, double* prNow) { - sqlite3_vfs* wrappedVfs = static_cast(vfs->pAppData); - return wrappedVfs->xCurrentTime(wrappedVfs, prNow); -} - int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) { // xGetLastError() has never been used by SQLite. The implementation in // os_win.c indicates this is a reasonable implementation. @@ -333,6 +328,11 @@ int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) { return 0; } +int chromiumCurrentTimeInt64(sqlite3_vfs* vfs, sqlite3_int64* now) { + sqlite3_vfs* wrapped_vfs = static_cast(vfs->pAppData); + return wrapped_vfs->xCurrentTimeInt64(wrapped_vfs, now); +} + } // namespace void SQLiteFileSystem::registerSQLiteVFS() { @@ -342,9 +342,9 @@ void SQLiteFileSystem::registerSQLiteVFS() { // TODO(shess): Implement local versions. ASSERT(wrappedVfs->xRandomness); ASSERT(wrappedVfs->xSleep); - ASSERT(wrappedVfs->xCurrentTime); + ASSERT(wrappedVfs->xCurrentTimeInt64); - static sqlite3_vfs chromium_vfs = {1, + static sqlite3_vfs chromium_vfs = {2, sizeof(chromiumVfsFile), wrappedVfs->mxPathname, 0, @@ -360,8 +360,9 @@ void SQLiteFileSystem::registerSQLiteVFS() { chromiumDlClose, chromiumRandomness, chromiumSleep, - chromiumCurrentTime, - chromiumGetLastError}; + nullptr, // CurrentTime is deprecated. + chromiumGetLastError, + chromiumCurrentTimeInt64}; sqlite3_vfs_register(&chromium_vfs, 0); } diff --git a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp index 2933df65f6..31103047fd 100644 --- a/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp +++ b/chromium/third_party/WebKit/Source/modules/webdatabase/sqlite/SQLiteFileSystemWin.cpp @@ -148,11 +148,6 @@ int chromiumSleep(sqlite3_vfs* vfs, int microseconds) { return wrappedVfs->xSleep(wrappedVfs, microseconds); } -int chromiumCurrentTime(sqlite3_vfs* vfs, double* prNow) { - sqlite3_vfs* wrappedVfs = static_cast(vfs->pAppData); - return wrappedVfs->xCurrentTime(wrappedVfs, prNow); -} - int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) { // xGetLastError() has never been used by SQLite. The implementation in // os_win.c indicates this is a reasonable implementation. @@ -160,6 +155,11 @@ int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) { return 0; } +int chromiumCurrentTimeInt64(sqlite3_vfs* vfs, sqlite3_int64* now) { + sqlite3_vfs* wrapped_vfs = static_cast(vfs->pAppData); + return wrapped_vfs->xCurrentTimeInt64(wrapped_vfs, now); +} + } // namespace void SQLiteFileSystem::registerSQLiteVFS() { @@ -169,9 +169,9 @@ void SQLiteFileSystem::registerSQLiteVFS() { // TODO(shess): Implement local versions. ASSERT(wrappedVfs->xRandomness); ASSERT(wrappedVfs->xSleep); - ASSERT(wrappedVfs->xCurrentTime); + ASSERT(wrappedVfs->xCurrentTimeInt64); - static sqlite3_vfs chromium_vfs = {1, + static sqlite3_vfs chromium_vfs = {2, wrappedVfs->szOsFile, wrappedVfs->mxPathname, 0, @@ -187,8 +187,9 @@ void SQLiteFileSystem::registerSQLiteVFS() { chromiumDlClose, chromiumRandomness, chromiumSleep, - chromiumCurrentTime, - chromiumGetLastError}; + nullptr, // CurrentTime is deprecated. + chromiumGetLastError, + chromiumCurrentTimeInt64}; sqlite3_vfs_register(&chromium_vfs, 0); } -- cgit v1.2.1