Home | History | Annotate | Download | only in shell
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/shell/shell_message_filter.h"
      6 
      7 #include "base/file_util.h"
      8 #include "base/threading/thread_restrictions.h"
      9 #include "content/public/browser/child_process_security_policy.h"
     10 #include "content/shell/common/shell_messages.h"
     11 #include "content/shell/shell_browser_context.h"
     12 #include "content/shell/shell_content_browser_client.h"
     13 #include "content/shell/shell_network_delegate.h"
     14 #include "net/base/net_errors.h"
     15 #include "net/cookies/cookie_monster.h"
     16 #include "net/url_request/url_request_context.h"
     17 #include "net/url_request/url_request_context_getter.h"
     18 #include "webkit/browser/database/database_tracker.h"
     19 #include "webkit/browser/fileapi/isolated_context.h"
     20 #include "webkit/browser/quota/quota_manager.h"
     21 
     22 namespace content {
     23 
     24 ShellMessageFilter::ShellMessageFilter(
     25     int render_process_id,
     26     webkit_database::DatabaseTracker* database_tracker,
     27     quota::QuotaManager* quota_manager,
     28     net::URLRequestContextGetter* request_context_getter)
     29     : render_process_id_(render_process_id),
     30       database_tracker_(database_tracker),
     31       quota_manager_(quota_manager),
     32       request_context_getter_(request_context_getter) {
     33 }
     34 
     35 ShellMessageFilter::~ShellMessageFilter() {
     36 }
     37 
     38 void ShellMessageFilter::OverrideThreadForMessage(const IPC::Message& message,
     39                                                   BrowserThread::ID* thread) {
     40   if (message.type() == ShellViewHostMsg_ClearAllDatabases::ID)
     41     *thread = BrowserThread::FILE;
     42 }
     43 
     44 bool ShellMessageFilter::OnMessageReceived(const IPC::Message& message,
     45                                            bool* message_was_ok) {
     46   bool handled = true;
     47   IPC_BEGIN_MESSAGE_MAP_EX(ShellMessageFilter, message, *message_was_ok)
     48     IPC_MESSAGE_HANDLER(ShellViewHostMsg_ReadFileToString, OnReadFileToString)
     49     IPC_MESSAGE_HANDLER(ShellViewHostMsg_RegisterIsolatedFileSystem,
     50                         OnRegisterIsolatedFileSystem)
     51     IPC_MESSAGE_HANDLER(ShellViewHostMsg_ClearAllDatabases, OnClearAllDatabases)
     52     IPC_MESSAGE_HANDLER(ShellViewHostMsg_SetDatabaseQuota, OnSetDatabaseQuota)
     53     IPC_MESSAGE_HANDLER(ShellViewHostMsg_AcceptAllCookies, OnAcceptAllCookies)
     54     IPC_MESSAGE_HANDLER(ShellViewHostMsg_DeleteAllCookies, OnDeleteAllCookies)
     55     IPC_MESSAGE_UNHANDLED(handled = false)
     56   IPC_END_MESSAGE_MAP()
     57 
     58   return handled;
     59 }
     60 
     61 void ShellMessageFilter::OnReadFileToString(const base::FilePath& local_file,
     62                                             std::string* contents) {
     63   base::ThreadRestrictions::ScopedAllowIO allow_io;
     64   file_util::ReadFileToString(local_file, contents);
     65 }
     66 
     67 void ShellMessageFilter::OnRegisterIsolatedFileSystem(
     68     const std::vector<base::FilePath>& absolute_filenames,
     69     std::string* filesystem_id) {
     70   fileapi::IsolatedContext::FileInfoSet files;
     71   ChildProcessSecurityPolicy* policy =
     72       ChildProcessSecurityPolicy::GetInstance();
     73   for (size_t i = 0; i < absolute_filenames.size(); ++i) {
     74     files.AddPath(absolute_filenames[i], NULL);
     75     if (!policy->CanReadFile(render_process_id_, absolute_filenames[i]))
     76       policy->GrantReadFile(render_process_id_, absolute_filenames[i]);
     77   }
     78   *filesystem_id =
     79       fileapi::IsolatedContext::GetInstance()->RegisterDraggedFileSystem(files);
     80   policy->GrantReadFileSystem(render_process_id_, *filesystem_id);
     81 }
     82 
     83 void ShellMessageFilter::OnClearAllDatabases() {
     84   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
     85   database_tracker_->DeleteDataModifiedSince(
     86       base::Time(), net::CompletionCallback());
     87 }
     88 
     89 void ShellMessageFilter::OnSetDatabaseQuota(int quota) {
     90   quota_manager_->SetTemporaryGlobalOverrideQuota(
     91       quota * quota::QuotaManager::kPerHostTemporaryPortion,
     92       quota::QuotaCallback());
     93 }
     94 
     95 void ShellMessageFilter::OnAcceptAllCookies(bool accept) {
     96   ShellNetworkDelegate::SetAcceptAllCookies(accept);
     97 }
     98 
     99 void ShellMessageFilter::OnDeleteAllCookies() {
    100   request_context_getter_->GetURLRequestContext()->cookie_store()
    101       ->GetCookieMonster()
    102       ->DeleteAllAsync(net::CookieMonster::DeleteCallback());
    103 }
    104 
    105 }  // namespace content
    106