Index: Source/core/inspector/TraceEventDispatcher.cpp |
diff --git a/Source/core/inspector/TraceEventDispatcher.cpp b/Source/core/inspector/TraceEventDispatcher.cpp |
index 4c077d2f1365de7ffe919474b2019ba1052d9cec..5a635af45b7f779e616ff879efff627729fb9229 100644 |
--- a/Source/core/inspector/TraceEventDispatcher.cpp |
+++ b/Source/core/inspector/TraceEventDispatcher.cpp |
@@ -48,7 +48,7 @@ void TraceEventDispatcher::dispatchEventOnAnyThread(char phase, const unsigned c |
TraceEventDispatcher* self = instance(); |
{ |
MutexLocker locker(self->m_mutex); |
- if (self->m_handlers.find(std::make_pair(name, phase)) == self->m_handlers.end()) |
+ if (self->m_listeners->find(std::make_pair(name, phase)) == self->m_listeners->end()) |
return; |
} |
self->enqueueEvent(TraceEvent(timestamp, phase, name, id, currentThread(), numArgs, argNames, argTypes, argValues)); |
@@ -89,52 +89,52 @@ void TraceEventDispatcher::processBackgroundEvents() |
} |
for (size_t eventIndex = 0, size = events.size(); eventIndex < size; ++eventIndex) { |
const TraceEvent& event = events[eventIndex]; |
- HandlersMap::iterator it = m_handlers.find(std::make_pair(event.name(), event.phase())); |
- if (it == m_handlers.end()) |
+ ListenersMap::iterator it = m_listeners->find(std::make_pair(event.name(), event.phase())); |
+ if (it == m_listeners->end()) |
continue; |
- Vector<BoundTraceEventHandler>& handlers = it->value; |
- for (size_t handlerIndex = 0; handlerIndex < handlers.size(); ++handlerIndex) |
- (handlers[handlerIndex].instance->*(handlers[handlerIndex].method))(event); |
+ WillBeHeapVector<OwnPtrWillBeMember<TraceEventListener> >& listeners = *it->value.get(); |
+ for (size_t listenerIndex = 0; listenerIndex < listeners.size(); ++listenerIndex) |
+ listeners[listenerIndex]->call(event); |
} |
} |
-void TraceEventDispatcher::innerAddListener(const char* name, char phase, TraceEventTargetBase* instance, TraceEventHandlerMethod method, InspectorClient* client) |
+void TraceEventDispatcher::addListener(const char* name, char phase, PassOwnPtrWillBeRawPtr<TraceEventListener> listener, InspectorClient* client) |
{ |
static const char CategoryFilter[] = "-*," TRACE_DISABLED_BY_DEFAULT("devtools.timeline") "," TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame"); |
ASSERT(isMainThread()); |
MutexLocker locker(m_mutex); |
- if (m_handlers.isEmpty()) |
+ if (m_listeners->isEmpty()) |
client->setTraceEventCallback(CategoryFilter, dispatchEventOnAnyThread); |
- HandlersMap::iterator it = m_handlers.find(std::make_pair(name, phase)); |
- if (it == m_handlers.end()) |
- m_handlers.add(std::make_pair(name, phase), Vector<BoundTraceEventHandler>()).storedValue->value.append(BoundTraceEventHandler(instance, method)); |
+ ListenersMap::iterator it = m_listeners->find(std::make_pair(name, phase)); |
+ if (it == m_listeners->end()) |
+ m_listeners->add(std::make_pair(name, phase), adoptPtrWillBeNoop(new WillBeHeapVector<OwnPtrWillBeMember<TraceEventListener> >())).storedValue->value->append(listener); |
else |
- it->value.append(BoundTraceEventHandler(instance, method)); |
+ it->value->append(listener); |
} |
-void TraceEventDispatcher::removeAllListeners(TraceEventTargetBase* instance, InspectorClient* client) |
+void TraceEventDispatcher::removeAllListeners(void* eventTarget, InspectorClient* client) |
{ |
ASSERT(isMainThread()); |
processBackgroundEvents(); |
{ |
MutexLocker locker(m_mutex); |
- HandlersMap remainingHandlers; |
- for (HandlersMap::iterator it = m_handlers.begin(); it != m_handlers.end(); ++it) { |
- Vector<BoundTraceEventHandler>& handlers = it->value; |
- for (size_t j = 0; j < handlers.size();) { |
- if (handlers[j].instance == instance) |
- handlers.remove(j); |
+ ListenersMap remainingListeners; |
+ for (ListenersMap::iterator it = m_listeners->begin(); it != m_listeners->end(); ++it) { |
+ WillBeHeapVector<OwnPtrWillBeMember<TraceEventListener> >& listeners = *it->value.get(); |
+ for (size_t j = 0; j < listeners.size();) { |
+ if (listeners[j]->target() == eventTarget) |
+ listeners.remove(j); |
else |
++j; |
} |
- if (!handlers.isEmpty()) |
- remainingHandlers.add(it->key, it->value); |
+ if (!listeners.isEmpty()) |
+ remainingListeners.add(it->key, it->value.release()); |
} |
- m_handlers.swap(remainingHandlers); |
+ m_listeners->swap(remainingListeners); |
} |
- if (m_handlers.isEmpty()) |
+ if (m_listeners->isEmpty()) |
client->resetTraceEventCallback(); |
} |