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 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 else | 303 else |
304 breakpointsByTarget->remove(targetName.lower()); | 304 breakpointsByTarget->remove(targetName.lower()); |
305 didRemoveBreakpoint(); | 305 didRemoveBreakpoint(); |
306 } | 306 } |
307 | 307 |
308 void InspectorDOMDebuggerAgent::didInvalidateStyleAttr(Node* node) | 308 void InspectorDOMDebuggerAgent::didInvalidateStyleAttr(Node* node) |
309 { | 309 { |
310 if (hasBreakpoint(node, AttributeModified)) { | 310 if (hasBreakpoint(node, AttributeModified)) { |
311 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); | 311 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); |
312 descriptionForDOMEvent(node, AttributeModified, false, eventData.get()); | 312 descriptionForDOMEvent(node, AttributeModified, false, eventData.get()); |
313 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::DOM, s
td::move(eventData)); | 313 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::D
OM, std::move(eventData)); |
314 } | 314 } |
315 } | 315 } |
316 | 316 |
317 void InspectorDOMDebuggerAgent::didInsertDOMNode(Node* node) | 317 void InspectorDOMDebuggerAgent::didInsertDOMNode(Node* node) |
318 { | 318 { |
319 if (m_domBreakpoints.size()) { | 319 if (m_domBreakpoints.size()) { |
320 uint32_t mask = m_domBreakpoints.get(InspectorDOMAgent::innerParentNode(
node)); | 320 uint32_t mask = m_domBreakpoints.get(InspectorDOMAgent::innerParentNode(
node)); |
321 uint32_t inheritableTypesMask = (mask | (mask >> domBreakpointDerivedTyp
eShift)) & inheritableDOMBreakpointTypesMask; | 321 uint32_t inheritableTypesMask = (mask | (mask >> domBreakpointDerivedTyp
eShift)) & inheritableDOMBreakpointTypesMask; |
322 if (inheritableTypesMask) | 322 if (inheritableTypesMask) |
323 updateSubtreeBreakpoints(node, inheritableTypesMask, true); | 323 updateSubtreeBreakpoints(node, inheritableTypesMask, true); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 v8::Isolate* isolate = context->GetIsolate(); | 449 v8::Isolate* isolate = context->GetIsolate(); |
450 v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, i
nfo.handler); | 450 v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, i
nfo.handler); |
451 if (function.IsEmpty()) | 451 if (function.IsEmpty()) |
452 return nullptr; | 452 return nullptr; |
453 | 453 |
454 String scriptId; | 454 String scriptId; |
455 int lineNumber; | 455 int lineNumber; |
456 int columnNumber; | 456 int columnNumber; |
457 getFunctionLocation(function, scriptId, lineNumber, columnNumber); | 457 getFunctionLocation(function, scriptId, lineNumber, columnNumber); |
458 | 458 |
459 std::unique_ptr<protocol::Debugger::Location> location = protocol::Debugger:
:Location::create() | |
460 .setScriptId(scriptId) | |
461 .setLineNumber(lineNumber).build(); | |
462 location->setColumnNumber(columnNumber); | |
463 std::unique_ptr<protocol::DOMDebugger::EventListener> value = protocol::DOMD
ebugger::EventListener::create() | 459 std::unique_ptr<protocol::DOMDebugger::EventListener> value = protocol::DOMD
ebugger::EventListener::create() |
464 .setType(info.eventType) | 460 .setType(info.eventType) |
465 .setUseCapture(info.useCapture) | 461 .setUseCapture(info.useCapture) |
466 .setPassive(info.passive) | 462 .setPassive(info.passive) |
467 .setLocation(std::move(location)).build(); | 463 .setScriptId(scriptId) |
| 464 .setLineNumber(lineNumber) |
| 465 .setColumnNumber(columnNumber).build(); |
468 if (!objectGroupId.isEmpty()) { | 466 if (!objectGroupId.isEmpty()) { |
469 value->setHandler(m_v8Session->wrapObject(context, function, objectGroup
Id, false)); | 467 value->setHandler(m_v8Session->wrapObject(context, function, objectGroup
Id)); |
470 value->setOriginalHandler(m_v8Session->wrapObject(context, info.handler,
objectGroupId, false)); | 468 value->setOriginalHandler(m_v8Session->wrapObject(context, info.handler,
objectGroupId)); |
471 v8::Local<v8::Function> removeFunction; | 469 v8::Local<v8::Function> removeFunction; |
472 if (info.removeFunction.ToLocal(&removeFunction)) | 470 if (info.removeFunction.ToLocal(&removeFunction)) |
473 value->setRemoveFunction(m_v8Session->wrapObject(context, removeFunc
tion, objectGroupId, false)); | 471 value->setRemoveFunction(m_v8Session->wrapObject(context, removeFunc
tion, objectGroupId)); |
474 } | 472 } |
475 return value; | 473 return value; |
476 } | 474 } |
477 | 475 |
478 void InspectorDOMDebuggerAgent::allowNativeBreakpoint(const String& breakpointNa
me, const String* targetName, bool sync) | 476 void InspectorDOMDebuggerAgent::allowNativeBreakpoint(const String& breakpointNa
me, const String* targetName, bool sync) |
479 { | 477 { |
480 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(breakpointName, tar
getName), sync); | 478 pauseOnNativeEventIfNeeded(preparePauseOnNativeEventData(breakpointName, tar
getName), sync); |
481 } | 479 } |
482 | 480 |
483 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 481 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
484 { | 482 { |
485 if (hasBreakpoint(parent, SubtreeModified)) { | 483 if (hasBreakpoint(parent, SubtreeModified)) { |
486 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); | 484 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); |
487 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 485 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
488 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::DOM, s
td::move(eventData)); | 486 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::D
OM, std::move(eventData)); |
489 } | 487 } |
490 } | 488 } |
491 | 489 |
492 void InspectorDOMDebuggerAgent::willRemoveDOMNode(Node* node) | 490 void InspectorDOMDebuggerAgent::willRemoveDOMNode(Node* node) |
493 { | 491 { |
494 Node* parentNode = InspectorDOMAgent::innerParentNode(node); | 492 Node* parentNode = InspectorDOMAgent::innerParentNode(node); |
495 if (hasBreakpoint(node, NodeRemoved)) { | 493 if (hasBreakpoint(node, NodeRemoved)) { |
496 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); | 494 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); |
497 descriptionForDOMEvent(node, NodeRemoved, false, eventData.get()); | 495 descriptionForDOMEvent(node, NodeRemoved, false, eventData.get()); |
498 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::DOM, s
td::move(eventData)); | 496 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::D
OM, std::move(eventData)); |
499 } else if (parentNode && hasBreakpoint(parentNode, SubtreeModified)) { | 497 } else if (parentNode && hasBreakpoint(parentNode, SubtreeModified)) { |
500 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); | 498 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); |
501 descriptionForDOMEvent(node, SubtreeModified, false, eventData.get()); | 499 descriptionForDOMEvent(node, SubtreeModified, false, eventData.get()); |
502 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::DOM, s
td::move(eventData)); | 500 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::D
OM, std::move(eventData)); |
503 } | 501 } |
504 didRemoveDOMNode(node); | 502 didRemoveDOMNode(node); |
505 } | 503 } |
506 | 504 |
507 void InspectorDOMDebuggerAgent::willModifyDOMAttr(Element* element, const Atomic
String&, const AtomicString&) | 505 void InspectorDOMDebuggerAgent::willModifyDOMAttr(Element* element, const Atomic
String&, const AtomicString&) |
508 { | 506 { |
509 if (hasBreakpoint(element, AttributeModified)) { | 507 if (hasBreakpoint(element, AttributeModified)) { |
510 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); | 508 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::Diction
aryValue::create(); |
511 descriptionForDOMEvent(element, AttributeModified, false, eventData.get(
)); | 509 descriptionForDOMEvent(element, AttributeModified, false, eventData.get(
)); |
512 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::DOM, s
td::move(eventData)); | 510 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::D
OM, std::move(eventData)); |
513 } | 511 } |
514 } | 512 } |
515 | 513 |
516 void InspectorDOMDebuggerAgent::descriptionForDOMEvent(Node* target, int breakpo
intType, bool insertion, protocol::DictionaryValue* description) | 514 void InspectorDOMDebuggerAgent::descriptionForDOMEvent(Node* target, int breakpo
intType, bool insertion, protocol::DictionaryValue* description) |
517 { | 515 { |
518 ASSERT(hasBreakpoint(target, breakpointType)); | 516 ASSERT(hasBreakpoint(target, breakpointType)); |
519 | 517 |
520 Node* breakpointOwner = target; | 518 Node* breakpointOwner = target; |
521 if ((1 << breakpointType) & inheritableDOMBreakpointTypesMask) { | 519 if ((1 << breakpointType) & inheritableDOMBreakpointTypesMask) { |
522 // For inheritable breakpoint types, target node isn't always the same a
s the node that owns a breakpoint. | 520 // For inheritable breakpoint types, target node isn't always the same a
s the node that owns a breakpoint. |
523 // Target node may be unknown to frontend, so we need to push it first. | 521 // Target node may be unknown to frontend, so we need to push it first. |
524 std::unique_ptr<protocol::Runtime::RemoteObject> targetNodeObject = m_do
mAgent->resolveNode(target, V8InspectorSession::backtraceObjectGroup); | 522 std::unique_ptr<protocol::Runtime::API::RemoteObject> targetNodeObject =
m_domAgent->resolveNode(target, V8InspectorSession::backtraceObjectGroup); |
525 description->setValue("targetNode", targetNodeObject->serialize()); | 523 description->setValue("targetNode", protocol::SerializedValue::create(ta
rgetNodeObject->toJSONString())); |
526 | 524 |
527 // Find breakpoint owner node. | 525 // Find breakpoint owner node. |
528 if (!insertion) | 526 if (!insertion) |
529 breakpointOwner = InspectorDOMAgent::innerParentNode(target); | 527 breakpointOwner = InspectorDOMAgent::innerParentNode(target); |
530 ASSERT(breakpointOwner); | 528 ASSERT(breakpointOwner); |
531 while (!(m_domBreakpoints.get(breakpointOwner) & (1 << breakpointType)))
{ | 529 while (!(m_domBreakpoints.get(breakpointOwner) & (1 << breakpointType)))
{ |
532 Node* parentNode = InspectorDOMAgent::innerParentNode(breakpointOwne
r); | 530 Node* parentNode = InspectorDOMAgent::innerParentNode(breakpointOwne
r); |
533 if (!parentNode) | 531 if (!parentNode) |
534 break; | 532 break; |
535 breakpointOwner = parentNode; | 533 breakpointOwner = parentNode; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 | 568 |
571 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child =
InspectorDOMAgent::innerNextSibling(child)) | 569 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child =
InspectorDOMAgent::innerNextSibling(child)) |
572 updateSubtreeBreakpoints(child, newRootMask, set); | 570 updateSubtreeBreakpoints(child, newRootMask, set); |
573 } | 571 } |
574 | 572 |
575 void InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded(std::unique_ptr<proto
col::DictionaryValue> eventData, bool synchronous) | 573 void InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded(std::unique_ptr<proto
col::DictionaryValue> eventData, bool synchronous) |
576 { | 574 { |
577 if (!eventData) | 575 if (!eventData) |
578 return; | 576 return; |
579 if (synchronous) | 577 if (synchronous) |
580 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::EventL
istener, std::move(eventData)); | 578 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::E
ventListener, std::move(eventData)); |
581 else | 579 else |
582 m_v8Session->schedulePauseOnNextStatement(protocol::Debugger::Paused::Re
asonEnum::EventListener, std::move(eventData)); | 580 m_v8Session->schedulePauseOnNextStatement(protocol::Debugger::API::Pause
d::ReasonEnum::EventListener, std::move(eventData)); |
583 } | 581 } |
584 | 582 |
585 std::unique_ptr<protocol::DictionaryValue> InspectorDOMDebuggerAgent::preparePau
seOnNativeEventData(const String& eventName, const String* targetName) | 583 std::unique_ptr<protocol::DictionaryValue> InspectorDOMDebuggerAgent::preparePau
seOnNativeEventData(const String& eventName, const String* targetName) |
586 { | 584 { |
587 String fullEventName = (targetName ? listenerEventCategoryType : instrumenta
tionEventCategoryType) + eventName; | 585 String fullEventName = (targetName ? listenerEventCategoryType : instrumenta
tionEventCategoryType) + eventName; |
588 protocol::DictionaryValue* breakpoints = eventListenerBreakpoints(); | 586 protocol::DictionaryValue* breakpoints = eventListenerBreakpoints(); |
589 protocol::Value* value = breakpoints->get(fullEventName); | 587 protocol::Value* value = breakpoints->get(fullEventName); |
590 if (!value) | 588 if (!value) |
591 return nullptr; | 589 return nullptr; |
592 bool match = false; | 590 bool match = false; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 } | 672 } |
675 } | 673 } |
676 } | 674 } |
677 | 675 |
678 if (breakpointURL.isNull()) | 676 if (breakpointURL.isNull()) |
679 return; | 677 return; |
680 | 678 |
681 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryV
alue::create(); | 679 std::unique_ptr<protocol::DictionaryValue> eventData = protocol::DictionaryV
alue::create(); |
682 eventData->setString("breakpointURL", breakpointURL); | 680 eventData->setString("breakpointURL", breakpointURL); |
683 eventData->setString("url", url); | 681 eventData->setString("url", url); |
684 m_v8Session->breakProgram(protocol::Debugger::Paused::ReasonEnum::XHR, std::
move(eventData)); | 682 m_v8Session->breakProgram(protocol::Debugger::API::Paused::ReasonEnum::XHR,
std::move(eventData)); |
685 } | 683 } |
686 | 684 |
687 void InspectorDOMDebuggerAgent::didAddBreakpoint() | 685 void InspectorDOMDebuggerAgent::didAddBreakpoint() |
688 { | 686 { |
689 if (m_state->booleanProperty(DOMDebuggerAgentState::enabled, false)) | 687 if (m_state->booleanProperty(DOMDebuggerAgentState::enabled, false)) |
690 return; | 688 return; |
691 setEnabled(true); | 689 setEnabled(true); |
692 } | 690 } |
693 | 691 |
694 void InspectorDOMDebuggerAgent::didRemoveBreakpoint() | 692 void InspectorDOMDebuggerAgent::didRemoveBreakpoint() |
(...skipping 19 matching lines...) Expand all Loading... |
714 m_instrumentingAgents->removeInspectorDOMDebuggerAgent(this); | 712 m_instrumentingAgents->removeInspectorDOMDebuggerAgent(this); |
715 } | 713 } |
716 } | 714 } |
717 | 715 |
718 void InspectorDOMDebuggerAgent::didCommitLoadForLocalFrame(LocalFrame*) | 716 void InspectorDOMDebuggerAgent::didCommitLoadForLocalFrame(LocalFrame*) |
719 { | 717 { |
720 m_domBreakpoints.clear(); | 718 m_domBreakpoints.clear(); |
721 } | 719 } |
722 | 720 |
723 } // namespace blink | 721 } // namespace blink |
OLD | NEW |