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

Side by Side Diff: Source/core/inspector/AsyncCallStackTracker.cpp

Issue 466243002: Support merged Dart-JS callstacks (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/dartium
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 static XMLHttpRequest* toXmlHttpRequest(EventTarget* eventTarget) 84 static XMLHttpRequest* toXmlHttpRequest(EventTarget* eventTarget)
85 { 85 {
86 const AtomicString& interfaceName = eventTarget->interfaceName(); 86 const AtomicString& interfaceName = eventTarget->interfaceName();
87 if (interfaceName == EventTargetNames::XMLHttpRequest) 87 if (interfaceName == EventTargetNames::XMLHttpRequest)
88 return static_cast<XMLHttpRequest*>(eventTarget); 88 return static_cast<XMLHttpRequest*>(eventTarget);
89 if (interfaceName == EventTargetNames::XMLHttpRequestUpload) 89 if (interfaceName == EventTargetNames::XMLHttpRequestUpload)
90 return static_cast<XMLHttpRequestUpload*>(eventTarget)->xmlHttpRequest() ; 90 return static_cast<XMLHttpRequestUpload*>(eventTarget)->xmlHttpRequest() ;
91 return 0; 91 return 0;
92 } 92 }
93 93
94 AsyncCallStackTracker::AsyncCallStack::AsyncCallStack(const String& description, const StackTrace& callFrames) 94 AsyncCallStackTracker::AsyncCallStack::AsyncCallStack(const String& description, const StackTraces& callFrames)
95 : m_description(description) 95 : m_description(description)
96 , m_callFrames(callFrames) 96 , m_callFrames(callFrames)
97 { 97 {
98 } 98 }
99 99
100 AsyncCallStackTracker::AsyncCallStack::~AsyncCallStack() 100 AsyncCallStackTracker::AsyncCallStack::~AsyncCallStack()
101 { 101 {
102 } 102 }
103 103
104 AsyncCallStackTracker::AsyncCallStackTracker() 104 AsyncCallStackTracker::AsyncCallStackTracker()
(...skipping 11 matching lines...) Expand all
116 } 116 }
117 } 117 }
118 118
119 const AsyncCallStackTracker::AsyncCallChain* AsyncCallStackTracker::currentAsync CallChain() const 119 const AsyncCallStackTracker::AsyncCallChain* AsyncCallStackTracker::currentAsync CallChain() const
120 { 120 {
121 if (m_currentAsyncCallChain) 121 if (m_currentAsyncCallChain)
122 ensureMaxAsyncCallChainDepth(m_currentAsyncCallChain.get(), m_maxAsyncCa llStackDepth); 122 ensureMaxAsyncCallChainDepth(m_currentAsyncCallChain.get(), m_maxAsyncCa llStackDepth);
123 return m_currentAsyncCallChain.get(); 123 return m_currentAsyncCallChain.get();
124 } 124 }
125 125
126 void AsyncCallStackTracker::didInstallTimer(ExecutionContext* context, int timer Id, bool singleShot, const StackTrace& callFrames) 126 void AsyncCallStackTracker::didInstallTimer(ExecutionContext* context, int timer Id, bool singleShot, const StackTraces& callFrames)
127 { 127 {
128 ASSERT(context); 128 ASSERT(context);
129 ASSERT(isEnabled()); 129 ASSERT(isEnabled());
130 if (!validateCallFrames(callFrames)) 130 if (!validateCallFrames(callFrames))
131 return; 131 return;
132 ASSERT(timerId > 0); 132 ASSERT(timerId > 0);
133 ExecutionContextData* data = createContextDataIfNeeded(context); 133 ExecutionContextData* data = createContextDataIfNeeded(context);
134 data->m_timerCallChains.set(timerId, createAsyncCallChain(singleShot ? setTi meoutName : setIntervalName, callFrames)); 134 data->m_timerCallChains.set(timerId, createAsyncCallChain(singleShot ? setTi meoutName : setIntervalName, callFrames));
135 if (!singleShot) 135 if (!singleShot)
136 data->m_intervalTimerIds.add(timerId); 136 data->m_intervalTimerIds.add(timerId);
(...skipping 21 matching lines...) Expand all
158 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) { 158 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) {
159 if (data->m_intervalTimerIds.contains(timerId)) 159 if (data->m_intervalTimerIds.contains(timerId))
160 setCurrentAsyncCallChain(data->m_timerCallChains.get(timerId)); 160 setCurrentAsyncCallChain(data->m_timerCallChains.get(timerId));
161 else 161 else
162 setCurrentAsyncCallChain(data->m_timerCallChains.take(timerId)); 162 setCurrentAsyncCallChain(data->m_timerCallChains.take(timerId));
163 } else { 163 } else {
164 setCurrentAsyncCallChain(nullptr); 164 setCurrentAsyncCallChain(nullptr);
165 } 165 }
166 } 166 }
167 167
168 void AsyncCallStackTracker::didRequestAnimationFrame(ExecutionContext* context, int callbackId, const StackTrace& callFrames) 168 void AsyncCallStackTracker::didRequestAnimationFrame(ExecutionContext* context, int callbackId, const StackTraces& callFrames)
169 { 169 {
170 ASSERT(context); 170 ASSERT(context);
171 ASSERT(isEnabled()); 171 ASSERT(isEnabled());
172 if (!validateCallFrames(callFrames)) 172 if (!validateCallFrames(callFrames))
173 return; 173 return;
174 ASSERT(callbackId > 0); 174 ASSERT(callbackId > 0);
175 ExecutionContextData* data = createContextDataIfNeeded(context); 175 ExecutionContextData* data = createContextDataIfNeeded(context);
176 data->m_animationFrameCallChains.set(callbackId, createAsyncCallChain(reques tAnimationFrameName, callFrames)); 176 data->m_animationFrameCallChains.set(callbackId, createAsyncCallChain(reques tAnimationFrameName, callFrames));
177 } 177 }
178 178
(...skipping 12 matching lines...) Expand all
191 ASSERT(context); 191 ASSERT(context);
192 ASSERT(isEnabled()); 192 ASSERT(isEnabled());
193 ASSERT(callbackId > 0); 193 ASSERT(callbackId > 0);
194 ASSERT(!m_currentAsyncCallChain); 194 ASSERT(!m_currentAsyncCallChain);
195 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) 195 if (ExecutionContextData* data = m_executionContextDataMap.get(context))
196 setCurrentAsyncCallChain(data->m_animationFrameCallChains.take(callbackI d)); 196 setCurrentAsyncCallChain(data->m_animationFrameCallChains.take(callbackI d));
197 else 197 else
198 setCurrentAsyncCallChain(nullptr); 198 setCurrentAsyncCallChain(nullptr);
199 } 199 }
200 200
201 void AsyncCallStackTracker::didEnqueueEvent(EventTarget* eventTarget, Event* eve nt, const StackTrace& callFrames) 201 void AsyncCallStackTracker::didEnqueueEvent(EventTarget* eventTarget, Event* eve nt, const StackTraces& callFrames)
202 { 202 {
203 ASSERT(eventTarget->executionContext()); 203 ASSERT(eventTarget->executionContext());
204 ASSERT(isEnabled()); 204 ASSERT(isEnabled());
205 if (!validateCallFrames(callFrames)) 205 if (!validateCallFrames(callFrames))
206 return; 206 return;
207 ExecutionContextData* data = createContextDataIfNeeded(eventTarget->executio nContext()); 207 ExecutionContextData* data = createContextDataIfNeeded(eventTarget->executio nContext());
208 data->m_eventCallChains.set(event, createAsyncCallChain(event->type(), callF rames)); 208 data->m_eventCallChains.set(event, createAsyncCallChain(event->type(), callF rames));
209 } 209 }
210 210
211 void AsyncCallStackTracker::didRemoveEvent(EventTarget* eventTarget, Event* even t) 211 void AsyncCallStackTracker::didRemoveEvent(EventTarget* eventTarget, Event* even t)
(...skipping 11 matching lines...) Expand all
223 if (XMLHttpRequest* xhr = toXmlHttpRequest(eventTarget)) { 223 if (XMLHttpRequest* xhr = toXmlHttpRequest(eventTarget)) {
224 willHandleXHREvent(xhr, eventTarget, event); 224 willHandleXHREvent(xhr, eventTarget, event);
225 } else { 225 } else {
226 if (ExecutionContextData* data = m_executionContextDataMap.get(eventTarg et->executionContext())) 226 if (ExecutionContextData* data = m_executionContextDataMap.get(eventTarg et->executionContext()))
227 setCurrentAsyncCallChain(data->m_eventCallChains.get(event)); 227 setCurrentAsyncCallChain(data->m_eventCallChains.get(event));
228 else 228 else
229 setCurrentAsyncCallChain(nullptr); 229 setCurrentAsyncCallChain(nullptr);
230 } 230 }
231 } 231 }
232 232
233 void AsyncCallStackTracker::willLoadXHR(XMLHttpRequest* xhr, const StackTrace& c allFrames) 233 void AsyncCallStackTracker::willLoadXHR(XMLHttpRequest* xhr, const StackTraces& callFrames)
234 { 234 {
235 ASSERT(xhr->executionContext()); 235 ASSERT(xhr->executionContext());
236 ASSERT(isEnabled()); 236 ASSERT(isEnabled());
237 if (!validateCallFrames(callFrames)) 237 if (!validateCallFrames(callFrames))
238 return; 238 return;
239 ExecutionContextData* data = createContextDataIfNeeded(xhr->executionContext ()); 239 ExecutionContextData* data = createContextDataIfNeeded(xhr->executionContext ());
240 data->m_xhrCallChains.set(xhr, createAsyncCallChain(xhrSendName, callFrames) ); 240 data->m_xhrCallChains.set(xhr, createAsyncCallChain(xhrSendName, callFrames) );
241 } 241 }
242 242
243 void AsyncCallStackTracker::willHandleXHREvent(XMLHttpRequest* xhr, EventTarget* eventTarget, Event* event) 243 void AsyncCallStackTracker::willHandleXHREvent(XMLHttpRequest* xhr, EventTarget* eventTarget, Event* event)
244 { 244 {
245 ASSERT(xhr->executionContext()); 245 ASSERT(xhr->executionContext());
246 ASSERT(isEnabled()); 246 ASSERT(isEnabled());
247 if (ExecutionContextData* data = m_executionContextDataMap.get(xhr->executio nContext())) { 247 if (ExecutionContextData* data = m_executionContextDataMap.get(xhr->executio nContext())) {
248 bool isXHRDownload = (xhr == eventTarget); 248 bool isXHRDownload = (xhr == eventTarget);
249 if (isXHRDownload && event->type() == EventTypeNames::loadend) 249 if (isXHRDownload && event->type() == EventTypeNames::loadend)
250 setCurrentAsyncCallChain(data->m_xhrCallChains.take(xhr)); 250 setCurrentAsyncCallChain(data->m_xhrCallChains.take(xhr));
251 else 251 else
252 setCurrentAsyncCallChain(data->m_xhrCallChains.get(xhr)); 252 setCurrentAsyncCallChain(data->m_xhrCallChains.get(xhr));
253 } else { 253 } else {
254 setCurrentAsyncCallChain(nullptr); 254 setCurrentAsyncCallChain(nullptr);
255 } 255 }
256 } 256 }
257 257
258 void AsyncCallStackTracker::didEnqueueMutationRecord(ExecutionContext* context, MutationObserver* observer, const StackTrace& callFrames) 258 void AsyncCallStackTracker::didEnqueueMutationRecord(ExecutionContext* context, MutationObserver* observer, const StackTraces& callFrames)
259 { 259 {
260 ASSERT(context); 260 ASSERT(context);
261 ASSERT(isEnabled()); 261 ASSERT(isEnabled());
262 if (!validateCallFrames(callFrames)) 262 if (!validateCallFrames(callFrames))
263 return; 263 return;
264 ExecutionContextData* data = createContextDataIfNeeded(context); 264 ExecutionContextData* data = createContextDataIfNeeded(context);
265 data->m_mutationObserverCallChains.set(observer, createAsyncCallChain(enqueu eMutationRecordName, callFrames)); 265 data->m_mutationObserverCallChains.set(observer, createAsyncCallChain(enqueu eMutationRecordName, callFrames));
266 } 266 }
267 267
268 bool AsyncCallStackTracker::hasEnqueuedMutationRecord(ExecutionContext* context, MutationObserver* observer) 268 bool AsyncCallStackTracker::hasEnqueuedMutationRecord(ExecutionContext* context, MutationObserver* observer)
(...skipping 21 matching lines...) Expand all
290 setCurrentAsyncCallChain(data->m_mutationObserverCallChains.take(observe r)); 290 setCurrentAsyncCallChain(data->m_mutationObserverCallChains.take(observe r));
291 else 291 else
292 setCurrentAsyncCallChain(nullptr); 292 setCurrentAsyncCallChain(nullptr);
293 } 293 }
294 294
295 void AsyncCallStackTracker::didFireAsyncCall() 295 void AsyncCallStackTracker::didFireAsyncCall()
296 { 296 {
297 clearCurrentAsyncCallChain(); 297 clearCurrentAsyncCallChain();
298 } 298 }
299 299
300 PassRefPtr<AsyncCallStackTracker::AsyncCallChain> AsyncCallStackTracker::createA syncCallChain(const String& description, const StackTrace& callFrames) 300 PassRefPtr<AsyncCallStackTracker::AsyncCallChain> AsyncCallStackTracker::createA syncCallChain(const String& description, const StackTraces& callFrames)
301 { 301 {
302 RefPtr<AsyncCallChain> chain = adoptRef(m_currentAsyncCallChain ? new AsyncC allStackTracker::AsyncCallChain(*m_currentAsyncCallChain) : new AsyncCallStackTr acker::AsyncCallChain()); 302 RefPtr<AsyncCallChain> chain = adoptRef(m_currentAsyncCallChain ? new AsyncC allStackTracker::AsyncCallChain(*m_currentAsyncCallChain) : new AsyncCallStackTr acker::AsyncCallChain());
303 ensureMaxAsyncCallChainDepth(chain.get(), m_maxAsyncCallStackDepth - 1); 303 ensureMaxAsyncCallChainDepth(chain.get(), m_maxAsyncCallStackDepth - 1);
304 chain->m_callStacks.prepend(adoptRef(new AsyncCallStackTracker::AsyncCallSta ck(description, callFrames))); 304 chain->m_callStacks.prepend(adoptRef(new AsyncCallStackTracker::AsyncCallSta ck(description, callFrames)));
305 return chain.release(); 305 return chain.release();
306 } 306 }
307 307
308 void AsyncCallStackTracker::setCurrentAsyncCallChain(PassRefPtr<AsyncCallChain> chain) 308 void AsyncCallStackTracker::setCurrentAsyncCallChain(PassRefPtr<AsyncCallChain> chain)
309 { 309 {
310 if (V8RecursionScope::recursionLevel(v8::Isolate::GetCurrent())) { 310 if (V8RecursionScope::recursionLevel(v8::Isolate::GetCurrent())) {
(...skipping 14 matching lines...) Expand all
325 if (!m_nestedAsyncCallCount) 325 if (!m_nestedAsyncCallCount)
326 m_currentAsyncCallChain.clear(); 326 m_currentAsyncCallChain.clear();
327 } 327 }
328 328
329 void AsyncCallStackTracker::ensureMaxAsyncCallChainDepth(AsyncCallChain* chain, unsigned maxDepth) 329 void AsyncCallStackTracker::ensureMaxAsyncCallChainDepth(AsyncCallChain* chain, unsigned maxDepth)
330 { 330 {
331 while (chain->m_callStacks.size() > maxDepth) 331 while (chain->m_callStacks.size() > maxDepth)
332 chain->m_callStacks.removeLast(); 332 chain->m_callStacks.removeLast();
333 } 333 }
334 334
335 bool AsyncCallStackTracker::validateCallFrames(const StackTrace& callFrames) 335 bool AsyncCallStackTracker::validateCallFrames(const StackTraces& callFrames)
336 { 336 {
337 return !callFrames.isNull(); 337 return !callFrames.isNull();
338 } 338 }
339 339
340 AsyncCallStackTracker::ExecutionContextData* AsyncCallStackTracker::createContex tDataIfNeeded(ExecutionContext* context) 340 AsyncCallStackTracker::ExecutionContextData* AsyncCallStackTracker::createContex tDataIfNeeded(ExecutionContext* context)
341 { 341 {
342 ExecutionContextData* data = m_executionContextDataMap.get(context); 342 ExecutionContextData* data = m_executionContextDataMap.get(context);
343 if (!data) { 343 if (!data) {
344 data = new AsyncCallStackTracker::ExecutionContextData(this, context); 344 data = new AsyncCallStackTracker::ExecutionContextData(this, context);
345 m_executionContextDataMap.set(context, data); 345 m_executionContextDataMap.set(context, data);
346 } 346 }
347 return data; 347 return data;
348 } 348 }
349 349
350 void AsyncCallStackTracker::clear() 350 void AsyncCallStackTracker::clear()
351 { 351 {
352 m_currentAsyncCallChain.clear(); 352 m_currentAsyncCallChain.clear();
353 m_nestedAsyncCallCount = 0; 353 m_nestedAsyncCallCount = 0;
354 ExecutionContextDataMap copy; 354 ExecutionContextDataMap copy;
355 m_executionContextDataMap.swap(copy); 355 m_executionContextDataMap.swap(copy);
356 for (ExecutionContextDataMap::const_iterator it = copy.begin(); it != copy.e nd(); ++it) 356 for (ExecutionContextDataMap::const_iterator it = copy.begin(); it != copy.e nd(); ++it)
357 delete it->value; 357 delete it->value;
358 } 358 }
359 359
360 } // namespace WebCore 360 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/inspector/AsyncCallStackTracker.h ('k') | Source/core/inspector/InjectedScriptExterns.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698