Index: chrome/browser/renderer_host/database_dispatcher_host.cc |
diff --git a/chrome/browser/renderer_host/database_dispatcher_host.cc b/chrome/browser/renderer_host/database_dispatcher_host.cc |
index e7734aca97c87dad403db0cb8018b218e0a741c7..fed3e8929a61c5a3bd1b17c6bbebd3d12cc787ea 100644 |
--- a/chrome/browser/renderer_host/database_dispatcher_host.cc |
+++ b/chrome/browser/renderer_host/database_dispatcher_host.cc |
@@ -97,6 +97,7 @@ bool DatabaseDispatcherHost::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ViewHostMsg_DatabaseOpened, OnDatabaseOpened) |
IPC_MESSAGE_HANDLER(ViewHostMsg_DatabaseModified, OnDatabaseModified) |
IPC_MESSAGE_HANDLER(ViewHostMsg_DatabaseClosed, OnDatabaseClosed) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_AllowDatabase, OnAllowDatabase) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP_EX() |
return handled; |
@@ -107,11 +108,18 @@ void DatabaseDispatcherHost::ReceivedBadMessage(uint32 msg_type) { |
msg_type, process_handle_); |
} |
-// Scheduled by the file thread on the IO thread. |
-// Sends back to the renderer process the given message. |
-void DatabaseDispatcherHost::SendMessage(IPC::Message* message) { |
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
- if (!shutdown_) |
+void DatabaseDispatcherHost::Send(IPC::Message* message) { |
+ if (!ChromeThread::CurrentlyOn(ChromeThread::IO)) { |
+ if (!ChromeThread::PostTask( |
+ ChromeThread::IO, FROM_HERE, |
+ NewRunnableMethod(this, |
+ &DatabaseDispatcherHost::Send, |
+ message))) |
+ delete message; |
+ return; |
+ } |
+ |
+ if (!shutdown_ && resource_message_filter_) |
resource_message_filter_->Send(message); |
else |
delete message; |
@@ -127,55 +135,13 @@ void DatabaseDispatcherHost::OnDatabaseOpenFile(const string16& vfs_file_name, |
NewRunnableMethod(this, &DatabaseDispatcherHost::AddObserver)); |
} |
- // Only ask permission on the main database file in read/write mode. |
- if (!VfsBackend::FileTypeIsMainDB(desired_flags) || |
- !VfsBackend::OpenTypeIsReadWrite(desired_flags)) { |
- OnDatabaseOpenFileAllowed(vfs_file_name, desired_flags, message_id); |
- return; |
- } |
- |
- string16 origin_identifier; |
- string16 database_name; |
- bool ok = DatabaseUtil::CrackVfsFileName(vfs_file_name, |
- &origin_identifier, |
- &database_name, |
- NULL); |
- DCHECK(ok); // Should we assume this is an attack and kill the renderer? |
- if (!ok) { |
- OnDatabaseOpenFileBlocked(message_id); |
- return; |
- } |
- |
- // TODO(jorlow): createFromDatabaseIdentifier should not return a pointer. |
- scoped_ptr<WebSecurityOrigin> security_origin( |
- WebSecurityOrigin::createFromDatabaseIdentifier(origin_identifier)); |
- string16 origin(security_origin->toString()); |
- GURL url = GURL(origin); |
- |
- HostContentSettingsMap* host_content_settings_map = resource_message_filter_-> |
- GetRequestContextForURL(url)->host_content_settings_map(); |
- ContentSetting content_setting = host_content_settings_map->GetContentSetting( |
- url.host(), CONTENT_SETTINGS_TYPE_COOKIES); |
- |
- if (content_setting == CONTENT_SETTING_ASK) { |
- // Create a task for each possible outcome. |
- scoped_ptr<Task> on_allow(NewRunnableMethod( |
- this, &DatabaseDispatcherHost::OnDatabaseOpenFileAllowed, |
- vfs_file_name, desired_flags, message_id)); |
- scoped_ptr<Task> on_block(NewRunnableMethod( |
- this, &DatabaseDispatcherHost::OnDatabaseOpenFileBlocked, message_id)); |
- // And then let the permission request object do the rest. |
- scoped_refptr<DatabasePermissionRequest> request( |
- new DatabasePermissionRequest(url, database_name, on_allow.release(), |
- on_block.release(), |
- host_content_settings_map)); |
- request->RequestPermission(); |
- } else if (content_setting == CONTENT_SETTING_ALLOW) { |
- OnDatabaseOpenFileAllowed(vfs_file_name, desired_flags, message_id); |
- } else { |
- DCHECK(content_setting == CONTENT_SETTING_BLOCK); |
- OnDatabaseOpenFileBlocked(message_id); |
- } |
+ ChromeThread::PostTask( |
+ ChromeThread::FILE, FROM_HERE, |
+ NewRunnableMethod(this, |
+ &DatabaseDispatcherHost::DatabaseOpenFile, |
+ vfs_file_name, |
+ desired_flags, |
+ message_id)); |
} |
static void SetOpenFileResponseParams( |
@@ -220,12 +186,7 @@ void DatabaseDispatcherHost::DatabaseOpenFile(const string16& vfs_file_name, |
ViewMsg_DatabaseOpenFileResponse_Params response_params; |
SetOpenFileResponseParams(&response_params, target_handle, target_dir_handle); |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::SendMessage, |
- new ViewMsg_DatabaseOpenFileResponse( |
- message_id, response_params))); |
+ Send(new ViewMsg_DatabaseOpenFileResponse(message_id, response_params)); |
} |
void DatabaseDispatcherHost::OnDatabaseDeleteFile(const string16& vfs_file_name, |
@@ -273,12 +234,7 @@ void DatabaseDispatcherHost::DatabaseDeleteFile(const string16& vfs_file_name, |
} |
} |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::SendMessage, |
- new ViewMsg_DatabaseDeleteFileResponse( |
- message_id, error_code))); |
+ Send(new ViewMsg_DatabaseDeleteFileResponse(message_id, error_code)); |
} |
void DatabaseDispatcherHost::OnDatabaseGetFileAttributes( |
@@ -305,12 +261,7 @@ void DatabaseDispatcherHost::DatabaseGetFileAttributes( |
DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name); |
if (!db_file.empty()) |
attributes = VfsBackend::GetFileAttributes(db_file); |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::SendMessage, |
- new ViewMsg_DatabaseGetFileAttributesResponse( |
- message_id, attributes))); |
+ Send(new ViewMsg_DatabaseGetFileAttributesResponse(message_id, attributes)); |
} |
void DatabaseDispatcherHost::OnDatabaseGetFileSize( |
@@ -335,12 +286,7 @@ void DatabaseDispatcherHost::DatabaseGetFileSize(const string16& vfs_file_name, |
DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name); |
if (!db_file.empty()) |
size = VfsBackend::GetFileSize(db_file); |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::SendMessage, |
- new ViewMsg_DatabaseGetFileSizeResponse( |
- message_id, size))); |
+ Send(new ViewMsg_DatabaseGetFileSizeResponse(message_id, size)); |
} |
void DatabaseDispatcherHost::OnDatabaseOpened(const string16& origin_identifier, |
@@ -367,13 +313,8 @@ void DatabaseDispatcherHost::DatabaseOpened(const string16& origin_identifier, |
database_connections_.AddConnection(origin_identifier, database_name); |
db_tracker_->DatabaseOpened(origin_identifier, database_name, description, |
estimated_size, &database_size, &space_available); |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::SendMessage, |
- new ViewMsg_DatabaseUpdateSize( |
- origin_identifier, database_name, |
- database_size, space_available))); |
+ Send(new ViewMsg_DatabaseUpdateSize(origin_identifier, database_name, |
+ database_size, space_available)); |
} |
void DatabaseDispatcherHost::OnDatabaseModified( |
@@ -409,6 +350,49 @@ void DatabaseDispatcherHost::OnDatabaseClosed(const string16& origin_identifier, |
database_name)); |
} |
+void DatabaseDispatcherHost::OnAllowDatabase(const std::string& origin, |
michaeln
2010/03/30 19:46:19
Since every other call here uses 'origin_identifie
jochen (gone - plz use gerrit)
2010/03/31 07:36:34
Done.
|
+ const string16& name, |
+ const string16& display_name, |
+ unsigned long estimated_size, |
+ IPC::Message* reply_msg) { |
+ GURL url = GURL(origin); |
+ HostContentSettingsMap* host_content_settings_map = resource_message_filter_-> |
+ GetRequestContextForURL(url)->host_content_settings_map(); |
+ ContentSetting content_setting = host_content_settings_map->GetContentSetting( |
+ url.host(), CONTENT_SETTINGS_TYPE_COOKIES); |
+ |
+ if (content_setting == CONTENT_SETTING_ASK) { |
+ // Create a task for each possible outcome. |
+ scoped_ptr<Task> on_allow(NewRunnableMethod( |
+ this, &DatabaseDispatcherHost::AllowDatabaseResponse, |
+ reply_msg, CONTENT_SETTING_ALLOW)); |
+ scoped_ptr<Task> on_block(NewRunnableMethod( |
+ this, &DatabaseDispatcherHost::AllowDatabaseResponse, |
+ reply_msg, CONTENT_SETTING_BLOCK)); |
+ // And then let the permission request object do the rest. |
+ scoped_refptr<DatabasePermissionRequest> request( |
+ new DatabasePermissionRequest(url, name, display_name, estimated_size, |
+ on_allow.release(), on_block.release(), |
+ host_content_settings_map)); |
+ request->RequestPermission(); |
+ |
+ // Tell the renderer that it needs to run a nested message loop. |
+ Send(new ViewMsg_SignalCookiePromptEvent()); |
+ return; |
+ } |
+ |
+ AllowDatabaseResponse(reply_msg, content_setting); |
+} |
+ |
+void DatabaseDispatcherHost::AllowDatabaseResponse( |
+ IPC::Message* reply_msg, ContentSetting content_setting) { |
+ DCHECK((content_setting == CONTENT_SETTING_ALLOW) || |
+ (content_setting == CONTENT_SETTING_BLOCK)); |
+ ViewHostMsg_AllowDatabase::WriteReplyParams( |
+ reply_msg, content_setting == CONTENT_SETTING_ALLOW); |
+ Send(reply_msg); |
+} |
+ |
void DatabaseDispatcherHost::DatabaseClosed(const string16& origin_identifier, |
const string16& database_name) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
@@ -429,13 +413,8 @@ void DatabaseDispatcherHost::OnDatabaseSizeChanged( |
int64 space_available) { |
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
if (database_connections_.IsOriginUsed(origin_identifier)) { |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::SendMessage, |
- new ViewMsg_DatabaseUpdateSize( |
- origin_identifier, database_name, |
- database_size, space_available))); |
+ Send(new ViewMsg_DatabaseUpdateSize(origin_identifier, database_name, |
+ database_size, space_available)); |
} |
} |
@@ -443,40 +422,5 @@ 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)); |
- if (shutdown_) |
- return; |
- |
- ChromeThread::PostTask( |
- ChromeThread::FILE, FROM_HERE, |
- NewRunnableMethod(this, |
- &DatabaseDispatcherHost::DatabaseOpenFile, |
- vfs_file_name, |
- desired_flags, |
- message_id)); |
-} |
- |
-void DatabaseDispatcherHost::OnDatabaseOpenFileBlocked(int32 message_id) { |
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
- if (shutdown_) |
- return; |
- |
- // This will result in failed transactions NOT a failed window.openDatabase |
- // call. |
- ViewMsg_DatabaseOpenFileResponse_Params response_params; |
- SetOpenFileResponseParams(&response_params, |
- base::kInvalidPlatformFileValue, |
- base::kInvalidPlatformFileValue); |
- SendMessage(new ViewMsg_DatabaseOpenFileResponse(message_id, |
- response_params)); |
+ Send(new ViewMsg_DatabaseCloseImmediately(origin_identifier, database_name)); |
} |