embedded_worker_registry.cc revision 010d83a9304c5a91596085d917d248abff47903a
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 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void EmbeddedWorkerRegistry::OnWorkerScriptLoaded(int process_id, 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int embedded_worker_id) { 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (found == worker_map_.end()) { 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (found->second->process_id() != process_id) { 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Incorrect embedded_worker_id"; 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) found->second->OnScriptLoaded(); 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void EmbeddedWorkerRegistry::OnWorkerScriptLoadFailed(int process_id, 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int embedded_worker_id) { 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (found == worker_map_.end()) { 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (found->second->process_id() != process_id) { 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Incorrect embedded_worker_id"; 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) found->second->OnScriptLoadFailed(); 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EmbeddedWorkerRegistry::OnWorkerStarted( 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, int thread_id, int embedded_worker_id) { 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!ContainsKey(worker_process_map_, process_id) || 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_[process_id].count(embedded_worker_id) == 0); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found == worker_map_.end()) { 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (found->second->process_id() != process_id) { 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Incorrect embedded_worker_id"; 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_[process_id].insert(embedded_worker_id); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) found->second->OnStarted(thread_id); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EmbeddedWorkerRegistry::OnWorkerStopped( 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, int embedded_worker_id) { 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found == worker_map_.end()) { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (found->second->process_id() != process_id) { 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(ERROR) << "Incorrect embedded_worker_id"; 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_[process_id].erase(embedded_worker_id); 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) found->second->OnStopped(); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid EmbeddedWorkerRegistry::OnReportException( 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int embedded_worker_id, 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::string16& error_message, 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int line_number, 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int column_number, 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& source_url) { 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (found == worker_map_.end()) { 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch found->second->OnReportException( 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch error_message, line_number, column_number, source_url); 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid EmbeddedWorkerRegistry::OnReportConsoleMessage( 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int embedded_worker_id, 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int source_identifier, 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int message_level, 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::string16& message, 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int line_number, 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GURL& source_url) { 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (found == worker_map_.end()) { 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(ERROR) << "Worker " << embedded_worker_id << " not registered"; 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch found->second->OnReportConsoleMessage( 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch source_identifier, message_level, message, line_number, source_url); 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void EmbeddedWorkerRegistry::AddChildProcessSender( 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int process_id, IPC::Sender* sender) { 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_sender_map_[process_id] = sender; 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!ContainsKey(worker_process_map_, process_id)); 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void EmbeddedWorkerRegistry::RemoveChildProcessSender(int process_id) { 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) process_sender_map_.erase(process_id); 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<int, std::set<int> >::iterator found = 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.find(process_id); 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found != worker_process_map_.end()) { 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::set<int>& worker_set = worker_process_map_[process_id]; 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (std::set<int>::const_iterator it = worker_set.begin(); 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) it != worker_set.end(); 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ++it) { 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int embedded_worker_id = *it; 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ContainsKey(worker_map_, embedded_worker_id)); 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_map_[embedded_worker_id]->OnStopped(); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.erase(found); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)EmbeddedWorkerInstance* EmbeddedWorkerRegistry::GetWorker( 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int embedded_worker_id) { 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WorkerInstanceMap::iterator found = worker_map_.find(embedded_worker_id); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (found == worker_map_.end()) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return found->second; 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuEmbeddedWorkerRegistry::~EmbeddedWorkerRegistry() { 2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Shutdown(); 2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid EmbeddedWorkerRegistry::StartWorkerWithProcessId( 2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int embedded_worker_id, 2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, 2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const StatusCallback& callback, 2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ServiceWorkerStatusCode status, 2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int process_id) { 2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WorkerInstanceMap::const_iterator worker = 2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu worker_map_.find(embedded_worker_id); 2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (worker == worker_map_.end()) { 2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The Instance was destroyed before it could finish starting. Undo what 2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // we've done so far. 2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (context_) 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu context_->process_manager()->ReleaseWorkerProcess(process_id); 2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(SERVICE_WORKER_ERROR_ABORT); 2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (status == SERVICE_WORKER_OK) { 2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Gets the new routing id for the renderer process. 2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<RenderWidgetHelper> helper( 2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RenderWidgetHelper::FromProcessHostID(process_id)); 2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // |helper| may be NULL in unittest. 2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu params->worker_devtools_agent_route_id = 2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu helper ? helper->GetNextRoutingID() : MSG_ROUTING_NONE; 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu worker->second->RecordProcessId( 2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu process_id, status, params->worker_devtools_agent_route_id); 2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (status != SERVICE_WORKER_OK) { 2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(status); 2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // The ServiceWorkerDispatcherHost is supposed to be created when the process 2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // is created, and keep an entry in process_sender_map_ for its whole 2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // lifetime. 2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(ContainsKey(process_sender_map_, process_id)); 2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback.Run(Send(process_id, new EmbeddedWorkerMsg_StartWorker(*params))); 2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ServiceWorkerStatusCode EmbeddedWorkerRegistry::Send( 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int process_id, IPC::Message* message) { 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!context_) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_ERROR_ABORT; 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ProcessToSenderMap::iterator found = process_sender_map_.find(process_id); 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (found == process_sender_map_.end()) 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND; 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!found->second->Send(message)) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_ERROR_IPC_FAILED; 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return SERVICE_WORKER_OK; 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EmbeddedWorkerRegistry::RemoveWorker(int process_id, 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int embedded_worker_id) { 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ContainsKey(worker_map_, embedded_worker_id)); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_map_.erase(embedded_worker_id); 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) worker_process_map_.erase(process_id); 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace content 271