Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(507)

Side by Side Diff: Source/core/inspector/InspectorDOMDebuggerAgent.cpp

Issue 1268353005: [DevTools] Support JQuery event listeners (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
yurys 2015/08/14 17:24:20 Consider inlining this function.
kozy 2015/08/14 18:15:45 Done.
450 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(v8::Loc al<v8::Object> handler, InjectedScriptManager* manager, const String* objectGrou pId)
451 {
452 if (handler.IsEmpty())
453 return nullptr;
454 ScriptState* scriptState = ScriptState::from(handler->CreationContext());
455 InjectedScript injectedScript = manager->injectedScriptFor(scriptState);
456 if (!injectedScript.isEmpty())
457 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId);
458 return nullptr;
459 }
460
461 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)
462 {
463 if (handler.IsEmpty())
464 return nullptr;
465
466 ScriptState* scriptState = injectedScript.scriptState();
467 v8::Isolate* isolate = scriptState->isolate();
468 v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, h andler);
469 if (function.IsEmpty())
470 return nullptr;
471
382 String scriptId; 472 String scriptId;
383 int lineNumber; 473 int lineNumber;
384 int columnNumber; 474 int columnNumber;
385 ExecutionContext* context = target->executionContext(); 475 getFunctionLocation(function, scriptId, lineNumber, columnNumber);
386 if (!context)
387 return nullptr;
388 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber))
389 return nullptr;
390 476
391 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() 477 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create()
392 .setScriptId(scriptId) 478 .setScriptId(scriptId)
393 .setLineNumber(lineNumber); 479 .setLineNumber(lineNumber);
394 location->setColumnNumber(columnNumber); 480 location->setColumnNumber(columnNumber);
395 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() 481 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create()
396 .setType(eventType) 482 .setType(type)
397 .setUseCapture(registeredEventListener.useCapture) 483 .setUseCapture(useCapture)
398 .setLocation(location); 484 .setLocation(location);
485 value->setListenerType(listenerType);
399 if (!objectGroupId.isEmpty()) 486 if (!objectGroupId.isEmpty())
400 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); 487 value->setHandler(eventHandlerObject(function, m_injectedScriptManager, &objectGroupId));
401 return value.release(); 488 return value.release();
402 } 489 }
403 490
404 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) 491 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent)
405 { 492 {
406 if (hasBreakpoint(parent, SubtreeModified)) { 493 if (hasBreakpoint(parent, SubtreeModified)) {
407 RefPtr<JSONObject> eventData = JSONObject::create(); 494 RefPtr<JSONObject> eventData = JSONObject::create();
408 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); 495 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get());
409 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); 496 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release());
410 } 497 }
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 return; 786 return;
700 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) 787 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints)))
701 return; 788 return;
702 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) 789 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs))
703 return; 790 return;
704 m_state->remove(DOMDebuggerAgentState::enabled); 791 m_state->remove(DOMDebuggerAgentState::enabled);
705 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); 792 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr);
706 } 793 }
707 794
708 } // namespace blink 795 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698