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

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: Added UI 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 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 m_domBreakpoints.set(node, mask); 337 m_domBreakpoints.set(node, mask);
338 else 338 else
339 m_domBreakpoints.remove(node); 339 m_domBreakpoints.remove(node);
340 340
341 if ((rootBit & inheritableDOMBreakpointTypesMask) && !(mask & (rootBit << do mBreakpointDerivedTypeShift))) { 341 if ((rootBit & inheritableDOMBreakpointTypesMask) && !(mask & (rootBit << do mBreakpointDerivedTypeShift))) {
342 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; chil d = InspectorDOMAgent::innerNextSibling(child)) 342 for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; chil d = InspectorDOMAgent::innerNextSibling(child))
343 updateSubtreeBreakpoints(child, rootBit, false); 343 updateSubtreeBreakpoints(child, rootBit, false);
344 } 344 }
345 } 345 }
346 346
347 void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons t String& objectId, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventLis tener>>& listenersArray) 347 void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons t String& objectId, const bool* resolveFrameworkHandlers, RefPtr<TypeBuilder::Ar ray<TypeBuilder::DOMDebugger::EventListener>>& listenersArray)
348 { 348 {
349 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId); 349 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(objectId);
350 if (!remoteId) { 350 if (!remoteId) {
351 *errorString = "Invalid object id"; 351 *errorString = "Invalid object id";
352 return; 352 return;
353 } 353 }
354 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript( remoteId.get()); 354 InjectedScript injectedScript = m_injectedScriptManager->findInjectedScript( remoteId.get());
355 if (injectedScript.isEmpty()) { 355 if (injectedScript.isEmpty()) {
356 *errorString = "Inspected frame has gone"; 356 *errorString = "Inspected frame has gone";
357 return; 357 return;
358 } 358 }
359
360 ScriptState* state = injectedScript.scriptState(); 359 ScriptState* state = injectedScript.scriptState();
361 ScriptState::Scope scope(state); 360 ScriptState::Scope scope(state);
362 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId); 361 v8::Local<v8::Value> value = injectedScript.findObject(*remoteId);
363 if (value.IsEmpty()) { 362 if (value.IsEmpty()) {
364 *errorString = "No object with passed objectId"; 363 *errorString = "No object with passed objectId";
365 return; 364 return;
366 } 365 }
367 EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isol ate(), value); 366 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state- >isolate(), value);
368 if (!target) { 367 if (!eventTarget) {
369 *errorString = "No event target with passed objectId"; 368 *errorString = "No event target with passed objectId";
370 return; 369 return;
371 } 370 }
371 ExecutionContext* executionContext = eventTarget->executionContext();
372 if (!executionContext) {
373 *errorString = "ExecutionContext is empty";
374 return;
375 }
372 376
377 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId);
373 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); 378 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create();
379 eventListeners(executionContext, injectedScript, eventTarget, value, objectG roup, asBool(resolveFrameworkHandlers), listenersArray);
380 if (asBool(resolveFrameworkHandlers))
381 frameworkEventListeners(executionContext, injectedScript, value, objectG roup, listenersArray);
382 }
383
384 void InspectorDOMDebuggerAgent::eventListeners(ExecutionContext* executionContex t, InjectedScript& injectedScript, EventTarget* eventTarget, v8::Local<v8::Value > object, const String& objectGroup, bool filterFrameworkHandlers, RefPtr<TypeBu ilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray)
385 {
374 WillBeHeapVector<EventListenerInfo> eventInformation; 386 WillBeHeapVector<EventListenerInfo> eventInformation;
375 EventListenerInfo::getEventListeners(target, eventInformation, false); 387 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false);
376 if (eventInformation.isEmpty()) 388 if (eventInformation.isEmpty())
377 return; 389 return;
390 v8::Local<v8::Set> frameworkHandlers;
391 if (filterFrameworkHandlers)
392 filterFrameworkHandlers = injectedScript.frameworkEventHandlers(object). ToLocal(&frameworkHandlers);
378 393
379 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId);
380 RegisteredEventListenerIterator iterator(eventInformation); 394 RegisteredEventListenerIterator iterator(eventInformation);
381 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { 395 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) {
382 const EventListenerInfo& info = iterator.currentEventListenerInfo(); 396 const EventListenerInfo& info = iterator.currentEventListenerInfo();
383 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); 397 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l istener->listener.get());
398
399 if (filterFrameworkHandlers) {
400 v8::Maybe<bool> hasHandler = frameworkHandlers->Has(frameworkHandler s->CreationContext(), handler);
401 if (hasHandler.IsJust() && hasHandler.FromJust())
402 continue;
403 }
404
405 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(handler, listener->useCapture, info.eventType, executionCon text, objectGroup);
384 if (listenerObject) 406 if (listenerObject)
385 listenersArray->addItem(listenerObject); 407 listenersArray->addItem(listenerObject);
386 } 408 }
387 } 409 }
388 410
389 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(const RegisteredEventListener& registeredEventListene r, const AtomicString& eventType, EventTarget* target, const String& objectGroup Id) 411 void InspectorDOMDebuggerAgent::frameworkEventListeners(ExecutionContext* execut ionContext, InjectedScript& injectedScript, v8::Local<v8::Value> object, const S tring& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventLi stener>>& listenersArray)
390 { 412 {
391 EventListener* eventListener = registeredEventListener.listener.get(); 413 v8::MaybeLocal<v8::Array> listeners = injectedScript.frameworkEventListeners (object);
392 RefPtrWillBeRawPtr<EventListener> protect(eventListener); 414 if (listeners.IsEmpty())
415 return;
416 v8::Local<v8::Array> array = listeners.ToLocalChecked();
417
418 ScriptState* scriptState = injectedScript.scriptState();
419 v8::Isolate* isolate = scriptState->isolate();
420 v8::Local<v8::Context> v8Context(array->CreationContext());
421 for (unsigned i = 0; i < array->Length(); ++i) {
422 v8::Local<v8::Value> listener = array->Get(array->CreationContext(), i). ToLocalChecked();
yurys 2015/08/12 21:56:03 v8Context
423 v8::Local<v8::Object> listenerObject = listener.As<v8::Object>();
424 v8::Local<v8::Function> function = listenerObject->Get(v8Context, v8Stri ng(isolate, "handler")).ToLocalChecked().As<v8::Function>();
425 v8::Local<v8::String> eventType = listenerObject->Get(v8Context, v8Strin g(isolate, "type")).ToLocalChecked().As<v8::String>();
426 v8::Local<v8::Boolean> useCapture = listenerObject->Get(v8Context, v8Str ing(isolate, "useCapture")).ToLocalChecked().As<v8::Boolean>();
427 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(function, useCapture->Value(), toCoreString(eventT ype), executionContext, objectGroup);
428 if (inspectorListenerObject)
429 listenersArray->addItem(inspectorListenerObject);
430 }
431 }
432
433 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(Executi onContext* context, v8::Local<v8::Object> handler, InjectedScriptManager* manage r, const String* objectGroupId)
434 {
435 if (handler.IsEmpty() || !context->isDocument())
436 return nullptr;
437
438 ScriptState* scriptState = ScriptState::from(handler->CreationContext());
439 LocalFrame* frame = toDocument(context)->frame();
440 if (!frame)
441 return nullptr;
442
443 InjectedScript injectedScript = manager->injectedScriptFor(scriptState);
444 if (!injectedScript.isEmpty())
445 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId);
446 return nullptr;
447 }
448
449 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(v8::Local<v8::Object> handler, bool useCapture, const String& type, ExecutionContext* context, const String& objectGroupId)
450 {
451 if (handler.IsEmpty())
452 return nullptr;
393 String scriptId; 453 String scriptId;
394 int lineNumber; 454 int lineNumber;
395 int columnNumber; 455 int columnNumber;
396 ExecutionContext* context = target->executionContext(); 456 v8::Local<v8::Function> function = eventListenerEffectiveFunction(toIsolate( context), handler);
397 if (!context) 457 if (function.IsEmpty())
398 return nullptr; 458 return nullptr;
399 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber)) 459 getFunctionLocation(function, scriptId, lineNumber, columnNumber);
400 return nullptr;
401
402 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() 460 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create()
403 .setScriptId(scriptId) 461 .setScriptId(scriptId)
404 .setLineNumber(lineNumber); 462 .setLineNumber(lineNumber);
405 location->setColumnNumber(columnNumber); 463 location->setColumnNumber(columnNumber);
406 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() 464 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create()
407 .setType(eventType) 465 .setType(type)
408 .setUseCapture(registeredEventListener.useCapture) 466 .setUseCapture(useCapture)
409 .setLocation(location); 467 .setLocation(location);
410 if (!objectGroupId.isEmpty()) 468 if (!objectGroupId.isEmpty())
411 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); 469 value->setHandler(eventHandlerObject(context, function, m_injectedScript Manager, &objectGroupId));
412 return value.release(); 470 return value.release();
413 } 471 }
414 472
415 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) 473 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent)
416 { 474 {
417 if (hasBreakpoint(parent, SubtreeModified)) { 475 if (hasBreakpoint(parent, SubtreeModified)) {
418 RefPtr<JSONObject> eventData = JSONObject::create(); 476 RefPtr<JSONObject> eventData = JSONObject::create();
419 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); 477 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get());
420 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); 478 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release());
421 } 479 }
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 eventData->setString("url", url); 740 eventData->setString("url", url);
683 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release()); 741 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::XHR, even tData.release());
684 } 742 }
685 743
686 void InspectorDOMDebuggerAgent::clear() 744 void InspectorDOMDebuggerAgent::clear()
687 { 745 {
688 m_domBreakpoints.clear(); 746 m_domBreakpoints.clear();
689 } 747 }
690 748
691 } // namespace blink 749 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698