summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host/database_dispatcher_host.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/renderer_host/database_dispatcher_host.cc')
-rw-r--r--chrome/browser/renderer_host/database_dispatcher_host.cc438
1 files changed, 0 insertions, 438 deletions
diff --git a/chrome/browser/renderer_host/database_dispatcher_host.cc b/chrome/browser/renderer_host/database_dispatcher_host.cc
deleted file mode 100644
index c755bf0..0000000
--- a/chrome/browser/renderer_host/database_dispatcher_host.cc
+++ /dev/null
@@ -1,438 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/renderer_host/database_dispatcher_host.h"
-
-#include <string>
-
-#include "base/string_util.h"
-#include "base/thread.h"
-#include "chrome/browser/browser_thread.h"
-#include "chrome/browser/content_settings/host_content_settings_map.h"
-#include "chrome/browser/net/chrome_url_request_context.h"
-#include "chrome/browser/renderer_host/browser_render_process_host.h"
-#include "chrome/common/render_messages.h"
-#include "googleurl/src/gurl.h"
-#include "third_party/sqlite/sqlite3.h"
-#include "third_party/WebKit/WebKit/chromium/public/WebSecurityOrigin.h"
-#include "webkit/database/database_util.h"
-#include "webkit/database/vfs_backend.h"
-
-#if defined(OS_POSIX)
-#include "base/file_descriptor_posix.h"
-#endif
-
-using WebKit::WebSecurityOrigin;
-using webkit_database::DatabaseTracker;
-using webkit_database::DatabaseUtil;
-using webkit_database::VfsBackend;
-
-const int kNumDeleteRetries = 2;
-const int kDelayDeleteRetryMs = 100;
-
-DatabaseDispatcherHost::DatabaseDispatcherHost(
- DatabaseTracker* db_tracker,
- IPC::Message::Sender* sender,
- HostContentSettingsMap *host_content_settings_map)
- : db_tracker_(db_tracker),
- message_sender_(sender),
- process_handle_(0),
- observer_added_(false),
- shutdown_(false),
- host_content_settings_map_(host_content_settings_map) {
- DCHECK(db_tracker_);
- DCHECK(message_sender_);
-}
-
-void DatabaseDispatcherHost::Init(base::ProcessHandle process_handle) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(!shutdown_);
- DCHECK(!process_handle_);
- DCHECK(process_handle);
- process_handle_ = process_handle;
-}
-
-void DatabaseDispatcherHost::Shutdown() {
- shutdown_ = true;
- message_sender_ = NULL;
- if (observer_added_) {
- observer_added_ = false;
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this, &DatabaseDispatcherHost::RemoveObserver));
- }
-}
-
-void DatabaseDispatcherHost::AddObserver() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- db_tracker_->AddObserver(this);
-}
-
-void DatabaseDispatcherHost::RemoveObserver() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
-
- // If the renderer process died without closing all databases,
- // then we need to manually close those connections
- db_tracker_->CloseDatabases(database_connections_);
- database_connections_.RemoveAllConnections();
-
- db_tracker_->RemoveObserver(this);
-}
-
-bool DatabaseDispatcherHost::OnMessageReceived(
- const IPC::Message& message, bool* message_was_ok) {
- DCHECK(!shutdown_);
- *message_was_ok = true;
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP_EX(DatabaseDispatcherHost, message, *message_was_ok)
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_DatabaseOpenFile,
- OnDatabaseOpenFile)
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_DatabaseDeleteFile,
- OnDatabaseDeleteFile)
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_DatabaseGetFileAttributes,
- OnDatabaseGetFileAttributes)
- IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_DatabaseGetFileSize,
- OnDatabaseGetFileSize)
- 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;
-}
-
-void DatabaseDispatcherHost::ReceivedBadMessage(uint32 msg_type) {
- BrowserRenderProcessHost::BadMessageTerminateProcess(
- msg_type, process_handle_);
-}
-
-void DatabaseDispatcherHost::Send(IPC::Message* message) {
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
- if (!BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::Send,
- message)))
- delete message;
- return;
- }
-
- if (!shutdown_ && message_sender_)
- message_sender_->Send(message);
- else
- delete message;
-}
-
-DatabaseDispatcherHost::~DatabaseDispatcherHost() {}
-
-void DatabaseDispatcherHost::OnDatabaseOpenFile(const string16& vfs_file_name,
- int desired_flags,
- IPC::Message* reply_msg) {
- if (!observer_added_) {
- observer_added_ = true;
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this, &DatabaseDispatcherHost::AddObserver));
- }
-
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseOpenFile,
- vfs_file_name,
- desired_flags,
- reply_msg));
-}
-
-// Scheduled by the IO thread on the file thread.
-// Opens the given database file, then schedules
-// a task on the IO thread's message loop to send an IPC back to
-// corresponding renderer process with the file handle.
-void DatabaseDispatcherHost::DatabaseOpenFile(const string16& vfs_file_name,
- int desired_flags,
- IPC::Message* reply_msg) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::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, &file_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()) {
- 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, auto_close)
-#endif
- );
- Send(reply_msg);
-}
-
-void DatabaseDispatcherHost::OnDatabaseDeleteFile(const string16& vfs_file_name,
- const bool& sync_dir,
- IPC::Message* reply_msg) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseDeleteFile,
- vfs_file_name,
- sync_dir,
- reply_msg,
- kNumDeleteRetries));
-}
-
-// Scheduled by the IO thread on the file thread.
-// Deletes the given database file, then schedules
-// a task on the IO thread's message loop to send an IPC back to
-// corresponding renderer process with the error code.
-void DatabaseDispatcherHost::DatabaseDeleteFile(const string16& vfs_file_name,
- bool sync_dir,
- IPC::Message* reply_msg,
- int reschedule_count) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
-
- // Return an error if the file name is invalid or if the file could not
- // be deleted after kNumDeleteRetries attempts.
- int error_code = SQLITE_IOERR_DELETE;
- FilePath db_file =
- DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name);
- if (!db_file.empty()) {
- // 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.
- BrowserThread::PostDelayedTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseDeleteFile,
- vfs_file_name,
- sync_dir,
- reply_msg,
- reschedule_count - 1),
- kDelayDeleteRetryMs);
- return;
- }
- }
-
- ViewHostMsg_DatabaseDeleteFile::WriteReplyParams(reply_msg, error_code);
- Send(reply_msg);
-}
-
-void DatabaseDispatcherHost::OnDatabaseGetFileAttributes(
- const string16& vfs_file_name,
- IPC::Message* reply_msg) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseGetFileAttributes,
- vfs_file_name,
- reply_msg));
-}
-
-// Scheduled by the IO thread on the file thread.
-// Gets the attributes of the given database file, then schedules
-// a task on the IO thread's message loop to send an IPC back to
-// corresponding renderer process.
-void DatabaseDispatcherHost::DatabaseGetFileAttributes(
- const string16& vfs_file_name,
- IPC::Message* reply_msg) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- int32 attributes = -1;
- FilePath db_file =
- DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name);
- if (!db_file.empty())
- attributes = VfsBackend::GetFileAttributes(db_file);
-
- ViewHostMsg_DatabaseGetFileAttributes::WriteReplyParams(
- reply_msg, attributes);
- Send(reply_msg);
-}
-
-void DatabaseDispatcherHost::OnDatabaseGetFileSize(
- const string16& vfs_file_name, IPC::Message* reply_msg) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseGetFileSize,
- vfs_file_name,
- reply_msg));
-}
-
-// Scheduled by the IO thread on the file thread.
-// Gets the size of the given file, then schedules a task
-// on the IO thread's message loop to send an IPC back to
-// the corresponding renderer process.
-void DatabaseDispatcherHost::DatabaseGetFileSize(const string16& vfs_file_name,
- IPC::Message* reply_msg) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- int64 size = 0;
- FilePath db_file =
- DatabaseUtil::GetFullFilePathForVfsFile(db_tracker_, vfs_file_name);
- if (!db_file.empty())
- size = VfsBackend::GetFileSize(db_file);
-
- ViewHostMsg_DatabaseGetFileSize::WriteReplyParams(reply_msg, size);
- Send(reply_msg);
-}
-
-void DatabaseDispatcherHost::OnDatabaseOpened(const string16& origin_identifier,
- const string16& database_name,
- const string16& description,
- int64 estimated_size) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseOpened,
- origin_identifier,
- database_name,
- description,
- estimated_size));
-}
-
-void DatabaseDispatcherHost::DatabaseOpened(const string16& origin_identifier,
- const string16& database_name,
- const string16& description,
- int64 estimated_size) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- int64 database_size = 0;
- int64 space_available = 0;
- database_connections_.AddConnection(origin_identifier, database_name);
- db_tracker_->DatabaseOpened(origin_identifier, database_name, description,
- estimated_size, &database_size, &space_available);
- Send(new ViewMsg_DatabaseUpdateSize(origin_identifier, database_name,
- database_size, space_available));
-}
-
-void DatabaseDispatcherHost::OnDatabaseModified(
- const string16& origin_identifier,
- const string16& database_name) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseModified,
- origin_identifier,
- database_name));
-}
-
-void DatabaseDispatcherHost::DatabaseModified(const string16& origin_identifier,
- const string16& database_name) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- if (!database_connections_.IsDatabaseOpened(
- origin_identifier, database_name)) {
- ReceivedBadMessage(ViewHostMsg_DatabaseModified::ID);
- return;
- }
-
- db_tracker_->DatabaseModified(origin_identifier, database_name);
-}
-
-void DatabaseDispatcherHost::OnDatabaseClosed(const string16& origin_identifier,
- const string16& database_name) {
- BrowserThread::PostTask(
- BrowserThread::FILE, FROM_HERE,
- NewRunnableMethod(this,
- &DatabaseDispatcherHost::DatabaseClosed,
- origin_identifier,
- database_name));
-}
-
-void DatabaseDispatcherHost::OnAllowDatabase(const std::string& origin_url,
- const string16& name,
- const string16& display_name,
- unsigned long estimated_size,
- IPC::Message* reply_msg) {
- GURL url = GURL(origin_url);
- ContentSetting content_setting =
- host_content_settings_map_->GetContentSetting(
- url, CONTENT_SETTINGS_TYPE_COOKIES, "");
- 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) ||
- (content_setting == CONTENT_SETTING_SESSION_ONLY));
- ViewHostMsg_AllowDatabase::WriteReplyParams(
- reply_msg, content_setting != CONTENT_SETTING_BLOCK);
- Send(reply_msg);
-}
-
-void DatabaseDispatcherHost::DatabaseClosed(const string16& origin_identifier,
- const string16& database_name) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- if (!database_connections_.IsDatabaseOpened(
- origin_identifier, database_name)) {
- ReceivedBadMessage(ViewHostMsg_DatabaseClosed::ID);
- return;
- }
-
- db_tracker_->DatabaseClosed(origin_identifier, database_name);
- database_connections_.RemoveConnection(origin_identifier, database_name);
-}
-
-void DatabaseDispatcherHost::OnDatabaseSizeChanged(
- const string16& origin_identifier,
- const string16& database_name,
- int64 database_size,
- int64 space_available) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- if (database_connections_.IsOriginUsed(origin_identifier)) {
- Send(new ViewMsg_DatabaseUpdateSize(origin_identifier, database_name,
- database_size, space_available));
- }
-}
-
-void DatabaseDispatcherHost::OnDatabaseScheduledForDeletion(
- const string16& origin_identifier,
- const string16& database_name) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- Send(new ViewMsg_DatabaseCloseImmediately(origin_identifier, database_name));
-}