Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/inspector/v8-inspector-impl.cc

Issue 2906153002: [inspector] Support multiple sessions per context group (Closed)
Patch Set: using set per kozy@ Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/inspector/v8-inspector-impl.h ('k') | src/inspector/v8-runtime-agent-impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010-2011 Google Inc. All rights reserved. 2 * Copyright (c) 2010-2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 } 144 }
145 145
146 std::unique_ptr<V8StackTrace> V8InspectorImpl::createStackTrace( 146 std::unique_ptr<V8StackTrace> V8InspectorImpl::createStackTrace(
147 v8::Local<v8::StackTrace> stackTrace) { 147 v8::Local<v8::StackTrace> stackTrace) {
148 return m_debugger->createStackTrace(stackTrace); 148 return m_debugger->createStackTrace(stackTrace);
149 } 149 }
150 150
151 std::unique_ptr<V8InspectorSession> V8InspectorImpl::connect( 151 std::unique_ptr<V8InspectorSession> V8InspectorImpl::connect(
152 int contextGroupId, V8Inspector::Channel* channel, 152 int contextGroupId, V8Inspector::Channel* channel,
153 const StringView& state) { 153 const StringView& state) {
154 DCHECK(m_sessions.find(contextGroupId) == m_sessions.cend());
155 int sessionId = ++m_lastSessionId; 154 int sessionId = ++m_lastSessionId;
156 std::unique_ptr<V8InspectorSessionImpl> session = 155 std::unique_ptr<V8InspectorSessionImpl> session =
157 V8InspectorSessionImpl::create(this, contextGroupId, sessionId, channel, 156 V8InspectorSessionImpl::create(this, contextGroupId, sessionId, channel,
158 state); 157 state);
159 m_sessions[contextGroupId] = session.get(); 158 m_sessions[contextGroupId][sessionId] = session.get();
160 m_sessionById[sessionId] = session.get();
161 return std::move(session); 159 return std::move(session);
162 } 160 }
163 161
164 void V8InspectorImpl::disconnect(V8InspectorSessionImpl* session) { 162 void V8InspectorImpl::disconnect(V8InspectorSessionImpl* session) {
165 DCHECK(m_sessions.find(session->contextGroupId()) != m_sessions.end()); 163 auto& map = m_sessions[session->contextGroupId()];
166 m_sessions.erase(session->contextGroupId()); 164 map.erase(session->sessionId());
167 m_sessionById.erase(session->sessionId()); 165 if (map.empty()) m_sessions.erase(session->contextGroupId());
168 } 166 }
169 167
170 InspectedContext* V8InspectorImpl::getContext(int groupId, 168 InspectedContext* V8InspectorImpl::getContext(int groupId,
171 int contextId) const { 169 int contextId) const {
172 if (!groupId || !contextId) return nullptr; 170 if (!groupId || !contextId) return nullptr;
173 171
174 ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId); 172 ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId);
175 if (contextGroupIt == m_contexts.end()) return nullptr; 173 if (contextGroupIt == m_contexts.end()) return nullptr;
176 174
177 ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId); 175 ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId);
(...skipping 11 matching lines...) Expand all
189 if (contextIt == m_contexts.end()) 187 if (contextIt == m_contexts.end())
190 contextIt = m_contexts 188 contextIt = m_contexts
191 .insert(std::make_pair( 189 .insert(std::make_pair(
192 info.contextGroupId, 190 info.contextGroupId,
193 std::unique_ptr<ContextByIdMap>(new ContextByIdMap()))) 191 std::unique_ptr<ContextByIdMap>(new ContextByIdMap())))
194 .first; 192 .first;
195 const auto& contextById = contextIt->second; 193 const auto& contextById = contextIt->second;
196 194
197 DCHECK(contextById->find(contextId) == contextById->cend()); 195 DCHECK(contextById->find(contextId) == contextById->cend());
198 (*contextById)[contextId].reset(context); 196 (*contextById)[contextId].reset(context);
199 SessionMap::iterator sessionIt = m_sessions.find(info.contextGroupId); 197 forEachSession(
200 if (sessionIt != m_sessions.end()) 198 info.contextGroupId, [&context](V8InspectorSessionImpl* session) {
201 sessionIt->second->runtimeAgent()->reportExecutionContextCreated(context); 199 session->runtimeAgent()->reportExecutionContextCreated(context);
200 });
202 } 201 }
203 202
204 void V8InspectorImpl::contextDestroyed(v8::Local<v8::Context> context) { 203 void V8InspectorImpl::contextDestroyed(v8::Local<v8::Context> context) {
205 int contextId = InspectedContext::contextId(context); 204 int contextId = InspectedContext::contextId(context);
206 int groupId = contextGroupId(context); 205 int groupId = contextGroupId(context);
207 m_contextIdToGroupIdMap.erase(contextId); 206 m_contextIdToGroupIdMap.erase(contextId);
208 207
209 ConsoleStorageMap::iterator storageIt = m_consoleStorageMap.find(groupId); 208 ConsoleStorageMap::iterator storageIt = m_consoleStorageMap.find(groupId);
210 if (storageIt != m_consoleStorageMap.end()) 209 if (storageIt != m_consoleStorageMap.end())
211 storageIt->second->contextDestroyed(contextId); 210 storageIt->second->contextDestroyed(contextId);
212 211
213 InspectedContext* inspectedContext = getContext(groupId, contextId); 212 InspectedContext* inspectedContext = getContext(groupId, contextId);
214 if (!inspectedContext) return; 213 if (!inspectedContext) return;
215 214
216 SessionMap::iterator iter = m_sessions.find(groupId); 215 forEachSession(groupId, [&inspectedContext](V8InspectorSessionImpl* session) {
217 if (iter != m_sessions.end()) 216 session->runtimeAgent()->reportExecutionContextDestroyed(inspectedContext);
218 iter->second->runtimeAgent()->reportExecutionContextDestroyed( 217 });
219 inspectedContext);
220 discardInspectedContext(groupId, contextId); 218 discardInspectedContext(groupId, contextId);
221 } 219 }
222 220
223 void V8InspectorImpl::resetContextGroup(int contextGroupId) { 221 void V8InspectorImpl::resetContextGroup(int contextGroupId) {
224 m_consoleStorageMap.erase(contextGroupId); 222 m_consoleStorageMap.erase(contextGroupId);
225 m_muteExceptionsMap.erase(contextGroupId); 223 m_muteExceptionsMap.erase(contextGroupId);
226 SessionMap::iterator session = m_sessions.find(contextGroupId); 224 forEachSession(contextGroupId,
227 if (session != m_sessions.end()) session->second->reset(); 225 [](V8InspectorSessionImpl* session) { session->reset(); });
228 m_contexts.erase(contextGroupId); 226 m_contexts.erase(contextGroupId);
229 m_debugger->wasmTranslation()->Clear(); 227 m_debugger->wasmTranslation()->Clear();
230 } 228 }
231 229
232 void V8InspectorImpl::idleStarted() { 230 void V8InspectorImpl::idleStarted() {
233 for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { 231 for (auto& it : m_sessions) {
234 if (it->second->profilerAgent()->idleStarted()) return; 232 for (auto& it2 : it.second) {
233 if (it2.second->profilerAgent()->idleStarted()) return;
234 }
235 } 235 }
236 } 236 }
237 237
238 void V8InspectorImpl::idleFinished() { 238 void V8InspectorImpl::idleFinished() {
239 for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { 239 for (auto& it : m_sessions) {
240 if (it->second->profilerAgent()->idleFinished()) return; 240 for (auto& it2 : it.second) {
241 if (it2.second->profilerAgent()->idleFinished()) return;
242 }
241 } 243 }
242 } 244 }
243 245
244 unsigned V8InspectorImpl::exceptionThrown( 246 unsigned V8InspectorImpl::exceptionThrown(
245 v8::Local<v8::Context> context, const StringView& message, 247 v8::Local<v8::Context> context, const StringView& message,
246 v8::Local<v8::Value> exception, const StringView& detailedMessage, 248 v8::Local<v8::Value> exception, const StringView& detailedMessage,
247 const StringView& url, unsigned lineNumber, unsigned columnNumber, 249 const StringView& url, unsigned lineNumber, unsigned columnNumber,
248 std::unique_ptr<V8StackTrace> stackTrace, int scriptId) { 250 std::unique_ptr<V8StackTrace> stackTrace, int scriptId) {
249 int groupId = contextGroupId(context); 251 int groupId = contextGroupId(context);
250 if (!groupId || m_muteExceptionsMap[groupId]) return 0; 252 if (!groupId || m_muteExceptionsMap[groupId]) return 0;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 return m_regexContext.Get(m_isolate); 307 return m_regexContext.Get(m_isolate);
306 } 308 }
307 309
308 void V8InspectorImpl::discardInspectedContext(int contextGroupId, 310 void V8InspectorImpl::discardInspectedContext(int contextGroupId,
309 int contextId) { 311 int contextId) {
310 if (!getContext(contextGroupId, contextId)) return; 312 if (!getContext(contextGroupId, contextId)) return;
311 m_contexts[contextGroupId]->erase(contextId); 313 m_contexts[contextGroupId]->erase(contextId);
312 if (m_contexts[contextGroupId]->empty()) m_contexts.erase(contextGroupId); 314 if (m_contexts[contextGroupId]->empty()) m_contexts.erase(contextGroupId);
313 } 315 }
314 316
315 V8InspectorSessionImpl* V8InspectorImpl::sessionForContextGroup( 317 V8InspectorSessionImpl* V8InspectorImpl::sessionById(int contextGroupId,
316 int contextGroupId) { 318 int sessionId) {
317 if (!contextGroupId) return nullptr; 319 auto it = m_sessions.find(contextGroupId);
318 SessionMap::iterator iter = m_sessions.find(contextGroupId); 320 if (it == m_sessions.end()) return nullptr;
319 return iter == m_sessions.end() ? nullptr : iter->second; 321 auto it2 = it->second.find(sessionId);
320 } 322 return it2 == it->second.end() ? nullptr : it2->second;
321
322 V8InspectorSessionImpl* V8InspectorImpl::sessionById(int sessionId) {
323 auto it = m_sessionById.find(sessionId);
324 return it == m_sessionById.end() ? nullptr : it->second;
325 } 323 }
326 324
327 V8Console* V8InspectorImpl::console() { 325 V8Console* V8InspectorImpl::console() {
328 if (!m_console) m_console.reset(new V8Console(this)); 326 if (!m_console) m_console.reset(new V8Console(this));
329 return m_console.get(); 327 return m_console.get();
330 } 328 }
331 329
332 void V8InspectorImpl::forEachContext( 330 void V8InspectorImpl::forEachContext(
333 int contextGroupId, std::function<void(InspectedContext*)> callback) { 331 int contextGroupId, std::function<void(InspectedContext*)> callback) {
334 auto it = m_contexts.find(contextGroupId); 332 auto it = m_contexts.find(contextGroupId);
335 if (it == m_contexts.end()) return; 333 if (it == m_contexts.end()) return;
336 std::vector<int> ids; 334 std::vector<int> ids;
337 ids.reserve(it->second->size()); 335 ids.reserve(it->second->size());
338 for (auto& contextIt : *(it->second)) ids.push_back(contextIt.first); 336 for (auto& contextIt : *(it->second)) ids.push_back(contextIt.first);
339 337
340 // Retrieve by ids each time since |callback| may destroy some contexts. 338 // Retrieve by ids each time since |callback| may destroy some contexts.
341 for (auto& contextId : ids) { 339 for (auto& contextId : ids) {
342 it = m_contexts.find(contextGroupId); 340 it = m_contexts.find(contextGroupId);
343 if (it == m_contexts.end()) continue; 341 if (it == m_contexts.end()) continue;
344 auto contextIt = it->second->find(contextId); 342 auto contextIt = it->second->find(contextId);
345 if (contextIt != it->second->end()) callback(contextIt->second.get()); 343 if (contextIt != it->second->end()) callback(contextIt->second.get());
346 } 344 }
347 } 345 }
348 346
347 void V8InspectorImpl::forEachSession(
348 int contextGroupId, std::function<void(V8InspectorSessionImpl*)> callback) {
349 auto it = m_sessions.find(contextGroupId);
350 if (it == m_sessions.end()) return;
351 std::vector<int> ids;
352 ids.reserve(it->second.size());
353 for (auto& sessionIt : it->second) ids.push_back(sessionIt.first);
354
355 // Retrieve by ids each time since |callback| may destroy some contexts.
356 for (auto& sessionId : ids) {
357 it = m_sessions.find(contextGroupId);
358 if (it == m_sessions.end()) continue;
359 auto sessionIt = it->second.find(sessionId);
360 if (sessionIt != it->second.end()) callback(sessionIt->second);
361 }
362 }
363
349 } // namespace v8_inspector 364 } // namespace v8_inspector
OLDNEW
« no previous file with comments | « src/inspector/v8-inspector-impl.h ('k') | src/inspector/v8-runtime-agent-impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698