• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 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/browser/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/browser/shell_browser_context.h"
11 #include "content/shell/browser/shell_content_browser_client.h"
12 #include "content/shell/browser/shell_network_delegate.h"
13 #include "content/shell/common/shell_messages.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 
ShellMessageFilter(int render_process_id,webkit_database::DatabaseTracker * database_tracker,quota::QuotaManager * quota_manager,net::URLRequestContextGetter * request_context_getter)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     : BrowserMessageFilter(ShellMsgStart),
30       render_process_id_(render_process_id),
31       database_tracker_(database_tracker),
32       quota_manager_(quota_manager),
33       request_context_getter_(request_context_getter) {
34 }
35 
~ShellMessageFilter()36 ShellMessageFilter::~ShellMessageFilter() {
37 }
38 
OverrideThreadForMessage(const IPC::Message & message,BrowserThread::ID * thread)39 void ShellMessageFilter::OverrideThreadForMessage(const IPC::Message& message,
40                                                   BrowserThread::ID* thread) {
41   if (message.type() == ShellViewHostMsg_ClearAllDatabases::ID)
42     *thread = BrowserThread::FILE;
43 }
44 
OnMessageReceived(const IPC::Message & message)45 bool ShellMessageFilter::OnMessageReceived(const IPC::Message& message) {
46   bool handled = true;
47   IPC_BEGIN_MESSAGE_MAP(ShellMessageFilter, message)
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 
OnReadFileToString(const base::FilePath & local_file,std::string * contents)61 void ShellMessageFilter::OnReadFileToString(const base::FilePath& local_file,
62                                             std::string* contents) {
63   base::ThreadRestrictions::ScopedAllowIO allow_io;
64   base::ReadFileToString(local_file, contents);
65 }
66 
OnRegisterIsolatedFileSystem(const std::vector<base::FilePath> & absolute_filenames,std::string * filesystem_id)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 
OnClearAllDatabases()83 void ShellMessageFilter::OnClearAllDatabases() {
84   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
85   database_tracker_->DeleteDataModifiedSince(
86       base::Time(), net::CompletionCallback());
87 }
88 
OnSetDatabaseQuota(int quota)89 void ShellMessageFilter::OnSetDatabaseQuota(int quota) {
90   quota_manager_->SetTemporaryGlobalOverrideQuota(
91       quota * quota::QuotaManager::kPerHostTemporaryPortion,
92       quota::QuotaCallback());
93 }
94 
OnAcceptAllCookies(bool accept)95 void ShellMessageFilter::OnAcceptAllCookies(bool accept) {
96   ShellNetworkDelegate::SetAcceptAllCookies(accept);
97 }
98 
OnDeleteAllCookies()99 void ShellMessageFilter::OnDeleteAllCookies() {
100   request_context_getter_->GetURLRequestContext()->cookie_store()
101       ->GetCookieMonster()
102       ->DeleteAllAsync(net::CookieMonster::DeleteCallback());
103 }
104 
105 }  // namespace content
106