| Index: webkit/tools/test_shell/simple_database_system.cc
 | 
| ===================================================================
 | 
| --- webkit/tools/test_shell/simple_database_system.cc	(revision 31991)
 | 
| +++ webkit/tools/test_shell/simple_database_system.cc	(working copy)
 | 
| @@ -13,9 +13,13 @@
 | 
|  #include "base/file_util.h"
 | 
|  #include "base/platform_thread.h"
 | 
|  #include "base/process_util.h"
 | 
| +#include "third_party/WebKit/WebKit/chromium/public/WebDatabase.h"
 | 
| +#include "third_party/WebKit/WebKit/chromium/public/WebString.h"
 | 
| +#include "webkit/database/database_util.h"
 | 
|  #include "webkit/database/vfs_backend.h"
 | 
| -#include "webkit/glue/webkit_glue.h"
 | 
|  
 | 
| +using webkit_database::DatabaseTracker;
 | 
| +using webkit_database::DatabaseUtil;
 | 
|  using webkit_database::VfsBackend;
 | 
|  
 | 
|  SimpleDatabaseSystem* SimpleDatabaseSystem::instance_ = NULL;
 | 
| @@ -25,63 +29,48 @@
 | 
|    return instance_;
 | 
|  }
 | 
|  
 | 
| -SimpleDatabaseSystem::SimpleDatabaseSystem()
 | 
| -    : hack_main_db_handle_(base::kInvalidPlatformFileValue) {
 | 
| +SimpleDatabaseSystem::SimpleDatabaseSystem() {
 | 
|    temp_dir_.CreateUniqueTempDir();
 | 
| +  db_tracker_ = new DatabaseTracker(temp_dir_.path());
 | 
|    DCHECK(!instance_);
 | 
|    instance_ = this;
 | 
|  }
 | 
|  
 | 
|  SimpleDatabaseSystem::~SimpleDatabaseSystem() {
 | 
| -  base::ClosePlatformFile(hack_main_db_handle_);
 | 
|    instance_ = NULL;
 | 
|  }
 | 
|  
 | 
|  base::PlatformFile SimpleDatabaseSystem::OpenFile(
 | 
| -      const FilePath& file_name, int desired_flags,
 | 
| +      const string16& vfs_file_name, int desired_flags,
 | 
|        base::PlatformFile* dir_handle) {
 | 
|    base::PlatformFile file_handle = base::kInvalidPlatformFileValue;
 | 
| +  FilePath file_name =
 | 
| +      DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name);
 | 
|    if (file_name.empty()) {
 | 
|      VfsBackend::OpenTempFileInDirectory(
 | 
| -        GetDBDir(), desired_flags, base::GetCurrentProcessHandle(),
 | 
| -        &file_handle, dir_handle);
 | 
| +        db_tracker_->DatabaseDirectory(), desired_flags,
 | 
| +        base::GetCurrentProcessHandle(), &file_handle, dir_handle);
 | 
|    } else {
 | 
| -    VfsBackend::OpenFile(GetDBFileFullPath(file_name), desired_flags,
 | 
| +    VfsBackend::OpenFile(file_name, desired_flags,
 | 
|                           base::GetCurrentProcessHandle(), &file_handle,
 | 
|                           dir_handle);
 | 
|    }
 | 
|  
 | 
| -  // HACK: Currently, the DB object that keeps track of the main database
 | 
| -  // (DatabaseTracker) is a singleton that is declared as a static variable
 | 
| -  // in a function, so it gets destroyed at the very end of the program.
 | 
| -  // Because of that, we have a handle opened to the main DB file until the
 | 
| -  // very end of the program, which prevents temp_dir_'s destructor from
 | 
| -  // deleting the database directory.
 | 
| -  //
 | 
| -  // We will properly solve this problem when we reimplement DatabaseTracker.
 | 
| -  // For now, however, we are going to take advantage of the fact that in order
 | 
| -  // to do anything related to DBs, we have to call openDatabase() first, which
 | 
| -  // opens a handle to the main DB before opening handles to any other DB files.
 | 
| -  // We are going to cache the first file handle we get, and we are going to
 | 
| -  // manually close it in the destructor.
 | 
| -  if (hack_main_db_handle_ == base::kInvalidPlatformFileValue) {
 | 
| -    hack_main_db_handle_ = file_handle;
 | 
| -  }
 | 
| -
 | 
|    return file_handle;
 | 
|  }
 | 
|  
 | 
|  int SimpleDatabaseSystem::DeleteFile(
 | 
| -    const FilePath& file_name, bool sync_dir) {
 | 
| +    const string16& vfs_file_name, bool sync_dir) {
 | 
|    // We try to delete the file multiple times, because that's what the default
 | 
|    // VFS does (apparently deleting a file can sometimes fail on Windows).
 | 
|    // We sleep for 10ms between retries for the same reason.
 | 
|    const int kNumDeleteRetries = 3;
 | 
|    int num_retries = 0;
 | 
|    int error_code = SQLITE_OK;
 | 
| +  FilePath file_name =
 | 
| +      DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name);
 | 
