OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "core/inspector/ThreadDebugger.h" | 5 #include "core/inspector/ThreadDebugger.h" |
6 | 6 |
7 #include "bindings/core/v8/SourceLocation.h" | 7 #include "bindings/core/v8/SourceLocation.h" |
8 #include "bindings/core/v8/V8Binding.h" | 8 #include "bindings/core/v8/V8Binding.h" |
9 #include "bindings/core/v8/V8DOMException.h" | 9 #include "bindings/core/v8/V8DOMException.h" |
10 #include "bindings/core/v8/V8DOMTokenList.h" | 10 #include "bindings/core/v8/V8DOMTokenList.h" |
11 #include "bindings/core/v8/V8Event.h" | 11 #include "bindings/core/v8/V8Event.h" |
12 #include "bindings/core/v8/V8EventListener.h" | 12 #include "bindings/core/v8/V8EventListener.h" |
13 #include "bindings/core/v8/V8EventListenerInfo.h" | 13 #include "bindings/core/v8/V8EventListenerInfo.h" |
14 #include "bindings/core/v8/V8EventListenerList.h" | 14 #include "bindings/core/v8/V8EventListenerList.h" |
15 #include "bindings/core/v8/V8HTMLAllCollection.h" | 15 #include "bindings/core/v8/V8HTMLAllCollection.h" |
16 #include "bindings/core/v8/V8HTMLCollection.h" | 16 #include "bindings/core/v8/V8HTMLCollection.h" |
17 #include "bindings/core/v8/V8Node.h" | 17 #include "bindings/core/v8/V8Node.h" |
18 #include "bindings/core/v8/V8NodeList.h" | 18 #include "bindings/core/v8/V8NodeList.h" |
19 #include "bindings/core/v8/V8ScriptRunner.h" | 19 #include "bindings/core/v8/V8ScriptRunner.h" |
20 #include "core/inspector/ConsoleMessage.h" | 20 #include "core/inspector/ConsoleMessage.h" |
21 #include "core/inspector/InspectorDOMDebuggerAgent.h" | 21 #include "core/inspector/InspectorDOMDebuggerAgent.h" |
22 #include "core/inspector/InspectorTraceEvents.h" | 22 #include "core/inspector/InspectorTraceEvents.h" |
| 23 #include "core/inspector/V8InspectorString.h" |
23 #include "platform/ScriptForbiddenScope.h" | 24 #include "platform/ScriptForbiddenScope.h" |
24 #include "wtf/CurrentTime.h" | 25 #include "wtf/CurrentTime.h" |
25 #include "wtf/PtrUtil.h" | 26 #include "wtf/PtrUtil.h" |
26 #include <memory> | 27 #include <memory> |
27 | 28 |
28 namespace blink { | 29 namespace blink { |
29 | 30 |
30 ThreadDebugger::ThreadDebugger(v8::Isolate* isolate) | 31 ThreadDebugger::ThreadDebugger(v8::Isolate* isolate) |
31 : m_isolate(isolate) | 32 : m_isolate(isolate) |
32 , m_v8Inspector(v8_inspector::V8Inspector::create(isolate, this)) | 33 , m_v8Inspector(v8_inspector::V8Inspector::create(isolate, this)) |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 } | 79 } |
79 | 80 |
80 void ThreadDebugger::idleFinished(v8::Isolate* isolate) | 81 void ThreadDebugger::idleFinished(v8::Isolate* isolate) |
81 { | 82 { |
82 if (ThreadDebugger* debugger = ThreadDebugger::from(isolate)) | 83 if (ThreadDebugger* debugger = ThreadDebugger::from(isolate)) |
83 debugger->v8Inspector()->idleFinished(); | 84 debugger->v8Inspector()->idleFinished(); |
84 } | 85 } |
85 | 86 |
86 void ThreadDebugger::asyncTaskScheduled(const String& operationName, void* task,
bool recurring) | 87 void ThreadDebugger::asyncTaskScheduled(const String& operationName, void* task,
bool recurring) |
87 { | 88 { |
88 m_v8Inspector->asyncTaskScheduled(operationName, task, recurring); | 89 m_v8Inspector->asyncTaskScheduled(toV8InspectorStringView(operationName), ta
sk, recurring); |
89 } | 90 } |
90 | 91 |
91 void ThreadDebugger::asyncTaskCanceled(void* task) | 92 void ThreadDebugger::asyncTaskCanceled(void* task) |
92 { | 93 { |
93 m_v8Inspector->asyncTaskCanceled(task); | 94 m_v8Inspector->asyncTaskCanceled(task); |
94 } | 95 } |
95 | 96 |
96 void ThreadDebugger::allAsyncTasksCanceled() | 97 void ThreadDebugger::allAsyncTasksCanceled() |
97 { | 98 { |
98 m_v8Inspector->allAsyncTasksCanceled(); | 99 m_v8Inspector->allAsyncTasksCanceled(); |
(...skipping 12 matching lines...) Expand all Loading... |
111 unsigned ThreadDebugger::promiseRejected(v8::Local<v8::Context> context, const S
tring& errorMessage, v8::Local<v8::Value> exception, std::unique_ptr<SourceLocat
ion> location) | 112 unsigned ThreadDebugger::promiseRejected(v8::Local<v8::Context> context, const S
tring& errorMessage, v8::Local<v8::Value> exception, std::unique_ptr<SourceLocat
ion> location) |
112 { | 113 { |
113 const String defaultMessage = "Uncaught (in promise)"; | 114 const String defaultMessage = "Uncaught (in promise)"; |
114 String message = errorMessage; | 115 String message = errorMessage; |
115 if (message.isEmpty()) | 116 if (message.isEmpty()) |
116 message = defaultMessage; | 117 message = defaultMessage; |
117 else if (message.startsWith("Uncaught ")) | 118 else if (message.startsWith("Uncaught ")) |
118 message = message.substring(0, 8) + " (in promise)" + message.substring(
8); | 119 message = message.substring(0, 8) + " (in promise)" + message.substring(
8); |
119 | 120 |
120 reportConsoleMessage(toExecutionContext(context), JSMessageSource, ErrorMess
ageLevel, message, location.get()); | 121 reportConsoleMessage(toExecutionContext(context), JSMessageSource, ErrorMess
ageLevel, message, location.get()); |
121 return v8Inspector()->exceptionThrown(context, defaultMessage, exception, me
ssage, location->url(), location->lineNumber(), location->columnNumber(), locati
on->takeStackTrace(), location->scriptId()); | 122 String url = location->url(); |
| 123 return v8Inspector()->exceptionThrown(context, toV8InspectorStringView(defau
ltMessage), exception, toV8InspectorStringView(message), toV8InspectorStringView
(url), location->lineNumber(), location->columnNumber(), location->takeStackTrac
e(), location->scriptId()); |
122 } | 124 } |
123 | 125 |
124 void ThreadDebugger::promiseRejectionRevoked(v8::Local<v8::Context> context, uns
igned promiseRejectionId) | 126 void ThreadDebugger::promiseRejectionRevoked(v8::Local<v8::Context> context, uns
igned promiseRejectionId) |
125 { | 127 { |
126 const String message = "Handler added to rejected promise"; | 128 const String message = "Handler added to rejected promise"; |
127 v8Inspector()->exceptionRevoked(context, promiseRejectionId, message); | 129 v8Inspector()->exceptionRevoked(context, promiseRejectionId, toV8InspectorSt
ringView(message)); |
128 } | 130 } |
129 | 131 |
130 void ThreadDebugger::beginUserGesture() | 132 void ThreadDebugger::beginUserGesture() |
131 { | 133 { |
132 m_userGestureIndicator = wrapUnique(new UserGestureIndicator(DefinitelyProce
ssingNewUserGesture)); | 134 m_userGestureIndicator = wrapUnique(new UserGestureIndicator(DefinitelyProce
ssingNewUserGesture)); |
133 } | 135 } |
134 | 136 |
135 void ThreadDebugger::endUserGesture() | 137 void ThreadDebugger::endUserGesture() |
136 { | 138 { |
137 m_userGestureIndicator.reset(); | 139 m_userGestureIndicator.reset(); |
138 } | 140 } |
139 | 141 |
140 String16 ThreadDebugger::valueSubtype(v8::Local<v8::Value> value) | 142 std::unique_ptr<v8_inspector::StringBuffer> ThreadDebugger::valueSubtype(v8::Loc
al<v8::Value> value) |
141 { | 143 { |
| 144 static const char kNode[] = "node"; |
| 145 static const char kArray[] = "array"; |
| 146 static const char kError[] = "error"; |
142 if (V8Node::hasInstance(value, m_isolate)) | 147 if (V8Node::hasInstance(value, m_isolate)) |
143 return "node"; | 148 return toV8InspectorStringBuffer(kNode); |
144 if (V8NodeList::hasInstance(value, m_isolate) | 149 if (V8NodeList::hasInstance(value, m_isolate) |
145 || V8DOMTokenList::hasInstance(value, m_isolate) | 150 || V8DOMTokenList::hasInstance(value, m_isolate) |
146 || V8HTMLCollection::hasInstance(value, m_isolate) | 151 || V8HTMLCollection::hasInstance(value, m_isolate) |
147 || V8HTMLAllCollection::hasInstance(value, m_isolate)) { | 152 || V8HTMLAllCollection::hasInstance(value, m_isolate)) { |
148 return "array"; | 153 return toV8InspectorStringBuffer(kArray); |
149 } | 154 } |
150 if (V8DOMException::hasInstance(value, m_isolate)) | 155 if (V8DOMException::hasInstance(value, m_isolate)) |
151 return "error"; | 156 return toV8InspectorStringBuffer(kError); |
152 return String(); | 157 return nullptr; |
153 } | 158 } |
154 | 159 |
155 bool ThreadDebugger::formatAccessorsAsProperties(v8::Local<v8::Value> value) | 160 bool ThreadDebugger::formatAccessorsAsProperties(v8::Local<v8::Value> value) |
156 { | 161 { |
157 return V8DOMWrapper::isWrapper(m_isolate, value); | 162 return V8DOMWrapper::isWrapper(m_isolate, value); |
158 } | 163 } |
159 | 164 |
160 double ThreadDebugger::currentTimeMS() | 165 double ThreadDebugger::currentTimeMS() |
161 { | 166 { |
162 return WTF::currentTimeMS(); | 167 return WTF::currentTimeMS(); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 createDataProperty(context, listenerObject, v8String(isolate, "passive")
, v8::Boolean::New(isolate, info.passive)); | 339 createDataProperty(context, listenerObject, v8String(isolate, "passive")
, v8::Boolean::New(isolate, info.passive)); |
335 createDataProperty(context, listenerObject, v8String(isolate, "type"), v
8String(isolate, currentEventType)); | 340 createDataProperty(context, listenerObject, v8String(isolate, "type"), v
8String(isolate, currentEventType)); |
336 v8::Local<v8::Function> removeFunction; | 341 v8::Local<v8::Function> removeFunction; |
337 if (info.removeFunction.ToLocal(&removeFunction)) | 342 if (info.removeFunction.ToLocal(&removeFunction)) |
338 createDataProperty(context, listenerObject, v8String(isolate, "remov
e"), removeFunction); | 343 createDataProperty(context, listenerObject, v8String(isolate, "remov
e"), removeFunction); |
339 createDataPropertyInArray(context, listeners, outputIndex++, listenerObj
ect); | 344 createDataPropertyInArray(context, listeners, outputIndex++, listenerObj
ect); |
340 } | 345 } |
341 info.GetReturnValue().Set(result); | 346 info.GetReturnValue().Set(result); |
342 } | 347 } |
343 | 348 |
344 void ThreadDebugger::consoleTime(const String16& title) | 349 void ThreadDebugger::consoleTime(const v8_inspector::StringView& title) |
345 { | 350 { |
346 TRACE_EVENT_COPY_ASYNC_BEGIN0("blink.console", String(title).utf8().data(),
this); | 351 // TODO(dgozman): we can save on a copy here if trace macro would take a poi
nter with length. |
| 352 TRACE_EVENT_COPY_ASYNC_BEGIN0("blink.console", toCoreString(title).utf8().da
ta(), this); |
347 } | 353 } |
348 | 354 |
349 void ThreadDebugger::consoleTimeEnd(const String16& title) | 355 void ThreadDebugger::consoleTimeEnd(const v8_inspector::StringView& title) |
350 { | 356 { |
351 TRACE_EVENT_COPY_ASYNC_END0("blink.console", String(title).utf8().data(), th
is); | 357 // TODO(dgozman): we can save on a copy here if trace macro would take a poi
nter with length. |
| 358 TRACE_EVENT_COPY_ASYNC_END0("blink.console", toCoreString(title).utf8().data
(), this); |
352 } | 359 } |
353 | 360 |
354 void ThreadDebugger::consoleTimeStamp(const String16& title) | 361 void ThreadDebugger::consoleTimeStamp(const v8_inspector::StringView& title) |
355 { | 362 { |
356 v8::Isolate* isolate = m_isolate; | 363 v8::Isolate* isolate = m_isolate; |
357 TRACE_EVENT_INSTANT1("devtools.timeline", "TimeStamp", TRACE_EVENT_SCOPE_THR
EAD, "data", InspectorTimeStampEvent::data(currentExecutionContext(isolate), tit
le)); | 364 // TODO(dgozman): we can save on a copy here if TracedValue would take a Str
ingView. |
| 365 TRACE_EVENT_INSTANT1("devtools.timeline", "TimeStamp", TRACE_EVENT_SCOPE_THR
EAD, "data", InspectorTimeStampEvent::data(currentExecutionContext(isolate), toC
oreString(title))); |
358 } | 366 } |
359 | 367 |
360 void ThreadDebugger::startRepeatingTimer(double interval, V8InspectorClient::Tim
erCallback callback, void* data) | 368 void ThreadDebugger::startRepeatingTimer(double interval, V8InspectorClient::Tim
erCallback callback, void* data) |
361 { | 369 { |
362 m_timerData.append(data); | 370 m_timerData.append(data); |
363 m_timerCallbacks.append(callback); | 371 m_timerCallbacks.append(callback); |
364 | 372 |
365 std::unique_ptr<Timer<ThreadDebugger>> timer = wrapUnique(new Timer<ThreadDe
bugger>(this, &ThreadDebugger::onTimer)); | 373 std::unique_ptr<Timer<ThreadDebugger>> timer = wrapUnique(new Timer<ThreadDe
bugger>(this, &ThreadDebugger::onTimer)); |
366 Timer<ThreadDebugger>* timerPtr = timer.get(); | 374 Timer<ThreadDebugger>* timerPtr = timer.get(); |
367 m_timers.append(std::move(timer)); | 375 m_timers.append(std::move(timer)); |
(...skipping 17 matching lines...) Expand all Loading... |
385 { | 393 { |
386 for (size_t index = 0; index < m_timers.size(); ++index) { | 394 for (size_t index = 0; index < m_timers.size(); ++index) { |
387 if (m_timers[index].get() == timer) { | 395 if (m_timers[index].get() == timer) { |
388 m_timerCallbacks[index](m_timerData[index]); | 396 m_timerCallbacks[index](m_timerData[index]); |
389 return; | 397 return; |
390 } | 398 } |
391 } | 399 } |
392 } | 400 } |
393 | 401 |
394 } // namespace blink | 402 } // namespace blink |
OLD | NEW |