| Index: content/browser/renderer_host/database_message_filter.cc
|
| ===================================================================
|
| --- content/browser/renderer_host/database_message_filter.cc (revision 86348)
|
| +++ content/browser/renderer_host/database_message_filter.cc (working copy)
|
| @@ -16,19 +16,53 @@
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
|
| #include "webkit/database/database_util.h"
|
| #include "webkit/database/vfs_backend.h"
|
| +#include "webkit/quota/quota_manager.h"
|
|
|
| #if defined(OS_POSIX)
|
| #include "base/file_descriptor_posix.h"
|
| #endif
|
|
|
| +using quota::QuotaManager;
|
| +using quota::QuotaManagerProxy;
|
| +using quota::QuotaStatusCode;
|
| using WebKit::WebSecurityOrigin;
|
| using webkit_database::DatabaseTracker;
|
| using webkit_database::DatabaseUtil;
|
| using webkit_database::VfsBackend;
|
|
|
| +namespace {
|
| +
|
| +class MyGetUsageAndQuotaCallback
|
| + : public QuotaManager::GetUsageAndQuotaCallback {
|
| + public:
|
| + MyGetUsageAndQuotaCallback(
|
| + DatabaseMessageFilter* sender, IPC::Message* reply_msg)
|
| + : sender_(sender), reply_msg_(reply_msg) {}
|
| +
|
| + virtual void RunWithParams(
|
| + const Tuple3<QuotaStatusCode, int64, int64>& params) {
|
| + Run(params.a, params.b, params.c);
|
| + }
|
| +
|
| + void Run(QuotaStatusCode status, int64 usage, int64 quota) {
|
| + int64 available = 0;
|
| + if ((status == quota::kQuotaStatusOk) && (usage < quota))
|
| + available = quota - usage;
|
| + DatabaseHostMsg_GetSpaceAvailable::WriteReplyParams(
|
| + reply_msg_.get(), available);
|
| + sender_->Send(reply_msg_.release());
|
| + }
|
| +
|
| + private:
|
| + scoped_refptr<DatabaseMessageFilter> sender_;
|
| + scoped_ptr<IPC::Message> reply_msg_;
|
| +};
|
| +
|
| const int kNumDeleteRetries = 2;
|
| const int kDelayDeleteRetryMs = 100;
|
|
|
| +} // namespace
|
| +
|
| DatabaseMessageFilter::DatabaseMessageFilter(
|
| webkit_database::DatabaseTracker* db_tracker)
|
| : db_tracker_(db_tracker),
|
| @@ -53,22 +87,23 @@
|
|
|
| void DatabaseMessageFilter::RemoveObserver() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| + db_tracker_->RemoveObserver(this);
|
|
|
| // 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);
|
| }
|
|
|
| void DatabaseMessageFilter::OverrideThreadForMessage(
|
| const IPC::Message& message,
|
| BrowserThread::ID* thread) {
|
| - if (IPC_MESSAGE_CLASS(message) == DatabaseMsgStart)
|
| + if (message.type() == DatabaseHostMsg_GetSpaceAvailable::ID)
|
| + *thread = BrowserThread::IO;
|
| + else if (IPC_MESSAGE_CLASS(message) == DatabaseMsgStart)
|
| *thread = BrowserThread::FILE;
|
|
|
| - if (message.type() == DatabaseHostMsg_OpenFile::ID && !observer_added_) {
|
| + if (message.type() == DatabaseHostMsg_Opened::ID && !observer_added_) {
|
| observer_added_ = true;
|
| BrowserThread::PostTask(
|
| BrowserThread::FILE, FROM_HERE,
|
| @@ -89,6 +124,8 @@
|
| OnDatabaseGetFileAttributes)
|
| IPC_MESSAGE_HANDLER_DELAY_REPLY(DatabaseHostMsg_GetFileSize,
|
| OnDatabaseGetFileSize)
|
| + IPC_MESSAGE_HANDLER_DELAY_REPLY(DatabaseHostMsg_GetSpaceAvailable,
|
| + OnDatabaseGetSpaceAvailable)
|
| IPC_MESSAGE_HANDLER(DatabaseHostMsg_Opened, OnDatabaseOpened)
|
| IPC_MESSAGE_HANDLER(DatabaseHostMsg_Modified, OnDatabaseModified)
|
| IPC_MESSAGE_HANDLER(DatabaseHostMsg_Closed, OnDatabaseClosed)
|
| @@ -220,7 +257,7 @@
|
| }
|
|
|
| void DatabaseMessageFilter::OnDatabaseGetFileSize(
|
| - const string16& vfs_file_name, IPC::Message* reply_msg) {
|
| + const string16& vfs_file_name, IPC::Message* reply_msg) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| int64 size = 0;
|
| FilePath db_file =
|
| @@ -232,18 +269,40 @@
|
| Send(reply_msg);
|
| }
|
|
|
| +void DatabaseMessageFilter::OnDatabaseGetSpaceAvailable(
|
| + const string16& origin_identifier, IPC::Message* reply_msg) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + DCHECK(db_tracker_->quota_manager_proxy());
|
| +
|
| + QuotaManager* quota_manager =
|
| + db_tracker_->quota_manager_proxy()->quota_manager();
|
| + if (!quota_manager) {
|
| + NOTREACHED(); // The system is shutting down, messages are unexpected.
|
| + DatabaseHostMsg_GetSpaceAvailable::WriteReplyParams(
|
| + reply_msg, static_cast<int64>(0));
|
| + Send(reply_msg);
|
| + return;
|
| + }
|
| +
|
| + quota_manager->GetUsageAndQuota(
|
| + DatabaseUtil::GetOriginFromIdentifier(origin_identifier),
|
| + quota::kStorageTypeTemporary,
|
| + new MyGetUsageAndQuotaCallback(this, reply_msg));
|
| +}
|
| +
|
| void DatabaseMessageFilter::OnDatabaseOpened(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;
|
| + int64 space_available_not_used = 0;
|
| + db_tracker_->DatabaseOpened(origin_identifier, database_name, description,
|
| + estimated_size, &database_size,
|
| + &space_available_not_used);
|
| database_connections_.AddConnection(origin_identifier, database_name);
|
| - db_tracker_->DatabaseOpened(origin_identifier, database_name, description,
|
| - estimated_size, &database_size, &space_available);
|
| Send(new DatabaseMsg_UpdateSize(origin_identifier, database_name,
|
| - database_size, space_available));
|
| + database_size));
|
| }
|
|
|
| void DatabaseMessageFilter::OnDatabaseModified(
|
| @@ -270,19 +329,19 @@
|
| return;
|
| }
|
|
|
| + database_connections_.RemoveConnection(origin_identifier, database_name);
|
| db_tracker_->DatabaseClosed(origin_identifier, database_name);
|
| - database_connections_.RemoveConnection(origin_identifier, database_name);
|
| }
|
|
|
| void DatabaseMessageFilter::OnDatabaseSizeChanged(
|
| const string16& origin_identifier,
|
| const string16& database_name,
|
| int64 database_size,
|
| - int64 space_available) {
|
| + int64 space_available_not_used) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| if (database_connections_.IsOriginUsed(origin_identifier)) {
|
| Send(new DatabaseMsg_UpdateSize(origin_identifier, database_name,
|
| - database_size, space_available));
|
| + database_size));
|
| }
|
| }
|
|
|
|
|