|    do {
 | 
| -    error_code = VfsBackend::DeleteFile(
 | 
| -        GetDBFileFullPath(file_name), sync_dir);
 | 
| +    error_code = VfsBackend::DeleteFile(file_name, sync_dir);
 | 
|    } while ((++num_retries < kNumDeleteRetries) &&
 | 
|             (error_code == SQLITE_IOERR_DELETE) &&
 | 
|             (PlatformThread::Sleep(10), 1));
 | 
| @@ -89,25 +78,65 @@
 | 
|    return error_code;
 | 
|  }
 | 
|  
 | 
| -long SimpleDatabaseSystem::GetFileAttributes(
 | 
| -    const FilePath& file_name) {
 | 
| -  return VfsBackend::GetFileAttributes(GetDBFileFullPath(file_name));
 | 
| +long SimpleDatabaseSystem::GetFileAttributes(const string16& vfs_file_name) {
 | 
| +  return VfsBackend::GetFileAttributes(
 | 
| +      DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name));
 | 
|  }
 | 
|  
 | 
| -long long SimpleDatabaseSystem::GetFileSize(
 | 
| -    const FilePath& file_name) {
 | 
| -  return VfsBackend::GetFileSize(GetDBFileFullPath(file_name));
 | 
| +long long SimpleDatabaseSystem::GetFileSize(const string16& vfs_file_name) {
 | 
| +  return VfsBackend::GetFileSize(
 | 
| +      DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name));
 | 
|  }
 | 
|  
 | 
| -void SimpleDatabaseSystem::ClearAllDatabases() {
 | 
| -  // TODO(dumi): implement this once we refactor DatabaseTracker
 | 
| -  //file_util::Delete(GetDBDir(), true);
 | 
| +void SimpleDatabaseSystem::DatabaseOpened(const string16& origin_identifier,
 | 
| +                                          const string16& database_name,
 | 
| +                                          const string16& description,
 | 
| +                                          int64 estimated_size) {
 | 
| +  int64 database_size = 0;
 | 
| +  int64 space_available = 0;
 | 
| +  db_tracker_->DatabaseOpened(origin_identifier, database_name, description,
 | 
| +                              estimated_size, &database_size, &space_available);
 | 
| +  OnDatabaseSizeChanged(origin_identifier, database_name,
 | 
| +                        database_size, space_available);
 | 
|  }
 | 
|  
 | 
| -FilePath SimpleDatabaseSystem::GetDBDir() {
 | 
| -  return temp_dir_.path().Append(FILE_PATH_LITERAL("databases"));
 | 
| +void SimpleDatabaseSystem::DatabaseModified(const string16& origin_identifier,
 | 
| +                                            const string16& database_name) {
 | 
| +  db_tracker_->DatabaseModified(origin_identifier, database_name);
 | 
|  }
 | 
|  
 | 
| -FilePath SimpleDatabaseSystem::GetDBFileFullPath(const FilePath& file_name) {
 | 
| -  return GetDBDir().Append(file_name);
 | 
| +void SimpleDatabaseSystem::DatabaseClosed(const string16& origin_identifier,
 | 
| +                                          const string16& database_name) {
 | 
| +  db_tracker_->DatabaseClosed(origin_identifier, database_name);
 | 
|  }
 | 
| +
 | 
| +void SimpleDatabaseSystem::OnDatabaseSizeChanged(
 | 
| +    const string16& origin_identifier,
 | 
| +    const string16& database_name,
 | 
| +    int64 database_size,
 | 
| +    int64 space_available) {
 | 
| +  WebKit::WebDatabase::updateDatabaseSize(
 | 
| +      origin_identifier, database_name, database_size, space_available);
 | 
| +}
 | 
| +
 | 
| +void SimpleDatabaseSystem::databaseOpened(const WebKit::WebDatabase& database) {
 | 
| +  DatabaseOpened(database.securityOrigin().databaseIdentifier(),
 | 
| +                 database.name(), database.displayName(),
 | 
| +                 database.estimatedSize());
 | 
| +}
 | 
| +
 | 
| +void SimpleDatabaseSystem::databaseModified(
 | 
| +    const WebKit::WebDatabase& database) {
 | 
| +  DatabaseModified(database.securityOrigin().databaseIdentifier(),
 | 
| +                   database.name());
 | 
| +}
 | 
| +
 | 
| +void SimpleDatabaseSystem::databaseClosed(const WebKit::WebDatabase& database) {
 | 
| +  DatabaseClosed(database.securityOrigin().databaseIdentifier(),
 | 
| +                 database.name());
 | 
| +}
 | 
| +
 | 
| +void SimpleDatabaseSystem::ClearAllDatabases() {
 | 
| +  db_tracker_->CloseTrackerDatabaseAndClearCaches();
 | 
| +  file_util::Delete(db_tracker_->DatabaseDirectory(), true);
 | 
| +}
 | 
| 
 |