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

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

Issue 732593002: DevTools: Make StepInto work across script boundaries and Blink process tasks. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: added new test debugger-step-into-document-write.html Created 6 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 static const char requestAnimationFrameEventName[] = "requestAnimationFrame"; 60 static const char requestAnimationFrameEventName[] = "requestAnimationFrame";
61 static const char cancelAnimationFrameEventName[] = "cancelAnimationFrame"; 61 static const char cancelAnimationFrameEventName[] = "cancelAnimationFrame";
62 static const char animationFrameFiredEventName[] = "animationFrameFired"; 62 static const char animationFrameFiredEventName[] = "animationFrameFired";
63 static const char setTimerEventName[] = "setTimer"; 63 static const char setTimerEventName[] = "setTimer";
64 static const char clearTimerEventName[] = "clearTimer"; 64 static const char clearTimerEventName[] = "clearTimer";
65 static const char timerFiredEventName[] = "timerFired"; 65 static const char timerFiredEventName[] = "timerFired";
66 static const char newPromiseEventName[] = "newPromise"; 66 static const char newPromiseEventName[] = "newPromise";
67 static const char promiseResolvedEventName[] = "promiseResolved"; 67 static const char promiseResolvedEventName[] = "promiseResolved";
68 static const char promiseRejectedEventName[] = "promiseRejected"; 68 static const char promiseRejectedEventName[] = "promiseRejected";
69 static const char windowCloseEventName[] = "close"; 69 static const char windowCloseEventName[] = "close";
70 static const char customElementCallbackName[] = "customElementCallback";
71 static const char webglErrorFiredEventName[] = "webglErrorFired"; 70 static const char webglErrorFiredEventName[] = "webglErrorFired";
72 static const char webglWarningFiredEventName[] = "webglWarningFired"; 71 static const char webglWarningFiredEventName[] = "webglWarningFired";
73 static const char webglErrorNameProperty[] = "webglErrorName"; 72 static const char webglErrorNameProperty[] = "webglErrorName";
74 73
75 namespace DOMDebuggerAgentState { 74 namespace DOMDebuggerAgentState {
76 static const char eventListenerBreakpoints[] = "eventListenerBreakpoints"; 75 static const char eventListenerBreakpoints[] = "eventListenerBreakpoints";
77 static const char eventTargetAny[] = "*"; 76 static const char eventTargetAny[] = "*";
78 static const char pauseOnAllXHRs[] = "pauseOnAllXHRs"; 77 static const char pauseOnAllXHRs[] = "pauseOnAllXHRs";
79 static const char xhrBreakpoints[] = "xhrBreakpoints"; 78 static const char xhrBreakpoints[] = "xhrBreakpoints";
80 } 79 }
81 80
82 PassOwnPtrWillBeRawPtr<InspectorDOMDebuggerAgent> InspectorDOMDebuggerAgent::cre ate(InspectorDOMAgent* domAgent, InspectorDebuggerAgent* debuggerAgent) 81 PassOwnPtrWillBeRawPtr<InspectorDOMDebuggerAgent> InspectorDOMDebuggerAgent::cre ate(InspectorDOMAgent* domAgent, InspectorDebuggerAgent* debuggerAgent)
83 { 82 {
84 return adoptPtrWillBeNoop(new InspectorDOMDebuggerAgent(domAgent, debuggerAg ent)); 83 return adoptPtrWillBeNoop(new InspectorDOMDebuggerAgent(domAgent, debuggerAg ent));
85 } 84 }
86 85
87 InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(InspectorDOMAgent* domAgent , InspectorDebuggerAgent* debuggerAgent) 86 InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(InspectorDOMAgent* domAgent , InspectorDebuggerAgent* debuggerAgent)
88 : InspectorBaseAgent<InspectorDOMDebuggerAgent>("DOMDebugger") 87 : InspectorBaseAgent<InspectorDOMDebuggerAgent>("DOMDebugger")
89 , m_domAgent(domAgent) 88 , m_domAgent(domAgent)
90 , m_debuggerAgent(debuggerAgent) 89 , m_debuggerAgent(debuggerAgent)
91 , m_pauseInNextEventListener(false)
92 { 90 {
93 m_debuggerAgent->setListener(this); 91 m_debuggerAgent->setListener(this);
94 m_domAgent->setListener(this); 92 m_domAgent->setListener(this);
95 } 93 }
96 94
97 InspectorDOMDebuggerAgent::~InspectorDOMDebuggerAgent() 95 InspectorDOMDebuggerAgent::~InspectorDOMDebuggerAgent()
98 { 96 {
99 #if !ENABLE(OILPAN) 97 #if !ENABLE(OILPAN)
100 ASSERT(!m_debuggerAgent); 98 ASSERT(!m_debuggerAgent);
101 ASSERT(!m_instrumentingAgents->inspectorDOMDebuggerAgent()); 99 ASSERT(!m_instrumentingAgents->inspectorDOMDebuggerAgent());
(...skipping 26 matching lines...) Expand all
128 { 126 {
129 if (m_domAgent->enabled() && m_debuggerAgent->enabled()) 127 if (m_domAgent->enabled() && m_debuggerAgent->enabled())
130 m_instrumentingAgents->setInspectorDOMDebuggerAgent(this); 128 m_instrumentingAgents->setInspectorDOMDebuggerAgent(this);
131 } 129 }
132 130
133 void InspectorDOMDebuggerAgent::domAgentWasDisabled() 131 void InspectorDOMDebuggerAgent::domAgentWasDisabled()
134 { 132 {
135 disable(); 133 disable();
136 } 134 }
137 135
138 void InspectorDOMDebuggerAgent::stepInto()
139 {
140 m_pauseInNextEventListener = true;
141 }
142
143 void InspectorDOMDebuggerAgent::didPause()
144 {
145 m_pauseInNextEventListener = false;
146 }
147
148 void InspectorDOMDebuggerAgent::didProcessTask()
149 {
150 if (!m_pauseInNextEventListener)
151 return;
152 if (m_debuggerAgent && m_debuggerAgent->runningNestedMessageLoop())
yurys 2014/11/18 12:35:25 Now we can remove runningNestedMessageLoop from th
153 return;
154 m_pauseInNextEventListener = false;
155 }
156
157 void InspectorDOMDebuggerAgent::disable() 136 void InspectorDOMDebuggerAgent::disable()
158 { 137 {
159 m_instrumentingAgents->setInspectorDOMDebuggerAgent(0); 138 m_instrumentingAgents->setInspectorDOMDebuggerAgent(0);
160 clear(); 139 clear();
161 } 140 }
162 141
163 void InspectorDOMDebuggerAgent::clearFrontend() 142 void InspectorDOMDebuggerAgent::clearFrontend()
164 { 143 {
165 disable(); 144 disable();
166 } 145 }
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 m_domBreakpoints.remove(node); 404 m_domBreakpoints.remove(node);
426 405
427 uint32_t newRootMask = rootMask & ~newMask; 406 uint32_t newRootMask = rootMask & ~newMask;
428 if (!newRootMask) 407 if (!newRootMask)
429 return; 408 return;
430 409
431 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child = InspectorDOMAgent::innerNextSibling(child)) 410 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child = InspectorDOMAgent::innerNextSibling(child))
432 updateSubtreeBreakpoints(child, newRootMask, set); 411 updateSubtreeBreakpoints(child, newRootMask, set);
433 } 412 }
434 413
435 void InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded(PassRefPtr<JSONObject > prpEventData, bool synchronous) 414 void InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded(PassRefPtr<JSONObject > eventData, bool synchronous)
436 { 415 {
437 if (!prpEventData) 416 if (!eventData)
438 return; 417 return;
439 RefPtr<JSONObject> eventData = prpEventData;
440 InspectorFrontend::Debugger::Reason::Enum breakReason = InspectorFrontend::D ebugger::Reason::EventListener;
441 if (m_pauseInNextEventListener) {
442 m_pauseInNextEventListener = false;
443 breakReason = InspectorFrontend::Debugger::Reason::Other;
444 eventData = nullptr;
445 }
446 if (synchronous) 418 if (synchronous)
447 m_debuggerAgent->breakProgram(breakReason, eventData.release()); 419 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::Event Listener, eventData);
448 else 420 else
449 m_debuggerAgent->schedulePauseOnNextStatement(breakReason, eventData.rel ease()); 421 m_debuggerAgent->schedulePauseOnNextStatement(InspectorFrontend::Debugge r::Reason::EventListener, eventData);
450 } 422 }
451 423
452 PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::preparePauseOnNativeEventData( const String& eventName, const String* targetName) 424 PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::preparePauseOnNativeEventData( const String& eventName, const String* targetName)
453 { 425 {
454 String fullEventName = (targetName ? listenerEventCategoryType : instrumenta tionEventCategoryType) + eventName; 426 String fullEventName = (targetName ? listenerEventCategoryType : instrumenta tionEventCategoryType) + eventName;
455 if (!m_pauseInNextEventListener) { 427 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger AgentState::eventListenerBreakpoints);
456 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebu ggerAgentState::eventListenerBreakpoints); 428 JSONObject::iterator it = eventListenerBreakpoints->find(fullEventName);
457 JSONObject::iterator it = eventListenerBreakpoints->find(fullEventName); 429 if (it == eventListenerBreakpoints->end())
458 if (it == eventListenerBreakpoints->end()) 430 return nullptr;
459 return nullptr; 431 bool match = false;
460 bool match = false; 432 RefPtr<JSONObject> breakpointsByTarget = it->value->asObject();
461 RefPtr<JSONObject> breakpointsByTarget = it->value->asObject(); 433 breakpointsByTarget->getBoolean(DOMDebuggerAgentState::eventTargetAny, &matc h);
462 breakpointsByTarget->getBoolean(DOMDebuggerAgentState::eventTargetAny, & match); 434 if (!match && targetName)
463 if (!match && targetName) 435 breakpointsByTarget->getBoolean(targetName->lower(), &match);
464 breakpointsByTarget->getBoolean(targetName->lower(), &match); 436 if (!match)
465 if (!match) 437 return nullptr;
466 return nullptr;
467 }
468 438
469 RefPtr<JSONObject> eventData = JSONObject::create(); 439 RefPtr<JSONObject> eventData = JSONObject::create();
470 eventData->setString("eventName", fullEventName); 440 eventData->setString("eventName", fullEventName);
471 if (targetName) 441 if (targetName)
472 eventData->setString("targetName", *targetName); 442 eventData->setString("targetName", *targetName);
473 return eventData.release(); 443 return eventData.release();
474 } 444 }
475 445
476 void InspectorDOMDebuggerAgent::didInstallTimer(ExecutionContext*, int, int, boo l) 446 void InspectorDOMDebuggerAgent::didInstallTimer(ExecutionContext*, int, int, boo l)
477 { 447 {
478 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(setTimerEventName, 0), true); 448 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(setTimerEventName, 0), true);
479 } 449 }
480 450
481 void InspectorDOMDebuggerAgent::didRemoveTimer(ExecutionContext*, int) 451 void InspectorDOMDebuggerAgent::didRemoveTimer(ExecutionContext*, int)
482 { 452 {
483 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(clearTimerEventName , 0), true); 453 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(clearTimerEventName , 0), true);
484 } 454 }
485 455
486 void InspectorDOMDebuggerAgent::willFireTimer(ExecutionContext*, int) 456 void InspectorDOMDebuggerAgent::willFireTimer(ExecutionContext*, int)
487 { 457 {
488 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(timerFiredEventName , 0), false); 458 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(timerFiredEventName , 0), false);
489 } 459 }
490 460
491 bool InspectorDOMDebuggerAgent::canPauseOnPromiseEvent() 461 bool InspectorDOMDebuggerAgent::canPauseOnPromiseEvent()
492 { 462 {
493 if (m_pauseInNextEventListener)
494 return true;
495 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger AgentState::eventListenerBreakpoints); 463 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger AgentState::eventListenerBreakpoints);
496 JSONObject::iterator end = eventListenerBreakpoints->end(); 464 JSONObject::iterator end = eventListenerBreakpoints->end();
497 return eventListenerBreakpoints->find(String(instrumentationEventCategoryTyp e) + newPromiseEventName) != end 465 return eventListenerBreakpoints->find(String(instrumentationEventCategoryTyp e) + newPromiseEventName) != end
498 || eventListenerBreakpoints->find(String(instrumentationEventCategoryTyp e) + promiseResolvedEventName) != end 466 || eventListenerBreakpoints->find(String(instrumentationEventCategoryTyp e) + promiseResolvedEventName) != end
499 || eventListenerBreakpoints->find(String(instrumentationEventCategoryTyp e) + promiseRejectedEventName) != end; 467 || eventListenerBreakpoints->find(String(instrumentationEventCategoryTyp e) + promiseRejectedEventName) != end;
500 } 468 }
501 469
502 void InspectorDOMDebuggerAgent::didCreatePromise() 470 void InspectorDOMDebuggerAgent::didCreatePromise()
503 { 471 {
504 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(newPromiseEventName , 0), true); 472 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(newPromiseEventName , 0), true);
(...skipping 29 matching lines...) Expand all
534 Node* node = target->toNode(); 502 Node* node = target->toNode();
535 String targetName = node ? node->nodeName() : target->interfaceName(); 503 String targetName = node ? node->nodeName() : target->interfaceName();
536 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(event->type(), &tar getName), false); 504 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(event->type(), &tar getName), false);
537 } 505 }
538 506
539 void InspectorDOMDebuggerAgent::willCloseWindow() 507 void InspectorDOMDebuggerAgent::willCloseWindow()
540 { 508 {
541 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(windowCloseEventNam e, 0), true); 509 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(windowCloseEventNam e, 0), true);
542 } 510 }
543 511
544 void InspectorDOMDebuggerAgent::willExecuteCustomElementCallback(Element*)
545 {
546 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(customElementCallba ckName, 0), false);
547 }
548
549 void InspectorDOMDebuggerAgent::didFireWebGLError(const String& errorName) 512 void InspectorDOMDebuggerAgent::didFireWebGLError(const String& errorName)
550 { 513 {
551 RefPtr<JSONObject> eventData = preparePauseOnNativeEventData(webglErrorFired EventName, 0); 514 RefPtr<JSONObject> eventData = preparePauseOnNativeEventData(webglErrorFired EventName, 0);
552 if (!eventData) 515 if (!eventData)
553 return; 516 return;
554 if (!errorName.isEmpty()) 517 if (!errorName.isEmpty())
555 eventData->setString(webglErrorNameProperty, errorName); 518 eventData->setString(webglErrorNameProperty, errorName);
556 pauseOnNativeEventIfNeeded(eventData.release(), m_debuggerAgent->canBreakPro gram()); 519 pauseOnNativeEventIfNeeded(eventData.release(), m_debuggerAgent->canBreakPro gram());
557 } 520 }
558 521
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 576
614 RefPtr<JSONObject> eventData = JSONObject::create(); 577 RefPtr<JSONObject> eventData = JSONObject::create();
615 eventData->setString("breakpointURL", breakpointURL); 578 eventData->setString("breakpointURL", breakpointURL);
616 eventData->setString("url", url); 579 eventData->setString("url", url);
617 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release()); 580 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release());
618 } 581 }
619 582
620 void InspectorDOMDebuggerAgent::clear() 583 void InspectorDOMDebuggerAgent::clear()
621 { 584 {
622 m_domBreakpoints.clear(); 585 m_domBreakpoints.clear();
623 m_pauseInNextEventListener = false;
624 } 586 }
625 587
626 } // namespace blink 588 } // namespace blink
627
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698