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 23 namespace content { 24 25 ShellMessageFilter::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 37 ShellMessageFilter::~ShellMessageFilter() { 38 } 39 40 void ShellMessageFilter::OverrideThreadForMessage(const IPC::Message& message, 41 BrowserThread::ID* thread) { 42 if (message.type() == ShellViewHostMsg_ClearAllDatabases::ID) 43 *thread = BrowserThread::FILE; 44 } 45 46 bool 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 68 void 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 74 void 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 90 void ShellMessageFilter::OnClearAllDatabases() { 91 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 92 database_tracker_->DeleteDataModifiedSince( 93 base::Time(), net::CompletionCallback()); 94 } 95 96 void ShellMessageFilter::OnSetDatabaseQuota(int quota) { 97 quota_manager_->SetTemporaryGlobalOverrideQuota( 98 quota * storage::QuotaManager::kPerHostTemporaryPortion, 99 storage::QuotaCallback()); 100 } 101 102 void 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 112 void 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 123 void ShellMessageFilter::OnClearWebNotificationPermissions() { 124 ShellNotificationManager* manager = 125 ShellContentBrowserClient::Get()->GetShellNotificationManager(); 126 if (manager) 127 manager->ClearPermissions(); 128 } 129 130 void ShellMessageFilter::OnAcceptAllCookies(bool accept) { 131 ShellNetworkDelegate::SetAcceptAllCookies(accept); 132 } 133 134 void ShellMessageFilter::OnDeleteAllCookies() { 135 request_context_getter_->GetURLRequestContext()->cookie_store() 136 ->GetCookieMonster() 137 ->DeleteAllAsync(net::CookieMonster::DeleteCallback()); 138 } 139 140 } // namespace content 141