1 // Copyright 2014 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/browser/shared_worker/shared_worker_message_filter.h" 6 7 #include "content/browser/devtools/worker_devtools_manager.h" 8 #include "content/browser/message_port_message_filter.h" 9 #include "content/browser/shared_worker/shared_worker_service_impl.h" 10 #include "content/common/devtools_messages.h" 11 #include "content/common/view_messages.h" 12 #include "content/common/worker_messages.h" 13 14 namespace content { 15 namespace { 16 const uint32 kFilteredMessageClasses[] = { 17 ViewMsgStart, 18 WorkerMsgStart, 19 }; 20 } // namespace 21 22 SharedWorkerMessageFilter::SharedWorkerMessageFilter( 23 int render_process_id, 24 ResourceContext* resource_context, 25 const WorkerStoragePartition& partition, 26 MessagePortMessageFilter* message_port_message_filter) 27 : BrowserMessageFilter(kFilteredMessageClasses, 28 arraysize(kFilteredMessageClasses)), 29 render_process_id_(render_process_id), 30 resource_context_(resource_context), 31 partition_(partition), 32 message_port_message_filter_(message_port_message_filter) { 33 } 34 35 SharedWorkerMessageFilter::~SharedWorkerMessageFilter() { 36 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 37 } 38 39 void SharedWorkerMessageFilter::OnChannelClosing() { 40 SharedWorkerServiceImpl::GetInstance()->OnSharedWorkerMessageFilterClosing( 41 this); 42 } 43 44 bool SharedWorkerMessageFilter::OnMessageReceived(const IPC::Message& message) { 45 bool handled = true; 46 IPC_BEGIN_MESSAGE_MAP(SharedWorkerMessageFilter, message) 47 // Only sent from renderer for now, until we have nested workers. 48 IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWorker, OnCreateWorker) 49 IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardToWorker, OnForwardToWorker) 50 // Only sent from renderer. 51 IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentDetached, OnDocumentDetached) 52 // Only sent from SharedWorker in renderer. 53 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextClosed, 54 OnWorkerContextClosed) 55 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextDestroyed, 56 OnWorkerContextDestroyed) 57 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoaded, 58 OnWorkerScriptLoaded) 59 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoadFailed, 60 OnWorkerScriptLoadFailed) 61 IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerConnected, 62 OnWorkerConnected) 63 IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowDatabase, OnAllowDatabase) 64 IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_RequestFileSystemAccessSync, 65 OnRequestFileSystemAccessSync) 66 IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowIndexedDB, OnAllowIndexedDB) 67 IPC_MESSAGE_UNHANDLED(handled = false) 68 IPC_END_MESSAGE_MAP() 69 return handled; 70 } 71 72 int SharedWorkerMessageFilter::GetNextRoutingID() { 73 return message_port_message_filter_->GetNextRoutingID(); 74 } 75 76 void SharedWorkerMessageFilter::OnCreateWorker( 77 const ViewHostMsg_CreateWorker_Params& params, 78 int* route_id) { 79 bool url_error = false; 80 *route_id = GetNextRoutingID(); 81 SharedWorkerServiceImpl::GetInstance()->CreateWorker( 82 params, 83 *route_id, 84 this, 85 resource_context_, 86 WorkerStoragePartitionId(partition_), 87 &url_error); 88 if (url_error) 89 *route_id = MSG_ROUTING_NONE; 90 } 91 92 void SharedWorkerMessageFilter::OnForwardToWorker(const IPC::Message& message) { 93 SharedWorkerServiceImpl::GetInstance()->ForwardToWorker(message, this); 94 } 95 96 void SharedWorkerMessageFilter::OnDocumentDetached( 97 unsigned long long document_id) { 98 SharedWorkerServiceImpl::GetInstance()->DocumentDetached(document_id, this); 99 } 100 101 void SharedWorkerMessageFilter::OnWorkerContextClosed(int worker_route_id) { 102 SharedWorkerServiceImpl::GetInstance()->WorkerContextClosed(worker_route_id, 103 this); 104 } 105 106 void SharedWorkerMessageFilter::OnWorkerContextDestroyed(int worker_route_id) { 107 SharedWorkerServiceImpl::GetInstance()->WorkerContextDestroyed( 108 worker_route_id, 109 this); 110 } 111 112 void SharedWorkerMessageFilter::OnWorkerScriptLoaded(int worker_route_id) { 113 SharedWorkerServiceImpl::GetInstance()->WorkerScriptLoaded(worker_route_id, 114 this); 115 } 116 117 void SharedWorkerMessageFilter::OnWorkerScriptLoadFailed(int worker_route_id) { 118 SharedWorkerServiceImpl::GetInstance()->WorkerScriptLoadFailed( 119 worker_route_id, 120 this); 121 } 122 123 void SharedWorkerMessageFilter::OnWorkerConnected(int message_port_id, 124 int worker_route_id) { 125 SharedWorkerServiceImpl::GetInstance()->WorkerConnected( 126 message_port_id, 127 worker_route_id, 128 this); 129 } 130 131 void SharedWorkerMessageFilter::OnAllowDatabase( 132 int worker_route_id, 133 const GURL& url, 134 const base::string16& name, 135 const base::string16& display_name, 136 unsigned long estimated_size, 137 bool* result) { 138 SharedWorkerServiceImpl::GetInstance()->AllowDatabase(worker_route_id, 139 url, 140 name, 141 display_name, 142 estimated_size, 143 result, 144 this); 145 } 146 147 void SharedWorkerMessageFilter::OnRequestFileSystemAccessSync( 148 int worker_route_id, 149 const GURL& url, 150 bool* result) { 151 SharedWorkerServiceImpl::GetInstance()->AllowFileSystem(worker_route_id, 152 url, 153 result, 154 this); 155 } 156 157 void SharedWorkerMessageFilter::OnAllowIndexedDB(int worker_route_id, 158 const GURL& url, 159 const base::string16& name, 160 bool* result) { 161 SharedWorkerServiceImpl::GetInstance()->AllowIndexedDB(worker_route_id, 162 url, 163 name, 164 result, 165 this); 166 } 167 168 } // namespace content 169