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

Side by Side Diff: third_party/WebKit/Source/platform/v8_inspector/V8DebuggerAgentImpl.cpp

Issue 1767883002: DevTools: generate string16-based handlers for v8_inspector. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: for landing 2 Created 4 years, 9 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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/V8DebuggerAgentImpl.h" 5 #include "platform/v8_inspector/V8DebuggerAgentImpl.h"
6 6
7 #include "platform/inspector_protocol/String16.h"
7 #include "platform/inspector_protocol/Values.h" 8 #include "platform/inspector_protocol/Values.h"
8 #include "platform/v8_inspector/IgnoreExceptionsScope.h" 9 #include "platform/v8_inspector/IgnoreExceptionsScope.h"
9 #include "platform/v8_inspector/InjectedScript.h" 10 #include "platform/v8_inspector/InjectedScript.h"
10 #include "platform/v8_inspector/InjectedScriptHost.h" 11 #include "platform/v8_inspector/InjectedScriptHost.h"
11 #include "platform/v8_inspector/InjectedScriptManager.h" 12 #include "platform/v8_inspector/InjectedScriptManager.h"
12 #include "platform/v8_inspector/JavaScriptCallFrame.h" 13 #include "platform/v8_inspector/JavaScriptCallFrame.h"
13 #include "platform/v8_inspector/PromiseTracker.h" 14 #include "platform/v8_inspector/PromiseTracker.h"
14 #include "platform/v8_inspector/RemoteObjectId.h" 15 #include "platform/v8_inspector/RemoteObjectId.h"
15 #include "platform/v8_inspector/V8AsyncCallTracker.h" 16 #include "platform/v8_inspector/V8AsyncCallTracker.h"
16 #include "platform/v8_inspector/V8JavaScriptCallFrame.h" 17 #include "platform/v8_inspector/V8JavaScriptCallFrame.h"
17 #include "platform/v8_inspector/V8Regex.h" 18 #include "platform/v8_inspector/V8Regex.h"
18 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" 19 #include "platform/v8_inspector/V8RuntimeAgentImpl.h"
19 #include "platform/v8_inspector/V8StackTraceImpl.h" 20 #include "platform/v8_inspector/V8StackTraceImpl.h"
20 #include "platform/v8_inspector/V8StringUtil.h" 21 #include "platform/v8_inspector/V8StringUtil.h"
21 #include "platform/v8_inspector/public/V8ContentSearchUtil.h" 22 #include "platform/v8_inspector/public/V8ContentSearchUtil.h"
22 #include "platform/v8_inspector/public/V8Debugger.h" 23 #include "platform/v8_inspector/public/V8Debugger.h"
23 #include "platform/v8_inspector/public/V8DebuggerClient.h" 24 #include "platform/v8_inspector/public/V8DebuggerClient.h"
24 #include "wtf/text/StringBuilder.h"
25 #include "wtf/text/WTFString.h"
26 25
27 using blink::protocol::Array; 26 using blink::protocol::Array;
28 using blink::protocol::Maybe; 27 using blink::protocol::Maybe;
29 using blink::protocol::Debugger::AsyncOperation; 28 using blink::protocol::Debugger::AsyncOperation;
30 using blink::protocol::Debugger::BreakpointId; 29 using blink::protocol::Debugger::BreakpointId;
31 using blink::protocol::Debugger::CallFrame; 30 using blink::protocol::Debugger::CallFrame;
32 using blink::protocol::Debugger::CollectionEntry; 31 using blink::protocol::Debugger::CollectionEntry;
33 using blink::protocol::Runtime::ExceptionDetails; 32 using blink::protocol::Runtime::ExceptionDetails;
34 using blink::protocol::Debugger::FunctionDetails; 33 using blink::protocol::Debugger::FunctionDetails;
35 using blink::protocol::Debugger::GeneratorObjectDetails; 34 using blink::protocol::Debugger::GeneratorObjectDetails;
(...skipping 20 matching lines...) Expand all
56 static const char skipAllPauses[] = "skipAllPauses"; 55 static const char skipAllPauses[] = "skipAllPauses";
57 56
58 } // namespace DebuggerAgentState; 57 } // namespace DebuggerAgentState;
59 58
60 static const int maxSkipStepFrameCount = 128; 59 static const int maxSkipStepFrameCount = 128;
61 60
62 const char V8DebuggerAgent::backtraceObjectGroup[] = "backtrace"; 61 const char V8DebuggerAgent::backtraceObjectGroup[] = "backtrace";
63 62
64 const int V8DebuggerAgent::unknownAsyncOperationId = 0; 63 const int V8DebuggerAgent::unknownAsyncOperationId = 0;
65 64
66 static String breakpointIdSuffix(V8DebuggerAgentImpl::BreakpointSource source) 65 static String16 breakpointIdSuffix(V8DebuggerAgentImpl::BreakpointSource source)
67 { 66 {
68 switch (source) { 67 switch (source) {
69 case V8DebuggerAgentImpl::UserBreakpointSource: 68 case V8DebuggerAgentImpl::UserBreakpointSource:
70 break; 69 break;
71 case V8DebuggerAgentImpl::DebugCommandBreakpointSource: 70 case V8DebuggerAgentImpl::DebugCommandBreakpointSource:
72 return ":debug"; 71 return ":debug";
73 case V8DebuggerAgentImpl::MonitorCommandBreakpointSource: 72 case V8DebuggerAgentImpl::MonitorCommandBreakpointSource:
74 return ":monitor"; 73 return ":monitor";
75 } 74 }
76 return String(); 75 return String16();
77 } 76 }
78 77
79 static String generateBreakpointId(const String& scriptId, int lineNumber, int c olumnNumber, V8DebuggerAgentImpl::BreakpointSource source) 78 static String16 generateBreakpointId(const String16& scriptId, int lineNumber, i nt columnNumber, V8DebuggerAgentImpl::BreakpointSource source)
80 { 79 {
81 return scriptId + ':' + String::number(lineNumber) + ':' + String::number(co lumnNumber) + breakpointIdSuffix(source); 80 return scriptId + ":" + String16::number(lineNumber) + ":" + String16::numbe r(columnNumber) + breakpointIdSuffix(source);
82 } 81 }
83 82
84 static bool positionComparator(const std::pair<int, int>& a, const std::pair<int , int>& b) 83 static bool positionComparator(const std::pair<int, int>& a, const std::pair<int , int>& b)
85 { 84 {
86 if (a.first != b.first) 85 if (a.first != b.first)
87 return a.first < b.first; 86 return a.first < b.first;
88 return a.second < b.second; 87 return a.second < b.second;
89 } 88 }
90 89
91 static const LChar hexDigits[17] = "0123456789ABCDEF"; 90 static const LChar hexDigits[17] = "0123456789ABCDEF";
92 91
93 static void appendUnsignedAsHex(unsigned number, String& destination) 92 static void appendUnsignedAsHex(unsigned number, String16Builder* destination)
94 { 93 {
95 for (size_t i = 0; i < 8; ++i) { 94 for (size_t i = 0; i < 8; ++i) {
96 destination.append(hexDigits[number & 0xF]); 95 destination->append(hexDigits[number & 0xF]);
97 number >>= 4; 96 number >>= 4;
98 } 97 }
99 } 98 }
100 99
101 // Hash algorithm for substrings is described in "Über die Komplexität der Multi plikation in 100 // Hash algorithm for substrings is described in "Über die Komplexität der Multi plikation in
102 // eingeschränkten Branchingprogrammmodellen" by Woelfe. 101 // eingeschränkten Branchingprogrammmodellen" by Woelfe.
103 // http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECT ION00832000000000000000 102 // http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECT ION00832000000000000000
104 static String calculateHash(const String& str) 103 static String16 calculateHash(const String16& str)
105 { 104 {
106 static uint64_t prime[] = { 0x3FB75161, 0xAB1F4E4F, 0x82675BC5, 0xCD924D35, 0x81ABE279 }; 105 static uint64_t prime[] = { 0x3FB75161, 0xAB1F4E4F, 0x82675BC5, 0xCD924D35, 0x81ABE279 };
107 static uint64_t random[] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }; 106 static uint64_t random[] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 };
108 static uint32_t randomOdd[] = { 0xB4663807, 0xCC322BF5, 0xD4F91BBD, 0xA7BEA1 1D, 0x8F462907 }; 107 static uint32_t randomOdd[] = { 0xB4663807, 0xCC322BF5, 0xD4F91BBD, 0xA7BEA1 1D, 0x8F462907 };
109 108
110 uint64_t hashes[] = { 0, 0, 0, 0, 0 }; 109 uint64_t hashes[] = { 0, 0, 0, 0, 0 };
111 uint64_t zi[] = { 1, 1, 1, 1, 1 }; 110 uint64_t zi[] = { 1, 1, 1, 1, 1 };
112 111
113 const size_t hashesSize = WTF_ARRAY_LENGTH(hashes); 112 const size_t hashesSize = WTF_ARRAY_LENGTH(hashes);
114 113
(...skipping 18 matching lines...) Expand all
133 } 132 }
134 uint64_t xi = v * randomOdd[current] & 0x7FFFFFFF; 133 uint64_t xi = v * randomOdd[current] & 0x7FFFFFFF;
135 hashes[current] = (hashes[current] + zi[current] * xi) % prime[current]; 134 hashes[current] = (hashes[current] + zi[current] * xi) % prime[current];
136 zi[current] = (zi[current] * random[current]) % prime[current]; 135 zi[current] = (zi[current] * random[current]) % prime[current];
137 current = current == hashesSize - 1 ? 0 : current + 1; 136 current = current == hashesSize - 1 ? 0 : current + 1;
138 } 137 }
139 138
140 for (size_t i = 0; i < hashesSize; ++i) 139 for (size_t i = 0; i < hashesSize; ++i)
141 hashes[i] = (hashes[i] + zi[i] * (prime[i] - 1)) % prime[i]; 140 hashes[i] = (hashes[i] + zi[i] * (prime[i] - 1)) % prime[i];
142 141
143 String hash; 142 String16Builder hash;
144 for (size_t i = 0; i < hashesSize; ++i) 143 for (size_t i = 0; i < hashesSize; ++i)
145 appendUnsignedAsHex(hashes[i], hash); 144 appendUnsignedAsHex(hashes[i], &hash);
146 return hash; 145 return hash.toString();
147 } 146 }
148 147
149 PassOwnPtr<V8DebuggerAgent> V8DebuggerAgent::create(V8RuntimeAgent* runtimeAgent , int contextGroupId) 148 PassOwnPtr<V8DebuggerAgent> V8DebuggerAgent::create(V8RuntimeAgent* runtimeAgent , int contextGroupId)
150 { 149 {
151 V8RuntimeAgentImpl* runtimeAgentImpl = static_cast<V8RuntimeAgentImpl*>(runt imeAgent); 150 V8RuntimeAgentImpl* runtimeAgentImpl = static_cast<V8RuntimeAgentImpl*>(runt imeAgent);
152 return adoptPtr(new V8DebuggerAgentImpl(runtimeAgentImpl->injectedScriptMana ger(), runtimeAgentImpl->debugger(), contextGroupId)); 151 return adoptPtr(new V8DebuggerAgentImpl(runtimeAgentImpl->injectedScriptMana ger(), runtimeAgentImpl->debugger(), contextGroupId));
153 } 152 }
154 153
155 V8DebuggerAgentImpl::V8DebuggerAgentImpl(InjectedScriptManager* injectedScriptMa nager, V8DebuggerImpl* debugger, int contextGroupId) 154 V8DebuggerAgentImpl::V8DebuggerAgentImpl(InjectedScriptManager* injectedScriptMa nager, V8DebuggerImpl* debugger, int contextGroupId)
156 : m_injectedScriptManager(injectedScriptManager) 155 : m_injectedScriptManager(injectedScriptManager)
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 m_state->setBoolean(DebuggerAgentState::promiseTrackerCaptureStacks, false); 236 m_state->setBoolean(DebuggerAgentState::promiseTrackerCaptureStacks, false);
238 237
239 debugger().removeAgent(m_contextGroupId); 238 debugger().removeAgent(m_contextGroupId);
240 m_pausedContext.Reset(); 239 m_pausedContext.Reset();
241 m_currentCallStack.Reset(); 240 m_currentCallStack.Reset();
242 m_scripts.clear(); 241 m_scripts.clear();
243 m_blackboxedPositions.clear(); 242 m_blackboxedPositions.clear();
244 m_breakpointIdToDebuggerBreakpointIds.clear(); 243 m_breakpointIdToDebuggerBreakpointIds.clear();
245 internalSetAsyncCallStackDepth(0); 244 internalSetAsyncCallStackDepth(0);
246 m_promiseTracker->setEnabled(false, false); 245 m_promiseTracker->setEnabled(false, false);
247 m_continueToLocationBreakpointId = String(); 246 m_continueToLocationBreakpointId = String16();
248 clearBreakDetails(); 247 clearBreakDetails();
249 m_scheduledDebuggerStep = NoStep; 248 m_scheduledDebuggerStep = NoStep;
250 m_skipNextDebuggerStepOut = false; 249 m_skipNextDebuggerStepOut = false;
251 m_javaScriptPauseScheduled = false; 250 m_javaScriptPauseScheduled = false;
252 m_steppingFromFramework = false; 251 m_steppingFromFramework = false;
253 m_pausingOnNativeEvent = false; 252 m_pausingOnNativeEvent = false;
254 m_skippedStepFrameCount = 0; 253 m_skippedStepFrameCount = 0;
255 m_recursionLevelForStepFrame = 0; 254 m_recursionLevelForStepFrame = 0;
256 m_asyncOperationNotifications.clear(); 255 m_asyncOperationNotifications.clear();
257 clearStepIntoAsync(); 256 clearStepIntoAsync();
(...skipping 23 matching lines...) Expand all
281 disable(&error); 280 disable(&error);
282 ASSERT(m_frontend); 281 ASSERT(m_frontend);
283 m_frontend = nullptr; 282 m_frontend = nullptr;
284 } 283 }
285 284
286 void V8DebuggerAgentImpl::restore() 285 void V8DebuggerAgentImpl::restore()
287 { 286 {
288 ASSERT(!m_enabled); 287 ASSERT(!m_enabled);
289 m_frontend->globalObjectCleared(); 288 m_frontend->globalObjectCleared();
290 enable(); 289 enable();
291 String error; 290 ErrorString error;
292 291
293 int pauseState = V8DebuggerImpl::DontPauseOnExceptions; 292 int pauseState = V8DebuggerImpl::DontPauseOnExceptions;
294 m_state->getNumber(DebuggerAgentState::pauseOnExceptionsState, &pauseState); 293 m_state->getNumber(DebuggerAgentState::pauseOnExceptionsState, &pauseState);
295 setPauseOnExceptionsImpl(&error, pauseState); 294 setPauseOnExceptionsImpl(&error, pauseState);
296 295
297 m_skipAllPauses = m_state->booleanProperty(DebuggerAgentState::skipAllPauses , false); 296 m_skipAllPauses = m_state->booleanProperty(DebuggerAgentState::skipAllPauses , false);
298 297
299 int asyncCallStackDepth = 0; 298 int asyncCallStackDepth = 0;
300 m_state->getNumber(DebuggerAgentState::asyncCallStackDepth, &asyncCallStackD epth); 299 m_state->getNumber(DebuggerAgentState::asyncCallStackDepth, &asyncCallStackD epth);
301 internalSetAsyncCallStackDepth(asyncCallStackDepth); 300 internalSetAsyncCallStackDepth(asyncCallStackDepth);
(...skipping 12 matching lines...) Expand all
314 { 313 {
315 m_skipAllPauses = skipped; 314 m_skipAllPauses = skipped;
316 m_state->setBoolean(DebuggerAgentState::skipAllPauses, m_skipAllPauses); 315 m_state->setBoolean(DebuggerAgentState::skipAllPauses, m_skipAllPauses);
317 } 316 }
318 317
319 bool V8DebuggerAgentImpl::isPaused() 318 bool V8DebuggerAgentImpl::isPaused()
320 { 319 {
321 return debugger().isPaused(); 320 return debugger().isPaused();
322 } 321 }
323 322
324 static PassOwnPtr<protocol::DictionaryValue> buildObjectForBreakpointCookie(cons t String& url, int lineNumber, int columnNumber, const String& condition, bool i sRegex) 323 static PassOwnPtr<protocol::DictionaryValue> buildObjectForBreakpointCookie(cons t String16& url, int lineNumber, int columnNumber, const String16& condition, bo ol isRegex)
325 { 324 {
326 OwnPtr<protocol::DictionaryValue> breakpointObject = protocol::DictionaryVal ue::create(); 325 OwnPtr<protocol::DictionaryValue> breakpointObject = protocol::DictionaryVal ue::create();
327 breakpointObject->setString(DebuggerAgentState::url, url); 326 breakpointObject->setString(DebuggerAgentState::url, url);
328 breakpointObject->setNumber(DebuggerAgentState::lineNumber, lineNumber); 327 breakpointObject->setNumber(DebuggerAgentState::lineNumber, lineNumber);
329 breakpointObject->setNumber(DebuggerAgentState::columnNumber, columnNumber); 328 breakpointObject->setNumber(DebuggerAgentState::columnNumber, columnNumber);
330 breakpointObject->setString(DebuggerAgentState::condition, condition); 329 breakpointObject->setString(DebuggerAgentState::condition, condition);
331 breakpointObject->setBoolean(DebuggerAgentState::isRegex, isRegex); 330 breakpointObject->setBoolean(DebuggerAgentState::isRegex, isRegex);
332 return breakpointObject.release(); 331 return breakpointObject.release();
333 } 332 }
334 333
335 static bool matches(V8DebuggerImpl* debugger, const String& url, const String& p attern, bool isRegex) 334 static bool matches(V8DebuggerImpl* debugger, const String16& url, const String1 6& pattern, bool isRegex)
336 { 335 {
337 if (isRegex) { 336 if (isRegex) {
338 V8Regex regex(debugger, pattern, TextCaseSensitive); 337 V8Regex regex(debugger, pattern, true);
339 return regex.match(url) != -1; 338 return regex.match(url) != -1;
340 } 339 }
341 return url == pattern; 340 return url == pattern;
342 } 341 }
343 342
344 void V8DebuggerAgentImpl::setBreakpointByUrl(ErrorString* errorString, 343 void V8DebuggerAgentImpl::setBreakpointByUrl(ErrorString* errorString,
345 int lineNumber, 344 int lineNumber,
346 const Maybe<String>& optionalURL, 345 const Maybe<String16>& optionalURL,
347 const Maybe<String>& optionalURLRegex, 346 const Maybe<String16>& optionalURLRegex,
348 const Maybe<int>& optionalColumnNumber, 347 const Maybe<int>& optionalColumnNumber,
349 const Maybe<String>& optionalCondition, 348 const Maybe<String16>& optionalCondition,
350 BreakpointId* outBreakpointId, 349 String16* outBreakpointId,
351 OwnPtr<protocol::Array<protocol::Debugger::Location>>* locations) 350 OwnPtr<protocol::Array<protocol::Debugger::Location>>* locations)
352 { 351 {
353 *locations = Array<protocol::Debugger::Location>::create(); 352 *locations = Array<protocol::Debugger::Location>::create();
354 if (optionalURL.isJust() == optionalURLRegex.isJust()) { 353 if (optionalURL.isJust() == optionalURLRegex.isJust()) {
355 *errorString = "Either url or urlRegex must be specified."; 354 *errorString = "Either url or urlRegex must be specified.";
356 return; 355 return;
357 } 356 }
358 357
359 String url = optionalURL.isJust() ? optionalURL.fromJust() : optionalURLRege x.fromJust(); 358 String16 url = optionalURL.isJust() ? optionalURL.fromJust() : optionalURLRe gex.fromJust();
360 int columnNumber = 0; 359 int columnNumber = 0;
361 if (optionalColumnNumber.isJust()) { 360 if (optionalColumnNumber.isJust()) {
362 columnNumber = optionalColumnNumber.fromJust(); 361 columnNumber = optionalColumnNumber.fromJust();
363 if (columnNumber < 0) { 362 if (columnNumber < 0) {
364 *errorString = "Incorrect column number"; 363 *errorString = "Incorrect column number";
365 return; 364 return;
366 } 365 }
367 } 366 }
368 String condition = optionalCondition.fromMaybe(""); 367 String16 condition = optionalCondition.fromMaybe("");
369 bool isRegex = optionalURLRegex.isJust(); 368 bool isRegex = optionalURLRegex.isJust();
370 369
371 String breakpointId = (isRegex ? "/" + url + "/" : url) + ':' + String::numb er(lineNumber) + ':' + String::number(columnNumber); 370 String16 breakpointId = (isRegex ? "/" + url + "/" : url) + ":" + String16:: number(lineNumber) + ":" + String16::number(columnNumber);
372 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg entState::javaScriptBreakpoints); 371 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg entState::javaScriptBreakpoints);
373 if (!breakpointsCookie) { 372 if (!breakpointsCookie) {
374 OwnPtr<protocol::DictionaryValue> newValue = protocol::DictionaryValue:: create(); 373 OwnPtr<protocol::DictionaryValue> newValue = protocol::DictionaryValue:: create();
375 breakpointsCookie = newValue.get(); 374 breakpointsCookie = newValue.get();
376 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, newValue.r elease()); 375 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, newValue.r elease());
377 } 376 }
378 if (breakpointsCookie->get(breakpointId)) { 377 if (breakpointsCookie->get(breakpointId)) {
379 *errorString = "Breakpoint at specified location already exists."; 378 *errorString = "Breakpoint at specified location already exists.";
380 return; 379 return;
381 } 380 }
382 381
383 breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(ur l, lineNumber, columnNumber, condition, isRegex)); 382 breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(ur l, lineNumber, columnNumber, condition, isRegex));
384 383
385 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); 384 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition);
386 for (auto& script : m_scripts) { 385 for (auto& script : m_scripts) {
387 if (!matches(m_debugger, script.second->sourceURL(), url, isRegex)) 386 if (!matches(m_debugger, script.second->sourceURL(), url, isRegex))
388 continue; 387 continue;
389 OwnPtr<protocol::Debugger::Location> location = resolveBreakpoint(breakp ointId, script.first, breakpoint, UserBreakpointSource); 388 OwnPtr<protocol::Debugger::Location> location = resolveBreakpoint(breakp ointId, script.first, breakpoint, UserBreakpointSource);
390 if (location) 389 if (location)
391 (*locations)->addItem(location.release()); 390 (*locations)->addItem(location.release());
392 } 391 }
393 392
394 *outBreakpointId = breakpointId; 393 *outBreakpointId = breakpointId;
395 } 394 }
396 395
397 static bool parseLocation(ErrorString* errorString, PassOwnPtr<protocol::Debugge r::Location> location, String* scriptId, int* lineNumber, int* columnNumber) 396 static bool parseLocation(ErrorString* errorString, PassOwnPtr<protocol::Debugge r::Location> location, String16* scriptId, int* lineNumber, int* columnNumber)
398 { 397 {
399 *scriptId = location->getScriptId(); 398 *scriptId = location->getScriptId();
400 *lineNumber = location->getLineNumber(); 399 *lineNumber = location->getLineNumber();
401 *columnNumber = location->getColumnNumber(0); 400 *columnNumber = location->getColumnNumber(0);
402 return true; 401 return true;
403 } 402 }
404 403
405 void V8DebuggerAgentImpl::setBreakpoint(ErrorString* errorString, 404 void V8DebuggerAgentImpl::setBreakpoint(ErrorString* errorString,
406 PassOwnPtr<protocol::Debugger::Location> location, 405 PassOwnPtr<protocol::Debugger::Location> location,
407 const Maybe<String>& optionalCondition, 406 const Maybe<String16>& optionalCondition,
408 BreakpointId* outBreakpointId, 407 String16* outBreakpointId,
409 OwnPtr<protocol::Debugger::Location>* actualLocation) 408 OwnPtr<protocol::Debugger::Location>* actualLocation)
410 { 409 {
411 String scriptId; 410 String16 scriptId;
412 int lineNumber; 411 int lineNumber;
413 int columnNumber; 412 int columnNumber;
414 413
415 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber)) 414 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber))
416 return; 415 return;
417 416
418 String condition = optionalCondition.fromMaybe(""); 417 String16 condition = optionalCondition.fromMaybe("");
419 418
420 String breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumbe r, UserBreakpointSource); 419 String16 breakpointId = generateBreakpointId(scriptId, lineNumber, columnNum ber, UserBreakpointSource);
421 if (m_breakpointIdToDebuggerBreakpointIds.contains(breakpointId)) { 420 if (m_breakpointIdToDebuggerBreakpointIds.contains(breakpointId)) {
422 *errorString = "Breakpoint at specified location already exists."; 421 *errorString = "Breakpoint at specified location already exists.";
423 return; 422 return;
424 } 423 }
425 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); 424 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition);
426 *actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint, User BreakpointSource); 425 *actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint, User BreakpointSource);
427 if (*actualLocation) 426 if (*actualLocation)
428 *outBreakpointId = breakpointId; 427 *outBreakpointId = breakpointId;
429 else 428 else
430 *errorString = "Could not resolve breakpoint"; 429 *errorString = "Could not resolve breakpoint";
431 } 430 }
432 431
433 void V8DebuggerAgentImpl::removeBreakpoint(ErrorString* errorString, const Strin g& breakpointId) 432 void V8DebuggerAgentImpl::removeBreakpoint(ErrorString* errorString, const Strin g16& breakpointId)
434 { 433 {
435 if (!checkEnabled(errorString)) 434 if (!checkEnabled(errorString))
436 return; 435 return;
437 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg entState::javaScriptBreakpoints); 436 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg entState::javaScriptBreakpoints);
438 if (breakpointsCookie) 437 if (breakpointsCookie)
439 breakpointsCookie->remove(breakpointId); 438 breakpointsCookie->remove(breakpointId);
440 removeBreakpoint(breakpointId); 439 removeBreakpoint(breakpointId);
441 } 440 }
442 441
443 void V8DebuggerAgentImpl::removeBreakpoint(const String& breakpointId) 442 void V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId)
444 { 443 {
445 ASSERT(enabled()); 444 ASSERT(enabled());
446 BreakpointIdToDebuggerBreakpointIdsMap::iterator debuggerBreakpointIdsIterat or = m_breakpointIdToDebuggerBreakpointIds.find(breakpointId); 445 BreakpointIdToDebuggerBreakpointIdsMap::iterator debuggerBreakpointIdsIterat or = m_breakpointIdToDebuggerBreakpointIds.find(breakpointId);
447 if (debuggerBreakpointIdsIterator == m_breakpointIdToDebuggerBreakpointIds.e nd()) 446 if (debuggerBreakpointIdsIterator == m_breakpointIdToDebuggerBreakpointIds.e nd())
448 return; 447 return;
449 protocol::Vector<String>* ids = debuggerBreakpointIdsIterator->second; 448 protocol::Vector<String16>* ids = debuggerBreakpointIdsIterator->second;
450 for (size_t i = 0; i < ids->size(); ++i) { 449 for (size_t i = 0; i < ids->size(); ++i) {
451 const String& debuggerBreakpointId = ids->at(i); 450 const String16& debuggerBreakpointId = ids->at(i);
452 451
453 debugger().removeBreakpoint(debuggerBreakpointId); 452 debugger().removeBreakpoint(debuggerBreakpointId);
454 m_serverBreakpoints.remove(debuggerBreakpointId); 453 m_serverBreakpoints.remove(debuggerBreakpointId);
455 } 454 }
456 m_breakpointIdToDebuggerBreakpointIds.remove(breakpointId); 455 m_breakpointIdToDebuggerBreakpointIds.remove(breakpointId);
457 } 456 }
458 457
459 void V8DebuggerAgentImpl::continueToLocation(ErrorString* errorString, 458 void V8DebuggerAgentImpl::continueToLocation(ErrorString* errorString,
460 PassOwnPtr<protocol::Debugger::Location> location, 459 PassOwnPtr<protocol::Debugger::Location> location,
461 const protocol::Maybe<bool>& interstateLocationOpt) 460 const protocol::Maybe<bool>& interstateLocationOpt)
462 { 461 {
463 if (!checkEnabled(errorString)) 462 if (!checkEnabled(errorString))
464 return; 463 return;
465 if (!m_continueToLocationBreakpointId.isEmpty()) { 464 if (!m_continueToLocationBreakpointId.isEmpty()) {
466 debugger().removeBreakpoint(m_continueToLocationBreakpointId); 465 debugger().removeBreakpoint(m_continueToLocationBreakpointId);
467 m_continueToLocationBreakpointId = ""; 466 m_continueToLocationBreakpointId = "";
468 } 467 }
469 468
470 String scriptId; 469 String16 scriptId;
471 int lineNumber; 470 int lineNumber;
472 int columnNumber; 471 int columnNumber;
473 472
474 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber)) 473 if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNum ber))
475 return; 474 return;
476 475
477 ScriptBreakpoint breakpoint(lineNumber, columnNumber, ""); 476 ScriptBreakpoint breakpoint(lineNumber, columnNumber, "");
478 m_continueToLocationBreakpointId = debugger().setBreakpoint(scriptId, breakp oint, &lineNumber, &columnNumber, interstateLocationOpt.fromMaybe(false)); 477 m_continueToLocationBreakpointId = debugger().setBreakpoint(scriptId, breakp oint, &lineNumber, &columnNumber, interstateLocationOpt.fromMaybe(false));
479 resume(errorString); 478 resume(errorString);
480 } 479 }
481 480
482 void V8DebuggerAgentImpl::getStepInPositions(ErrorString* errorString, const Str ing& callFrameId, Maybe<Array<protocol::Debugger::Location>>* positions) 481 void V8DebuggerAgentImpl::getStepInPositions(ErrorString* errorString, const Str ing16& callFrameId, Maybe<Array<protocol::Debugger::Location>>* positions)
483 { 482 {
484 if (!isPaused() || m_currentCallStack.IsEmpty()) { 483 if (!isPaused() || m_currentCallStack.IsEmpty()) {
485 *errorString = "Attempt to access callframe when debugger is not on paus e"; 484 *errorString = "Attempt to access callframe when debugger is not on paus e";
486 return; 485 return;
487 } 486 }
488 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId); 487 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId);
489 if (!remoteId) { 488 if (!remoteId) {
490 *errorString = "Invalid call frame id"; 489 *errorString = "Invalid call frame id";
491 return; 490 return;
492 } 491 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 bool V8DebuggerAgentImpl::isTopCallFrameBlackboxed() 525 bool V8DebuggerAgentImpl::isTopCallFrameBlackboxed()
527 { 526 {
528 ASSERT(enabled()); 527 ASSERT(enabled());
529 return isCallFrameWithUnknownScriptOrBlackboxed(debugger().callFrameNoScopes (0).get()); 528 return isCallFrameWithUnknownScriptOrBlackboxed(debugger().callFrameNoScopes (0).get());
530 } 529 }
531 530
532 bool V8DebuggerAgentImpl::isCallFrameWithUnknownScriptOrBlackboxed(JavaScriptCal lFrame* frame) 531 bool V8DebuggerAgentImpl::isCallFrameWithUnknownScriptOrBlackboxed(JavaScriptCal lFrame* frame)
533 { 532 {
534 if (!frame) 533 if (!frame)
535 return true; 534 return true;
536 ScriptsMap::iterator it = m_scripts.find(String::number(frame->sourceID())); 535 ScriptsMap::iterator it = m_scripts.find(String16::number(frame->sourceID()) );
537 if (it == m_scripts.end()) { 536 if (it == m_scripts.end()) {
538 // Unknown scripts are blackboxed. 537 // Unknown scripts are blackboxed.
539 return true; 538 return true;
540 } 539 }
541 auto itBlackboxedPositions = m_blackboxedPositions.find(String::number(frame ->sourceID())); 540 auto itBlackboxedPositions = m_blackboxedPositions.find(String16::number(fra me->sourceID()));
542 if (itBlackboxedPositions == m_blackboxedPositions.end()) 541 if (itBlackboxedPositions == m_blackboxedPositions.end())
543 return false; 542 return false;
544 543
545 protocol::Vector<std::pair<int, int>>* ranges = itBlackboxedPositions->secon d; 544 protocol::Vector<std::pair<int, int>>* ranges = itBlackboxedPositions->secon d;
546 auto itRange = std::lower_bound(ranges->begin(), ranges->end(), std::make_pa ir(frame->line(), frame->column()), positionComparator); 545 auto itRange = std::lower_bound(ranges->begin(), ranges->end(), std::make_pa ir(frame->line(), frame->column()), positionComparator);
547 // Ranges array contains positions in script where blackbox state is changed . 546 // Ranges array contains positions in script where blackbox state is changed .
548 // [(0,0) ... ranges[0]) isn't blackboxed, [ranges[0] ... ranges[1]) is blac kboxed... 547 // [(0,0) ... ranges[0]) isn't blackboxed, [ranges[0] ... ranges[1]) is blac kboxed...
549 return std::distance(ranges->begin(), itRange) % 2; 548 return std::distance(ranges->begin(), itRange) % 2;
550 } 549 }
551 550
(...skipping 23 matching lines...) Expand all
575 if (m_skippedStepFrameCount >= maxSkipStepFrameCount) 574 if (m_skippedStepFrameCount >= maxSkipStepFrameCount)
576 return RequestStepOut; 575 return RequestStepOut;
577 576
578 if (!m_skippedStepFrameCount) 577 if (!m_skippedStepFrameCount)
579 m_recursionLevelForStepFrame = 1; 578 m_recursionLevelForStepFrame = 1;
580 579
581 ++m_skippedStepFrameCount; 580 ++m_skippedStepFrameCount;
582 return RequestStepFrame; 581 return RequestStepFrame;
583 } 582 }
584 583
585 PassOwnPtr<protocol::Debugger::Location> V8DebuggerAgentImpl::resolveBreakpoint( const String& breakpointId, const String& scriptId, const ScriptBreakpoint& brea kpoint, BreakpointSource source) 584 PassOwnPtr<protocol::Debugger::Location> V8DebuggerAgentImpl::resolveBreakpoint( const String16& breakpointId, const String16& scriptId, const ScriptBreakpoint& breakpoint, BreakpointSource source)
586 { 585 {
587 ASSERT(enabled()); 586 ASSERT(enabled());
588 // FIXME: remove these checks once crbug.com/520702 is resolved. 587 // FIXME: remove these checks once crbug.com/520702 is resolved.
589 RELEASE_ASSERT(!breakpointId.isEmpty()); 588 RELEASE_ASSERT(!breakpointId.isEmpty());
590 RELEASE_ASSERT(!scriptId.isEmpty()); 589 RELEASE_ASSERT(!scriptId.isEmpty());
591 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); 590 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId);
592 if (scriptIterator == m_scripts.end()) 591 if (scriptIterator == m_scripts.end())
593 return nullptr; 592 return nullptr;
594 V8DebuggerScript* script = scriptIterator->second; 593 V8DebuggerScript* script = scriptIterator->second;
595 if (breakpoint.lineNumber < script->startLine() || script->endLine() < break point.lineNumber) 594 if (breakpoint.lineNumber < script->startLine() || script->endLine() < break point.lineNumber)
596 return nullptr; 595 return nullptr;
597 596
598 int actualLineNumber; 597 int actualLineNumber;
599 int actualColumnNumber; 598 int actualColumnNumber;
600 String debuggerBreakpointId = debugger().setBreakpoint(scriptId, breakpoint, &actualLineNumber, &actualColumnNumber, false); 599 String16 debuggerBreakpointId = debugger().setBreakpoint(scriptId, breakpoin t, &actualLineNumber, &actualColumnNumber, false);
601 if (debuggerBreakpointId.isEmpty()) 600 if (debuggerBreakpointId.isEmpty())
602 return nullptr; 601 return nullptr;
603 602
604 m_serverBreakpoints.set(debuggerBreakpointId, std::make_pair(breakpointId, s ource)); 603 m_serverBreakpoints.set(debuggerBreakpointId, std::make_pair(breakpointId, s ource));
605 RELEASE_ASSERT(!breakpointId.isEmpty()); 604 RELEASE_ASSERT(!breakpointId.isEmpty());
606 if (!m_breakpointIdToDebuggerBreakpointIds.contains(breakpointId)) 605 if (!m_breakpointIdToDebuggerBreakpointIds.contains(breakpointId))
607 m_breakpointIdToDebuggerBreakpointIds.set(breakpointId, protocol::Vector <String>()); 606 m_breakpointIdToDebuggerBreakpointIds.set(breakpointId, protocol::Vector <String16>());
608 607
609 BreakpointIdToDebuggerBreakpointIdsMap::iterator debuggerBreakpointIdsIterat or = m_breakpointIdToDebuggerBreakpointIds.find(breakpointId); 608 BreakpointIdToDebuggerBreakpointIdsMap::iterator debuggerBreakpointIdsIterat or = m_breakpointIdToDebuggerBreakpointIds.find(breakpointId);
610 debuggerBreakpointIdsIterator->second->append(debuggerBreakpointId); 609 debuggerBreakpointIdsIterator->second->append(debuggerBreakpointId);
611 610
612 OwnPtr<protocol::Debugger::Location> location = protocol::Debugger::Location ::create() 611 OwnPtr<protocol::Debugger::Location> location = protocol::Debugger::Location ::create()
613 .setScriptId(scriptId) 612 .setScriptId(scriptId)
614 .setLineNumber(actualLineNumber) 613 .setLineNumber(actualLineNumber)
615 .setColumnNumber(actualColumnNumber).build(); 614 .setColumnNumber(actualColumnNumber).build();
616 return location.release(); 615 return location.release();
617 } 616 }
618 617
619 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String& scri ptId, const String& query, 618 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc riptId, const String16& query,
620 const Maybe<bool>& optionalCaseSensitive, 619 const Maybe<bool>& optionalCaseSensitive,
621 const Maybe<bool>& optionalIsRegex, 620 const Maybe<bool>& optionalIsRegex,
622 OwnPtr<Array<protocol::Debugger::SearchMatch>>* results) 621 OwnPtr<Array<protocol::Debugger::SearchMatch>>* results)
623 { 622 {
624 ScriptsMap::iterator it = m_scripts.find(scriptId); 623 ScriptsMap::iterator it = m_scripts.find(scriptId);
625 if (it != m_scripts.end()) 624 if (it != m_scripts.end())
626 *results = V8ContentSearchUtil::searchInTextByLines(m_debugger, it->seco nd->source(), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.fro mMaybe(false)); 625 *results = V8ContentSearchUtil::searchInTextByLines(m_debugger, it->seco nd->source(), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.fro mMaybe(false));
627 else 626 else
628 *error = "No script for id: " + scriptId; 627 *error = String16("No script for id: " + scriptId);
629 } 628 }
630 629
631 void V8DebuggerAgentImpl::setScriptSource(ErrorString* error, 630 void V8DebuggerAgentImpl::setScriptSource(ErrorString* error,
632 const String& scriptId, 631 const String16& scriptId,
633 const String& newContent, 632 const String16& newContent,
634 const Maybe<bool>& preview, 633 const Maybe<bool>& preview,
635 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, 634 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames,
636 Maybe<bool>* stackChanged, 635 Maybe<bool>* stackChanged,
637 Maybe<StackTrace>* asyncStackTrace, 636 Maybe<StackTrace>* asyncStackTrace,
638 Maybe<protocol::Debugger::SetScriptSourceError>* optOutCompileError) 637 Maybe<protocol::Debugger::SetScriptSourceError>* optOutCompileError)
639 { 638 {
640 if (!checkEnabled(error)) 639 if (!checkEnabled(error))
641 return; 640 return;
642 if (!debugger().setScriptSource(scriptId, newContent, preview.fromMaybe(fals e), error, optOutCompileError, &m_currentCallStack, stackChanged)) 641 if (!debugger().setScriptSource(scriptId, newContent, preview.fromMaybe(fals e), error, optOutCompileError, &m_currentCallStack, stackChanged))
643 return; 642 return;
644 643
645 *newCallFrames = currentCallFrames(); 644 *newCallFrames = currentCallFrames();
646 *asyncStackTrace = currentAsyncStackTrace(); 645 *asyncStackTrace = currentAsyncStackTrace();
647 646
648 ScriptsMap::iterator it = m_scripts.find(scriptId); 647 ScriptsMap::iterator it = m_scripts.find(scriptId);
649 if (it == m_scripts.end()) 648 if (it == m_scripts.end())
650 return; 649 return;
651 it->second->setSource(newContent); 650 it->second->setSource(newContent);
652 } 651 }
653 652
654 void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString, 653 void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString,
655 const String& callFrameId, 654 const String16& callFrameId,
656 OwnPtr<Array<CallFrame>>* newCallFrames, 655 OwnPtr<Array<CallFrame>>* newCallFrames,
657 Maybe<StackTrace>* asyncStackTrace) 656 Maybe<StackTrace>* asyncStackTrace)
658 { 657 {
659 if (!isPaused() || m_currentCallStack.IsEmpty()) { 658 if (!isPaused() || m_currentCallStack.IsEmpty()) {
660 *errorString = "Attempt to access callframe when debugger is not on paus e"; 659 *errorString = "Attempt to access callframe when debugger is not on paus e";
661 return; 660 return;
662 } 661 }
663 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId); 662 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId);
664 if (!remoteId) { 663 if (!remoteId) {
665 *errorString = "Invalid call frame id"; 664 *errorString = "Invalid call frame id";
666 return; 665 return;
667 } 666 }
668 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get()); 667 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get());
669 if (!injectedScript) { 668 if (!injectedScript) {
670 *errorString = "Inspected frame has gone"; 669 *errorString = "Inspected frame has gone";
671 return; 670 return;
672 } 671 }
673 672
674 v8::HandleScope scope(m_isolate); 673 v8::HandleScope scope(m_isolate);
675 v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate); 674 v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate);
676 injectedScript->restartFrame(errorString, callStack, callFrameId); 675 injectedScript->restartFrame(errorString, callStack, callFrameId);
677 m_currentCallStack.Reset(m_isolate, debugger().currentCallFrames()); 676 m_currentCallStack.Reset(m_isolate, debugger().currentCallFrames());
678 *newCallFrames = currentCallFrames(); 677 *newCallFrames = currentCallFrames();
679 *asyncStackTrace = currentAsyncStackTrace(); 678 *asyncStackTrace = currentAsyncStackTrace();
680 } 679 }
681 680
682 void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String& scri ptId, String* scriptSource) 681 void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String16& sc riptId, String16* scriptSource)
683 { 682 {
684 if (!checkEnabled(error)) 683 if (!checkEnabled(error))
685 return; 684 return;
686 ScriptsMap::iterator it = m_scripts.find(scriptId); 685 ScriptsMap::iterator it = m_scripts.find(scriptId);
687 if (it == m_scripts.end()) { 686 if (it == m_scripts.end()) {
688 *error = "No script for id: " + scriptId; 687 *error = "No script for id: " + scriptId;
689 return; 688 return;
690 } 689 }
691 *scriptSource = it->second->source(); 690 *scriptSource = it->second->source();
692 } 691 }
693 692
694 void V8DebuggerAgentImpl::getFunctionDetails(ErrorString* errorString, const Str ing& functionId, OwnPtr<FunctionDetails>* details) 693 void V8DebuggerAgentImpl::getFunctionDetails(ErrorString* errorString, const Str ing16& functionId, OwnPtr<FunctionDetails>* details)
695 { 694 {
696 if (!checkEnabled(errorString)) 695 if (!checkEnabled(errorString))
697 return; 696 return;
698 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(functionId); 697 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(functionId);
699 if (!remoteId) { 698 if (!remoteId) {
700 *errorString = "Invalid object id"; 699 *errorString = "Invalid object id";
701 return; 700 return;
702 } 701 }
703 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get()); 702 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get());
704 if (!injectedScript) { 703 if (!injectedScript) {
705 *errorString = "Function object id is obsolete"; 704 *errorString = "Function object id is obsolete";
706 return; 705 return;
707 } 706 }
708 injectedScript->getFunctionDetails(errorString, functionId, details); 707 injectedScript->getFunctionDetails(errorString, functionId, details);
709 } 708 }
710 709
711 void V8DebuggerAgentImpl::getGeneratorObjectDetails(ErrorString* errorString, co nst String& objectId, OwnPtr<GeneratorObjectDetails>* details) 710 void V8DebuggerAgentImpl::getGeneratorObjectDetails(ErrorString* errorString, co nst String16& objectId, OwnPtr<GeneratorObjectDetails>* details)
712 { 711 {
713 if (!checkEnabled(errorString)) 712 if (!checkEnabled(errorString))
714 return; 713 return;
715 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); 714 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId);
716 if (!remoteId) { 715 if (!remoteId) {
717 *errorString = "Invalid object id"; 716 *errorString = "Invalid object id";
718 return; 717 return;
719 } 718 }
720 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get()); 719 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get());
721 if (!injectedScript) { 720 if (!injectedScript) {
722 *errorString = "Inspected frame has gone"; 721 *errorString = "Inspected frame has gone";
723 return; 722 return;
724 } 723 }
725 injectedScript->getGeneratorObjectDetails(errorString, objectId, details); 724 injectedScript->getGeneratorObjectDetails(errorString, objectId, details);
726 } 725 }
727 726
728 void V8DebuggerAgentImpl::getCollectionEntries(ErrorString* errorString, const S tring& objectId, OwnPtr<protocol::Array<CollectionEntry>>* entries) 727 void V8DebuggerAgentImpl::getCollectionEntries(ErrorString* errorString, const S tring16& objectId, OwnPtr<protocol::Array<CollectionEntry>>* entries)
729 { 728 {
730 if (!checkEnabled(errorString)) 729 if (!checkEnabled(errorString))
731 return; 730 return;
732 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); 731 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId);
733 if (!remoteId) { 732 if (!remoteId) {
734 *errorString = "Invalid object id"; 733 *errorString = "Invalid object id";
735 return; 734 return;
736 } 735 }
737 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get()); 736 InjectedScript* injectedScript = m_injectedScriptManager->findInjectedScript (remoteId.get());
738 if (!injectedScript) { 737 if (!injectedScript) {
739 *errorString = "Inspected frame has gone"; 738 *errorString = "Inspected frame has gone";
740 return; 739 return;
741 } 740 }
742 injectedScript->getCollectionEntries(errorString, objectId, entries); 741 injectedScript->getCollectionEntries(errorString, objectId, entries);
743 } 742 }
744 743
745 void V8DebuggerAgentImpl::schedulePauseOnNextStatement(const String& breakReason , PassOwnPtr<protocol::DictionaryValue> data) 744 void V8DebuggerAgentImpl::schedulePauseOnNextStatement(const String16& breakReas on, PassOwnPtr<protocol::DictionaryValue> data)
746 { 745 {
747 ASSERT(enabled()); 746 ASSERT(enabled());
748 if (m_scheduledDebuggerStep == StepInto || m_javaScriptPauseScheduled || isP aused()) 747 if (m_scheduledDebuggerStep == StepInto || m_javaScriptPauseScheduled || isP aused())
749 return; 748 return;
750 m_breakReason = breakReason; 749 m_breakReason = breakReason;
751 m_breakAuxData = data; 750 m_breakAuxData = data;
752 m_pausingOnNativeEvent = true; 751 m_pausingOnNativeEvent = true;
753 m_skipNextDebuggerStepOut = false; 752 m_skipNextDebuggerStepOut = false;
754 debugger().setPauseOnNextStatement(true); 753 debugger().setPauseOnNextStatement(true);
755 } 754 }
(...skipping 17 matching lines...) Expand all
773 clearBreakDetails(); 772 clearBreakDetails();
774 m_pausingOnNativeEvent = false; 773 m_pausingOnNativeEvent = false;
775 debugger().setPauseOnNextStatement(false); 774 debugger().setPauseOnNextStatement(false);
776 } 775 }
777 776
778 bool V8DebuggerAgentImpl::v8AsyncTaskEventsEnabled() const 777 bool V8DebuggerAgentImpl::v8AsyncTaskEventsEnabled() const
779 { 778 {
780 return trackingAsyncCalls(); 779 return trackingAsyncCalls();
781 } 780 }
782 781
783 void V8DebuggerAgentImpl::didReceiveV8AsyncTaskEvent(v8::Local<v8::Context> cont ext, const String& eventType, const String& eventName, int id) 782 void V8DebuggerAgentImpl::didReceiveV8AsyncTaskEvent(v8::Local<v8::Context> cont ext, const String16& eventType, const String16& eventName, int id)
784 { 783 {
785 ASSERT(trackingAsyncCalls()); 784 ASSERT(trackingAsyncCalls());
786 m_v8AsyncCallTracker->didReceiveV8AsyncTaskEvent(context, eventType, eventNa me, id); 785 m_v8AsyncCallTracker->didReceiveV8AsyncTaskEvent(context, eventType, eventNa me, id);
787 } 786 }
788 787
789 bool V8DebuggerAgentImpl::v8PromiseEventsEnabled() const 788 bool V8DebuggerAgentImpl::v8PromiseEventsEnabled() const
790 { 789 {
791 return m_promiseTracker->isEnabled(); 790 return m_promiseTracker->isEnabled();
792 } 791 }
793 792
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 return; 865 return;
867 if (!trackingAsyncCalls()) { 866 if (!trackingAsyncCalls()) {
868 *errorString = "Can only perform operation if async call stacks are enab led."; 867 *errorString = "Can only perform operation if async call stacks are enab led.";
869 return; 868 return;
870 } 869 }
871 clearStepIntoAsync(); 870 clearStepIntoAsync();
872 m_startingStepIntoAsync = true; 871 m_startingStepIntoAsync = true;
873 stepInto(errorString); 872 stepInto(errorString);
874 } 873 }
875 874
876 void V8DebuggerAgentImpl::setPauseOnExceptions(ErrorString* errorString, const S tring& stringPauseState) 875 void V8DebuggerAgentImpl::setPauseOnExceptions(ErrorString* errorString, const S tring16& stringPauseState)
877 { 876 {
878 if (!checkEnabled(errorString)) 877 if (!checkEnabled(errorString))
879 return; 878 return;
880 V8DebuggerImpl::PauseOnExceptionsState pauseState; 879 V8DebuggerImpl::PauseOnExceptionsState pauseState;
881 if (stringPauseState == "none") { 880 if (stringPauseState == "none") {
882 pauseState = V8DebuggerImpl::DontPauseOnExceptions; 881 pauseState = V8DebuggerImpl::DontPauseOnExceptions;
883 } else if (stringPauseState == "all") { 882 } else if (stringPauseState == "all") {
884 pauseState = V8DebuggerImpl::PauseOnAllExceptions; 883 pauseState = V8DebuggerImpl::PauseOnAllExceptions;
885 } else if (stringPauseState == "uncaught") { 884 } else if (stringPauseState == "uncaught") {
886 pauseState = V8DebuggerImpl::PauseOnUncaughtExceptions; 885 pauseState = V8DebuggerImpl::PauseOnUncaughtExceptions;
887 } else { 886 } else {
888 *errorString = "Unknown pause on exceptions mode: " + stringPauseState; 887 *errorString = "Unknown pause on exceptions mode: " + stringPauseState;
889 return; 888 return;
890 } 889 }
891 setPauseOnExceptionsImpl(errorString, pauseState); 890 setPauseOnExceptionsImpl(errorString, pauseState);
892 } 891 }
893 892
894 void V8DebuggerAgentImpl::setPauseOnExceptionsImpl(ErrorString* errorString, int pauseState) 893 void V8DebuggerAgentImpl::setPauseOnExceptionsImpl(ErrorString* errorString, int pauseState)
895 { 894 {
896 debugger().setPauseOnExceptionsState(static_cast<V8DebuggerImpl::PauseOnExce ptionsState>(pauseState)); 895 debugger().setPauseOnExceptionsState(static_cast<V8DebuggerImpl::PauseOnExce ptionsState>(pauseState));
897 if (debugger().getPauseOnExceptionsState() != pauseState) 896 if (debugger().getPauseOnExceptionsState() != pauseState)
898 *errorString = "Internal error. Could not change pause on exceptions sta te"; 897 *errorString = "Internal error. Could not change pause on exceptions sta te";
899 else 898 else
900 m_state->setNumber(DebuggerAgentState::pauseOnExceptionsState, pauseStat e); 899 m_state->setNumber(DebuggerAgentState::pauseOnExceptionsState, pauseStat e);
901 } 900 }
902 901
903 void V8DebuggerAgentImpl::evaluateOnCallFrame(ErrorString* errorString, 902 void V8DebuggerAgentImpl::evaluateOnCallFrame(ErrorString* errorString,
904 const String& callFrameId, 903 const String16& callFrameId,
905 const String& expression, 904 const String16& expression,
906 const Maybe<String>& objectGroup, 905 const Maybe<String16>& objectGroup,
907 const Maybe<bool>& includeCommandLineAPI, 906 const Maybe<bool>& includeCommandLineAPI,
908 const Maybe<bool>& doNotPauseOnExceptionsAndMuteConsole, 907 const Maybe<bool>& doNotPauseOnExceptionsAndMuteConsole,
909 const Maybe<bool>& returnByValue, 908 const Maybe<bool>& returnByValue,
910 const Maybe<bool>& generatePreview, 909 const Maybe<bool>& generatePreview,
911 OwnPtr<RemoteObject>* result, 910 OwnPtr<RemoteObject>* result,
912 Maybe<bool>* wasThrown, 911 Maybe<bool>* wasThrown,
913 Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails) 912 Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails)
914 { 913 {
915 if (!isPaused() || m_currentCallStack.IsEmpty()) { 914 if (!isPaused() || m_currentCallStack.IsEmpty()) {
916 *errorString = "Attempt to access callframe when debugger is not on paus e"; 915 *errorString = "Attempt to access callframe when debugger is not on paus e";
(...skipping 12 matching lines...) Expand all
929 928
930 v8::HandleScope scope(m_isolate); 929 v8::HandleScope scope(m_isolate);
931 v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate); 930 v8::Local<v8::Object> callStack = m_currentCallStack.Get(m_isolate);
932 931
933 IgnoreExceptionsScope ignoreExceptionsScope(doNotPauseOnExceptionsAndMuteCon sole.fromMaybe(false) ? m_debugger : nullptr); 932 IgnoreExceptionsScope ignoreExceptionsScope(doNotPauseOnExceptionsAndMuteCon sole.fromMaybe(false) ? m_debugger : nullptr);
934 injectedScript->evaluateOnCallFrame(errorString, callStack, callFrameId, exp ression, objectGroup.fromMaybe(""), includeCommandLineAPI.fromMaybe(false), retu rnByValue.fromMaybe(false), generatePreview.fromMaybe(false), result, wasThrown, exceptionDetails); 933 injectedScript->evaluateOnCallFrame(errorString, callStack, callFrameId, exp ression, objectGroup.fromMaybe(""), includeCommandLineAPI.fromMaybe(false), retu rnByValue.fromMaybe(false), generatePreview.fromMaybe(false), result, wasThrown, exceptionDetails);
935 } 934 }
936 935
937 void V8DebuggerAgentImpl::setVariableValue(ErrorString* errorString, 936 void V8DebuggerAgentImpl::setVariableValue(ErrorString* errorString,
938 int scopeNumber, 937 int scopeNumber,
939 const String& variableName, 938 const String16& variableName,
940 PassOwnPtr<protocol::Runtime::CallArgument> newValue, 939 PassOwnPtr<protocol::Runtime::CallArgument> newValue,
941 const Maybe<String>& callFrameId, 940 const Maybe<String16>& callFrameId,
942 const Maybe<String>& functionObjectId) 941 const Maybe<String16>& functionObjectId)
943 { 942 {
944 if (!checkEnabled(errorString)) 943 if (!checkEnabled(errorString))
945 return; 944 return;
946 InjectedScript* injectedScript = nullptr; 945 InjectedScript* injectedScript = nullptr;
947 if (callFrameId.isJust()) { 946 if (callFrameId.isJust()) {
948 if (!isPaused() || m_currentCallStack.IsEmpty()) { 947 if (!isPaused() || m_currentCallStack.IsEmpty()) {
949 *errorString = "Attempt to access callframe when debugger is not on pause"; 948 *errorString = "Attempt to access callframe when debugger is not on pause";
950 return; 949 return;
951 } 950 }
952 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameI d.fromJust()); 951 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameI d.fromJust());
(...skipping 14 matching lines...) Expand all
967 } 966 }
968 injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.ge t()); 967 injectedScript = m_injectedScriptManager->findInjectedScript(remoteId.ge t());
969 if (!injectedScript) { 968 if (!injectedScript) {
970 *errorString = "Function object id cannot be resolved"; 969 *errorString = "Function object id cannot be resolved";
971 return; 970 return;
972 } 971 }
973 } else { 972 } else {
974 *errorString = "Either call frame or function object must be specified"; 973 *errorString = "Either call frame or function object must be specified";
975 return; 974 return;
976 } 975 }
977 String newValueString = protocol::toValue(newValue.get())->toJSONString(); 976 String16 newValueString = protocol::toValue(newValue.get())->toJSONString();
978 v8::HandleScope scope(m_isolate); 977 v8::HandleScope scope(m_isolate);
979 v8::Local<v8::Object> currentCallStack = m_currentCallStack.Get(m_isolate); 978 v8::Local<v8::Object> currentCallStack = m_currentCallStack.Get(m_isolate);
980 injectedScript->setVariableValue(errorString, currentCallStack, callFrameId, functionObjectId, scopeNumber, variableName, newValueString); 979 injectedScript->setVariableValue(errorString, currentCallStack, callFrameId, functionObjectId, scopeNumber, variableName, newValueString);
981 } 980 }
982 981
983 void V8DebuggerAgentImpl::setAsyncCallStackDepth(ErrorString* errorString, int d epth) 982 void V8DebuggerAgentImpl::setAsyncCallStackDepth(ErrorString* errorString, int d epth)
984 { 983 {
985 if (!checkEnabled(errorString)) 984 if (!checkEnabled(errorString))
986 return; 985 return;
987 m_state->setNumber(DebuggerAgentState::asyncCallStackDepth, depth); 986 m_state->setNumber(DebuggerAgentState::asyncCallStackDepth, depth);
(...skipping 11 matching lines...) Expand all
999 } 998 }
1000 999
1001 void V8DebuggerAgentImpl::disablePromiseTracker(ErrorString* errorString) 1000 void V8DebuggerAgentImpl::disablePromiseTracker(ErrorString* errorString)
1002 { 1001 {
1003 if (!checkEnabled(errorString)) 1002 if (!checkEnabled(errorString))
1004 return; 1003 return;
1005 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false); 1004 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false);
1006 m_promiseTracker->setEnabled(false, false); 1005 m_promiseTracker->setEnabled(false, false);
1007 } 1006 }
1008 1007
1009 void V8DebuggerAgentImpl::getPromiseById(ErrorString* errorString, int promiseId , const Maybe<String>& objectGroup, OwnPtr<RemoteObject>* promise) 1008 void V8DebuggerAgentImpl::getPromiseById(ErrorString* errorString, int promiseId , const Maybe<String16>& objectGroup, OwnPtr<RemoteObject>* promise)
1010 { 1009 {
1011 if (!checkEnabled(errorString)) 1010 if (!checkEnabled(errorString))
1012 return; 1011 return;
1013 if (!m_promiseTracker->isEnabled()) { 1012 if (!m_promiseTracker->isEnabled()) {
1014 *errorString = "Promise tracking is disabled"; 1013 *errorString = "Promise tracking is disabled";
1015 return; 1014 return;
1016 } 1015 }
1017 v8::HandleScope handles(m_isolate); 1016 v8::HandleScope handles(m_isolate);
1018 v8::Local<v8::Object> value = m_promiseTracker->promiseById(promiseId); 1017 v8::Local<v8::Object> value = m_promiseTracker->promiseById(promiseId);
1019 if (value.IsEmpty()) { 1018 if (value.IsEmpty()) {
1020 *errorString = "Promise with specified ID not found."; 1019 *errorString = "Promise with specified ID not found.";
1021 return; 1020 return;
1022 } 1021 }
1023 InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor( value->CreationContext()); 1022 InjectedScript* injectedScript = m_injectedScriptManager->injectedScriptFor( value->CreationContext());
1024 *promise = injectedScript->wrapObject(value, objectGroup.fromMaybe("")); 1023 *promise = injectedScript->wrapObject(value, objectGroup.fromMaybe(""));
1025 } 1024 }
1026 1025
1027 void V8DebuggerAgentImpl::didUpdatePromise(const String& eventType, PassOwnPtr<p rotocol::Debugger::PromiseDetails> promise) 1026 void V8DebuggerAgentImpl::didUpdatePromise(const String16& eventType, PassOwnPtr <protocol::Debugger::PromiseDetails> promise)
1028 { 1027 {
1029 if (m_frontend) 1028 if (m_frontend)
1030 m_frontend->promiseUpdated(eventType, promise); 1029 m_frontend->promiseUpdated(eventType, promise);
1031 } 1030 }
1032 1031
1033 int V8DebuggerAgentImpl::traceAsyncOperationStarting(const String& description) 1032 int V8DebuggerAgentImpl::traceAsyncOperationStarting(const String16& description )
1034 { 1033 {
1035 v8::HandleScope scope(m_isolate); 1034 v8::HandleScope scope(m_isolate);
1036 OwnPtr<V8StackTraceImpl> chain = V8StackTraceImpl::capture(this, V8StackTrac e::maxCallStackSizeToCapture, description); 1035 OwnPtr<V8StackTraceImpl> chain = V8StackTraceImpl::capture(this, V8StackTrac e::maxCallStackSizeToCapture, description);
1037 1036
1038 do { 1037 do {
1039 ++m_lastAsyncOperationId; 1038 ++m_lastAsyncOperationId;
1040 if (m_lastAsyncOperationId <= 0) 1039 if (m_lastAsyncOperationId <= 0)
1041 m_lastAsyncOperationId = 1; 1040 m_lastAsyncOperationId = 1;
1042 } while (m_asyncOperations.contains(m_lastAsyncOperationId)); 1041 } while (m_asyncOperations.contains(m_lastAsyncOperationId));
1043 1042
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 *errorString = "Can only perform operation while tracking async call sta cks."; 1210 *errorString = "Can only perform operation while tracking async call sta cks.";
1212 return; 1211 return;
1213 } 1212 }
1214 if (operationId <= 0) { 1213 if (operationId <= 0) {
1215 *errorString = "Wrong async operation id."; 1214 *errorString = "Wrong async operation id.";
1216 return; 1215 return;
1217 } 1216 }
1218 m_asyncOperationBreakpoints.remove(operationId); 1217 m_asyncOperationBreakpoints.remove(operationId);
1219 } 1218 }
1220 1219
1221 void V8DebuggerAgentImpl::setBlackboxedRanges(ErrorString* error, const String& scriptId, PassOwnPtr<protocol::Array<protocol::Debugger::ScriptPosition>> inPosi tions) 1220 void V8DebuggerAgentImpl::setBlackboxedRanges(ErrorString* error, const String16 & scriptId, PassOwnPtr<protocol::Array<protocol::Debugger::ScriptPosition>> inPo sitions)
1222 { 1221 {
1223 if (!m_scripts.contains(scriptId)) { 1222 if (!m_scripts.contains(scriptId)) {
1224 *error = "No script with passed id."; 1223 *error = "No script with passed id.";
1225 return; 1224 return;
1226 } 1225 }
1227 1226
1228 if (!inPositions->length()) { 1227 if (!inPositions->length()) {
1229 m_blackboxedPositions.remove(scriptId); 1228 m_blackboxedPositions.remove(scriptId);
1230 return; 1229 return;
1231 } 1230 }
(...skipping 24 matching lines...) Expand all
1256 m_blackboxedPositions.set(scriptId, positions); 1255 m_blackboxedPositions.set(scriptId, positions);
1257 } 1256 }
1258 1257
1259 void V8DebuggerAgentImpl::willExecuteScript(int scriptId) 1258 void V8DebuggerAgentImpl::willExecuteScript(int scriptId)
1260 { 1259 {
1261 changeJavaScriptRecursionLevel(+1); 1260 changeJavaScriptRecursionLevel(+1);
1262 // Fast return. 1261 // Fast return.
1263 if (m_scheduledDebuggerStep != StepInto) 1262 if (m_scheduledDebuggerStep != StepInto)
1264 return; 1263 return;
1265 // Skip unknown scripts (e.g. InjectedScript). 1264 // Skip unknown scripts (e.g. InjectedScript).
1266 if (!m_scripts.contains(String::number(scriptId))) 1265 if (!m_scripts.contains(String16::number(scriptId)))
1267 return; 1266 return;
1268 schedulePauseOnNextStatementIfSteppingInto(); 1267 schedulePauseOnNextStatementIfSteppingInto();
1269 } 1268 }
1270 1269
1271 void V8DebuggerAgentImpl::didExecuteScript() 1270 void V8DebuggerAgentImpl::didExecuteScript()
1272 { 1271 {
1273 changeJavaScriptRecursionLevel(-1); 1272 changeJavaScriptRecursionLevel(-1);
1274 } 1273 }
1275 1274
1276 void V8DebuggerAgentImpl::changeJavaScriptRecursionLevel(int step) 1275 void V8DebuggerAgentImpl::changeJavaScriptRecursionLevel(int step)
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 else if (!script.sourceMappingURL().isEmpty()) 1353 else if (!script.sourceMappingURL().isEmpty())
1355 V8ContentSearchUtil::findSourceMapURL(script.source(), false, &isDepreca tedSourceMappingURL); 1354 V8ContentSearchUtil::findSourceMapURL(script.source(), false, &isDepreca tedSourceMappingURL);
1356 1355
1357 script.setHash(calculateHash(script.source())); 1356 script.setHash(calculateHash(script.source()));
1358 1357
1359 int executionContextId = script.executionContextId(); 1358 int executionContextId = script.executionContextId();
1360 bool isContentScript = script.isContentScript(); 1359 bool isContentScript = script.isContentScript();
1361 bool isInternalScript = script.isInternalScript(); 1360 bool isInternalScript = script.isInternalScript();
1362 bool isLiveEdit = script.isLiveEdit(); 1361 bool isLiveEdit = script.isLiveEdit();
1363 bool hasSourceURL = script.hasSourceURL(); 1362 bool hasSourceURL = script.hasSourceURL();
1364 String scriptURL = script.sourceURL(); 1363 String16 scriptURL = script.sourceURL();
1365 String sourceMapURL = script.sourceMappingURL(); 1364 String16 sourceMapURL = script.sourceMappingURL();
1366 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM appingURL; 1365 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM appingURL;
1367 1366
1368 const Maybe<String>& sourceMapURLParam = sourceMapURL; 1367 const Maybe<String16>& sourceMapURLParam = sourceMapURL;
1369 const bool* isContentScriptParam = isContentScript ? &isContentScript : null ptr; 1368 const bool* isContentScriptParam = isContentScript ? &isContentScript : null ptr;
1370 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n ullptr; 1369 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n ullptr;
1371 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; 1370 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr;
1372 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; 1371 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr;
1373 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr ecatedCommentWasUsed : nullptr; 1372 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr ecatedCommentWasUsed : nullptr;
1374 if (parsedScript.success) 1373 if (parsedScript.success)
1375 m_frontend->scriptParsed(parsedScript.scriptId, scriptURL, script.startL ine(), script.startColumn(), script.endLine(), script.endColumn(), executionCont extId, script.hash(), isContentScriptParam, isInternalScriptParam, isLiveEditPar am, sourceMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); 1374 m_frontend->scriptParsed(parsedScript.scriptId, scriptURL, script.startL ine(), script.startColumn(), script.endLine(), script.endColumn(), executionCont extId, script.hash(), isContentScriptParam, isInternalScriptParam, isLiveEditPar am, sourceMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam);
1376 else 1375 else
1377 m_frontend->scriptFailedToParse(parsedScript.scriptId, scriptURL, script .startLine(), script.startColumn(), script.endLine(), script.endColumn(), execut ionContextId, script.hash(), isContentScriptParam, isInternalScriptParam, source MapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); 1376 m_frontend->scriptFailedToParse(parsedScript.scriptId, scriptURL, script .startLine(), script.startColumn(), script.endLine(), script.endColumn(), execut ionContextId, script.hash(), isContentScriptParam, isInternalScriptParam, source MapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam);
1378 1377
1379 m_scripts.set(parsedScript.scriptId, script); 1378 m_scripts.set(parsedScript.scriptId, script);
1380 1379
1381 if (scriptURL.isEmpty() || !parsedScript.success) 1380 if (scriptURL.isEmpty() || !parsedScript.success)
1382 return; 1381 return;
1383 1382
1384 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg entState::javaScriptBreakpoints); 1383 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg entState::javaScriptBreakpoints);
1385 if (!breakpointsCookie) 1384 if (!breakpointsCookie)
1386 return; 1385 return;
1387 1386
1388 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { 1387 for (size_t i = 0; i < breakpointsCookie->size(); ++i) {
1389 auto cookie = breakpointsCookie->at(i); 1388 auto cookie = breakpointsCookie->at(i);
1390 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue: :cast(cookie.second); 1389 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue: :cast(cookie.second);
1391 bool isRegex; 1390 bool isRegex;
1392 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); 1391 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex);
1393 String url; 1392 String16 url;
1394 breakpointObject->getString(DebuggerAgentState::url, &url); 1393 breakpointObject->getString(DebuggerAgentState::url, &url);
1395 if (!matches(m_debugger, scriptURL, url, isRegex)) 1394 if (!matches(m_debugger, scriptURL, url, isRegex))
1396 continue; 1395 continue;
1397 ScriptBreakpoint breakpoint; 1396 ScriptBreakpoint breakpoint;
1398 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint. lineNumber); 1397 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint. lineNumber);
1399 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin t.columnNumber); 1398 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin t.columnNumber);
1400 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c ondition); 1399 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c ondition);
1401 OwnPtr<protocol::Debugger::Location> location = resolveBreakpoint(cookie .first, parsedScript.scriptId, breakpoint, UserBreakpointSource); 1400 OwnPtr<protocol::Debugger::Location> location = resolveBreakpoint(cookie .first, parsedScript.scriptId, breakpoint, UserBreakpointSource);
1402 if (location) 1401 if (location)
1403 m_frontend->breakpointResolved(cookie.first, location.release()); 1402 m_frontend->breakpointResolved(cookie.first, location.release());
1404 } 1403 }
1405 } 1404 }
1406 1405
1407 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8 ::Context> context, v8::Local<v8::Object> callFrames, v8::Local<v8::Value> excep tion, const protocol::Vector<String>& hitBreakpoints, bool isPromiseRejection) 1406 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8 ::Context> context, v8::Local<v8::Object> callFrames, v8::Local<v8::Value> excep tion, const protocol::Vector<String16>& hitBreakpoints, bool isPromiseRejection)
1408 { 1407 {
1409 V8DebuggerAgentImpl::SkipPauseRequest result; 1408 V8DebuggerAgentImpl::SkipPauseRequest result;
1410 if (m_skipAllPauses) 1409 if (m_skipAllPauses)
1411 result = RequestContinue; 1410 result = RequestContinue;
1412 else if (!hitBreakpoints.isEmpty()) 1411 else if (!hitBreakpoints.isEmpty())
1413 result = RequestNoSkip; // Don't skip explicit breakpoints even if set i n frameworks. 1412 result = RequestNoSkip; // Don't skip explicit breakpoints even if set i n frameworks.
1414 else if (!exception.IsEmpty()) 1413 else if (!exception.IsEmpty())
1415 result = shouldSkipExceptionPause(); 1414 result = shouldSkipExceptionPause();
1416 else if (m_scheduledDebuggerStep != NoStep || m_javaScriptPauseScheduled || m_pausingOnNativeEvent) 1415 else if (m_scheduledDebuggerStep != NoStep || m_javaScriptPauseScheduled || m_pausingOnNativeEvent)
1417 result = shouldSkipStepPause(); 1416 result = shouldSkipStepPause();
(...skipping 20 matching lines...) Expand all
1438 auto obj = injectedScript->wrapObject(exception, V8DebuggerAgentImpl ::backtraceObjectGroup); 1437 auto obj = injectedScript->wrapObject(exception, V8DebuggerAgentImpl ::backtraceObjectGroup);
1439 m_breakAuxData = obj ? obj->serialize() : nullptr; 1438 m_breakAuxData = obj ? obj->serialize() : nullptr;
1440 // m_breakAuxData might be null after this. 1439 // m_breakAuxData might be null after this.
1441 } 1440 }
1442 } else if (m_pausingOnAsyncOperation) { 1441 } else if (m_pausingOnAsyncOperation) {
1443 m_breakReason = protocol::Debugger::Paused::ReasonEnum::AsyncOperation; 1442 m_breakReason = protocol::Debugger::Paused::ReasonEnum::AsyncOperation;
1444 m_breakAuxData = protocol::DictionaryValue::create(); 1443 m_breakAuxData = protocol::DictionaryValue::create();
1445 m_breakAuxData->setNumber("operationId", m_currentAsyncOperationId); 1444 m_breakAuxData->setNumber("operationId", m_currentAsyncOperationId);
1446 } 1445 }
1447 1446
1448 OwnPtr<Array<String>> hitBreakpointIds = Array<String>::create(); 1447 OwnPtr<Array<String16>> hitBreakpointIds = Array<String16>::create();
1449 1448
1450 for (const auto& point : hitBreakpoints) { 1449 for (const auto& point : hitBreakpoints) {
1451 DebugServerBreakpointToBreakpointIdAndSourceMap::iterator breakpointIter ator = m_serverBreakpoints.find(point); 1450 DebugServerBreakpointToBreakpointIdAndSourceMap::iterator breakpointIter ator = m_serverBreakpoints.find(point);
1452 if (breakpointIterator != m_serverBreakpoints.end()) { 1451 if (breakpointIterator != m_serverBreakpoints.end()) {
1453 const String& localId = breakpointIterator->second->first; 1452 const String16& localId = breakpointIterator->second->first;
1454 hitBreakpointIds->addItem(localId); 1453 hitBreakpointIds->addItem(localId);
1455 1454
1456 BreakpointSource source = breakpointIterator->second->second; 1455 BreakpointSource source = breakpointIterator->second->second;
1457 if (m_breakReason == protocol::Debugger::Paused::ReasonEnum::Other & & source == DebugCommandBreakpointSource) 1456 if (m_breakReason == protocol::Debugger::Paused::ReasonEnum::Other & & source == DebugCommandBreakpointSource)
1458 m_breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCom mand; 1457 m_breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCom mand;
1459 } 1458 }
1460 } 1459 }
1461 1460
1462 if (!m_asyncOperationNotifications.isEmpty()) 1461 if (!m_asyncOperationNotifications.isEmpty())
1463 flushAsyncOperationEvents(nullptr); 1462 flushAsyncOperationEvents(nullptr);
(...skipping 20 matching lines...) Expand all
1484 m_currentCallStack.Reset(); 1483 m_currentCallStack.Reset();
1485 clearBreakDetails(); 1484 clearBreakDetails();
1486 m_frontend->resumed(); 1485 m_frontend->resumed();
1487 } 1486 }
1488 1487
1489 bool V8DebuggerAgentImpl::canBreakProgram() 1488 bool V8DebuggerAgentImpl::canBreakProgram()
1490 { 1489 {
1491 return debugger().canBreakProgram(); 1490 return debugger().canBreakProgram();
1492 } 1491 }
1493 1492
1494 void V8DebuggerAgentImpl::breakProgram(const String& breakReason, PassOwnPtr<pro tocol::DictionaryValue> data) 1493 void V8DebuggerAgentImpl::breakProgram(const String16& breakReason, PassOwnPtr<p rotocol::DictionaryValue> data)
1495 { 1494 {
1496 ASSERT(enabled()); 1495 ASSERT(enabled());
1497 if (m_skipAllPauses || !m_pausedContext.IsEmpty() || isCallStackEmptyOrBlack boxed()) 1496 if (m_skipAllPauses || !m_pausedContext.IsEmpty() || isCallStackEmptyOrBlack boxed())
1498 return; 1497 return;
1499 m_breakReason = breakReason; 1498 m_breakReason = breakReason;
1500 m_breakAuxData = data; 1499 m_breakAuxData = data;
1501 m_scheduledDebuggerStep = NoStep; 1500 m_scheduledDebuggerStep = NoStep;
1502 m_steppingFromFramework = false; 1501 m_steppingFromFramework = false;
1503 m_pausingOnNativeEvent = false; 1502 m_pausingOnNativeEvent = false;
1504 clearStepIntoAsync(); 1503 clearStepIntoAsync();
1505 debugger().breakProgram(); 1504 debugger().breakProgram();
1506 } 1505 }
1507 1506
1508 void V8DebuggerAgentImpl::breakProgramOnException(const String& breakReason, Pas sOwnPtr<protocol::DictionaryValue> data) 1507 void V8DebuggerAgentImpl::breakProgramOnException(const String16& breakReason, P assOwnPtr<protocol::DictionaryValue> data)
1509 { 1508 {
1510 if (m_debugger->getPauseOnExceptionsState() == V8DebuggerImpl::DontPauseOnEx ceptions) 1509 if (m_debugger->getPauseOnExceptionsState() == V8DebuggerImpl::DontPauseOnEx ceptions)
1511 return; 1510 return;
1512 breakProgram(breakReason, data); 1511 breakProgram(breakReason, data);
1513 } 1512 }
1514 1513
1515 void V8DebuggerAgentImpl::clearStepIntoAsync() 1514 void V8DebuggerAgentImpl::clearStepIntoAsync()
1516 { 1515 {
1517 m_startingStepIntoAsync = false; 1516 m_startingStepIntoAsync = false;
1518 m_pausingOnAsyncOperation = false; 1517 m_pausingOnAsyncOperation = false;
1519 m_pausingAsyncOperations.clear(); 1518 m_pausingAsyncOperations.clear();
1520 } 1519 }
1521 1520
1522 bool V8DebuggerAgentImpl::assertPaused(ErrorString* errorString) 1521 bool V8DebuggerAgentImpl::assertPaused(ErrorString* errorString)
1523 { 1522 {
1524 if (m_pausedContext.IsEmpty()) { 1523 if (m_pausedContext.IsEmpty()) {
1525 *errorString = "Can only perform operation while paused."; 1524 *errorString = "Can only perform operation while paused.";
1526 return false; 1525 return false;
1527 } 1526 }
1528 return true; 1527 return true;
1529 } 1528 }
1530 1529
1531 void V8DebuggerAgentImpl::clearBreakDetails() 1530 void V8DebuggerAgentImpl::clearBreakDetails()
1532 { 1531 {
1533 m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other; 1532 m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other;
1534 m_breakAuxData = nullptr; 1533 m_breakAuxData = nullptr;
1535 } 1534 }
1536 1535
1537 void V8DebuggerAgentImpl::setBreakpointAt(const String& scriptId, int lineNumber , int columnNumber, BreakpointSource source, const String& condition) 1536 void V8DebuggerAgentImpl::setBreakpointAt(const String16& scriptId, int lineNumb er, int columnNumber, BreakpointSource source, const String16& condition)
1538 { 1537 {
1539 String breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumbe r, source); 1538 String16 breakpointId = generateBreakpointId(scriptId, lineNumber, columnNum ber, source);
1540 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); 1539 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition);
1541 resolveBreakpoint(breakpointId, scriptId, breakpoint, source); 1540 resolveBreakpoint(breakpointId, scriptId, breakpoint, source);
1542 } 1541 }
1543 1542
1544 void V8DebuggerAgentImpl::removeBreakpointAt(const String& scriptId, int lineNum ber, int columnNumber, BreakpointSource source) 1543 void V8DebuggerAgentImpl::removeBreakpointAt(const String16& scriptId, int lineN umber, int columnNumber, BreakpointSource source)
1545 { 1544 {
1546 removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, so urce)); 1545 removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, so urce));
1547 } 1546 }
1548 1547
1549 void V8DebuggerAgentImpl::reset() 1548 void V8DebuggerAgentImpl::reset()
1550 { 1549 {
1551 m_scheduledDebuggerStep = NoStep; 1550 m_scheduledDebuggerStep = NoStep;
1552 m_scripts.clear(); 1551 m_scripts.clear();
1553 m_blackboxedPositions.clear(); 1552 m_blackboxedPositions.clear();
1554 m_breakpointIdToDebuggerBreakpointIds.clear(); 1553 m_breakpointIdToDebuggerBreakpointIds.clear();
1555 resetAsyncCallTracker(); 1554 resetAsyncCallTracker();
1556 m_promiseTracker->clear(); 1555 m_promiseTracker->clear();
1557 if (m_frontend) 1556 if (m_frontend)
1558 m_frontend->globalObjectCleared(); 1557 m_frontend->globalObjectCleared();
1559 } 1558 }
1560 1559
1561 } // namespace blink 1560 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698