diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/profile.cc | 19 | ||||
-rw-r--r-- | chrome/browser/renderer_host/database_dispatcher_host.cc | 44 | ||||
-rw-r--r-- | chrome/test/testing_profile.cc | 2 |
3 files changed, 54 insertions, 11 deletions
diff --git a/chrome/browser/profile.cc b/chrome/browser/profile.cc index ea689e6..15ef278 100644 --- a/chrome/browser/profile.cc +++ b/chrome/browser/profile.cc @@ -316,6 +316,13 @@ class OffTheRecordProfileImpl : public Profile, Source<Profile>(this), NotificationService::NoDetails()); CleanupRequestContext(request_context_); + + // Clean up all DB files/directories + ChromeThread::PostTask( + ChromeThread::FILE, FROM_HERE, + NewRunnableMethod( + db_tracker_.get(), + &webkit_database::DatabaseTracker::DeleteIncognitoDBDirectory)); } virtual ProfileId GetRuntimeId() { @@ -342,8 +349,10 @@ class OffTheRecordProfileImpl : public Profile, } virtual webkit_database::DatabaseTracker* GetDatabaseTracker() { - if (!db_tracker_) - db_tracker_ = new webkit_database::DatabaseTracker(FilePath()); + if (!db_tracker_) { + db_tracker_ = new webkit_database::DatabaseTracker( + GetPath(), IsOffTheRecord()); + } return db_tracker_; } @@ -1017,8 +1026,10 @@ Profile* ProfileImpl::GetOriginalProfile() { } webkit_database::DatabaseTracker* ProfileImpl::GetDatabaseTracker() { - if (!db_tracker_) - db_tracker_ = new webkit_database::DatabaseTracker(GetPath()); + if (!db_tracker_) { + db_tracker_ = new webkit_database::DatabaseTracker( + GetPath(), IsOffTheRecord()); + } return db_tracker_; } diff --git a/chrome/browser/renderer_host/database_dispatcher_host.cc b/chrome/browser/renderer_host/database_dispatcher_host.cc index f9f3528..eb51fb9 100644 --- a/chrome/browser/renderer_host/database_dispatcher_host.cc +++ b/chrome/browser/renderer_host/database_dispatcher_host.cc @@ -157,13 +157,19 @@ void DatabaseDispatcherHost::DatabaseOpenFile(const string16& vfs_file_name, int desired_flags, IPC::Message* reply_msg) { DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); + base::PlatformFile file_handle = base::kInvalidPlatformFileValue; base::PlatformFile target_handle = base::kInvalidPlatformFileValue; string16 origin_identifier; string16 database_name; + + // When in incognito mode, we want to make sure that all DB files are + // removed when the incognito profile goes away, so we add the + // SQLITE_OPEN_DELETEONCLOSE flag when opening all files, and keep + // open handles to them in the database tracker to make sure they're + // around for as long as needed. if (vfs_file_name.empty()) { VfsBackend::OpenTempFileInDirectory(db_tracker_->DatabaseDirectory(), - desired_flags, process_handle_, - &target_handle); + desired_flags, &file_handle); } else if (DatabaseUtil::CrackVfsFileName(vfs_file_name, &origin_identifier, &database_name, NULL) && !db_tracker_->IsDatabaseScheduledForDeletion(origin_identifier, @@ -171,17 +177,35 @@ void DatabaseDispatcherHost::DatabaseOpenFile(const string16& vfs_file_name, FilePath db_file = DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name); if (!db_file.empty()) { - VfsBackend::OpenFile(db_file, desired_flags, process_handle_, - &target_handle); + if (db_tracker_->IsIncognitoProfile()) { + db_tracker_->GetIncognitoFileHandle(vfs_file_name, &file_handle); + if (file_handle == base::kInvalidPlatformFileValue) { + VfsBackend::OpenFile(db_file, + desired_flags | SQLITE_OPEN_DELETEONCLOSE, + &file_handle); + if (VfsBackend::FileTypeIsMainDB(desired_flags) || + VfsBackend::FileTypeIsJournal(desired_flags)) + db_tracker_->SaveIncognitoFileHandle(vfs_file_name, file_handle); + } + } else { + VfsBackend::OpenFile(db_file, desired_flags, &file_handle); + } } } + // Then we duplicate the file handle to make it useable in the renderer + // process. The original handle is closed, unless we saved it in the + // database tracker. + bool auto_close = !db_tracker_->HasSavedIncognitoFileHandle(vfs_file_name); + VfsBackend::GetFileHandleForProcess(process_handle_, file_handle, + &target_handle, auto_close); + ViewHostMsg_DatabaseOpenFile::WriteReplyParams( reply_msg, #if defined(OS_WIN) target_handle #elif defined(OS_POSIX) - base::FileDescriptor(target_handle, true) + base::FileDescriptor(target_handle, auto_close) #endif ); Send(reply_msg); @@ -216,7 +240,15 @@ void DatabaseDispatcherHost::DatabaseDeleteFile(const string16& vfs_file_name, FilePath db_file = DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name); if (!db_file.empty()) { - error_code = VfsBackend::DeleteFile(db_file, sync_dir); + // In order to delete a journal file in incognito mode, we only need to + // close the open handle to it that's stored in the database tracker. + if (db_tracker_->IsIncognitoProfile()) { + if (db_tracker_->CloseIncognitoFileHandle(vfs_file_name)) + error_code = SQLITE_OK; + } else { + error_code = VfsBackend::DeleteFile(db_file, sync_dir); + } + if ((error_code == SQLITE_IOERR_DELETE) && reschedule_count) { // If the file could not be deleted, try again. ChromeThread::PostDelayedTask( diff --git a/chrome/test/testing_profile.cc b/chrome/test/testing_profile.cc index 4481105..3d8ea0d 100644 --- a/chrome/test/testing_profile.cc +++ b/chrome/test/testing_profile.cc @@ -288,7 +288,7 @@ void TestingProfile::UseThemeProvider(BrowserThemeProvider* theme_provider) { webkit_database::DatabaseTracker* TestingProfile::GetDatabaseTracker() { if (!db_tracker_) - db_tracker_ = new webkit_database::DatabaseTracker(GetPath()); + db_tracker_ = new webkit_database::DatabaseTracker(GetPath(), false); return db_tracker_; } |