OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "platform/v8_inspector/V8AsyncCallTracker.h" | 5 #include "platform/v8_inspector/V8AsyncCallTracker.h" |
6 | 6 |
7 #include "platform/inspector_protocol/Collections.h" | 7 #include "platform/inspector_protocol/Collections.h" |
8 #include "wtf/text/StringBuilder.h" | 8 #include "platform/inspector_protocol/String16.h" |
9 #include "wtf/text/StringHash.h" | |
10 #include "wtf/text/WTFString.h" | |
11 | 9 |
12 namespace blink { | 10 namespace blink { |
13 | 11 |
14 namespace { | 12 namespace { |
15 | 13 |
16 static const char v8AsyncTaskEventEnqueue[] = "enqueue"; | 14 static const char v8AsyncTaskEventEnqueue[] = "enqueue"; |
17 static const char v8AsyncTaskEventWillHandle[] = "willHandle"; | 15 static const char v8AsyncTaskEventWillHandle[] = "willHandle"; |
18 static const char v8AsyncTaskEventDidHandle[] = "didHandle"; | 16 static const char v8AsyncTaskEventDidHandle[] = "didHandle"; |
19 | 17 |
20 } | 18 } |
21 | 19 |
22 static String makeV8AsyncTaskUniqueId(const String& eventName, int id) | 20 static String16 makeV8AsyncTaskUniqueId(const String16& eventName, int id) |
23 { | 21 { |
24 StringBuilder builder; | 22 String16Builder builder; |
25 builder.append(eventName); | 23 builder.append(eventName); |
26 builder.append(" -> "); | 24 builder.append(" -> "); |
27 builder.appendNumber(id); | 25 builder.appendNumber(id); |
28 return builder.toString(); | 26 return builder.toString(); |
29 } | 27 } |
30 | 28 |
31 V8AsyncCallTracker::V8AsyncCallTracker(V8DebuggerAgentImpl* debuggerAgent) | 29 V8AsyncCallTracker::V8AsyncCallTracker(V8DebuggerAgentImpl* debuggerAgent) |
32 : m_debuggerAgent(debuggerAgent) | 30 : m_debuggerAgent(debuggerAgent) |
33 { | 31 { |
34 } | 32 } |
(...skipping 13 matching lines...) Expand all Loading... |
48 completeOperations(it.second->map); | 46 completeOperations(it.second->map); |
49 m_idToOperations.clear(); | 47 m_idToOperations.clear(); |
50 } | 48 } |
51 | 49 |
52 void V8AsyncCallTracker::contextDisposed(int contextId) | 50 void V8AsyncCallTracker::contextDisposed(int contextId) |
53 { | 51 { |
54 completeOperations(m_idToOperations.get(contextId)->map); | 52 completeOperations(m_idToOperations.get(contextId)->map); |
55 m_idToOperations.remove(contextId); | 53 m_idToOperations.remove(contextId); |
56 } | 54 } |
57 | 55 |
58 void V8AsyncCallTracker::didReceiveV8AsyncTaskEvent(v8::Local<v8::Context> conte
xt, const String& eventType, const String& eventName, int id) | 56 void V8AsyncCallTracker::didReceiveV8AsyncTaskEvent(v8::Local<v8::Context> conte
xt, const String16& eventType, const String16& eventName, int id) |
59 { | 57 { |
60 ASSERT(m_debuggerAgent->trackingAsyncCalls()); | 58 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
61 if (eventType == v8AsyncTaskEventEnqueue) | 59 if (eventType == v8AsyncTaskEventEnqueue) |
62 didEnqueueV8AsyncTask(context, eventName, id); | 60 didEnqueueV8AsyncTask(context, eventName, id); |
63 else if (eventType == v8AsyncTaskEventWillHandle) | 61 else if (eventType == v8AsyncTaskEventWillHandle) |
64 willHandleV8AsyncTask(context, eventName, id); | 62 willHandleV8AsyncTask(context, eventName, id); |
65 else if (eventType == v8AsyncTaskEventDidHandle) | 63 else if (eventType == v8AsyncTaskEventDidHandle) |
66 m_debuggerAgent->traceAsyncCallbackCompleted(); | 64 m_debuggerAgent->traceAsyncCallbackCompleted(); |
67 else | 65 else |
68 ASSERT_NOT_REACHED(); | 66 ASSERT_NOT_REACHED(); |
69 } | 67 } |
70 | 68 |
71 void V8AsyncCallTracker::weakCallback(const v8::WeakCallbackInfo<Operations>& da
ta) | 69 void V8AsyncCallTracker::weakCallback(const v8::WeakCallbackInfo<Operations>& da
ta) |
72 { | 70 { |
73 data.GetParameter()->target->contextDisposed(data.GetParameter()->contextId)
; | 71 data.GetParameter()->target->contextDisposed(data.GetParameter()->contextId)
; |
74 } | 72 } |
75 | 73 |
76 void V8AsyncCallTracker::didEnqueueV8AsyncTask(v8::Local<v8::Context> context, c
onst String& eventName, int id) | 74 void V8AsyncCallTracker::didEnqueueV8AsyncTask(v8::Local<v8::Context> context, c
onst String16& eventName, int id) |
77 { | 75 { |
78 ASSERT(!context.IsEmpty()); | 76 ASSERT(!context.IsEmpty()); |
79 ASSERT(m_debuggerAgent->trackingAsyncCalls()); | 77 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
80 int operationId = m_debuggerAgent->traceAsyncOperationStarting(eventName); | 78 int operationId = m_debuggerAgent->traceAsyncOperationStarting(eventName); |
81 if (!operationId) | 79 if (!operationId) |
82 return; | 80 return; |
83 int contextId = V8Debugger::contextId(context); | 81 int contextId = V8Debugger::contextId(context); |
84 Operations* operations = m_idToOperations.get(contextId); | 82 Operations* operations = m_idToOperations.get(contextId); |
85 if (!operations) { | 83 if (!operations) { |
86 OwnPtr<Operations> newOperations = adoptPtr(new Operations()); | 84 OwnPtr<Operations> newOperations = adoptPtr(new Operations()); |
87 newOperations->contextId = contextId; | 85 newOperations->contextId = contextId; |
88 newOperations->target = this; | 86 newOperations->target = this; |
89 newOperations->context.Reset(context->GetIsolate(), context); | 87 newOperations->context.Reset(context->GetIsolate(), context); |
90 operations = newOperations.get(); | 88 operations = newOperations.get(); |
91 m_idToOperations.set(contextId, newOperations.release()); | 89 m_idToOperations.set(contextId, newOperations.release()); |
92 operations->context.SetWeak(operations, V8AsyncCallTracker::weakCallback
, v8::WeakCallbackType::kParameter); | 90 operations->context.SetWeak(operations, V8AsyncCallTracker::weakCallback
, v8::WeakCallbackType::kParameter); |
93 } | 91 } |
94 operations->map.set(makeV8AsyncTaskUniqueId(eventName, id), operationId); | 92 operations->map.set(makeV8AsyncTaskUniqueId(eventName, id), operationId); |
95 } | 93 } |
96 | 94 |
97 void V8AsyncCallTracker::willHandleV8AsyncTask(v8::Local<v8::Context> context, c
onst String& eventName, int id) | 95 void V8AsyncCallTracker::willHandleV8AsyncTask(v8::Local<v8::Context> context, c
onst String16& eventName, int id) |
98 { | 96 { |
99 ASSERT(!context.IsEmpty()); | 97 ASSERT(!context.IsEmpty()); |
100 ASSERT(m_debuggerAgent->trackingAsyncCalls()); | 98 ASSERT(m_debuggerAgent->trackingAsyncCalls()); |
101 int contextId = V8Debugger::contextId(context); | 99 int contextId = V8Debugger::contextId(context); |
102 if (Operations* operations = m_idToOperations.get(contextId)) { | 100 if (Operations* operations = m_idToOperations.get(contextId)) { |
103 String taskId = makeV8AsyncTaskUniqueId(eventName, id); | 101 String16 taskId = makeV8AsyncTaskUniqueId(eventName, id); |
104 int operationId = operations->map.get(taskId); | 102 int operationId = operations->map.get(taskId); |
105 m_debuggerAgent->traceAsyncCallbackStarting(operationId); | 103 m_debuggerAgent->traceAsyncCallbackStarting(operationId); |
106 m_debuggerAgent->traceAsyncOperationCompleted(operationId); | 104 m_debuggerAgent->traceAsyncOperationCompleted(operationId); |
107 operations->map.remove(taskId); | 105 operations->map.remove(taskId); |
108 } else { | 106 } else { |
109 m_debuggerAgent->traceAsyncCallbackStarting(V8DebuggerAgentImpl::unknown
AsyncOperationId); | 107 m_debuggerAgent->traceAsyncCallbackStarting(V8DebuggerAgentImpl::unknown
AsyncOperationId); |
110 } | 108 } |
111 } | 109 } |
112 | 110 |
113 void V8AsyncCallTracker::completeOperations(const protocol::HashMap<String, int>
& contextCallChains) | 111 void V8AsyncCallTracker::completeOperations(const protocol::HashMap<String16, in
t>& contextCallChains) |
114 { | 112 { |
115 for (const auto& it : contextCallChains) | 113 for (const auto& it : contextCallChains) |
116 m_debuggerAgent->traceAsyncOperationCompleted(*it.second); | 114 m_debuggerAgent->traceAsyncOperationCompleted(*it.second); |
117 } | 115 } |
118 | 116 |
119 } // namespace blink | 117 } // namespace blink |
OLD | NEW |