15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_message_filter.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/message_port_message_filter.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/shared_worker/shared_worker_service_impl.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/devtools_messages.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/view_messages.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/worker_messages.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const uint32 kFilteredMessageClasses[] = { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ViewMsgStart, 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerMsgStart, 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SharedWorkerMessageFilter::SharedWorkerMessageFilter( 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_process_id, 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceContext* resource_context, 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const WorkerStoragePartition& partition, 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MessagePortMessageFilter* message_port_message_filter) 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : BrowserMessageFilter(kFilteredMessageClasses, 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu arraysize(kFilteredMessageClasses)), 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) render_process_id_(render_process_id), 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource_context_(resource_context), 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) partition_(partition), 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_port_message_filter_(message_port_message_filter) { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SharedWorkerMessageFilter::~SharedWorkerMessageFilter() { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnChannelClosing() { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->OnSharedWorkerMessageFilterClosing( 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool SharedWorkerMessageFilter::OnMessageReceived(const IPC::Message& message) { 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool handled = true; 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(SharedWorkerMessageFilter, message) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only sent from renderer for now, until we have nested workers. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWorker, OnCreateWorker) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardToWorker, OnForwardToWorker) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only sent from renderer. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(ViewHostMsg_DocumentDetached, OnDocumentDetached) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only sent from SharedWorker in renderer. 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextClosed, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnWorkerContextClosed) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerContextDestroyed, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnWorkerContextDestroyed) 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerReadyForInspection, 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OnWorkerReadyForInspection) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoaded, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnWorkerScriptLoaded) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerScriptLoadFailed, 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnWorkerScriptLoadFailed) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerHostMsg_WorkerConnected, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnWorkerConnected) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowDatabase, OnAllowDatabase) 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER_DELAY_REPLY( 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WorkerProcessHostMsg_RequestFileSystemAccessSync, 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnRequestFileSystemAccess) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowIndexedDB, OnAllowIndexedDB) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IPC_END_MESSAGE_MAP() 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return handled; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int SharedWorkerMessageFilter::GetNextRoutingID() { 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return message_port_message_filter_->GetNextRoutingID(); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnCreateWorker( 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ViewHostMsg_CreateWorker_Params& params, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int* route_id) { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool url_error = false; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *route_id = GetNextRoutingID(); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->CreateWorker( 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params, 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *route_id, 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu resource_context_, 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WorkerStoragePartitionId(partition_), 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &url_error); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (url_error) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *route_id = MSG_ROUTING_NONE; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnForwardToWorker(const IPC::Message& message) { 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->ForwardToWorker(message, this); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnDocumentDetached( 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long long document_id) { 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->DocumentDetached(document_id, this); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnWorkerContextClosed(int worker_route_id) { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->WorkerContextClosed(worker_route_id, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnWorkerContextDestroyed(int worker_route_id) { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->WorkerContextDestroyed( 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_route_id, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SharedWorkerMessageFilter::OnWorkerReadyForInspection( 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int worker_route_id) { 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->WorkerReadyForInspection( 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) worker_route_id, this); 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnWorkerScriptLoaded(int worker_route_id) { 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->WorkerScriptLoaded(worker_route_id, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnWorkerScriptLoadFailed(int worker_route_id) { 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->WorkerScriptLoadFailed( 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_route_id, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnWorkerConnected(int message_port_id, 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int worker_route_id) { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->WorkerConnected( 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_port_id, 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_route_id, 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnAllowDatabase( 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int worker_route_id, 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& name, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& display_name, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long estimated_size, 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* result) { 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->AllowDatabase(worker_route_id, 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name, 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) display_name, 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) estimated_size, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result, 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SharedWorkerMessageFilter::OnRequestFileSystemAccess( 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int worker_route_id, 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& url, 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC::Message* reply_msg) { 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SharedWorkerServiceImpl::GetInstance()->AllowFileSystem( 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch worker_route_id, url, reply_msg, this); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SharedWorkerMessageFilter::OnAllowIndexedDB(int worker_route_id, 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& url, 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& name, 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool* result) { 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedWorkerServiceImpl::GetInstance()->AllowIndexedDB(worker_route_id, 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url, 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) name, 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) result, 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 175