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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 |
OLD | NEW |