Changeset 147796 in webkit
- Timestamp:
- Apr 5, 2013 1:52:10 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r147795 r147796 1 2013-04-05 Benjamin Poulain <benjamin@webkit.org> 2 3 Clean the chromium bits of WebCore's WebDatabase 4 https://bugs.webkit.org/show_bug.cgi?id=114010 5 6 Reviewed by Ryosuke Niwa. 7 8 * Modules/webdatabase/AbstractDatabaseServer.h: 9 * Modules/webdatabase/ChangeVersionWrapper.cpp: 10 (WebCore::ChangeVersionWrapper::performPreflight): 11 (WebCore::ChangeVersionWrapper::performPostflight): 12 * Modules/webdatabase/Database.cpp: 13 * Modules/webdatabase/Database.h: 14 (Database): 15 * Modules/webdatabase/DatabaseBackend.cpp: 16 (WebCore::DatabaseBackend::openAndVerifyVersion): 17 * Modules/webdatabase/DatabaseBackendBase.cpp: 18 (WebCore::DoneCreatingDatabaseOnExitCaller::~DoneCreatingDatabaseOnExitCaller): 19 (WebCore::DatabaseBackendBase::performOpenAndVerify): 20 (WebCore::DatabaseBackendBase::getActualVersionForTransaction): 21 (WebCore::DatabaseBackendBase::incrementalVacuumIfNeeded): 22 * Modules/webdatabase/DatabaseBackendBase.h: 23 (DatabaseBackendBase): 24 * Modules/webdatabase/DatabaseBackendSync.cpp: 25 (WebCore::DatabaseBackendSync::openAndVerifyVersion): 26 * Modules/webdatabase/DatabaseContext.cpp: 27 (WebCore::DatabaseContext::databaseExceededQuota): 28 * Modules/webdatabase/DatabaseManager.cpp: 29 * Modules/webdatabase/DatabaseManager.h: 30 (DatabaseManager): 31 * Modules/webdatabase/DatabaseServer.cpp: 32 (WebCore::DatabaseServer::initialize): 33 (WebCore::DatabaseServer::setClient): 34 (WebCore::DatabaseServer::databaseDirectoryPath): 35 (WebCore::DatabaseServer::setDatabaseDirectoryPath): 36 (WebCore::DatabaseServer::openDatabase): 37 * Modules/webdatabase/DatabaseServer.h: 38 * Modules/webdatabase/DatabaseSync.cpp: 39 (WebCore::DatabaseSync::changeVersion): 40 * Modules/webdatabase/DatabaseTracker.cpp: 41 (WebCore::DatabaseTracker::canEstablishDatabase): 42 (WebCore::DatabaseTracker::retryCanEstablishDatabase): 43 * Modules/webdatabase/DatabaseTracker.h: 44 (WebCore): 45 (DatabaseTracker): 46 * Modules/webdatabase/SQLStatementBackend.cpp: 47 (WebCore::SQLStatementBackend::execute): 48 (WebCore::SQLStatementBackend::setDatabaseDeletedError): 49 (WebCore::SQLStatementBackend::setVersionMismatchedError): 50 (WebCore::SQLStatementBackend::setFailureDueToQuota): 51 * Modules/webdatabase/SQLStatementBackend.h: 52 (SQLStatementBackend): 53 * Modules/webdatabase/SQLTransaction.cpp: 54 (WebCore::SQLTransaction::deliverTransactionCallback): 55 (WebCore::SQLTransaction::deliverStatementCallback): 56 * Modules/webdatabase/SQLTransactionBackend.cpp: 57 (WebCore::SQLTransactionBackend::executeSQL): 58 (WebCore::SQLTransactionBackend::openTransactionAndPreflight): 59 (WebCore::SQLTransactionBackend::runCurrentStatementAndGetNextState): 60 (WebCore::SQLTransactionBackend::nextStateForCurrentStatementError): 61 (WebCore::SQLTransactionBackend::postflightAndCommit): 62 (WebCore::SQLTransactionBackend::acquireOriginLock): 63 (WebCore::SQLTransactionBackend::releaseOriginLockIfNeeded): 64 * Modules/webdatabase/SQLTransactionBackend.h: 65 (SQLTransactionBackend): 66 * Modules/webdatabase/SQLTransactionBackendSync.cpp: 67 (WebCore::SQLTransactionBackendSync::begin): 68 (WebCore::SQLTransactionBackendSync::commit): 69 1 70 2013-04-05 Geoffrey Garen <ggaren@apple.com> 2 71 -
trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h
r144006 r147796 62 62 bool setVersionInNewDatabase, DatabaseError&, String& errorMessage, OpenAttempt = FirstTryToOpenDatabase) = 0; 63 63 64 #if !PLATFORM(CHROMIUM)65 64 virtual bool hasEntryForOrigin(SecurityOrigin*) = 0; 66 65 virtual void origins(Vector<RefPtr<SecurityOrigin> >& result) = 0; … … 77 76 virtual bool deleteDatabase(SecurityOrigin*, const String& name) = 0; 78 77 79 #else // PLATFORM(CHROMIUM)80 virtual void closeDatabasesImmediately(const String& originIdentifier, const String& name) = 0;81 #endif // PLATFORM(CHROMIUM)82 83 78 virtual void interruptAllDatabasesForContext(const DatabaseBackendContext*) = 0; 84 79 -
trunk/Source/WebCore/Modules/webdatabase/ChangeVersionWrapper.cpp
r143551 r147796 53 53 if (!database->getVersionFromDatabase(actualVersion)) { 54 54 int sqliteError = database->sqliteDatabase().lastError(); 55 database->reportChangeVersionResult(1, SQLError::UNKNOWN_ERR, sqliteError);56 55 m_sqlError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to read the current version", 57 56 sqliteError, database->sqliteDatabase().lastErrorMsg()); … … 60 59 61 60 if (actualVersion != m_oldVersion) { 62 database->reportChangeVersionResult(2, SQLError::VERSION_ERR, 0);63 61 m_sqlError = SQLError::create(SQLError::VERSION_ERR, "current version of the database and `oldVersion` argument do not match"); 64 62 return false; … … 76 74 if (!database->setVersionInDatabase(m_newVersion)) { 77 75 int sqliteError = database->sqliteDatabase().lastError(); 78 database->reportChangeVersionResult(3, SQLError::UNKNOWN_ERR, sqliteError);79 76 m_sqlError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to set new version in database", 80 77 sqliteError, database->sqliteDatabase().lastErrorMsg()); … … 83 80 84 81 database->setExpectedVersion(m_newVersion); 85 86 database->reportChangeVersionResult(0, -1, 0); // OK87 82 return true; 88 83 } -
trunk/Source/WebCore/Modules/webdatabase/Database.cpp
r147795 r147796 284 284 } 285 285 286 #if PLATFORM(CHROMIUM)287 void Database::reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)288 {289 backend()->reportStartTransactionResult(errorSite, webSqlErrorCode, sqliteErrorCode);290 }291 292 void Database::reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)293 {294 backend()->reportCommitTransactionResult(errorSite, webSqlErrorCode, sqliteErrorCode);295 }296 297 #endif298 299 286 } // namespace WebCore 300 287 -
trunk/Source/WebCore/Modules/webdatabase/Database.h
r144006 r147796 87 87 Vector<String> performGetTableNames(); 88 88 89 #if PLATFORM(CHROMIUM)90 void reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);91 void reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);92 #else93 void reportStartTransactionResult(int, int, int) { }94 void reportCommitTransactionResult(int, int, int) { }95 #endif96 97 89 RefPtr<SecurityOrigin> m_databaseThreadSecurityOrigin; 98 90 RefPtr<DatabaseContext> m_databaseContext; -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackend.cpp
r143551 r147796 56 56 return false; 57 57 58 #if PLATFORM(CHROMIUM)59 DatabaseTracker::tracker().prepareToOpenDatabase(this);60 #endif61 58 bool success = false; 62 59 OwnPtr<DatabaseOpenTask> task = DatabaseOpenTask::create(this, setVersionInNewDatabase, &synchronizer, error, errorMessage, success); -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackendBase.cpp
r144006 r147796 52 52 #include <wtf/text/StringHash.h> 53 53 54 #if PLATFORM(CHROMIUM)55 #include "DatabaseObserver.h" // For error reporting.56 #endif57 58 54 // Registering "opened" databases with the DatabaseTracker 59 55 // ======================================================= … … 295 291 ~DoneCreatingDatabaseOnExitCaller() 296 292 { 297 #if !PLATFORM(CHROMIUM)298 293 DatabaseTracker::tracker().doneCreatingDatabase(m_database); 299 #else300 if (!m_openSucceeded)301 DatabaseTracker::tracker().failedToOpenDatabase(m_database);302 #endif303 294 } 304 295 … … 320 311 321 312 if (!m_sqliteDatabase.open(m_filename, true)) { 322 reportOpenDatabaseResult(1, INVALID_STATE_ERR, m_sqliteDatabase.lastError());323 313 errorMessage = formatErrorMessage("unable to open database", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 324 314 return false; … … 338 328 currentVersion = entry->value.isNull() ? emptyString() : entry->value.isolatedCopy(); 339 329 LOG(StorageAPI, "Current cached version for guid %i is %s", m_guid, currentVersion.ascii().data()); 340 341 #if PLATFORM(CHROMIUM)342 // Note: In multi-process browsers the cached value may be inaccurate, but343 // we cannot read the actual version from the database without potentially344 // inducing a form of deadlock, a busytimeout error when trying to345 // access the database. So we'll use the cached value if we're unable to read346 // the value from the database file without waiting.347 // FIXME: Add an async openDatabase method to the DatabaseAPI.348 const int noSqliteBusyWaitTime = 0;349 m_sqliteDatabase.setBusyTimeout(noSqliteBusyWaitTime);350 String versionFromDatabase;351 if (getVersionFromDatabase(versionFromDatabase, false)) {352 currentVersion = versionFromDatabase;353 updateGuidVersionMap(m_guid, currentVersion);354 }355 m_sqliteDatabase.setBusyTimeout(maxSqliteBusyWaitTime);356 #endif357 330 } else { 358 331 LOG(StorageAPI, "No cached version for guid %i", m_guid); … … 361 334 transaction.begin(); 362 335 if (!transaction.inProgress()) { 363 reportOpenDatabaseResult(2, INVALID_STATE_ERR, m_sqliteDatabase.lastError());364 336 errorMessage = formatErrorMessage("unable to open database, failed to start transaction", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 365 337 m_sqliteDatabase.close(); … … 372 344 373 345 if (!m_sqliteDatabase.executeCommand("CREATE TABLE " + tableName + " (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT NOT NULL ON CONFLICT FAIL);")) { 374 reportOpenDatabaseResult(3, INVALID_STATE_ERR, m_sqliteDatabase.lastError());375 346 errorMessage = formatErrorMessage("unable to open database, failed to create 'info' table", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 376 347 transaction.rollback(); … … 379 350 } 380 351 } else if (!getVersionFromDatabase(currentVersion, false)) { 381 reportOpenDatabaseResult(4, INVALID_STATE_ERR, m_sqliteDatabase.lastError());382 352 errorMessage = formatErrorMessage("unable to open database, failed to read current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 383 353 transaction.rollback(); … … 391 361 LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data()); 392 362 if (!setVersionInDatabase(m_expectedVersion, false)) { 393 reportOpenDatabaseResult(5, INVALID_STATE_ERR, m_sqliteDatabase.lastError());394 363 errorMessage = formatErrorMessage("unable to open database, failed to write current version", m_sqliteDatabase.lastError(), m_sqliteDatabase.lastErrorMsg()); 395 364 transaction.rollback(); … … 412 381 // If the expected version is the empty string, then we always return with whatever version of the database we have. 413 382 if ((!m_new || shouldSetVersionInNewDatabase) && m_expectedVersion.length() && m_expectedVersion != currentVersion) { 414 reportOpenDatabaseResult(6, INVALID_STATE_ERR, 0);415 383 errorMessage = "unable to open database, version mismatch, '" + m_expectedVersion + "' does not match the currentVersion of '" + currentVersion + "'"; 416 384 m_sqliteDatabase.close(); … … 431 399 if (m_new && !shouldSetVersionInNewDatabase) 432 400 m_expectedVersion = ""; // The caller provided a creationCallback which will set the expected version. 433 434 reportOpenDatabaseResult(0, -1, 0); // OK435 401 return true; 436 402 } … … 528 494 { 529 495 ASSERT(m_sqliteDatabase.transactionInProgress()); 530 #if PLATFORM(CHROMIUM)531 496 // Note: In multi-process browsers the cached value may be inaccurate. 532 497 // So we retrieve the value from the database and update the cached value here. 533 498 return getVersionFromDatabase(actualVersion, true); 534 #else535 actualVersion = getCachedVersion();536 return true;537 #endif538 499 } 539 500 … … 603 564 if (totalSize <= 10 * freeSpaceSize) { 604 565 int result = m_sqliteDatabase.runIncrementalVacuumCommand(); 605 reportVacuumDatabaseResult(result);606 566 if (result != SQLResultOk) 607 567 m_frontend->logErrorMessage(formatErrorMessage("error vacuuming database", result, m_sqliteDatabase.lastErrorMsg())); … … 620 580 } 621 581 622 #if PLATFORM(CHROMIUM)623 // These are used to generate histograms of errors seen with websql.624 // See about:histograms in chromium.625 void DatabaseBackendBase::reportOpenDatabaseResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)626 {627 DatabaseObserver::reportOpenDatabaseResult(this, errorSite, webSqlErrorCode, sqliteErrorCode);628 }629 630 void DatabaseBackendBase::reportChangeVersionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)631 {632 DatabaseObserver::reportChangeVersionResult(this, errorSite, webSqlErrorCode, sqliteErrorCode);633 }634 635 void DatabaseBackendBase::reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)636 {637 DatabaseObserver::reportStartTransactionResult(this, errorSite, webSqlErrorCode, sqliteErrorCode);638 }639 640 void DatabaseBackendBase::reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)641 {642 DatabaseObserver::reportCommitTransactionResult(this, errorSite, webSqlErrorCode, sqliteErrorCode);643 }644 645 void DatabaseBackendBase::reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode)646 {647 DatabaseObserver::reportExecuteStatementResult(this, errorSite, webSqlErrorCode, sqliteErrorCode);648 }649 650 void DatabaseBackendBase::reportVacuumDatabaseResult(int sqliteErrorCode)651 {652 DatabaseObserver::reportVacuumDatabaseResult(this, sqliteErrorCode);653 }654 655 #endif // PLATFORM(CHROMIUM)656 657 582 } // namespace WebCore 658 583 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackendBase.h
r143471 r147796 115 115 bool getActualVersionForTransaction(String& version); 116 116 117 #if PLATFORM(CHROMIUM)118 void reportOpenDatabaseResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);119 void reportChangeVersionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);120 void reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);121 void reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);122 void reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);123 void reportVacuumDatabaseResult(int sqliteErrorCode);124 #else125 void reportOpenDatabaseResult(int, int, int) { }126 void reportChangeVersionResult(int, int, int) { }127 void reportStartTransactionResult(int, int, int) { }128 void reportCommitTransactionResult(int, int, int) { }129 void reportExecuteStatementResult(int, int, int) { }130 void reportVacuumDatabaseResult(int) { }131 #endif132 133 117 static const char* databaseInfoTableName(); 134 118 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseBackendSync.cpp
r143471 r147796 55 55 bool DatabaseBackendSync::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage) 56 56 { 57 #if PLATFORM(CHROMIUM)58 DatabaseTracker::tracker().prepareToOpenDatabase(this);59 #endif60 57 return performOpenAndVerify(setVersionInNewDatabase, error, errorMessage); 61 58 } -
trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp
r146537 r147796 225 225 } 226 226 ASSERT(m_scriptExecutionContext->isWorkerContext()); 227 #if !PLATFORM(CHROMIUM)228 227 // FIXME: This needs a real implementation; this is a temporary solution for testing. 229 228 const unsigned long long defaultQuota = 5 * 1024 * 1024; 230 229 DatabaseManager::manager().setQuota(m_scriptExecutionContext->securityOrigin(), defaultQuota); 231 #endif232 230 } 233 231 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp
r144949 r147796 364 364 } 365 365 366 #if !PLATFORM(CHROMIUM)367 366 bool DatabaseManager::hasEntryForOrigin(SecurityOrigin* origin) 368 367 { … … 414 413 return m_server->deleteDatabase(origin, name); 415 414 } 416 417 #else // PLATFORM(CHROMIUM)418 void DatabaseManager::closeDatabasesImmediately(const String& originIdentifier, const String& name)419 {420 m_server->closeDatabasesImmediately(originIdentifier, name);421 }422 #endif // PLATFORM(CHROMIUM)423 415 424 416 void DatabaseManager::interruptAllDatabasesForContext(ScriptExecutionContext* context) -
trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h
r144006 r147796 90 90 String fullPathForDatabase(SecurityOrigin*, const String& name, bool createIfDoesNotExist = true); 91 91 92 #if !PLATFORM(CHROMIUM)93 92 bool hasEntryForOrigin(SecurityOrigin*); 94 93 void origins(Vector<RefPtr<SecurityOrigin> >& result); … … 104 103 bool deleteOrigin(SecurityOrigin*); 105 104 bool deleteDatabase(SecurityOrigin*, const String& name); 106 107 #else // PLATFORM(CHROMIUM)108 void closeDatabasesImmediately(const String& originIdentifier, const String& name);109 #endif // PLATFORM(CHROMIUM)110 105 111 106 void interruptAllDatabasesForContext(ScriptExecutionContext*); -
trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp
r144006 r147796 41 41 void DatabaseServer::initialize(const String& databasePath) 42 42 { 43 #if !PLATFORM(CHROMIUM)44 43 DatabaseTracker::initializeTracker(databasePath); 45 #else46 UNUSED_PARAM(databasePath);47 #endif48 44 } 49 45 50 46 void DatabaseServer::setClient(DatabaseManagerClient* client) 51 47 { 52 #if !PLATFORM(CHROMIUM)53 48 DatabaseTracker::tracker().setClient(client); 54 #else55 UNUSED_PARAM(client);56 #endif57 49 } 58 50 59 51 String DatabaseServer::databaseDirectoryPath() const 60 52 { 61 #if !PLATFORM(CHROMIUM)62 53 return DatabaseTracker::tracker().databaseDirectoryPath(); 63 #else64 return "";65 #endif66 54 } 67 55 68 56 void DatabaseServer::setDatabaseDirectoryPath(const String& path) 69 57 { 70 #if !PLATFORM(CHROMIUM)71 58 DatabaseTracker::tracker().setDatabaseDirectoryPath(path); 72 #endif73 59 } 74 60 … … 78 64 } 79 65 80 #if !PLATFORM(CHROMIUM)81 66 bool DatabaseServer::hasEntryForOrigin(SecurityOrigin* origin) 82 67 { … … 129 114 } 130 115 131 #else // PLATFORM(CHROMIUM)132 void DatabaseServer::closeDatabasesImmediately(const String& originIdentifier, const String& name)133 {134 DatabaseTracker::tracker().closeDatabasesImmediately(originIdentifier, name);135 }136 #endif // PLATFORM(CHROMIUM)137 138 116 void DatabaseServer::interruptAllDatabasesForContext(const DatabaseBackendContext* context) 139 117 { … … 151 129 switch (attempt) { 152 130 case FirstTryToOpenDatabase: 153 success = DatabaseTracker::tracker().canEstablishDatabase(backendContext.get(), name, displayName,estimatedSize, error);131 success = DatabaseTracker::tracker().canEstablishDatabase(backendContext.get(), name, estimatedSize, error); 154 132 break; 155 133 case RetryOpenDatabase: 156 success = DatabaseTracker::tracker().retryCanEstablishDatabase(backendContext.get(), name, displayName,estimatedSize, error);134 success = DatabaseTracker::tracker().retryCanEstablishDatabase(backendContext.get(), name, estimatedSize, error); 157 135 } 158 136 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h
r144006 r147796 50 50 bool setVersionInNewDatabase, DatabaseError&, String& errorMessage, OpenAttempt); 51 51 52 #if !PLATFORM(CHROMIUM)53 52 virtual bool hasEntryForOrigin(SecurityOrigin*); 54 53 virtual void origins(Vector<RefPtr<SecurityOrigin> >& result); … … 65 64 virtual bool deleteDatabase(SecurityOrigin*, const String& name); 66 65 67 #else // PLATFORM(CHROMIUM)68 virtual void closeDatabasesImmediately(const String& originIdentifier, const String& name);69 #endif // PLATFORM(CHROMIUM)70 71 66 virtual void interruptAllDatabasesForContext(const DatabaseBackendContext*); 72 67 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseSync.cpp
r143471 r147796 80 80 81 81 if (sqliteDatabase().transactionInProgress()) { 82 reportChangeVersionResult(1, SQLException::DATABASE_ERR, 0);83 82 setLastErrorMessage("unable to changeVersion from within a transaction"); 84 83 ec = SQLException::DATABASE_ERR; … … 94 93 String actualVersion; 95 94 if (!getVersionFromDatabase(actualVersion)) { 96 reportChangeVersionResult(2, SQLException::UNKNOWN_ERR, sqliteDatabase().lastError());97 95 setLastErrorMessage("unable to read the current version", sqliteDatabase().lastError(), sqliteDatabase().lastErrorMsg()); 98 96 ec = SQLException::UNKNOWN_ERR; … … 101 99 102 100 if (actualVersion != oldVersion) { 103 reportChangeVersionResult(3, SQLException::VERSION_ERR, 0);104 101 setLastErrorMessage("current version of the database and `oldVersion` argument do not match"); 105 102 ec = SQLException::VERSION_ERR; … … 113 110 114 111 if (!setVersionInDatabase(newVersion)) { 115 reportChangeVersionResult(4, SQLException::UNKNOWN_ERR, sqliteDatabase().lastError());116 112 setLastErrorMessage("unable to set the new version", sqliteDatabase().lastError(), sqliteDatabase().lastErrorMsg()); 117 113 ec = SQLException::UNKNOWN_ERR; … … 124 120 return; 125 121 } 126 127 reportChangeVersionResult(0, -1, 0); // OK128 122 129 123 setExpectedVersion(newVersion); -
trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp
r145431 r147796 157 157 } 158 158 159 bool DatabaseTracker::canEstablishDatabase(DatabaseBackendContext* context, const String& name, const String& displayName, unsigned long estimatedSize, DatabaseError& error) 160 { 161 UNUSED_PARAM(displayName); // Chromium needs the displayName but we don't. 159 bool DatabaseTracker::canEstablishDatabase(DatabaseBackendContext* context, const String& name, unsigned long estimatedSize, DatabaseError& error) 160 { 162 161 error = DatabaseError::None; 163 162 … … 210 209 // re-use it. Also note that the path for opening a database involves IO, and 211 210 // hence should not be a performance critical path anyway. 212 bool DatabaseTracker::retryCanEstablishDatabase(DatabaseBackendContext* context, const String& name, const String& displayName, unsigned long estimatedSize, DatabaseError& error) 213 { 214 // Chromium needs the displayName in canEstablishDatabase(), but we don't. 215 // Though Chromium does not use retryCanEstablishDatabase(), we should 216 // keep the prototypes for canEstablishDatabase() and its retry function 217 // the same. Hence, we also have an unneeded displayName arg here. 218 UNUSED_PARAM(displayName); 211 bool DatabaseTracker::retryCanEstablishDatabase(DatabaseBackendContext* context, const String& name, unsigned long estimatedSize, DatabaseError& error) 212 { 219 213 error = DatabaseError::None; 220 214 -
trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h
r145431 r147796 32 32 #if ENABLE(SQL_DATABASE) 33 33 34 #include "DatabaseDetails.h" 34 35 #include "DatabaseError.h" 36 #include "SQLiteDatabase.h" 37 #include "SecurityOriginHash.h" 35 38 #include <wtf/HashMap.h> 36 39 #include <wtf/HashSet.h> 40 #include <wtf/OwnPtr.h> 37 41 #include <wtf/text/StringHash.h> 38 42 #include <wtf/text/WTFString.h> 39 40 #if !PLATFORM(CHROMIUM)41 #include "DatabaseDetails.h"42 #include "SQLiteDatabase.h"43 #include "SecurityOriginHash.h"44 #include <wtf/OwnPtr.h>45 #endif // !PLATFORM(CHROMIUM)46 43 47 44 namespace WebCore { … … 49 46 class DatabaseBackendBase; 50 47 class DatabaseBackendContext; 48 class DatabaseManagerClient; 51 49 class OriginLock; 52 50 class SecurityOrigin; 53 54 #if !PLATFORM(CHROMIUM)55 class DatabaseManagerClient;56 57 #endif // !PLATFORM(CHROMIUM)58 51 59 52 class DatabaseTracker { 60 53 WTF_MAKE_NONCOPYABLE(DatabaseTracker); WTF_MAKE_FAST_ALLOCATED; 61 54 public: 62 #if !PLATFORM(CHROMIUM)63 55 static void initializeTracker(const String& databasePath); 64 #endif 56 65 57 static DatabaseTracker& tracker(); 66 58 // This singleton will potentially be used from multiple worker threads and the page's context thread simultaneously. To keep this safe, it's … … 71 63 // notificationMutex() is currently independent of the other locks. 72 64 73 bool canEstablishDatabase(DatabaseBackendContext*, const String& name, const String& displayName,unsigned long estimatedSize, DatabaseError&);74 bool retryCanEstablishDatabase(DatabaseBackendContext*, const String& name, const String& displayName,unsigned long estimatedSize, DatabaseError&);65 bool canEstablishDatabase(DatabaseBackendContext*, const String& name, unsigned long estimatedSize, DatabaseError&); 66 bool retryCanEstablishDatabase(DatabaseBackendContext*, const String& name, unsigned long estimatedSize, DatabaseError&); 75 67 76 68 void setDatabaseDetails(SecurityOrigin*, const String& name, const String& displayName, unsigned long estimatedSize); … … 90 82 bool hasAdequateQuotaForOrigin(SecurityOrigin*, unsigned long estimatedSize, DatabaseError&); 91 83 92 #if !PLATFORM(CHROMIUM)93 84 public: 94 85 void setDatabaseDirectoryPath(const String&); … … 182 173 static void scheduleForNotification(); 183 174 static void notifyDatabasesChanged(void*); 184 #else // PLATFORM(CHROMIUM)185 public:186 void closeDatabasesImmediately(const String& originIdentifier, const String& name);187 188 void prepareToOpenDatabase(DatabaseBackendBase*);189 void failedToOpenDatabase(DatabaseBackendBase*);190 191 private:192 typedef HashSet<DatabaseBackendBase*> DatabaseSet;193 typedef HashMap<String, DatabaseSet*> DatabaseNameMap;194 typedef HashMap<String, DatabaseNameMap*> DatabaseOriginMap;195 class CloseOneDatabaseImmediatelyTask;196 197 void closeOneDatabaseImmediately(const String& originIdentifier, const String& name, DatabaseBackendBase*);198 199 Mutex m_openDatabaseMapGuard;200 mutable OwnPtr<DatabaseOriginMap> m_openDatabaseMap;201 #endif // PLATFORM(CHROMIUM)202 175 }; 203 176 -
trunk/Source/WebCore/Modules/webdatabase/SQLStatementBackend.cpp
r143551 r147796 133 133 else 134 134 m_error = SQLError::create(SQLError::SYNTAX_ERR, "could not prepare statement", result, database->lastErrorMsg()); 135 db->reportExecuteStatementResult(1, m_error->code(), result);136 135 return false; 137 136 } … … 142 141 LOG(StorageAPI, "Bind parameter count doesn't match number of question marks"); 143 142 m_error = SQLError::create(db->isInterrupted() ? SQLError::DATABASE_ERR : SQLError::SYNTAX_ERR, "number of '?'s in statement string does not match argument count"); 144 db->reportExecuteStatementResult(2, m_error->code(), 0);145 143 return false; 146 144 } … … 149 147 result = statement.bindValue(i + 1, m_arguments[i]); 150 148 if (result == SQLResultFull) { 151 setFailureDueToQuota( db);149 setFailureDueToQuota(); 152 150 return false; 153 151 } … … 155 153 if (result != SQLResultOk) { 156 154 LOG(StorageAPI, "Failed to bind value index %i to statement for query '%s'", i + 1, m_statement.ascii().data()); 157 db->reportExecuteStatementResult(3, SQLError::DATABASE_ERR, result);158 155 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not bind value", result, database->lastErrorMsg()); 159 156 return false; … … 180 177 181 178 if (result != SQLResultDone) { 182 db->reportExecuteStatementResult(4, SQLError::DATABASE_ERR, result);183 179 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not iterate results", result, database->lastErrorMsg()); 184 180 return false; … … 190 186 } else if (result == SQLResultFull) { 191 187 // Return the Quota error - the delegate will be asked for more space and this statement might be re-run 192 setFailureDueToQuota( db);188 setFailureDueToQuota(); 193 189 return false; 194 190 } else if (result == SQLResultConstraint) { 195 db->reportExecuteStatementResult(6, SQLError::CONSTRAINT_ERR, result);196 191 m_error = SQLError::create(SQLError::CONSTRAINT_ERR, "could not execute statement due to a constaint failure", result, database->lastErrorMsg()); 197 192 return false; 198 193 } else { 199 db->reportExecuteStatementResult(5, SQLError::DATABASE_ERR, result);200 194 m_error = SQLError::create(SQLError::DATABASE_ERR, "could not execute statement", result, database->lastErrorMsg()); 201 195 return false; … … 208 202 209 203 m_resultSet = resultSet; 210 db->reportExecuteStatementResult(0, -1, 0); // OK211 204 return true; 212 205 } 213 206 214 void SQLStatementBackend::setDatabaseDeletedError( DatabaseBackend* database)207 void SQLStatementBackend::setDatabaseDeletedError() 215 208 { 216 209 ASSERT(!m_error && !m_resultSet); 217 database->reportExecuteStatementResult(6, SQLError::UNKNOWN_ERR, 0);218 210 m_error = SQLError::create(SQLError::UNKNOWN_ERR, "unable to execute statement, because the user deleted the database"); 219 211 } 220 212 221 void SQLStatementBackend::setVersionMismatchedError( DatabaseBackend* database)213 void SQLStatementBackend::setVersionMismatchedError() 222 214 { 223 215 ASSERT(!m_error && !m_resultSet); 224 database->reportExecuteStatementResult(7, SQLError::VERSION_ERR, 0);225 216 m_error = SQLError::create(SQLError::VERSION_ERR, "current version of the database and `oldVersion` argument do not match"); 226 217 } 227 218 228 void SQLStatementBackend::setFailureDueToQuota( DatabaseBackend* database)219 void SQLStatementBackend::setFailureDueToQuota() 229 220 { 230 221 ASSERT(!m_error && !m_resultSet); 231 database->reportExecuteStatementResult(8, SQLError::QUOTA_ERR, 0);232 222 m_error = SQLError::create(SQLError::QUOTA_ERR, "there was not enough remaining storage space, or the storage quota was reached and the user declined to allow more space"); 233 223 } -
trunk/Source/WebCore/Modules/webdatabase/SQLStatementBackend.h
r143551 r147796 56 56 bool hasStatementErrorCallback() const { return m_hasErrorCallback; } 57 57 58 void setDatabaseDeletedError( DatabaseBackend*);59 void setVersionMismatchedError( DatabaseBackend*);58 void setDatabaseDeletedError(); 59 void setVersionMismatchedError(); 60 60 61 61 AbstractSQLStatement* frontend(); … … 67 67 const Vector<SQLValue>& arguments, int permissions); 68 68 69 void setFailureDueToQuota( DatabaseBackend*);69 void setFailureDueToQuota(); 70 70 void clearFailureDueToQuota(); 71 71 -
trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp
r143489 r147796 151 151 SQLTransactionState nextState = SQLTransactionState::RunStatements; 152 152 if (shouldDeliverErrorCallback) { 153 m_database->reportStartTransactionResult(5, SQLError::UNKNOWN_ERR, 0);154 153 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "the SQLTransactionCallback was null or threw an exception"); 155 154 nextState = SQLTransactionState::DeliverTransactionErrorCallback; 156 155 } 157 m_database->reportStartTransactionResult(0, -1, 0); // OK158 156 return nextState; 159 157 } … … 199 197 200 198 if (result) { 201 m_database->reportCommitTransactionResult(2, SQLError::UNKNOWN_ERR, 0);202 199 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "the statement callback raised an exception or statement error callback did not return false"); 203 200 return nextStateForTransactionError(); -
trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp
r144760 r147796 532 532 533 533 if (Database::from(m_database.get())->deleted()) 534 statementBackend->setDatabaseDeletedError( m_database.get());534 statementBackend->setDatabaseDeletedError(); 535 535 536 536 enqueueStatementBackend(statementBackend); … … 570 570 // If the database was deleted, jump to the error callback 571 571 if (Database::from(m_database.get())->deleted()) { 572 m_database->reportStartTransactionResult(1, SQLError::UNKNOWN_ERR, 0);573 572 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to open a transaction, because the user deleted the database"); 574 573 return nextStateForTransactionError(); … … 592 591 if (!m_sqliteTransaction->inProgress()) { 593 592 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 594 m_database->reportStartTransactionResult(2, SQLError::DATABASE_ERR, m_database->sqliteDatabase().lastError());595 593 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to begin transaction", 596 594 m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); … … 604 602 String actualVersion; 605 603 if (!m_database->getActualVersionForTransaction(actualVersion)) { 606 m_database->reportStartTransactionResult(3, SQLError::DATABASE_ERR, m_database->sqliteDatabase().lastError());607 604 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to read version", 608 605 m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); … … 620 617 m_database->enableAuthorizer(); 621 618 m_transactionError = m_wrapper->sqlError(); 622 if (!m_transactionError) { 623 m_database->reportStartTransactionResult(4, SQLError::UNKNOWN_ERR, 0); 619 if (!m_transactionError) 624 620 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occurred during transaction preflight"); 625 }626 621 return nextStateForTransactionError(); 627 622 } … … 688 683 689 684 if (m_hasVersionMismatch) 690 m_currentStatementBackend->setVersionMismatchedError( Database::from(m_database.get()));685 m_currentStatementBackend->setVersionMismatchedError(); 691 686 692 687 if (m_currentStatementBackend->execute(m_database.get())) { … … 720 715 721 716 m_transactionError = m_currentStatementBackend->sqlError(); 722 if (!m_transactionError) { 723 m_database->reportCommitTransactionResult(1, SQLError::DATABASE_ERR, 0); 717 if (!m_transactionError) 724 718 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "the statement failed to execute"); 725 }726 719 return nextStateForTransactionError(); 727 720 } … … 734 727 if (m_wrapper && !m_wrapper->performPostflight(this)) { 735 728 m_transactionError = m_wrapper->sqlError(); 736 if (!m_transactionError) { 737 m_database->reportCommitTransactionResult(3, SQLError::UNKNOWN_ERR, 0); 729 if (!m_transactionError) 738 730 m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occurred during transaction postflight"); 739 }740 731 return nextStateForTransactionError(); 741 732 } … … 754 745 if (m_wrapper) 755 746 m_wrapper->handleCommitFailedAfterPostflight(this); 756 m_database->reportCommitTransactionResult(4, SQLError::DATABASE_ERR, m_database->sqliteDatabase().lastError());757 747 m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to commit transaction", 758 748 m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); 759 749 return nextStateForTransactionError(); 760 750 } 761 762 m_database->reportCommitTransactionResult(0, -1, 0); // OK763 751 764 752 // Vacuum the database if anything was deleted. … … 850 838 void SQLTransactionBackend::acquireOriginLock() 851 839 { 852 #if !PLATFORM(CHROMIUM)853 840 ASSERT(!m_originLock); 854 841 m_originLock = DatabaseTracker::tracker().originLockFor(m_database->securityOrigin()); 855 842 m_originLock->lock(); 856 #endif857 843 } 858 844 859 845 void SQLTransactionBackend::releaseOriginLockIfNeeded() 860 846 { 861 #if !PLATFORM(CHROMIUM)862 847 if (m_originLock) { 863 848 m_originLock->unlock(); 864 849 m_originLock.clear(); 865 850 } 866 #endif867 851 } 868 852 -
trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.h
r144760 r147796 133 133 134 134 OwnPtr<SQLiteTransaction> m_sqliteTransaction; 135 #if !PLATFORM(CHROMIUM)136 135 RefPtr<OriginLock> m_originLock; 137 #endif138 136 }; 139 137 -
trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackendSync.cpp
r144006 r147796 132 132 ASSERT(m_database->scriptExecutionContext()->isContextThread()); 133 133 if (!m_database->opened()) { 134 m_database->reportStartTransactionResult(1, SQLException::UNKNOWN_ERR, 0);135 134 m_database->setLastErrorMessage("cannot begin transaction because the database is not open"); 136 135 return SQLException::UNKNOWN_ERR; … … 154 153 if (!m_sqliteTransaction->inProgress()) { 155 154 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 156 m_database->reportStartTransactionResult(2, SQLException::DATABASE_ERR, m_database->sqliteDatabase().lastError());157 155 m_database->setLastErrorMessage("unable to begin transaction", 158 156 m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); … … 166 164 String actualVersion; 167 165 if (!m_database->getActualVersionForTransaction(actualVersion)) { 168 m_database->reportStartTransactionResult(3, SQLException::DATABASE_ERR, m_database->sqliteDatabase().lastError());169 166 m_database->setLastErrorMessage("unable to read version", 170 167 m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); … … 173 170 } 174 171 m_hasVersionMismatch = !m_database->expectedVersion().isEmpty() && (m_database->expectedVersion() != actualVersion); 175 m_database->reportStartTransactionResult(0, -1, 0); // OK176 172 return 0; 177 173 } … … 195 191 ASSERT(m_database->scriptExecutionContext()->isContextThread()); 196 192 if (!m_database->opened()) { 197 m_database->reportCommitTransactionResult(1, SQLException::UNKNOWN_ERR, 0);198 193 m_database->setLastErrorMessage("unable to commit transaction because the database is not open."); 199 194 return SQLException::UNKNOWN_ERR; … … 208 203 // If the commit failed, the transaction will still be marked as "in progress" 209 204 if (m_sqliteTransaction->inProgress()) { 210 m_database->reportCommitTransactionResult(2, SQLException::DATABASE_ERR, m_database->sqliteDatabase().lastError());211 205 m_database->setLastErrorMessage("unable to commit transaction", 212 206 m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg()); … … 223 217 if (m_modifiedDatabase) 224 218 m_transactionClient->didCommitWriteTransaction(database()); 225 226 m_database->reportCommitTransactionResult(0, -1, 0); // OK227 219 return 0; 228 220 }
Note: See TracChangeset
for help on using the changeset viewer.