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

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 EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state- >isolate(), value);
357 if (!target) { 356 if (!eventTarget) {
358 *errorString = "No event target with passed objectId"; 357 *errorString = "No event target with passed objectId";
359 return; 358 return;
360 } 359 }
360 ExecutionContext* executionContext = eventTarget->executionContext();
361 if (!executionContext) {
362 *errorString = "ExecutionContext is empty";
363 return;
364 }
361 365
366 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId);
362 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create(); 367 listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener> ::create();
368 eventListeners(executionContext, injectedScript, eventTarget, value, objectG roup, listenersArray);
369 frameworkEventListeners(executionContext, injectedScript, value, objectGroup , listenersArray);
370 }
371
372 void InspectorDOMDebuggerAgent::eventListeners(ExecutionContext* executionContex t, InjectedScript& injectedScript, EventTarget* eventTarget, v8::Local<v8::Value > object, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMD ebugger::EventListener>>& listenersArray)
373 {
363 WillBeHeapVector<EventListenerInfo> eventInformation; 374 WillBeHeapVector<EventListenerInfo> eventInformation;
364 EventListenerInfo::getEventListeners(target, eventInformation, false); 375 EventListenerInfo::getEventListeners(eventTarget, eventInformation, false);
365 if (eventInformation.isEmpty()) 376 if (eventInformation.isEmpty())
366 return; 377 return;
378 v8::Local<v8::Set> frameworkHandlers = injectedScript.frameworksEventHandler s(object);
367 379
368 String objectGroup = injectedScript.objectIdToObjectGroupName(objectId);
369 RegisteredEventListenerIterator iterator(eventInformation); 380 RegisteredEventListenerIterator iterator(eventInformation);
370 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) { 381 while (const RegisteredEventListener* listener = iterator.nextRegisteredEven tListener()) {
382 TypeBuilder::DOMDebugger::EventListener::HandlerType::Enum handlerType = TypeBuilder::DOMDebugger::EventListener::HandlerType::General;
371 const EventListenerInfo& info = iterator.currentEventListenerInfo(); 383 const EventListenerInfo& info = iterator.currentEventListenerInfo();
372 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); 384 v8::Local<v8::Object> handler = eventListenerHandler(executionContext, l istener->listener.get());
385 if (!frameworkHandlers.IsEmpty()) {
386 v8::Maybe<bool> hasHandler = frameworkHandlers->Has(frameworkHandler s->CreationContext(), handler);
yurys 2015/08/13 23:49:07 You may need v8::TryCatch to protect against throw
kozy 2015/08/14 17:07:03 Acknowledged.
387 if (hasHandler.IsJust() && hasHandler.FromJust())
388 handlerType = TypeBuilder::DOMDebugger::EventListener::HandlerTy pe::FrameworksInternal;
389 }
390 RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildOb jectForEventListener(handler, handlerType, listener->useCapture, info.eventType, executionContext, objectGroup);
373 if (listenerObject) 391 if (listenerObject)
374 listenersArray->addItem(listenerObject); 392 listenersArray->addItem(listenerObject);
375 } 393 }
376 } 394 }
377 395
378 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(const RegisteredEventListener& registeredEventListene r, const AtomicString& eventType, EventTarget* target, const String& objectGroup Id) 396 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)
379 { 397 {
380 EventListener* eventListener = registeredEventListener.listener.get(); 398 v8::Local<v8::Array> listeners = injectedScript.frameworksEventListeners(obj ect);
381 RefPtrWillBeRawPtr<EventListener> protect(eventListener); 399 if (listeners.IsEmpty())
400 return;
401 ScriptState* scriptState = injectedScript.scriptState();
402 v8::Isolate* isolate = scriptState->isolate();
403 v8::Local<v8::Context> v8Context(listeners->CreationContext());
404 for (unsigned i = 0; i < listeners->Length(); ++i) {
405 v8::Local<v8::Value> listener = listeners->Get(v8Context, i).ToLocalChec ked();
yurys 2015/08/13 23:49:07 You should check if the field is present as the ob
kozy 2015/08/14 17:07:03 Done.
406 v8::Local<v8::Object> listenerObject = listener.As<v8::Object>();
407 v8::Local<v8::Function> function = listenerObject->Get(v8Context, v8Stri ng(isolate, "handler")).ToLocalChecked().As<v8::Function>();
408 v8::Local<v8::String> eventType = listenerObject->Get(v8Context, v8Strin g(isolate, "type")).ToLocalChecked().As<v8::String>();
409 v8::Local<v8::Boolean> useCapture = listenerObject->Get(v8Context, v8Str ing(isolate, "useCapture")).ToLocalChecked().As<v8::Boolean>();
410 RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(function, TypeBuilder::DOMDebugger::EventListener: :HandlerType::FrameworksResolved, useCapture->Value(), toCoreString(eventType), executionContext, objectGroup);
411 if (inspectorListenerObject)
412 listenersArray->addItem(inspectorListenerObject);
413 }
414 }
415
416 static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(Executi onContext* context, v8::Local<v8::Object> handler, InjectedScriptManager* manage r, const String* objectGroupId)
417 {
418 if (handler.IsEmpty() || !context->isDocument())
419 return nullptr;
420
421 ScriptState* scriptState = ScriptState::from(handler->CreationContext());
422 LocalFrame* frame = toDocument(context)->frame();
yurys 2015/08/13 23:49:06 Why do we need LocalFrame here? It should work in
kozy 2015/08/14 17:07:03 Done.
423 if (!frame)
424 return nullptr;
425
426 InjectedScript injectedScript = manager->injectedScriptFor(scriptState);
427 if (!injectedScript.isEmpty())
428 return injectedScript.wrapObject(ScriptValue(scriptState, handler), *obj ectGroupId);
429 return nullptr;
430 }
431
432 PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::b uildObjectForEventListener(v8::Local<v8::Object> handler, TypeBuilder::DOMDebugg er::EventListener::HandlerType::Enum handlerType, bool useCapture, const String& type, ExecutionContext* context, const String& objectGroupId)
433 {
434 if (handler.IsEmpty())
435 return nullptr;
382 String scriptId; 436 String scriptId;
383 int lineNumber; 437 int lineNumber;
384 int columnNumber; 438 int columnNumber;
385 ExecutionContext* context = target->executionContext(); 439 v8::Local<v8::Function> function = eventListenerEffectiveFunction(toIsolate( context), handler);
386 if (!context) 440 if (function.IsEmpty())
387 return nullptr; 441 return nullptr;
388 if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumb er, columnNumber)) 442 getFunctionLocation(function, scriptId, lineNumber, columnNumber);
389 return nullptr;
390
391 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create() 443 RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Lo cation::create()
392 .setScriptId(scriptId) 444 .setScriptId(scriptId)
393 .setLineNumber(lineNumber); 445 .setLineNumber(lineNumber);
394 location->setColumnNumber(columnNumber); 446 location->setColumnNumber(columnNumber);
395 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create() 447 RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebu gger::EventListener::create()
396 .setType(eventType) 448 .setType(type)
397 .setUseCapture(registeredEventListener.useCapture) 449 .setUseCapture(useCapture)
398 .setLocation(location); 450 .setLocation(location);
451 value->setHandlerType(handlerType);
399 if (!objectGroupId.isEmpty()) 452 if (!objectGroupId.isEmpty())
400 value->setHandler(eventHandlerObject(context, eventListener, m_injectedS criptManager, &objectGroupId)); 453 value->setHandler(eventHandlerObject(context, function, m_injectedScript Manager, &objectGroupId));
401 return value.release(); 454 return value.release();
402 } 455 }
403 456
404 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent) 457 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node* parent)
405 { 458 {
406 if (hasBreakpoint(parent, SubtreeModified)) { 459 if (hasBreakpoint(parent, SubtreeModified)) {
407 RefPtr<JSONObject> eventData = JSONObject::create(); 460 RefPtr<JSONObject> eventData = JSONObject::create();
408 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get()); 461 descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get());
409 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release()); 462 m_debuggerAgent->breakProgram(InspectorFrontend::Debugger::Reason::DOM, eventData.release());
410 } 463 }
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 return; 752 return;
700 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints))) 753 if (!isEmpty(m_state->getObject(DOMDebuggerAgentState::xhrBreakpoints)))
701 return; 754 return;
702 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs)) 755 if (m_state->getBoolean(DOMDebuggerAgentState::pauseOnAllXHRs))
703 return; 756 return;
704 m_state->remove(DOMDebuggerAgentState::enabled); 757 m_state->remove(DOMDebuggerAgentState::enabled);
705 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr); 758 m_instrumentingAgents->setInspectorDOMDebuggerAgent(nullptr);
706 } 759 }
707 760
708 } // namespace blink 761 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698