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