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