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

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

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

Powered by Google App Engine
This is Rietveld 408576698