embedded_worker_registry.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_registry.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind_helpers.h" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/stl_util.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/renderer_host/render_widget_helper.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/service_worker/embedded_worker_instance.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/service_worker/service_worker_context_core.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/service_worker/service_worker_context_wrapper.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/service_worker/embedded_worker_messages.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/browser_thread.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ipc/ipc_message.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ipc/ipc_sender.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace content { 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)EmbeddedWorkerRegistry::EmbeddedWorkerRegistry( 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtr<ServiceWorkerContextCore> context) 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : context_(context), 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) next_embedded_worker_id_(0) {} 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<EmbeddedWorkerInstance> EmbeddedWorkerRegistry::CreateWorker() { 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<EmbeddedWorkerInstance> worker( 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new EmbeddedWorkerInstance(this, next_embedded_worker_id_)); 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) worker_map_[next_embedded_worker_id_++] = worker.get(); 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return worker.Pass(); 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EmbeddedWorkerRegistry::StartWorker(const std::vector<int>& process_ids, 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int embedded_worker_id, 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int64 service_worker_version_id, 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GURL& scope, 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GURL& script_url, 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const StatusCallback& callback) { 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!context_) { 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(SERVICE_WORKER_ERROR_ABORT); 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new EmbeddedWorkerMsg_StartWorker_Params()); 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->embedded_worker_id = embedded_worker_id; 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->service_worker_version_id = service_worker_version_id; 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->scope = scope; 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->script_url = script_url; 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu context_->process_manager()->AllocateWorkerProcess( 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu process_ids, 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu script_url, 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind(&EmbeddedWorkerRegistry::StartWorkerWithProcessId, 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu embedded_worker_id, 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Passed(¶ms), 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback)); 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ServiceWorkerStatusCode EmbeddedWorkerRegistry::StopWorker( 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, int embedded_worker_id) { 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (context_) 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu context_->process_manager()->ReleaseWorkerProcess(process_id); 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return Send(process_id, 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new EmbeddedWorkerMsg_StopWorker(embedded_worker_id)); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool EmbeddedWorkerRegistry::OnMessageReceived(const IPC::Message& message) { 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // TODO(kinuko): Move all EmbeddedWorker message handling from 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // ServiceWorkerDispatcherHost. 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WorkerInstanceMap::iterator found = worker_map_.find(message.routing_id()); 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (found == worker_map_.end()) { 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(ERROR) << "Worker " << message.routing_id() << " not registered"; 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return found->second->OnMessageReceived(message); 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EmbeddedWorkerRegistry::Shutdown() { 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (WorkerInstanceMap::iterator it = worker_map_.begin(); 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it != worker_map_.end(); 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++it) { 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu it->second->Stop(); 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EmbeddedWorkerRegistry::OnWorkerStarted( 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, int thread_id, int embedded_worker_id) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!ContainsKey(worker_process_map_, process_id) || 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_[process_id].count(embedded_worker_id) == 0); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found == worker_map_.end()) { 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_[process_id].insert(embedded_worker_id); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(found->second->process_id(), process_id); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) found->second->OnStarted(thread_id); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EmbeddedWorkerRegistry::OnWorkerStopped( 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, int embedded_worker_id) { 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found == worker_map_.end()) { 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_EQ(found->second->process_id(), process_id); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_[process_id].erase(embedded_worker_id); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) found->second->OnStopped(); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid EmbeddedWorkerRegistry::OnReportException( 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int embedded_worker_id, 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::string16& error_message, 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int line_number, 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int column_number, 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& source_url) { 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (found == worker_map_.end()) { 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch found->second->OnReportException( 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch error_message, line_number, column_number, source_url); 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid EmbeddedWorkerRegistry::OnReportConsoleMessage( 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int embedded_worker_id, 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int source_identifier, 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int message_level, 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::string16& message, 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int line_number, 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& source_url) { 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (found == worker_map_.end()) { 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch found->second->OnReportConsoleMessage( 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch source_identifier, message_level, message, line_number, source_url); 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void EmbeddedWorkerRegistry::AddChildProcessSender( 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int process_id, IPC::Sender* sender) { 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_sender_map_[process_id] = sender; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!ContainsKey(worker_process_map_, process_id)); 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void EmbeddedWorkerRegistry::RemoveChildProcessSender(int process_id) { 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_sender_map_.erase(process_id); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, std::set<int> >::iterator found = 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.find(process_id); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found != worker_process_map_.end()) { 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::set<int>& worker_set = worker_process_map_[process_id]; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::set<int>::const_iterator it = worker_set.begin(); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != worker_set.end(); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int embedded_worker_id = *it; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ContainsKey(worker_map_, embedded_worker_id)); 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_map_[embedded_worker_id]->OnStopped(); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.erase(found); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)EmbeddedWorkerInstance* EmbeddedWorkerRegistry::GetWorker( 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int embedded_worker_id) { 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found == worker_map_.end()) 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return found->second; 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEmbeddedWorkerRegistry::~EmbeddedWorkerRegistry() { 1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Shutdown(); 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EmbeddedWorkerRegistry::StartWorkerWithProcessId( 1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int embedded_worker_id, 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const StatusCallback& callback, 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ServiceWorkerStatusCode status, 1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int process_id) { 1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WorkerInstanceMap::const_iterator worker = 1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu worker_map_.find(embedded_worker_id); 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (worker == worker_map_.end()) { 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The Instance was destroyed before it could finish starting. Undo what 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // we've done so far. 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (context_) 1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu context_->process_manager()->ReleaseWorkerProcess(process_id); 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(SERVICE_WORKER_ERROR_ABORT); 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (status == SERVICE_WORKER_OK) { 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Gets the new routing id for the renderer process. 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<RenderWidgetHelper> helper( 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RenderWidgetHelper::FromProcessHostID(process_id)); 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |helper| may be NULL in unittest. 2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->worker_devtools_agent_route_id = 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu helper ? helper->GetNextRoutingID() : MSG_ROUTING_NONE; 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu worker->second->RecordProcessId( 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu process_id, status, params->worker_devtools_agent_route_id); 2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (status != SERVICE_WORKER_OK) { 2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(status); 2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The ServiceWorkerDispatcherHost is supposed to be created when the process 2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // is created, and keep an entry in process_sender_map_ for its whole 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // lifetime. 2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(ContainsKey(process_sender_map_, process_id)); 2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(Send(process_id, new EmbeddedWorkerMsg_StartWorker(*params))); 2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ServiceWorkerStatusCode EmbeddedWorkerRegistry::Send( 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, IPC::Message* message) { 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_ERROR_ABORT; 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProcessToSenderMap::iterator found = process_sender_map_.find(process_id); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (found == process_sender_map_.end()) 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND; 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!found->second->Send(message)) 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_ERROR_IPC_FAILED; 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_OK; 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EmbeddedWorkerRegistry::RemoveWorker(int process_id, 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int embedded_worker_id) { 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ContainsKey(worker_map_, embedded_worker_id)); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_map_.erase(embedded_worker_id); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.erase(process_id); 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace content 237