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.
5 #include "content/shell/browser/layout_test/layout_test_message_filter.h"
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/layout_test/layout_test_content_browser_client.h"
11 #include "content/shell/browser/layout_test/layout_test_notification_manager.h"
12 #include "content/shell/browser/shell_browser_context.h"
13 #include "content/shell/browser/shell_content_browser_client.h"
14 #include "content/shell/browser/shell_network_delegate.h"
15 #include "content/shell/common/layout_test/layout_test_messages.h"
16 #include "net/base/net_errors.h"
17 #include "net/cookies/cookie_monster.h"
18 #include "net/url_request/url_request_context.h"
19 #include "net/url_request/url_request_context_getter.h"
20 #include "storage/browser/database/database_tracker.h"
21 #include "storage/browser/fileapi/isolated_context.h"
22 #include "storage/browser/quota/quota_manager.h"
26 LayoutTestMessageFilter::LayoutTestMessageFilter(
27 int render_process_id,
28 storage::DatabaseTracker* database_tracker,
29 storage::QuotaManager* quota_manager,
30 net::URLRequestContextGetter* request_context_getter)
31 : BrowserMessageFilter(LayoutTestMsgStart),
32 render_process_id_(render_process_id),
33 database_tracker_(database_tracker),
34 quota_manager_(quota_manager),
35 request_context_getter_(request_context_getter) {
38 LayoutTestMessageFilter::~LayoutTestMessageFilter() {
41 void LayoutTestMessageFilter::OverrideThreadForMessage(
42 const IPC::Message& message, BrowserThread::ID* thread) {
43 if (message.type() == LayoutTestHostMsg_ClearAllDatabases::ID)
44 *thread = BrowserThread::FILE;
45 if (message.type() == LayoutTestHostMsg_SimulateWebNotificationClick::ID)
46 *thread = BrowserThread::UI;
49 bool LayoutTestMessageFilter::OnMessageReceived(const IPC::Message& message) {
51 IPC_BEGIN_MESSAGE_MAP(LayoutTestMessageFilter, message)
52 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_ReadFileToString, OnReadFileToString)
53 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_RegisterIsolatedFileSystem,
54 OnRegisterIsolatedFileSystem)
55 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_ClearAllDatabases,
57 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_SetDatabaseQuota, OnSetDatabaseQuota)
58 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_CheckWebNotificationPermission,
59 OnCheckWebNotificationPermission)
60 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_GrantWebNotificationPermission,
61 OnGrantWebNotificationPermission)
62 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_ClearWebNotificationPermissions,
63 OnClearWebNotificationPermissions)
64 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_SimulateWebNotificationClick,
65 OnSimulateWebNotificationClick)
66 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_AcceptAllCookies, OnAcceptAllCookies)
67 IPC_MESSAGE_HANDLER(LayoutTestHostMsg_DeleteAllCookies, OnDeleteAllCookies)
68 IPC_MESSAGE_UNHANDLED(handled = false)
74 void LayoutTestMessageFilter::OnReadFileToString(
75 const base::FilePath& local_file, std::string* contents) {
76 base::ThreadRestrictions::ScopedAllowIO allow_io;
77 base::ReadFileToString(local_file, contents);
80 void LayoutTestMessageFilter::OnRegisterIsolatedFileSystem(
81 const std::vector<base::FilePath>& absolute_filenames,
82 std::string* filesystem_id) {
83 storage::IsolatedContext::FileInfoSet files;
84 ChildProcessSecurityPolicy* policy =
85 ChildProcessSecurityPolicy::GetInstance();
86 for (size_t i = 0; i < absolute_filenames.size(); ++i) {
87 files.AddPath(absolute_filenames[i], NULL);
88 if (!policy->CanReadFile(render_process_id_, absolute_filenames[i]))
89 policy->GrantReadFile(render_process_id_, absolute_filenames[i]);
92 storage::IsolatedContext::GetInstance()->RegisterDraggedFileSystem(files);
93 policy->GrantReadFileSystem(render_process_id_, *filesystem_id);
96 void LayoutTestMessageFilter::OnClearAllDatabases() {
97 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
98 database_tracker_->DeleteDataModifiedSince(
99 base::Time(), net::CompletionCallback());
102 void LayoutTestMessageFilter::OnSetDatabaseQuota(int quota) {
103 quota_manager_->SetTemporaryGlobalOverrideQuota(
104 quota * storage::QuotaManager::kPerHostTemporaryPortion,
105 storage::QuotaCallback());
108 void LayoutTestMessageFilter::OnCheckWebNotificationPermission(
109 const GURL& origin, int* result) {
110 LayoutTestNotificationManager* manager =
111 LayoutTestContentBrowserClient::Get()->GetLayoutTestNotificationManager();
113 *result = manager->CheckPermission(origin);
115 *result = blink::WebNotificationPermissionAllowed;
118 void LayoutTestMessageFilter::OnGrantWebNotificationPermission(
119 const GURL& origin, bool permission_granted) {
120 LayoutTestNotificationManager* manager =
121 LayoutTestContentBrowserClient::Get()->GetLayoutTestNotificationManager();
123 manager->SetPermission(origin, permission_granted ?
124 blink::WebNotificationPermissionAllowed :
125 blink::WebNotificationPermissionDenied);
129 void LayoutTestMessageFilter::OnClearWebNotificationPermissions() {
130 LayoutTestNotificationManager* manager =
131 LayoutTestContentBrowserClient::Get()->GetLayoutTestNotificationManager();
133 manager->ClearPermissions();
136 void LayoutTestMessageFilter::OnSimulateWebNotificationClick(
137 const std::string& title) {
138 LayoutTestNotificationManager* manager =
139 LayoutTestContentBrowserClient::Get()->GetLayoutTestNotificationManager();
141 manager->SimulateClick(title);
144 void LayoutTestMessageFilter::OnAcceptAllCookies(bool accept) {
145 ShellNetworkDelegate::SetAcceptAllCookies(accept);
148 void LayoutTestMessageFilter::OnDeleteAllCookies() {
149 request_context_getter_->GetURLRequestContext()->cookie_store()
151 ->DeleteAllAsync(net::CookieMonster::DeleteCallback());
154 } // namespace content