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 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); | 306 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); |
307 if (!remoteId) { | 307 if (!remoteId) { |
308 *errorString = "Invalid object id"; | 308 *errorString = "Invalid object id"; |
309 return; | 309 return; |
310 } | 310 } |
311 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(
remoteId.get()); | 311 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript(
remoteId.get()); |
312 if (injectedScript.isEmpty()) { | 312 if (injectedScript.isEmpty()) { |
313 *errorString = "Inspected frame has gone"; | 313 *errorString = "Inspected frame has gone"; |
314 return; | 314 return; |
315 } | 315 } |
316 | |
317 ScriptState* state = injectedScript.scriptState(); | 316 ScriptState* state = injectedScript.scriptState(); |
318 ScriptState::Scope scope(state); | 317 ScriptState::Scope scope(state); |
319 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); | 318 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); |
320 if (value.IsEmpty()) { | 319 if (value.IsEmpty()) { |
321 *errorString = "No object with passed objectId"; | 320 *errorString = "No object with passed objectId"; |
322 return; | 321 return; |
323 } | 322 } |
324 EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isol
ate(), value); | 323 |
325 if (!target) { | 324 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); |
326 *errorString = "No event target with passed objectId"; | 325 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>
::create(); |
| 326 |
| 327 eventListeners(injectedScript, value, objectGroup, listenersArray); |
| 328 frameworkUserEventListeners(injectedScript, value, objectGroup, listenersArr
ay); |
| 329 } |
| 330 |
| 331 void InspectorDOMDebuggerAgent::eventListeners(InjectedScript& injectedScript, v
8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array
<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
| 332 { |
| 333 ScriptState* state = injectedScript.scriptState(); |
| 334 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state-
>isolate(), object); |
| 335 if (!eventTarget) |
327 return; | 336 return; |
328 } | 337 ExecutionContext* executionContext = eventTarget->executionContext(); |
| 338 if (!executionContext) |
| 339 return; |
329 | 340 |
330 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>
::create(); | |
331 WillBeHeapVector<EventListenerInfo> eventInformation; | 341 WillBeHeapVector<EventListenerInfo> eventInformation; |
332 EventListenerInfo::getEventListeners(target, eventInformation, false); | 342 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
333 if (eventInformation.isEmpty()) | 343 if (eventInformation.isEmpty()) |
334 return; | 344 return; |
335 | 345 |
336 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); | 346 v8::Local<v8::Set> frameworkInternalEventHandlers = injectedScript.framework
InternalEventHandlers(object); |
| 347 v8::Local<v8::Context> v8Context(frameworkInternalEventHandlers->CreationCon
text()); |
| 348 |
| 349 using ListenerType = TypeBuilder::DOMDebugger::EventListener::ListenerType; |
337 RegisteredEventListenerIterator iterator(eventInformation); | 350 RegisteredEventListenerIterator iterator(eventInformation); |
338 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven
tListener()) { | 351 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven
tListener()) { |
| 352 ListenerType::Enum listenerType = ListenerType::Normal; |
| 353 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l
istener->listener.get()); |
| 354 |
| 355 if (!frameworkInternalEventHandlers.IsEmpty()) { |
| 356 v8::Maybe<bool> hasHandler = frameworkInternalEventHandlers->Has(v8C
ontext, handler); |
| 357 if (hasHandler.IsJust() && hasHandler.FromJust()) |
| 358 listenerType = ListenerType::FrameworkInternal; |
| 359 } |
| 360 |
339 const EventListenerInfo& info = iterator.currentEventListenerInfo(); | 361 const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
340 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb
jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); | 362 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb
jectForEventListener(injectedScript, handler, listenerType, listener->useCapture
, info.eventType, objectGroup); |
341 if (listenerObject) | 363 if (listenerObject) |
342 listenersArray->addItem(listenerObject); | 364 listenersArray->addItem(listenerObject); |
343 } | 365 } |
344 } | 366 } |
345 | 367 |
346 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b
uildObjectForEventListener(const RegisteredEventListener& registeredEventListene
r, const AtomicString& eventType, EventTarget* target, const String& objectGroup
Id) | 368 void InspectorDOMDebuggerAgent::frameworkUserEventListeners(InjectedScript& inje
ctedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<Type
Builder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
347 { | 369 { |
348 EventListener* eventListener = registeredEventListener.listener.get(); | 370 v8::Local<v8::Array> listeners = injectedScript.frameworkUserEventListeners(
object); |
349 RefPtrWillBeRawPtr<EventListener> protect(eventListener); | 371 if (listeners.IsEmpty()) |
| 372 return; |
| 373 |
| 374 ScriptState* scriptState = injectedScript.scriptState(); |
| 375 v8::Isolate* isolate = scriptState->isolate(); |
| 376 v8::Local<v8::Context> v8Context(listeners->CreationContext()); |
| 377 for (unsigned i = 0; i < listeners->Length(); ++i) { |
| 378 v8::Local<v8::Value> value; |
| 379 |
| 380 v8::Local<v8::Object> listenerObject; |
| 381 if (listeners->Get(v8Context, i).ToLocal(&value)) { |
| 382 if (value->IsObject()) |
| 383 listenerObject = value.As<v8::Object>(); |
| 384 else |
| 385 continue; |
| 386 } |
| 387 |
| 388 v8::Local<v8::Function> handler; |
| 389 if (listenerObject->Get(v8Context, v8String(isolate, "handler")).ToLocal
(&value)) { |
| 390 if (value->IsFunction()) |
| 391 handler = value.As<v8::Function>(); |
| 392 else |
| 393 continue; |
| 394 } |
| 395 |
| 396 v8::Local<v8::String> type; |
| 397 if (listenerObject->Get(v8Context, v8String(isolate, "type")).ToLocal(&v
alue)) { |
| 398 if (value->IsString()) |
| 399 type = value.As<v8::String>(); |
| 400 else |
| 401 continue; |
| 402 } |
| 403 |
| 404 v8::Local<v8::Boolean> useCapture; |
| 405 if (listenerObject->Get(v8Context, v8String(isolate, "useCapture")).ToLo
cal(&value)) { |
| 406 if (value->IsBoolean()) |
| 407 useCapture = value.As<v8::Boolean>(); |
| 408 else |
| 409 continue; |
| 410 } |
| 411 |
| 412 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject
= buildObjectForEventListener(injectedScript, handler, TypeBuilder::DOMDebugger:
:EventListener::ListenerType::FrameworkUser, useCapture->Value(), toCoreString(t
ype), objectGroup); |
| 413 if (inspectorListenerObject) |
| 414 listenersArray->addItem(inspectorListenerObject); |
| 415 } |
| 416 } |
| 417 |
| 418 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) |
| 419 { |
| 420 if (handler.IsEmpty()) |
| 421 return nullptr; |
| 422 |
| 423 ScriptState* scriptState = injectedScript.scriptState(); |
| 424 v8::Isolate* isolate = scriptState->isolate(); |
| 425 v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, h
andler); |
| 426 if (function.IsEmpty()) |
| 427 return nullptr; |
| 428 |
350 String scriptId; | 429 String scriptId; |
351 int lineNumber; | 430 int lineNumber; |
352 int columnNumber; | 431 int columnNumber; |
353 ExecutionContext* context = target->executionContext(); | 432 getFunctionLocation(function, scriptId, lineNumber, columnNumber); |
354 if (!context) | |
355 return nullptr; | |
356 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb
er, columnNumber)) | |
357 return nullptr; | |
358 | 433 |
359 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo
cation::create() | 434 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo
cation::create() |
360 .setScriptId(scriptId) | 435 .setScriptId(scriptId) |
361 .setLineNumber(lineNumber); | 436 .setLineNumber(lineNumber); |
362 location->setColumnNumber(columnNumber); | 437 location->setColumnNumber(columnNumber); |
363 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu
gger::EventListener::create() | 438 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu
gger::EventListener::create() |
364 .setType(eventType) | 439 .setType(type) |
365 .setUseCapture(registeredEventListener.useCapture) | 440 .setUseCapture(useCapture) |
366 .setLocation(location); | 441 .setLocation(location); |
| 442 value->setListenerType(listenerType); |
367 if (!objectGroupId.isEmpty()) | 443 if (!objectGroupId.isEmpty()) |
368 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS
criptManager, &objectGroupId)); | 444 value->setHandler(injectedScript.wrapObject(ScriptValue(scriptState, fun
ction), objectGroupId)); |
369 return value.release(); | 445 return value.release(); |
370 } | 446 } |
371 | 447 |
372 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) | 448 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) |
373 { | 449 { |
374 if (hasBreakpoint(parent, SubtreeModified)) { | 450 if (hasBreakpoint(parent, SubtreeModified)) { |
375 RefPtr<JSONObject> eventData = JSONObject::create(); | 451 RefPtr<JSONObject> eventData = JSONObject::create(); |
376 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); | 452 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); |
377 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM,
eventData.release()); | 453 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM,
eventData.release()); |
378 } | 454 } |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 return; | 717 return; |
642 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) | 718 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) |
643 return; | 719 return; |
644 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) | 720 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) |
645 return; | 721 return; |
646 m_state->remove(DOMDebuggerAgentState::enabled); | 722 m_state->remove(DOMDebuggerAgentState::enabled); |
647 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); | 723 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); |
648 } | 724 } |
649 | 725 |
650 } // namespace blink | 726 } // namespace blink |
OLD | NEW |