Index: Source/core/inspector/InspectorDOMDebuggerAgent.cpp |
diff --git a/Source/core/inspector/InspectorDOMDebuggerAgent.cpp b/Source/core/inspector/InspectorDOMDebuggerAgent.cpp |
index 5b69bd3cda2edd56ece559bc3d825455a7d825af..53825a92a3c7411816a0153d6d5829a9614cac4a 100644 |
--- a/Source/core/inspector/InspectorDOMDebuggerAgent.cpp |
+++ b/Source/core/inspector/InspectorDOMDebuggerAgent.cpp |
@@ -356,7 +356,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); |
@@ -364,51 +363,104 @@ void InspectorDOMDebuggerAgent::getEventListeners(ErrorString* errorString, cons |
*errorString = "No object with passed objectId"; |
return; |
} |
- EventTarget* target = InjectedScriptHost::eventTargetFromV8Value(state->isolate(), value); |
- if (!target) { |
+ EventTarget* eventTarget = InjectedScriptHost::eventTargetFromV8Value(state->isolate(), value); |
+ if (!eventTarget) { |
*errorString = "No event target with passed objectId"; |
return; |
} |
+ ExecutionContext* executionContext = eventTarget->executionContext(); |
+ if (!executionContext) { |
+ *errorString = "ExecutionContext is empty"; |
+ return; |
+ } |
+ String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); |
listenersArray = TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>::create(); |
+ eventListeners(executionContext, eventTarget, objectGroup, listenersArray); |
+ librariesEventListeners(executionContext, injectedScript, objectId, objectGroup, listenersArray); |
+} |
+ |
+void InspectorDOMDebuggerAgent::eventListeners(ExecutionContext* executionContext, EventTarget* eventTarget, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
+{ |
WillBeHeapVector<EventListenerInfo> eventInformation; |
- EventListenerInfo::getEventListeners(target, eventInformation, false); |
+ EventListenerInfo::getEventListeners(eventTarget, eventInformation, false); |
if (eventInformation.isEmpty()) |
return; |
- |
- String objectGroup = injectedScript.objectIdToObjectGroupName(objectId); |
RegisteredEventListenerIterator iterator(eventInformation); |
while (const RegisteredEventListener* listener = iterator.nextRegisteredEventListener()) { |
const EventListenerInfo& info = iterator.currentEventListenerInfo(); |
- RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildObjectForEventListener(*listener, info.eventType, info.eventTarget, objectGroup); |
+ v8::Local<v8::Object> handler = eventListenerHandler(executionContext, listener->listener.get()); |
+ RefPtr<TypeBuilder::DOMDebugger::EventListener> listenerObject = buildObjectForEventListener(handler, listener->useCapture, info.eventType, executionContext, 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::librariesEventListeners(ExecutionContext* executionContext, InjectedScript& injectedScript, const String& objectId, const String& objectGroup, RefPtr<TypeBuilder::Array<TypeBuilder::DOMDebugger::EventListener>>& listenersArray) |
+{ |
+ ScriptValue listeners = injectedScript.librariesEventListeners(objectId); |
yurys
2015/08/11 21:10:24
Can we make injectedScript.librariesEventListeners
kozy
2015/08/12 18:02:22
Done.
|
+ if (listeners.isEmpty()) |
+ return; |
+ v8::Local<v8::Value> listenersValue = listeners.v8Value(); |
+ v8::Local<v8::Array> array = listenersValue.As<v8::Array>(); |
+ |
+ ScriptState* scriptState = injectedScript.scriptState(); |
+ v8::Isolate* isolate = scriptState->isolate(); |
+ v8::Local<v8::Context> v8Context(array->CreationContext()); |
+ for (unsigned i = 0; i < array->Length(); ++i) { |
+ fprintf(stderr, "Added!\n"); |
yurys
2015/08/11 21:10:24
remove debug print
kozy
2015/08/12 18:02:23
Done.
|
+ v8::Local<v8::Value> listener = array->Get(array->CreationContext(), i).ToLocalChecked(); |
+ v8::Local<v8::Object> listenerObject = listener.As<v8::Object>(); |
+ v8::Local<v8::Function> function = listenerObject->Get(v8Context, v8String(isolate, "handler")).ToLocalChecked().As<v8::Function>(); |
+ v8::Local<v8::String> eventType = listenerObject->Get(v8Context, v8String(isolate, "type")).ToLocalChecked().As<v8::String>(); |
+ v8::Local<v8::Boolean> useCapture = listenerObject->Get(v8Context, v8String(isolate, "useCapture")).ToLocalChecked().As<v8::Boolean>(); |
+ RefPtr<TypeBuilder::DOMDebugger::EventListener> inspectorListenerObject = buildObjectForEventListener(function, useCapture->Value(), toCoreString(eventType), executionContext, objectGroup); |
+ if (inspectorListenerObject) |
+ listenersArray->addItem(inspectorListenerObject); |
+ } |
+} |
+ |
+static PassRefPtr<TypeBuilder::Runtime::RemoteObject> eventHandlerObject(ExecutionContext* context, v8::Local<v8::Object> handler, InjectedScriptManager* manager, const String* objectGroupId) |
{ |
- EventListener* eventListener = registeredEventListener.listener.get(); |
- RefPtrWillBeRawPtr<EventListener> protect(eventListener); |
+ if (handler.IsEmpty() || !context->isDocument()) |
+ return nullptr; |
+ |
+ ScriptState* scriptState = ScriptState::from(handler->CreationContext()); |
+ LocalFrame* frame = toDocument(context)->frame(); |
+ if (!frame) |
+ return nullptr; |
+ |
+ InjectedScript injectedScript = manager->injectedScriptFor(scriptState); |
+ if (!injectedScript.isEmpty()) |
+ return injectedScript.wrapObject(ScriptValue(scriptState, handler), *objectGroupId); |
+ return nullptr; |
+} |
+ |
+PassRefPtr<TypeBuilder::DOMDebugger::EventListener> InspectorDOMDebuggerAgent::buildObjectForEventListener(v8::Local<v8::Object> handler, bool useCapture, const String& type, ExecutionContext* context, const String& objectGroupId) |
+{ |
+ if (handler.IsEmpty()) { |
+ fprintf(stderr, "handler is empty\n"); |
yurys
2015/08/11 21:10:25
remove debug print
kozy
2015/08/12 18:02:23
Done.
|
+ return nullptr; |
+ } |
String scriptId; |
int lineNumber; |
int columnNumber; |
- ExecutionContext* context = target->executionContext(); |
- if (!context) |
+ v8::Local<v8::Function> function = eventListenerEffectiveFunction(toIsolate(context), handler); |
+ if (function.IsEmpty()) { |
+ fprintf(stderr, "function is empty\n"); |
yurys
2015/08/11 21:10:25
remove debug print
kozy
2015/08/12 18:02:23
Done.
|
return nullptr; |
- if (!eventListenerHandlerLocation(context, eventListener, scriptId, lineNumber, columnNumber)) |
- return nullptr; |
- |
+ } |
+ functionLocation(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); |
if (!objectGroupId.isEmpty()) |
- value->setHandler(eventHandlerObject(context, eventListener, m_injectedScriptManager, &objectGroupId)); |
+ value->setHandler(eventHandlerObject(context, handler, m_injectedScriptManager, &objectGroupId)); |
return value.release(); |
} |