| Index: Source/core/inspector/InspectorDOMDebuggerAgent.cpp
|
| diff --git a/Source/core/inspector/InspectorDOMDebuggerAgent.cpp b/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
|
| index 7c954bed811769a8de165ade0da710500ff06e72..6de24dc22020983187c90d54cb50febc19076307 100644
|
| --- a/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
|
| +++ b/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
|
| @@ -313,7 +313,6 @@ void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons
|
| *errorString = "Inspected frame has gone";
|
| return;
|
| }
|
| -
|
| ScriptState* state = injectedScript.scriptState();
|
| ScriptState::Scope scope(state);
|
| v8::Local<v8::Value> value = injectedScript.findObject(*remoteId);
|
| @@ -321,51 +320,128 @@ void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons
|
| *errorString = "No object with passed objectId";
|
| return;
|
| }
|
| - EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isolate(), value);
|
| - if (!target) {
|
| - *errorString = "No event target with passed objectId";
|
| - return;
|
| - }
|
|
|
| + String objectGroup = injectedScript.objectIdToObjectGroupName(objectId);
|
| listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>::create();
|
| +
|
| + eventListeners(injectedScript, value, objectGroup, listenersArray);
|
| + frameworkUserEventListeners(injectedScript, value, objectGroup, listenersArray);
|
| +}
|
| +
|
| +void InspectorDOMDebuggerAgent::eventListeners(InjectedScript& injectedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray)
|
| +{
|
| + ScriptState* state = injectedScript.scriptState();
|
| + EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state->isolate(), object);
|
| + if (!eventTarget)
|
| + return;
|
| + ExecutionContext* executionContext = eventTarget->executionContext();
|
| + if (!executionContext)
|
| + return;
|
| +
|
| WillBeHeapVector<EventListenerInfo> eventInformation;
|
| - EventListenerInfo::getEventListeners(target, eventInformation, false);
|
| + EventListenerInfo::getEventListeners(eventTarget, eventInformation, false);
|
| if (eventInformation.isEmpty())
|
| return;
|
|
|
| - String objectGroup = injectedScript.objectIdToObjectGroupName(objectId);
|
| + v8::Local<v8::Set> frameworkInternalEventHandlers = injectedScript.frameworkInternalEventHandlers(object);
|
| + v8::Local<v8::Context> v8Context(frameworkInternalEventHandlers->CreationContext());
|
| +
|
| + using ListenerType = TypeBuilder::DOMDebugger::EventListener::ListenerType;
|
| RegisteredEventListenerIterator iterator(eventInformation);
|
| while (const RegisteredEventListener* listener = iterator.nextRegisteredEventListener()) {
|
| + ListenerType::Enum listenerType = ListenerType::Normal;
|
| + v8::Local<v8::Object> handler = eventListenerHandler(executionContext, listener->listener.get());
|
| +
|
| + if (!frameworkInternalEventHandlers.IsEmpty()) {
|
| + v8::Maybe<bool> hasHandler = frameworkInternalEventHandlers->Has(v8Context, handler);
|
| + if (hasHandler.IsJust() && hasHandler.FromJust())
|
| + listenerType = ListenerType::FrameworkInternal;
|
| + }
|
| +
|
| const EventListenerInfo& info = iterator.currentEventListenerInfo();
|
| - RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildObjectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup);
|
| + RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildObjectForEventListener(injectedScript, handler, listenerType, listener->useCapture, info.eventType, objectGroup);
|
| if (listenerObject)
|
| listenersArray->addItem(listenerObject);
|
| }
|
| }
|
|
|
| -PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::buildObjectForEventListener(const RegisteredEventListener& registeredEventListener, const AtomicString& eventType, EventTarget* target, const String& objectGroupId)
|
| +void InspectorDOMDebuggerAgent::frameworkUserEventListeners(InjectedScript& injectedScript, v8::Local<v8::Value> object, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray)
|
| {
|
| - EventListener* eventListener = registeredEventListener.listener.get();
|
| - RefPtrWillBeRawPtr<EventListener> protect(eventListener);
|
| + v8::Local<v8::Array> listeners = injectedScript.frameworkUserEventListeners(object);
|
| + if (listeners.IsEmpty())
|
| + return;
|
| +
|
| + ScriptState* scriptState = injectedScript.scriptState();
|
| + v8::Isolate* isolate = scriptState->isolate();
|
| + v8::Local<v8::Context> v8Context(listeners->CreationContext());
|
| + for (unsigned i = 0; i < listeners->Length(); ++i) {
|
| + v8::Local<v8::Value> value;
|
| +
|
| + v8::Local<v8::Object> listenerObject;
|
| + if (listeners->Get(v8Context, i).ToLocal(&value)) {
|
| + if (value->IsObject())
|
| + listenerObject = value.As<v8::Object>();
|
| + else
|
| + continue;
|
| + }
|
| +
|
| + v8::Local<v8::Function> handler;
|
| + if (listenerObject->Get(v8Context, v8String(isolate, "handler")).ToLocal(&value)) {
|
| + if (value->IsFunction())
|
| + handler = value.As<v8::Function>();
|
| + else
|
| + continue;
|
| + }
|
| +
|
| + v8::Local<v8::String> type;
|
| + if (listenerObject->Get(v8Context, v8String(isolate, "type")).ToLocal(&value)) {
|
| + if (value->IsString())
|
| + type = value.As<v8::String>();
|
| + else
|
| + continue;
|
| + }
|
| +
|
| + v8::Local<v8::Boolean> useCapture;
|
| + if (listenerObject->Get(v8Context, v8String(isolate, "useCapture")).ToLocal(&value)) {
|
| + if (value->IsBoolean())
|
| + useCapture = value.As<v8::Boolean>();
|
| + else
|
| + continue;
|
| + }
|
| +
|
| + RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(injectedScript, handler, TypeBuilder::DOMDebugger::EventListener::ListenerType::FrameworkUser, useCapture->Value(), toCoreString(type), objectGroup);
|
| + if (inspectorListenerObject)
|
| + listenersArray->addItem(inspectorListenerObject);
|
| + }
|
| +}
|
| +
|
| +PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::buildObjectForEventListener(InjectedScript& injectedScript, v8::Local<v8::Object> handler, TypeBuilder::DOMDebugger::EventListener::ListenerType::Enum listenerType, bool useCapture, const String& type, const String& objectGroupId)
|
| +{
|
| + if (handler.IsEmpty())
|
| + return nullptr;
|
| +
|
| + ScriptState* scriptState = injectedScript.scriptState();
|
| + v8::Isolate* isolate = scriptState->isolate();
|
| + v8::Local<v8::Function> function = eventListenerEffectiveFunction(isolate, handler);
|
| + if (function.IsEmpty())
|
| + return nullptr;
|
| +
|
| String scriptId;
|
| int lineNumber;
|
| int columnNumber;
|
| - ExecutionContext* context = target->executionContext();
|
| - if (!context)
|
| - return nullptr;
|
| - if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumber, columnNumber))
|
| - return nullptr;
|
| + getFunctionLocation(function, scriptId, lineNumber, columnNumber);
|
|
|
| RefPtr<TypeBuilder::Debugger::Location> location = TypeBuilder::Debugger::Location::create()
|
| .setScriptId(scriptId)
|
| .setLineNumber(lineNumber);
|
| location->setColumnNumber(columnNumber);
|
| RefPtr<TypeBuilder::DOMDebugger::EventListener> value = TypeBuilder::DOMDebugger::EventListener::create()
|
| - .setType(eventType)
|
| - .setUseCapture(registeredEventListener.useCapture)
|
| + .setType(type)
|
| + .setUseCapture(useCapture)
|
| .setLocation(location);
|
| + value->setListenerType(listenerType);
|
| if (!objectGroupId.isEmpty())
|
| - value->setHandler(eventHandlerObject(context, eventListener, m_injectedScriptManager, &objectGroupId));
|
| + value->setHandler(injectedScript.wrapObject(ScriptValue(scriptState, function), objectGroupId));
|
| return value.release();
|
| }
|
|
|
|
|