OLD | NEW |
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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 static const char setTimerEventName[] = "setTimer"; | 62 static const char setTimerEventName[] = "setTimer"; |
63 static const char clearTimerEventName[] = "clearTimer"; | 63 static const char clearTimerEventName[] = "clearTimer"; |
64 static const char timerFiredEventName[] = "timerFired"; | 64 static const char timerFiredEventName[] = "timerFired"; |
65 static const char customElementCallbackName[] = "customElementCallback"; | 65 static const char customElementCallbackName[] = "customElementCallback"; |
66 static const char webglErrorFiredEventName[] = "webglErrorFired"; | 66 static const char webglErrorFiredEventName[] = "webglErrorFired"; |
67 static const char webglWarningFiredEventName[] = "webglWarningFired"; | 67 static const char webglWarningFiredEventName[] = "webglWarningFired"; |
68 static const char webglErrorNameProperty[] = "webglErrorName"; | 68 static const char webglErrorNameProperty[] = "webglErrorName"; |
69 | 69 |
70 namespace DOMDebuggerAgentState { | 70 namespace DOMDebuggerAgentState { |
71 static const char eventListenerBreakpoints[] = "eventListenerBreakpoints"; | 71 static const char eventListenerBreakpoints[] = "eventListenerBreakpoints"; |
72 static const char eventTargetAny[] = "*"; | |
73 static const char pauseOnAllXHRs[] = "pauseOnAllXHRs"; | 72 static const char pauseOnAllXHRs[] = "pauseOnAllXHRs"; |
74 static const char xhrBreakpoints[] = "xhrBreakpoints"; | 73 static const char xhrBreakpoints[] = "xhrBreakpoints"; |
75 } | 74 } |
76 | 75 |
77 PassOwnPtr<InspectorDOMDebuggerAgent> InspectorDOMDebuggerAgent::create(Inspecto
rDOMAgent* domAgent, InspectorDebuggerAgent* debuggerAgent) | 76 PassOwnPtr<InspectorDOMDebuggerAgent> InspectorDOMDebuggerAgent::create(Inspecto
rDOMAgent* domAgent, InspectorDebuggerAgent* debuggerAgent) |
78 { | 77 { |
79 return adoptPtr(new InspectorDOMDebuggerAgent(domAgent, debuggerAgent)); | 78 return adoptPtr(new InspectorDOMDebuggerAgent(domAgent, debuggerAgent)); |
80 } | 79 } |
81 | 80 |
82 InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(InspectorDOMAgent* domAgent
, InspectorDebuggerAgent* debuggerAgent) | 81 InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(InspectorDOMAgent* domAgent
, InspectorDebuggerAgent* debuggerAgent) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 { | 146 { |
148 disable(); | 147 disable(); |
149 } | 148 } |
150 | 149 |
151 void InspectorDOMDebuggerAgent::discardAgent() | 150 void InspectorDOMDebuggerAgent::discardAgent() |
152 { | 151 { |
153 m_debuggerAgent->setListener(0); | 152 m_debuggerAgent->setListener(0); |
154 m_debuggerAgent = 0; | 153 m_debuggerAgent = 0; |
155 } | 154 } |
156 | 155 |
157 void InspectorDOMDebuggerAgent::setEventListenerBreakpoint(ErrorString* error, c
onst String& eventName, const String* targetName) | 156 void InspectorDOMDebuggerAgent::setEventListenerBreakpoint(ErrorString* error, c
onst String& eventName) |
158 { | 157 { |
159 setBreakpoint(error, String(listenerEventCategoryType) + eventName, targetNa
me); | 158 setBreakpoint(error, String(listenerEventCategoryType) + eventName); |
160 } | 159 } |
161 | 160 |
162 void InspectorDOMDebuggerAgent::setInstrumentationBreakpoint(ErrorString* error,
const String& eventName) | 161 void InspectorDOMDebuggerAgent::setInstrumentationBreakpoint(ErrorString* error,
const String& eventName) |
163 { | 162 { |
164 setBreakpoint(error, String(instrumentationEventCategoryType) + eventName, 0
); | 163 setBreakpoint(error, String(instrumentationEventCategoryType) + eventName); |
165 } | 164 } |
166 | 165 |
167 static PassRefPtr<JSONObject> ensurePropertyObject(JSONObject* object, const Str
ing& propertyName) | 166 void InspectorDOMDebuggerAgent::setBreakpoint(ErrorString* error, const String&
eventName) |
168 { | |
169 JSONObject::iterator it = object->find(propertyName); | |
170 if (it != object->end()) | |
171 return it->value->asObject(); | |
172 | |
173 RefPtr<JSONObject> result = JSONObject::create(); | |
174 object->setObject(propertyName, result); | |
175 return result.release(); | |
176 } | |
177 | |
178 void InspectorDOMDebuggerAgent::setBreakpoint(ErrorString* error, const String&
eventName, const String* targetName) | |
179 { | 167 { |
180 if (eventName.isEmpty()) { | 168 if (eventName.isEmpty()) { |
181 *error = "Event name is empty"; | 169 *error = "Event name is empty"; |
182 return; | 170 return; |
183 } | 171 } |
184 | 172 |
185 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger
AgentState::eventListenerBreakpoints); | 173 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger
AgentState::eventListenerBreakpoints); |
186 RefPtr<JSONObject> breakpointsByTarget = ensurePropertyObject(eventListenerB
reakpoints.get(), eventName); | 174 eventListenerBreakpoints->setBoolean(eventName, true); |
187 if (!targetName || targetName->isEmpty()) | 175 m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, eventLis
tenerBreakpoints); |
188 breakpointsByTarget->setBoolean(DOMDebuggerAgentState::eventTargetAny, t
rue); | |
189 else | |
190 breakpointsByTarget->setBoolean(targetName->lower(), true); | |
191 m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, eventLis
tenerBreakpoints.release()); | |
192 } | 176 } |
193 | 177 |
194 void InspectorDOMDebuggerAgent::removeEventListenerBreakpoint(ErrorString* error
, const String& eventName, const String* targetName) | 178 void InspectorDOMDebuggerAgent::removeEventListenerBreakpoint(ErrorString* error
, const String& eventName) |
195 { | 179 { |
196 removeBreakpoint(error, String(listenerEventCategoryType) + eventName, targe
tName); | 180 removeBreakpoint(error, String(listenerEventCategoryType) + eventName); |
197 } | 181 } |
198 | 182 |
199 void InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint(ErrorString* err
or, const String& eventName) | 183 void InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint(ErrorString* err
or, const String& eventName) |
200 { | 184 { |
201 removeBreakpoint(error, String(instrumentationEventCategoryType) + eventName
, 0); | 185 removeBreakpoint(error, String(instrumentationEventCategoryType) + eventName
); |
202 } | 186 } |
203 | 187 |
204 void InspectorDOMDebuggerAgent::removeBreakpoint(ErrorString* error, const Strin
g& eventName, const String* targetName) | 188 void InspectorDOMDebuggerAgent::removeBreakpoint(ErrorString* error, const Strin
g& eventName) |
205 { | 189 { |
206 if (eventName.isEmpty()) { | 190 if (eventName.isEmpty()) { |
207 *error = "Event name is empty"; | 191 *error = "Event name is empty"; |
208 return; | 192 return; |
209 } | 193 } |
210 | 194 |
211 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger
AgentState::eventListenerBreakpoints); | 195 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebugger
AgentState::eventListenerBreakpoints); |
212 RefPtr<JSONObject> breakpointsByTarget = ensurePropertyObject(eventListenerB
reakpoints.get(), eventName); | 196 eventListenerBreakpoints->remove(eventName); |
213 if (!targetName || targetName->isEmpty()) | 197 m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, eventLis
tenerBreakpoints); |
214 breakpointsByTarget->remove(DOMDebuggerAgentState::eventTargetAny); | |
215 else | |
216 breakpointsByTarget->remove(targetName->lower()); | |
217 m_state->setObject(DOMDebuggerAgentState::eventListenerBreakpoints, eventLis
tenerBreakpoints.release()); | |
218 } | 198 } |
219 | 199 |
220 void InspectorDOMDebuggerAgent::didInvalidateStyleAttr(Node* node) | 200 void InspectorDOMDebuggerAgent::didInvalidateStyleAttr(Node* node) |
221 { | 201 { |
222 if (hasBreakpoint(node, AttributeModified)) { | 202 if (hasBreakpoint(node, AttributeModified)) { |
223 RefPtr<JSONObject> eventData = JSONObject::create(); | 203 RefPtr<JSONObject> eventData = JSONObject::create(); |
224 descriptionForDOMEvent(node, AttributeModified, false, eventData.get()); | 204 descriptionForDOMEvent(node, AttributeModified, false, eventData.get()); |
225 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM,
eventData.release()); | 205 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM,
eventData.release()); |
226 } | 206 } |
227 } | 207 } |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 void InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded(PassRefPtr<JSONObject
> eventData, bool synchronous) | 390 void InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded(PassRefPtr<JSONObject
> eventData, bool synchronous) |
411 { | 391 { |
412 if (!eventData) | 392 if (!eventData) |
413 return; | 393 return; |
414 if (synchronous) | 394 if (synchronous) |
415 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::Event
Listener, eventData); | 395 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::Event
Listener, eventData); |
416 else | 396 else |
417 m_debuggerAgent->schedulePauseOnNextStatement(InspectorFrontend::Debugge
r::Reason::EventListener, eventData); | 397 m_debuggerAgent->schedulePauseOnNextStatement(InspectorFrontend::Debugge
r::Reason::EventListener, eventData); |
418 } | 398 } |
419 | 399 |
420 PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::preparePauseOnNativeEventData(
const String& eventName, const AtomicString* targetName) | 400 PassRefPtr<JSONObject> InspectorDOMDebuggerAgent::preparePauseOnNativeEventData(
bool isDOMEvent, const String& eventName) |
421 { | 401 { |
422 String fullEventName = (targetName ? listenerEventCategoryType : instrumenta
tionEventCategoryType) + eventName; | 402 String fullEventName = (isDOMEvent ? listenerEventCategoryType : instrumenta
tionEventCategoryType) + eventName; |
423 if (m_pauseInNextEventListener) { | 403 if (m_pauseInNextEventListener) |
424 m_pauseInNextEventListener = false; | 404 m_pauseInNextEventListener = false; |
425 } else { | 405 else { |
426 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebu
ggerAgentState::eventListenerBreakpoints); | 406 RefPtr<JSONObject> eventListenerBreakpoints = m_state->getObject(DOMDebu
ggerAgentState::eventListenerBreakpoints); |
427 JSONObject::iterator it = eventListenerBreakpoints->find(fullEventName); | 407 if (eventListenerBreakpoints->find(fullEventName) == eventListenerBreakp
oints->end()) |
428 if (it == eventListenerBreakpoints->end()) | |
429 return nullptr; | |
430 bool match = false; | |
431 RefPtr<JSONObject> breakpointsByTarget = it->value->asObject(); | |
432 breakpointsByTarget->getBoolean(DOMDebuggerAgentState::eventTargetAny, &
match); | |
433 if (!match && targetName) | |
434 breakpointsByTarget->getBoolean(targetName->lower(), &match); | |
435 if (!match) | |
436 return nullptr; | 408 return nullptr; |
437 } | 409 } |
438 | 410 |
439 RefPtr<JSONObject> eventData = JSONObject::create(); | 411 RefPtr<JSONObject> eventData = JSONObject::create(); |
440 eventData->setString("eventName", fullEventName); | 412 eventData->setString("eventName", fullEventName); |
441 if (targetName) | |
442 eventData->setString("targetName", *targetName); | |
443 return eventData.release(); | 413 return eventData.release(); |
444 } | 414 } |
445 | 415 |
446 void InspectorDOMDebuggerAgent::didInstallTimer(ExecutionContext*, int, int, boo
l) | 416 void InspectorDOMDebuggerAgent::didInstallTimer(ExecutionContext*, int, int, boo
l) |
447 { | 417 { |
448 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(setTimerEventName,
0), true); | 418 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, setTimerEven
tName), true); |
449 } | 419 } |
450 | 420 |
451 void InspectorDOMDebuggerAgent::didRemoveTimer(ExecutionContext*, int) | 421 void InspectorDOMDebuggerAgent::didRemoveTimer(ExecutionContext*, int) |
452 { | 422 { |
453 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(clearTimerEventName
, 0), true); | 423 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, clearTimerEv
entName), true); |
454 } | 424 } |
455 | 425 |
456 void InspectorDOMDebuggerAgent::willFireTimer(ExecutionContext*, int) | 426 void InspectorDOMDebuggerAgent::willFireTimer(ExecutionContext*, int) |
457 { | 427 { |
458 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(timerFiredEventName
, 0), false); | 428 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, timerFiredEv
entName), false); |
459 } | 429 } |
460 | 430 |
461 void InspectorDOMDebuggerAgent::didRequestAnimationFrame(Document*, int) | 431 void InspectorDOMDebuggerAgent::didRequestAnimationFrame(Document*, int) |
462 { | 432 { |
463 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(requestAnimationFra
meEventName, 0), true); | 433 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, requestAnima
tionFrameEventName), true); |
464 } | 434 } |
465 | 435 |
466 void InspectorDOMDebuggerAgent::didCancelAnimationFrame(Document*, int) | 436 void InspectorDOMDebuggerAgent::didCancelAnimationFrame(Document*, int) |
467 { | 437 { |
468 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(cancelAnimationFram
eEventName, 0), true); | 438 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, cancelAnimat
ionFrameEventName), true); |
469 } | 439 } |
470 | 440 |
471 void InspectorDOMDebuggerAgent::willFireAnimationFrame(Document*, int) | 441 void InspectorDOMDebuggerAgent::willFireAnimationFrame(Document*, int) |
472 { | 442 { |
473 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(animationFrameFired
EventName, 0), false); | 443 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, animationFra
meFiredEventName), false); |
474 } | 444 } |
475 | 445 |
476 void InspectorDOMDebuggerAgent::willHandleEvent(EventTarget* target, const Atomi
cString& eventType, EventListener*, bool) | 446 void InspectorDOMDebuggerAgent::willHandleEvent(EventTarget*, const AtomicString
& eventType, EventListener*, bool) |
477 { | 447 { |
478 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(eventType, &target-
>interfaceName()), false); | 448 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(true, eventType), f
alse); |
479 } | 449 } |
480 | 450 |
481 void InspectorDOMDebuggerAgent::willExecuteCustomElementCallback(Element*) | 451 void InspectorDOMDebuggerAgent::willExecuteCustomElementCallback(Element*) |
482 { | 452 { |
483 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(customElementCallba
ckName, 0), false); | 453 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, customElemen
tCallbackName), false); |
484 } | 454 } |
485 | 455 |
486 void InspectorDOMDebuggerAgent::didFireWebGLError(const String& errorName) | 456 void InspectorDOMDebuggerAgent::didFireWebGLError(const String& errorName) |
487 { | 457 { |
488 RefPtr<JSONObject> eventData = preparePauseOnNativeEventData(webglErrorFired
EventName, 0); | 458 RefPtr<JSONObject> eventData = preparePauseOnNativeEventData(false, webglErr
orFiredEventName); |
489 if (!eventData) | 459 if (!eventData) |
490 return; | 460 return; |
491 if (!errorName.isEmpty()) | 461 if (!errorName.isEmpty()) |
492 eventData->setString(webglErrorNameProperty, errorName); | 462 eventData->setString(webglErrorNameProperty, errorName); |
493 pauseOnNativeEventIfNeeded(eventData.release(), m_debuggerAgent->canBreakPro
gram()); | 463 pauseOnNativeEventIfNeeded(eventData.release(), m_debuggerAgent->canBreakPro
gram()); |
494 } | 464 } |
495 | 465 |
496 void InspectorDOMDebuggerAgent::didFireWebGLWarning() | 466 void InspectorDOMDebuggerAgent::didFireWebGLWarning() |
497 { | 467 { |
498 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(webglWarningFiredEv
entName, 0), m_debuggerAgent->canBreakProgram()); | 468 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(false, webglWarning
FiredEventName), m_debuggerAgent->canBreakProgram()); |
499 } | 469 } |
500 | 470 |
501 void InspectorDOMDebuggerAgent::didFireWebGLErrorOrWarning(const String& message
) | 471 void InspectorDOMDebuggerAgent::didFireWebGLErrorOrWarning(const String& message
) |
502 { | 472 { |
503 if (message.findIgnoringCase("error") != WTF::kNotFound) | 473 if (message.findIgnoringCase("error") != WTF::kNotFound) |
504 didFireWebGLError(String()); | 474 didFireWebGLError(String()); |
505 else | 475 else |
506 didFireWebGLWarning(); | 476 didFireWebGLWarning(); |
507 } | 477 } |
508 | 478 |
509 void InspectorDOMDebuggerAgent::setXHRBreakpoint(ErrorString*, const String& url
) | 479 void InspectorDOMDebuggerAgent::setXHRBreakpoint(ErrorString*, const String& url
) |
510 { | 480 { |
511 if (url.isEmpty()) { | 481 if (url.isEmpty()) { |
512 m_state->setBoolean(DOMDebuggerAgentState::pauseOnAllXHRs, true); | 482 m_state->setBoolean(DOMDebuggerAgentState::pauseOnAllXHRs, true); |
513 return; | 483 return; |
514 } | 484 } |
515 | 485 |
516 RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState
::xhrBreakpoints); | 486 RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState
::xhrBreakpoints); |
517 xhrBreakpoints->setBoolean(url, true); | 487 xhrBreakpoints->setBoolean(url, true); |
518 m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, xhrBreakpoints.rel
ease()); | 488 m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, xhrBreakpoints); |
519 } | 489 } |
520 | 490 |
521 void InspectorDOMDebuggerAgent::removeXHRBreakpoint(ErrorString*, const String&
url) | 491 void InspectorDOMDebuggerAgent::removeXHRBreakpoint(ErrorString*, const String&
url) |
522 { | 492 { |
523 if (url.isEmpty()) { | 493 if (url.isEmpty()) { |
524 m_state->setBoolean(DOMDebuggerAgentState::pauseOnAllXHRs, false); | 494 m_state->setBoolean(DOMDebuggerAgentState::pauseOnAllXHRs, false); |
525 return; | 495 return; |
526 } | 496 } |
527 | 497 |
528 RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState
::xhrBreakpoints); | 498 RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentState
::xhrBreakpoints); |
529 xhrBreakpoints->remove(url); | 499 xhrBreakpoints->remove(url); |
530 m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, xhrBreakpoints.rel
ease()); | 500 m_state->setObject(DOMDebuggerAgentState::xhrBreakpoints, xhrBreakpoints); |
531 } | 501 } |
532 | 502 |
533 void InspectorDOMDebuggerAgent::willSendXMLHttpRequest(const String& url) | 503 void InspectorDOMDebuggerAgent::willSendXMLHttpRequest(const String& url) |
534 { | 504 { |
535 String breakpointURL; | 505 String breakpointURL; |
536 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) | 506 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) |
537 breakpointURL = ""; | 507 breakpointURL = ""; |
538 else { | 508 else { |
539 RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentS
tate::xhrBreakpoints); | 509 RefPtr<JSONObject> xhrBreakpoints = m_state->getObject(DOMDebuggerAgentS
tate::xhrBreakpoints); |
540 for (JSONObject::iterator it = xhrBreakpoints->begin(); it != xhrBreakpo
ints->end(); ++it) { | 510 for (JSONObject::iterator it = xhrBreakpoints->begin(); it != xhrBreakpo
ints->end(); ++it) { |
(...skipping 14 matching lines...) Expand all Loading... |
555 } | 525 } |
556 | 526 |
557 void InspectorDOMDebuggerAgent::clear() | 527 void InspectorDOMDebuggerAgent::clear() |
558 { | 528 { |
559 m_domBreakpoints.clear(); | 529 m_domBreakpoints.clear(); |
560 m_pauseInNextEventListener = false; | 530 m_pauseInNextEventListener = false; |
561 } | 531 } |
562 | 532 |
563 } // namespace WebCore | 533 } // namespace WebCore |
564 | 534 |
OLD | NEW |