OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/service_worker/embedded_worker_registry.h" | 5 #include "content/browser/service_worker/embedded_worker_registry.h" |
6 | 6 |
7 #include "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "content/browser/renderer_host/render_widget_helper.h" | 10 #include "content/browser/renderer_host/render_widget_helper.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 return registry; | 36 return registry; |
37 } | 37 } |
38 | 38 |
39 std::unique_ptr<EmbeddedWorkerInstance> EmbeddedWorkerRegistry::CreateWorker() { | 39 std::unique_ptr<EmbeddedWorkerInstance> EmbeddedWorkerRegistry::CreateWorker() { |
40 std::unique_ptr<EmbeddedWorkerInstance> worker( | 40 std::unique_ptr<EmbeddedWorkerInstance> worker( |
41 new EmbeddedWorkerInstance(context_, next_embedded_worker_id_)); | 41 new EmbeddedWorkerInstance(context_, next_embedded_worker_id_)); |
42 worker_map_[next_embedded_worker_id_++] = worker.get(); | 42 worker_map_[next_embedded_worker_id_++] = worker.get(); |
43 return worker; | 43 return worker; |
44 } | 44 } |
45 | 45 |
46 ServiceWorkerStatusCode EmbeddedWorkerRegistry::StopWorker( | |
47 int process_id, int embedded_worker_id) { | |
48 return Send(process_id, | |
49 new EmbeddedWorkerMsg_StopWorker(embedded_worker_id)); | |
50 } | |
51 | |
52 bool EmbeddedWorkerRegistry::OnMessageReceived(const IPC::Message& message, | 46 bool EmbeddedWorkerRegistry::OnMessageReceived(const IPC::Message& message, |
53 int process_id) { | 47 int process_id) { |
54 // TODO(kinuko): Move all EmbeddedWorker message handling from | 48 // TODO(kinuko): Move all EmbeddedWorker message handling from |
55 // ServiceWorkerDispatcherHost. | 49 // ServiceWorkerDispatcherHost. |
56 | 50 |
57 EmbeddedWorkerInstance* worker = | 51 EmbeddedWorkerInstance* worker = |
58 GetWorkerForMessage(process_id, message.routing_id()); | 52 GetWorkerForMessage(process_id, message.routing_id()); |
59 if (!worker) { | 53 if (!worker) { |
60 // Assume this is from a detached worker, return true to indicate we're | 54 // Assume this is from a detached worker, return true to indicate we're |
61 // purposely handling the message as no-op. | 55 // purposely handling the message as no-op. |
(...skipping 10 matching lines...) Expand all Loading... |
72 } | 66 } |
73 | 67 |
74 void EmbeddedWorkerRegistry::Shutdown() { | 68 void EmbeddedWorkerRegistry::Shutdown() { |
75 for (WorkerInstanceMap::iterator it = worker_map_.begin(); | 69 for (WorkerInstanceMap::iterator it = worker_map_.begin(); |
76 it != worker_map_.end(); | 70 it != worker_map_.end(); |
77 ++it) { | 71 ++it) { |
78 it->second->Stop(); | 72 it->second->Stop(); |
79 } | 73 } |
80 } | 74 } |
81 | 75 |
82 void EmbeddedWorkerRegistry::OnWorkerReadyForInspection( | 76 bool EmbeddedWorkerRegistry::OnWorkerStarted(int process_id, |
83 int process_id, | 77 int embedded_worker_id) { |
84 int embedded_worker_id) { | 78 if (!base::ContainsKey(worker_process_map_, process_id) || |
85 EmbeddedWorkerInstance* worker = | 79 !base::ContainsKey(worker_process_map_[process_id], embedded_worker_id)) { |
86 GetWorkerForMessage(process_id, embedded_worker_id); | 80 return false; |
87 if (!worker) | 81 } |
88 return; | 82 |
89 worker->OnReadyForInspection(); | 83 lifetime_tracker_.StartTiming(embedded_worker_id); |
| 84 return true; |
90 } | 85 } |
91 | 86 |
92 void EmbeddedWorkerRegistry::OnWorkerScriptLoaded(int process_id, | 87 void EmbeddedWorkerRegistry::OnWorkerStopped(int process_id, |
93 int embedded_worker_id) { | 88 int embedded_worker_id) { |
94 EmbeddedWorkerInstance* worker = | |
95 GetWorkerForMessage(process_id, embedded_worker_id); | |
96 if (!worker) | |
97 return; | |
98 worker->OnScriptLoaded(); | |
99 } | |
100 | |
101 void EmbeddedWorkerRegistry::OnWorkerThreadStarted(int process_id, | |
102 int thread_id, | |
103 int embedded_worker_id) { | |
104 EmbeddedWorkerInstance* worker = | |
105 GetWorkerForMessage(process_id, embedded_worker_id); | |
106 if (!worker) | |
107 return; | |
108 worker->OnThreadStarted(thread_id); | |
109 } | |
110 | |
111 void EmbeddedWorkerRegistry::OnWorkerScriptLoadFailed(int process_id, | |
112 int embedded_worker_id) { | |
113 EmbeddedWorkerInstance* worker = | |
114 GetWorkerForMessage(process_id, embedded_worker_id); | |
115 if (!worker) | |
116 return; | |
117 worker->OnScriptLoadFailed(); | |
118 } | |
119 | |
120 void EmbeddedWorkerRegistry::OnWorkerScriptEvaluated(int process_id, | |
121 int embedded_worker_id, | |
122 bool success) { | |
123 EmbeddedWorkerInstance* worker = | |
124 GetWorkerForMessage(process_id, embedded_worker_id); | |
125 if (!worker) | |
126 return; | |
127 worker->OnScriptEvaluated(success); | |
128 } | |
129 | |
130 void EmbeddedWorkerRegistry::OnWorkerStarted( | |
131 int process_id, int embedded_worker_id) { | |
132 EmbeddedWorkerInstance* worker = | |
133 GetWorkerForMessage(process_id, embedded_worker_id); | |
134 if (!worker) | |
135 return; | |
136 | |
137 if (!base::ContainsKey(worker_process_map_, process_id) || | |
138 !base::ContainsKey(worker_process_map_[process_id], embedded_worker_id)) { | |
139 return; | |
140 } | |
141 | |
142 worker->OnStarted(); | |
143 lifetime_tracker_.StartTiming(embedded_worker_id); | |
144 } | |
145 | |
146 void EmbeddedWorkerRegistry::OnWorkerStopped( | |
147 int process_id, int embedded_worker_id) { | |
148 EmbeddedWorkerInstance* worker = | |
149 GetWorkerForMessage(process_id, embedded_worker_id); | |
150 if (!worker) | |
151 return; | |
152 worker_process_map_[process_id].erase(embedded_worker_id); | 89 worker_process_map_[process_id].erase(embedded_worker_id); |
153 worker->OnStopped(); | |
154 lifetime_tracker_.StopTiming(embedded_worker_id); | 90 lifetime_tracker_.StopTiming(embedded_worker_id); |
155 } | 91 } |
156 | 92 |
157 void EmbeddedWorkerRegistry::OnReportException( | |
158 int embedded_worker_id, | |
159 const base::string16& error_message, | |
160 int line_number, | |
161 int column_number, | |
162 const GURL& source_url) { | |
163 EmbeddedWorkerInstance* worker = GetWorker(embedded_worker_id); | |
164 if (!worker) | |
165 return; | |
166 worker->OnReportException(error_message, line_number, column_number, | |
167 source_url); | |
168 } | |
169 | |
170 void EmbeddedWorkerRegistry::OnReportConsoleMessage( | |
171 int embedded_worker_id, | |
172 int source_identifier, | |
173 int message_level, | |
174 const base::string16& message, | |
175 int line_number, | |
176 const GURL& source_url) { | |
177 EmbeddedWorkerInstance* worker = GetWorker(embedded_worker_id); | |
178 if (!worker) | |
179 return; | |
180 worker->OnReportConsoleMessage(source_identifier, message_level, message, | |
181 line_number, source_url); | |
182 } | |
183 | |
184 void EmbeddedWorkerRegistry::OnDevToolsAttached(int embedded_worker_id) { | 93 void EmbeddedWorkerRegistry::OnDevToolsAttached(int embedded_worker_id) { |
185 lifetime_tracker_.AbortTiming(embedded_worker_id); | 94 lifetime_tracker_.AbortTiming(embedded_worker_id); |
186 } | 95 } |
187 | 96 |
188 void EmbeddedWorkerRegistry::RemoveProcess(int process_id) { | 97 void EmbeddedWorkerRegistry::RemoveProcess(int process_id) { |
189 std::map<int, std::set<int> >::iterator found = | 98 std::map<int, std::set<int> >::iterator found = |
190 worker_process_map_.find(process_id); | 99 worker_process_map_.find(process_id); |
191 if (found != worker_process_map_.end()) { | 100 if (found != worker_process_map_.end()) { |
192 const std::set<int>& worker_set = worker_process_map_[process_id]; | 101 const std::set<int>& worker_set = worker_process_map_[process_id]; |
193 for (std::set<int>::const_iterator it = worker_set.begin(); | 102 for (std::set<int>::const_iterator it = worker_set.begin(); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 EmbeddedWorkerInstance* worker = GetWorker(embedded_worker_id); | 193 EmbeddedWorkerInstance* worker = GetWorker(embedded_worker_id); |
285 if (!worker || worker->process_id() != process_id) { | 194 if (!worker || worker->process_id() != process_id) { |
286 UMA_HISTOGRAM_BOOLEAN("ServiceWorker.WorkerForMessageFound", false); | 195 UMA_HISTOGRAM_BOOLEAN("ServiceWorker.WorkerForMessageFound", false); |
287 return nullptr; | 196 return nullptr; |
288 } | 197 } |
289 UMA_HISTOGRAM_BOOLEAN("ServiceWorker.WorkerForMessageFound", true); | 198 UMA_HISTOGRAM_BOOLEAN("ServiceWorker.WorkerForMessageFound", true); |
290 return worker; | 199 return worker; |
291 } | 200 } |
292 | 201 |
293 } // namespace content | 202 } // namespace content |
OLD | NEW |