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/files/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/browser/shell_notification_manager.h"
14#include "content/shell/common/shell_messages.h"
15#include "net/base/net_errors.h"
16#include "net/cookies/cookie_monster.h"
17#include "net/url_request/url_request_context.h"
18#include "net/url_request/url_request_context_getter.h"
19#include "storage/browser/database/database_tracker.h"
20#include "storage/browser/fileapi/isolated_context.h"
21#include "storage/browser/quota/quota_manager.h"
22
23namespace content {
24
25ShellMessageFilter::ShellMessageFilter(
26    int render_process_id,
27    storage::DatabaseTracker* database_tracker,
28    storage::QuotaManager* quota_manager,
29    net::URLRequestContextGetter* request_context_getter)
30    : BrowserMessageFilter(ShellMsgStart),
31      render_process_id_(render_process_id),
32      database_tracker_(database_tracker),
33      quota_manager_(quota_manager),
34      request_context_getter_(request_context_getter) {
35}
36
37ShellMessageFilter::~ShellMessageFilter() {
38}
39
40void ShellMessageFilter::OverrideThreadForMessage(const IPC::Message& message,
41                                                  BrowserThread::ID* thread) {
42  if (message.type() == ShellViewHostMsg_ClearAllDatabases::ID)
43    *thread = BrowserThread::FILE;
44}
45
46bool ShellMessageFilter::OnMessageReceived(const IPC::Message& message) {
47  bool handled = true;
48  IPC_BEGIN_MESSAGE_MAP(ShellMessageFilter, message)
49    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ReadFileToString, OnReadFileToString)
50    IPC_MESSAGE_HANDLER(ShellViewHostMsg_RegisterIsolatedFileSystem,
51                        OnRegisterIsolatedFileSystem)
52    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ClearAllDatabases, OnClearAllDatabases)
53    IPC_MESSAGE_HANDLER(ShellViewHostMsg_SetDatabaseQuota, OnSetDatabaseQuota)
54    IPC_MESSAGE_HANDLER(ShellViewHostMsg_CheckWebNotificationPermission,
55                        OnCheckWebNotificationPermission)
56    IPC_MESSAGE_HANDLER(ShellViewHostMsg_GrantWebNotificationPermission,
57                        OnGrantWebNotificationPermission)
58    IPC_MESSAGE_HANDLER(ShellViewHostMsg_ClearWebNotificationPermissions,
59                        OnClearWebNotificationPermissions)
60    IPC_MESSAGE_HANDLER(ShellViewHostMsg_AcceptAllCookies, OnAcceptAllCookies)
61    IPC_MESSAGE_HANDLER(ShellViewHostMsg_DeleteAllCookies, OnDeleteAllCookies)
62    IPC_MESSAGE_UNHANDLED(handled = false)
63  IPC_END_MESSAGE_MAP()
64
65  return handled;
66}
67
68void ShellMessageFilter::OnReadFileToString(const base::FilePath& local_file,
69                                            std::string* contents) {
70  base::ThreadRestrictions::ScopedAllowIO allow_io;
71  base::ReadFileToString(local_file, contents);
72}
73
74void ShellMessageFilter::OnRegisterIsolatedFileSystem(
75    const std::vector<base::FilePath>& absolute_filenames,
76    std::string* filesystem_id) {
77  storage::IsolatedContext::FileInfoSet files;
78  ChildProcessSecurityPolicy* policy =
79      ChildProcessSecurityPolicy::GetInstance();
80  for (size_t i = 0; i < absolute_filenames.size(); ++i) {
81    files.AddPath(absolute_filenames[i], NULL);
82    if (!policy->CanReadFile(render_process_id_, absolute_filenames[i]))
83      policy->GrantReadFile(render_process_id_, absolute_filenames[i]);
84  }
85  *filesystem_id =
86      storage::IsolatedContext::GetInstance()->RegisterDraggedFileSystem(files);
87  policy->GrantReadFileSystem(render_process_id_, *filesystem_id);
88}
89
90void ShellMessageFilter::OnClearAllDatabases() {
91  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
92  database_tracker_->DeleteDataModifiedSince(
93      base::Time(), net::CompletionCallback());
94}
95
96void ShellMessageFilter::OnSetDatabaseQuota(int quota) {
97  quota_manager_->SetTemporaryGlobalOverrideQuota(
98      quota * storage::QuotaManager::kPerHostTemporaryPortion,
99      storage::QuotaCallback());
100}
101
102void ShellMessageFilter::OnCheckWebNotificationPermission(const GURL& origin,
103                                                          int* result) {
104  ShellNotificationManager* manager =
105      ShellContentBrowserClient::Get()->GetShellNotificationManager();
106  if (manager)
107    *result = manager->CheckPermission(origin);
108  else
109    *result = blink::WebNotificationPermissionAllowed;
110}
111
112void ShellMessageFilter::OnGrantWebNotificationPermission(
113    const GURL& origin, bool permission_granted) {
114  ShellNotificationManager* manager =
115      ShellContentBrowserClient::Get()->GetShellNotificationManager();
116  if (manager) {
117    manager->SetPermission(origin, permission_granted ?
118        blink::WebNotificationPermissionAllowed :
119        blink::WebNotificationPermissionDenied);
120  }
121}
122
123void ShellMessageFilter::OnClearWebNotificationPermissions() {
124  ShellNotificationManager* manager =
125      ShellContentBrowserClient::Get()->GetShellNotificationManager();
126  if (manager)
127    manager->ClearPermissions();
128}
129
130void ShellMessageFilter::OnAcceptAllCookies(bool accept) {
131  ShellNetworkDelegate::SetAcceptAllCookies(accept);
132}
133
134void ShellMessageFilter::OnDeleteAllCookies() {
135  request_context_getter_->GetURLRequestContext()->cookie_store()
136      ->GetCookieMonster()
137      ->DeleteAllAsync(net::CookieMonster::DeleteCallback());
138}
139
140}  // namespace content
141