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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); | 338 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); |
339 if (!remoteId) { | 339 if (!remoteId) { |
340 *errorString = "Invalid object id"; | 340 *errorString = "Invalid object id"; |
341 return; | 341 return; |
342 } | 342 } |
343 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(
remoteId.get()); | 343 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(
remoteId.get()); |
344 if (injectedScript.isEmpty()) { | 344 if (injectedScript.isEmpty()) { |
345 *errorString = "Inspected frame has gone"; | 345 *errorString = "Inspected frame has gone"; |
346 return; | 346 return; |
347 } | 347 } |
348 | |
349 ScriptState* state = injectedScript.scriptState(); | 348 ScriptState* state = injectedScript.scriptState(); |
350 ScriptState::Scope scope(state); | 349 ScriptState::Scope scope(state); |
351 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); | 350 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); |
352 if (value.IsEmpty()) { | 351 if (value.IsEmpty()) { |
353 *errorString = "No object with passed objectId"; | 352 *errorString = "No object with passed objectId"; |
354 return; | 353 return; |
355 } | 354 } |
356 EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isol
ate(), value); | 355 |
357 if (!target) { | 356 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); |
358 *errorString = "No event target with passed objectId"; | 357 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>
::create(); |
| 358 |
| 359 eventListeners(injectedScript, value, objectGroup, listenersArray); |
| 360 frameworkUserEventListeners(injectedScript, value, objectGroup, listenersArr
ay); |
| 361 } |
| 362 |
| 363 void InspectorDOMDebuggerAgent::eventListeners(InjectedScript& injectedScript, v
8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array
<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
| 364 { |
| 365 ScriptState* state = injectedScript.scriptState(); |
| 366 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state-
>isolate(), object); |
| 367 if (!eventTarget) |
359 return; | 368 return; |
360 } | 369 ExecutionContext* executionContext = eventTarget->executionContext(); |
| 370 if (!executionContext) |
| 371 return; |
361 | 372 |
362 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>
::create(); | |
363 WillBeHeapVector<EventListenerInfo> eventInformation; | 373 WillBeHeapVector<EventListenerInfo> eventInformation; |
364 EventListenerInfo::getEventListeners(target, eventInformation, false); | 374 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
365 if (eventInformation.isEmpty()) | 375 if (eventInformation.isEmpty()) |
366 return; | 376 return; |
367 | 377 |
368 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | 378 v8::Local<v8::Set> frameworkInternalEventHandlers = injectedScript.framework
InternalEventHandlers(object); |
| 379 v8::Local<v8::Context> v8Context(frameworkInternalEventHandlers->CreationCon
text()); |
| 380 |
| 381 using ListenerType = TypeBuilder::DOMDebugger::EventListener::ListenerType; |
369 RegisteredEventListenerIterator iterator(eventInformation); | 382 RegisteredEventListenerIterator iterator(eventInformation); |
370 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven
tListener()) { | 383 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven
tListener()) { |
| 384 ListenerType::Enum listenerType = ListenerType::Normal; |
| 385 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l
istener->listener.get()); |
| 386 |
| 387 if (!frameworkInternalEventHandlers.IsEmpty()) { |
| 388 v8::Maybe<bool> hasHandler = frameworkInternalEventHandlers->Has(v8C
ontext, handler); |
| 389 if (hasHandler.IsJust() && hasHandler.FromJust()) |
| 390 listenerType = ListenerType::FrameworkInternal; |
| 391 } |
| 392 |
371 const EventListenerInfo& info = iterator.currentEventListenerInfo(); | 393 const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
372 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb
jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); | 394 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb
jectForEventListener(injectedScript, handler, listenerType, listener->useCapture
, info.eventType, objectGroup); |
373 if (listenerObject) | 395 if (listenerObject) |
374 listenersArray->addItem(listenerObject); | 396 listenersArray->addItem(listenerObject); |
375 } | 397 } |
376 } | 398 } |
377 | 399 |
378 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b
uildObjectForEventListener(const RegisteredEventListener& registeredEventListene
r, const AtomicString& eventType, EventTarget* target, const String& objectGroup
Id) | 400 void InspectorDOMDebuggerAgent::frameworkUserEventListeners(InjectedScript& inje
ctedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<Type
Builder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
379 { | 401 { |
380 EventListener* eventListener = registeredEventListener.listener.get(); | 402 v8::Local<v8::Array> listeners = injectedScript.frameworkUserEventListeners(
object); |
381 RefPtrWillBeRawPtr<EventListener> protect(eventListener); | 403 if (listeners.IsEmpty()) |
| 404 return; |
| 405 |
| 406 ScriptState* scriptState = injectedScript.scriptState(); |
| 407 v8::Isolate* isolate = scriptState->isolate(); |
| 408 v8::Local<v8::Context> v8Context(listeners->CreationContext()); |
| 409 for (unsigned i = 0; i < listeners->Length(); ++i) { |
| 410 v8::Local<v8::Value> value; |
| 411 |
| 412 v8::Local<v8::Object> listenerObject; |
| 413 if (listeners->Get(v8Context, i).ToLocal(&value)) { |
| 414 if (value->IsObject()) |
| 415 listenerObject = value.As<v8::Object>(); |
| 416 else |
| 417 continue; |
| 418 } |
| 419 |
| 420 v8::Local<v8::Function> handler; |
| 421 if (listenerObject->Get(v8Context, v8String(isolate, "handler")).ToLocal
(&value)) { |
| 422 if (value->IsFunction()) |
| 423 handler = value.As<v8::Function>(); |
| 424 else |
| 425 continue; |
| 426 } |
| 427 |
| 428 v8::Local<v8::String> type; |
| 429 if (listenerObject->Get(v8Context, v8String(isolate, "type")).ToLocal(&v
alue)) { |
| 430 if (value->IsString()) |
| 431 type = value.As<v8::String>(); |
| 432 else |
| 433 continue; |
| 434 } |
| 435 |
| 436 v8::Local<v8::Boolean> useCapture; |
| 437 if (listenerObject->Get(v8Context, v8String(isolate, "useCapture")).ToLo
cal(&value)) { |
| 438 if (value->IsBoolean()) |
| 439 useCapture = value.As<v8::Boolean>(); |
| 440 else |
| 441 continue; |
| 442 } |
| 443 |
| 444 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject
= buildObjectForEventListener(injectedScript, handler, TypeBuilder::DOMDebugger:
:EventListener::ListenerType::FrameworkUser, useCapture->Value(), toCoreString(t
ype), objectGroup); |
| 445 if (inspectorListenerObject) |
| 446 listenersArray->addItem(inspectorListenerObject); |
| 447 } |
| 448 } |
| 449 |
| 450 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b
uildObjectForEventListener(InjectedScript& injectedScript, v8::Local<v8::Object>
handler, TypeBuilder::DOMDebugger::EventListener::ListenerType::Enum listenerTy
pe, bool useCapture, const String& type, const String& objectGroupId) |
| 451 { |
| 452 if (handler.IsEmpty()) |
| 453 return nullptr; |
| 454 |
| 455 ScriptState* scriptState = injectedScript.scriptState(); |
| 456 v8::Isolate* isolate = scriptState->isolate(); |
| 457 v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, h
andler); |
| 458 if (function.IsEmpty()) |
| 459 return nullptr; |
| 460 |
382 String scriptId; | 461 String scriptId; |
383 int lineNumber; | 462 int lineNumber; |
384 int columnNumber; | 463 int columnNumber; |
385 ExecutionContext* context = target->executionContext(); | 464 getFunctionLocation(function, scriptId, lineNumber, columnNumber); |
386 if (!context) | |
387 return nullptr; | |
388 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb
er, columnNumber)) | |
389 return nullptr; | |
390 | 465 |
391 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo
cation::create() | 466 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo
cation::create() |
392 .setScriptId(scriptId) | 467 .setScriptId(scriptId) |
393 .setLineNumber(lineNumber); | 468 .setLineNumber(lineNumber); |
394 location->setColumnNumber(columnNumber); | 469 location->setColumnNumber(columnNumber); |
395 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu
gger::EventListener::create() | 470 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu
gger::EventListener::create() |
396 .setType(eventType) | 471 .setType(type) |
397 .setUseCapture(registeredEventListener.useCapture) | 472 .setUseCapture(useCapture) |
398 .setLocation(location); | 473 .setLocation(location); |
| 474 value->setListenerType(listenerType); |
399 if (!objectGroupId.isEmpty()) | 475 if (!objectGroupId.isEmpty()) |
400 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS
criptManager, &objectGroupId)); | 476 value->setHandler(injectedScript.wrapObject(ScriptValue(scriptState, fun
ction), objectGroupId)); |
401 return value.release(); | 477 return value.release(); |
402 } | 478 } |
403 | 479 |
404 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 480 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
405 { | 481 { |
406 if (hasBreakpoint(parent, SubtreeModified)) { | 482 if (hasBreakpoint(parent, SubtreeModified)) { |
407 RefPtr<JSONObject> eventData = JSONObject::create(); | 483 RefPtr<JSONObject> eventData = JSONObject::create(); |
408 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 484 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
409 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM,
eventData.release()); | 485 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM,
eventData.release()); |
410 } | 486 } |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 return; | 775 return; |
700 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) | 776 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) |
701 return; | 777 return; |
702 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) | 778 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) |
703 return; | 779 return; |
704 m_state->remove(DOMDebuggerAgentState::enabled); | 780 m_state->remove(DOMDebuggerAgentState::enabled); |
705 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); | 781 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); |
706 } | 782 } |
707 | 783 |
708 } // namespace blink | 784 } // namespace blink |
OLD | NEW |