summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-12 19:24:04 +0000
committerdumi@chromium.org <dumi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-12 19:24:04 +0000
commit2b0ec8bb8b1d5e113ad072b27c3f157d985c6b21 (patch)
tree7fd39372550d1bbb60dba7483151344a06c3ca60 /chrome
parentd84ac11ef8abf2366f8544fe76db3cb0e645e177 (diff)
downloadchromium_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.cc31
-rw-r--r--chrome/browser/renderer_host/database_dispatcher_host.h6
-rw-r--r--chrome/common/db_message_filter.cc9
-rw-r--r--chrome/common/db_message_filter.h4
-rw-r--r--chrome/common/render_messages_internal.h5
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)