diff options
author | dumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-12 19:24:04 +0000 |
---|---|---|
committer | dumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-12 19:24:04 +0000 |
commit | 2b0ec8bb8b1d5e113ad072b27c3f157d985c6b21 (patch) | |
tree | 7fd39372550d1bbb60dba7483151344a06c3ca60 /chrome | |
parent | d84ac11ef8abf2366f8544fe76db3cb0e645e177 (diff) | |
download | chromium_src-2b0ec8bb8b1d5e113ad072b27c3f157d985c6b21.zip chromium_src-2b0ec8bb8b1d5e113ad072b27c3f157d985c6b21.tar.gz chromium_src-2b0ec8bb8b1d5e113ad072b27c3f157d985c6b21.tar.bz2 |
Ask renderers to immediately close all DB handles to a database file
when the file needs to be deleted.
TEST=none
BUG=none
Review URL: http://codereview.chromium.org/594002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38911 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/renderer_host/database_dispatcher_host.cc | 31 | ||||
-rw-r--r-- | chrome/browser/renderer_host/database_dispatcher_host.h | 6 | ||||
-rw-r--r-- | chrome/common/db_message_filter.cc | 9 | ||||
-rw-r--r-- | chrome/common/db_message_filter.h | 4 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 5 |
5 files changed, 46 insertions, 9 deletions
diff --git a/chrome/browser/renderer_host/database_dispatcher_host.cc b/chrome/browser/renderer_host/database_dispatcher_host.cc index d72ca06..a57244a 100644 --- a/chrome/browser/renderer_host/database_dispatcher_host.cc +++ b/chrome/browser/renderer_host/database_dispatcher_host.cc @@ -196,17 +196,22 @@ void DatabaseDispatcherHost::DatabaseOpenFile(const string16& vfs_file_name, DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); base::PlatformFile target_handle = base::kInvalidPlatformFileValue; base::PlatformFile target_dir_handle = base::kInvalidPlatformFileValue; + string16 origin_identifier; + string16 database_name; if (vfs_file_name.empty()) { VfsBackend::OpenTempFileInDirectory(db_tracker_->DatabaseDirectory(), desired_flags, process_handle_, &target_handle, &target_dir_handle); - } else { - FilePath db_file = - DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name); - if (!db_file.empty()) { - VfsBackend::OpenFile(db_file, desired_flags, process_handle_, - &target_handle, &target_dir_handle); - } + } else if (DatabaseUtil::CrackVfsFileName(vfs_file_name, &origin_identifier, + &database_name, NULL) && + !db_tracker_->IsDatabaseScheduledForDeletion(origin_identifier, + database_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, &target_dir_handle); + } } ViewMsg_DatabaseOpenFileResponse_Params response_params; @@ -430,6 +435,18 @@ void DatabaseDispatcherHost::OnDatabaseSizeChanged( } } +void DatabaseDispatcherHost::OnDatabaseScheduledForDeletion( + const string16& origin_identifier, + const string16& database_name) { + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); + ChromeThread::PostTask( + ChromeThread::IO, FROM_HERE, + NewRunnableMethod(this, + &DatabaseDispatcherHost::SendMessage, + new ViewMsg_DatabaseCloseImmediately( + origin_identifier, database_name))); +} + void DatabaseDispatcherHost::OnDatabaseOpenFileAllowed( const string16& vfs_file_name, int desired_flags, int32 message_id) { DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); diff --git a/chrome/browser/renderer_host/database_dispatcher_host.h b/chrome/browser/renderer_host/database_dispatcher_host.h index 95f8d86..e9b3f2b 100644 --- a/chrome/browser/renderer_host/database_dispatcher_host.h +++ b/chrome/browser/renderer_host/database_dispatcher_host.h @@ -49,11 +49,13 @@ class DatabaseDispatcherHost void OnDatabaseClosed(const string16& origin_identifier, const string16& database_name); - // DatabaseTracker::Observer callback (file thread) + // DatabaseTracker::Observer callbacks (file thread) virtual void OnDatabaseSizeChanged(const string16& origin_identifier, const string16& database_name, int64 database_size, int64 space_available); + virtual void OnDatabaseScheduledForDeletion(const string16& origin_identifier, + const string16& database_name); private: void AddObserver(); @@ -77,7 +79,7 @@ class DatabaseDispatcherHost // Database tracker message handlers (file thread) void DatabaseOpened(const string16& origin_identifier, - const string16& file_name, + const string16& database_name, const string16& description, int64 estimated_size); void DatabaseModified(const string16& origin_identifier, diff --git a/chrome/common/db_message_filter.cc b/chrome/common/db_message_filter.cc index a3e6bd8..fb1944b 100644 --- a/chrome/common/db_message_filter.cc +++ b/chrome/common/db_message_filter.cc @@ -66,6 +66,8 @@ bool DBMessageFilter::OnMessageReceived(const IPC::Message& message) { OnResponse<uint32>) IPC_MESSAGE_HANDLER(ViewMsg_DatabaseGetFileSizeResponse, OnResponse<int64>) IPC_MESSAGE_HANDLER(ViewMsg_DatabaseUpdateSize, OnDatabaseUpdateSize) + IPC_MESSAGE_HANDLER(ViewMsg_DatabaseCloseImmediately, + OnDatabaseCloseImmediately) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -78,3 +80,10 @@ void DBMessageFilter::OnDatabaseUpdateSize(const string16& origin_identifier, WebKit::WebDatabase::updateDatabaseSize( origin_identifier, database_name, database_size, space_available); } + +void DBMessageFilter::OnDatabaseCloseImmediately( + const string16& origin_identifier, + const string16& database_name) { + WebKit::WebDatabase::closeDatabaseImmediately( + origin_identifier, database_name); +} diff --git a/chrome/common/db_message_filter.h b/chrome/common/db_message_filter.h index f28ea4b..aaf468f 100644 --- a/chrome/common/db_message_filter.h +++ b/chrome/common/db_message_filter.h @@ -98,6 +98,10 @@ class DBMessageFilter : public IPC::ChannelProxy::MessageFilter { int64 database_size, int64 space_available); + // Processes IPCs that ask for a DB to be closed immediately. + void OnDatabaseCloseImmediately(const string16& origin_identifier, + const string16& database_name); + // The message loop for the IO thread. MessageLoop* io_thread_message_loop_; diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index a37ba09..ad7f7c4 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -804,6 +804,11 @@ IPC_MESSAGE_ROUTED4(ViewMsg_NotifyLowLatencyAudioStreamCreated, int64 /* the new database size */, int64 /* space available to origin */) + // Asks the child process to close a database immediately + IPC_MESSAGE_CONTROL2(ViewMsg_DatabaseCloseImmediately, + string16 /* the origin */, + string16 /* the database name */) + // Storage events are broadcast to renderer processes. IPC_MESSAGE_CONTROL1(ViewMsg_DOMStorageEvent, ViewMsg_DOMStorageEvent_Params) |