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

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: Rebased 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 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698