OLD | NEW |
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 20 matching lines...) Expand all Loading... |
31 #include "config.h" | 31 #include "config.h" |
32 #include "core/inspector/AsyncCallTracker.h" | 32 #include "core/inspector/AsyncCallTracker.h" |
33 | 33 |
34 #include "core/dom/ContextLifecycleObserver.h" | 34 #include "core/dom/ContextLifecycleObserver.h" |
35 #include "core/dom/ExecutionContext.h" | 35 #include "core/dom/ExecutionContext.h" |
36 #include "core/dom/ExecutionContextTask.h" | 36 #include "core/dom/ExecutionContextTask.h" |
37 #include "core/events/Event.h" | 37 #include "core/events/Event.h" |
38 #include "core/events/EventTarget.h" | 38 #include "core/events/EventTarget.h" |
39 #include "core/inspector/AsyncOperationMap.h" | 39 #include "core/inspector/AsyncOperationMap.h" |
40 #include "core/inspector/InspectorDebuggerAgent.h" | 40 #include "core/inspector/InspectorDebuggerAgent.h" |
| 41 #include "core/timing/PerformanceObserver.h" |
41 #include "core/xmlhttprequest/XMLHttpRequest.h" | 42 #include "core/xmlhttprequest/XMLHttpRequest.h" |
42 #include "core/xmlhttprequest/XMLHttpRequestUpload.h" | 43 #include "core/xmlhttprequest/XMLHttpRequestUpload.h" |
43 #include "platform/ScriptForbiddenScope.h" | 44 #include "platform/ScriptForbiddenScope.h" |
44 #include "wtf/MainThread.h" | 45 #include "wtf/MainThread.h" |
45 #include "wtf/text/StringBuilder.h" | 46 #include "wtf/text/StringBuilder.h" |
46 #include "wtf/text/StringHash.h" | 47 #include "wtf/text/StringHash.h" |
47 | 48 |
48 namespace { | 49 namespace { |
49 | 50 |
50 static const char setTimeoutName[] = "setTimeout"; | 51 static const char setTimeoutName[] = "setTimeout"; |
51 static const char setIntervalName[] = "setInterval"; | 52 static const char setIntervalName[] = "setInterval"; |
52 static const char requestAnimationFrameName[] = "requestAnimationFrame"; | 53 static const char requestAnimationFrameName[] = "requestAnimationFrame"; |
53 static const char xhrSendName[] = "XMLHttpRequest.send"; | 54 static const char xhrSendName[] = "XMLHttpRequest.send"; |
54 static const char enqueueMutationRecordName[] = "Mutation"; | 55 static const char enqueueMutationRecordName[] = "Mutation"; |
| 56 static const char enqueuePerformanceObservationsName[] = "PerformanceObservation
"; |
55 | 57 |
56 } | 58 } |
57 | 59 |
58 namespace blink { | 60 namespace blink { |
59 | 61 |
60 class AsyncCallTracker::ExecutionContextData final : public NoBaseWillBeGarbageC
ollectedFinalized<ExecutionContextData>, public ContextLifecycleObserver { | 62 class AsyncCallTracker::ExecutionContextData final : public NoBaseWillBeGarbageC
ollectedFinalized<ExecutionContextData>, public ContextLifecycleObserver { |
61 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(AsyncCallTracker::ExecutionContextData
); | 63 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(AsyncCallTracker::ExecutionContextData
); |
62 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED(AsyncCallTracker::ExecutionContextDa
ta); | 64 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED(AsyncCallTracker::ExecutionContextDa
ta); |
63 public: | 65 public: |
64 ExecutionContextData(AsyncCallTracker* tracker, ExecutionContext* executionC
ontext) | 66 ExecutionContextData(AsyncCallTracker* tracker, ExecutionContext* executionC
ontext) |
65 : ContextLifecycleObserver(executionContext) | 67 : ContextLifecycleObserver(executionContext) |
66 , m_tracker(tracker) | 68 , m_tracker(tracker) |
67 , m_timerCallChains(tracker->m_debuggerAgent) | 69 , m_timerCallChains(tracker->m_debuggerAgent) |
68 , m_animationFrameCallChains(tracker->m_debuggerAgent) | 70 , m_animationFrameCallChains(tracker->m_debuggerAgent) |
69 , m_eventCallChains(tracker->m_debuggerAgent) | 71 , m_eventCallChains(tracker->m_debuggerAgent) |
70 , m_xhrCallChains(tracker->m_debuggerAgent) | 72 , m_xhrCallChains(tracker->m_debuggerAgent) |
71 , m_mutationObserverCallChains(tracker->m_debuggerAgent) | 73 , m_mutationObserverCallChains(tracker->m_debuggerAgent) |
| 74 , m_performanceObserverCallChains(tracker->m_debuggerAgent) |
72 , m_executionContextTaskCallChains(tracker->m_debuggerAgent) | 75 , m_executionContextTaskCallChains(tracker->m_debuggerAgent) |
73 , m_asyncOperations(tracker->m_debuggerAgent) | 76 , m_asyncOperations(tracker->m_debuggerAgent) |
74 { | 77 { |
75 } | 78 } |
76 | 79 |
77 void contextDestroyed() override | 80 void contextDestroyed() override |
78 { | 81 { |
79 ASSERT(executionContext()); | 82 ASSERT(executionContext()); |
80 OwnPtrWillBeRawPtr<ExecutionContextData> self = m_tracker->m_executionCo
ntextDataMap.take(executionContext()); | 83 OwnPtrWillBeRawPtr<ExecutionContextData> self = m_tracker->m_executionCo
ntextDataMap.take(executionContext()); |
81 ASSERT_UNUSED(self, self == this); | 84 ASSERT_UNUSED(self, self == this); |
(...skipping 12 matching lines...) Expand all Loading... |
94 visitor->trace(m_tracker); | 97 visitor->trace(m_tracker); |
95 #if ENABLE(OILPAN) | 98 #if ENABLE(OILPAN) |
96 visitor->trace(m_timerCallChains); | 99 visitor->trace(m_timerCallChains); |
97 visitor->trace(m_animationFrameCallChains); | 100 visitor->trace(m_animationFrameCallChains); |
98 visitor->trace(m_eventCallChains); | 101 visitor->trace(m_eventCallChains); |
99 visitor->trace(m_xhrCallChains); | 102 visitor->trace(m_xhrCallChains); |
100 visitor->trace(m_mutationObserverCallChains); | 103 visitor->trace(m_mutationObserverCallChains); |
101 visitor->trace(m_executionContextTaskCallChains); | 104 visitor->trace(m_executionContextTaskCallChains); |
102 visitor->trace(m_asyncOperations); | 105 visitor->trace(m_asyncOperations); |
103 #endif | 106 #endif |
| 107 visitor->trace(m_performanceObserverCallChains); |
104 ContextLifecycleObserver::trace(visitor); | 108 ContextLifecycleObserver::trace(visitor); |
105 } | 109 } |
106 | 110 |
107 RawPtrWillBeMember<AsyncCallTracker> m_tracker; | 111 RawPtrWillBeMember<AsyncCallTracker> m_tracker; |
108 HashSet<int> m_intervalTimerIds; | 112 HashSet<int> m_intervalTimerIds; |
109 AsyncOperationMap<int> m_timerCallChains; | 113 AsyncOperationMap<int> m_timerCallChains; |
110 AsyncOperationMap<int> m_animationFrameCallChains; | 114 AsyncOperationMap<int> m_animationFrameCallChains; |
111 AsyncOperationMap<RawPtrWillBeMember<Event> > m_eventCallChains; | 115 AsyncOperationMap<RawPtrWillBeMember<Event> > m_eventCallChains; |
112 AsyncOperationMap<RawPtrWillBeMember<EventTarget> > m_xhrCallChains; | 116 AsyncOperationMap<RawPtrWillBeMember<EventTarget> > m_xhrCallChains; |
113 AsyncOperationMap<RawPtrWillBeMember<MutationObserver> > m_mutationObserverC
allChains; | 117 AsyncOperationMap<RawPtrWillBeMember<MutationObserver> > m_mutationObserverC
allChains; |
| 118 AsyncOperationMap<Member<PerformanceObserver>, HeapHashMap<Member<Performanc
eObserver>, int>> m_performanceObserverCallChains; |
114 AsyncOperationMap<ExecutionContextTask*> m_executionContextTaskCallChains; | 119 AsyncOperationMap<ExecutionContextTask*> m_executionContextTaskCallChains; |
115 AsyncOperationMap<int> m_asyncOperations; | 120 AsyncOperationMap<int> m_asyncOperations; |
116 | 121 |
117 private: | 122 private: |
118 void disposeCallChains() | 123 void disposeCallChains() |
119 { | 124 { |
120 m_timerCallChains.dispose(); | 125 m_timerCallChains.dispose(); |
121 m_animationFrameCallChains.dispose(); | 126 m_animationFrameCallChains.dispose(); |
122 m_eventCallChains.dispose(); | 127 m_eventCallChains.dispose(); |
123 m_xhrCallChains.dispose(); | 128 m_xhrCallChains.dispose(); |
124 m_mutationObserverCallChains.dispose(); | 129 m_mutationObserverCallChains.dispose(); |
| 130 m_performanceObserverCallChains.dispose(); |
125 m_executionContextTaskCallChains.dispose(); | 131 m_executionContextTaskCallChains.dispose(); |
126 m_asyncOperations.dispose(); | 132 m_asyncOperations.dispose(); |
127 } | 133 } |
128 }; | 134 }; |
129 | 135 |
130 static XMLHttpRequest* toXmlHttpRequest(EventTarget* eventTarget) | 136 static XMLHttpRequest* toXmlHttpRequest(EventTarget* eventTarget) |
131 { | 137 { |
132 const AtomicString& interfaceName = eventTarget->interfaceName(); | 138 const AtomicString& interfaceName = eventTarget->interfaceName(); |
133 if (interfaceName == EventTargetNames::XMLHttpRequest) | 139 if (interfaceName == EventTargetNames::XMLHttpRequest) |
134 return static_cast<XMLHttpRequest*>(eventTarget); | 140 return static_cast<XMLHttpRequest*>(eventTarget); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 ASSERT(context); | 332 ASSERT(context); |
327 ASSERT(m_debuggerAgent->trackingAsyncCalls()); | 333 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
328 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) { | 334 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) { |
329 willFireAsyncCall(data->m_mutationObserverCallChains.get(observer)); | 335 willFireAsyncCall(data->m_mutationObserverCallChains.get(observer)); |
330 data->m_mutationObserverCallChains.remove(observer); | 336 data->m_mutationObserverCallChains.remove(observer); |
331 } else { | 337 } else { |
332 willFireAsyncCall(InspectorDebuggerAgent::unknownAsyncOperationId); | 338 willFireAsyncCall(InspectorDebuggerAgent::unknownAsyncOperationId); |
333 } | 339 } |
334 } | 340 } |
335 | 341 |
| 342 void AsyncCallTracker::didEnqueuePerformanceObserverEntries(ExecutionContext* co
ntext, PerformanceObserver* observer) |
| 343 { |
| 344 ASSERT(context); |
| 345 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
| 346 ExecutionContextData* data = createContextDataIfNeeded(context); |
| 347 if (data->m_performanceObserverCallChains.contains(observer)) |
| 348 return; |
| 349 int operationId = m_debuggerAgent->traceAsyncOperationStarting(enqueuePerfor
manceObservationsName); |
| 350 data->m_performanceObserverCallChains.set(observer, operationId); |
| 351 } |
| 352 |
| 353 void AsyncCallTracker::didClearAllPerformanceObservations(ExecutionContext* cont
ext, PerformanceObserver* observer) |
| 354 { |
| 355 ASSERT(context); |
| 356 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
| 357 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) |
| 358 data->m_performanceObserverCallChains.remove(observer); |
| 359 } |
| 360 |
| 361 void AsyncCallTracker::willDeliverPerformanceObservations(ExecutionContext* cont
ext, PerformanceObserver* observer) |
| 362 { |
| 363 ASSERT(context); |
| 364 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
| 365 if (ExecutionContextData* data = m_executionContextDataMap.get(context)) { |
| 366 willFireAsyncCall(data->m_performanceObserverCallChains.get(observer)); |
| 367 data->m_performanceObserverCallChains.remove(observer); |
| 368 } else { |
| 369 willFireAsyncCall(InspectorDebuggerAgent::unknownAsyncOperationId); |
| 370 } |
| 371 } |
| 372 |
336 void AsyncCallTracker::didPostExecutionContextTask(ExecutionContext* context, Ex
ecutionContextTask* task) | 373 void AsyncCallTracker::didPostExecutionContextTask(ExecutionContext* context, Ex
ecutionContextTask* task) |
337 { | 374 { |
338 ASSERT(context); | 375 ASSERT(context); |
339 ASSERT(m_debuggerAgent->trackingAsyncCalls()); | 376 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
340 if (task->taskNameForInstrumentation().isEmpty()) | 377 if (task->taskNameForInstrumentation().isEmpty()) |
341 return; | 378 return; |
342 int operationId = m_debuggerAgent->traceAsyncOperationStarting(task->taskNam
eForInstrumentation()); | 379 int operationId = m_debuggerAgent->traceAsyncOperationStarting(task->taskNam
eForInstrumentation()); |
343 ExecutionContextData* data = createContextDataIfNeeded(context); | 380 ExecutionContextData* data = createContextDataIfNeeded(context); |
344 data->m_executionContextTaskCallChains.set(task, operationId); | 381 data->m_executionContextTaskCallChains.set(task, operationId); |
345 } | 382 } |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 { | 470 { |
434 #if ENABLE(OILPAN) | 471 #if ENABLE(OILPAN) |
435 visitor->trace(m_executionContextDataMap); | 472 visitor->trace(m_executionContextDataMap); |
436 visitor->trace(m_debuggerAgent); | 473 visitor->trace(m_debuggerAgent); |
437 visitor->trace(m_instrumentingAgents); | 474 visitor->trace(m_instrumentingAgents); |
438 #endif | 475 #endif |
439 InspectorDebuggerAgent::AsyncCallTrackingListener::trace(visitor); | 476 InspectorDebuggerAgent::AsyncCallTrackingListener::trace(visitor); |
440 } | 477 } |
441 | 478 |
442 } // namespace blink | 479 } // namespace blink |
OLD | NEW |