| 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 |