| Index: third_party/WebKit/Source/core/workers/WorkerEventQueue.cpp
|
| diff --git a/third_party/WebKit/Source/core/workers/WorkerEventQueue.cpp b/third_party/WebKit/Source/core/workers/WorkerEventQueue.cpp
|
| index 0439a3da8f8fcef4204f908dba6beb191a900759..94e74bcd192020440692a57f4f8c735930a8daf0 100644
|
| --- a/third_party/WebKit/Source/core/workers/WorkerEventQueue.cpp
|
| +++ b/third_party/WebKit/Source/core/workers/WorkerEventQueue.cpp
|
| @@ -30,7 +30,6 @@
|
| #include "core/dom/ExecutionContextTask.h"
|
| #include "core/events/Event.h"
|
| #include "core/inspector/InspectorInstrumentation.h"
|
| -#include "wtf/PtrUtil.h"
|
|
|
| namespace blink {
|
|
|
| @@ -47,98 +46,58 @@ WorkerEventQueue::WorkerEventQueue(ExecutionContext* context)
|
|
|
| WorkerEventQueue::~WorkerEventQueue()
|
| {
|
| - DCHECK(m_eventTaskMap.isEmpty());
|
| + DCHECK(m_pendingEvents.isEmpty());
|
| }
|
|
|
| DEFINE_TRACE(WorkerEventQueue)
|
| {
|
| visitor->trace(m_executionContext);
|
| - visitor->trace(m_eventTaskMap);
|
| + visitor->trace(m_pendingEvents);
|
| EventQueue::trace(visitor);
|
| }
|
|
|
| -class WorkerEventQueue::EventDispatcherTask : public ExecutionContextTask {
|
| -public:
|
| - static std::unique_ptr<EventDispatcherTask> create(Event* event, WorkerEventQueue* eventQueue)
|
| - {
|
| - return wrapUnique(new EventDispatcherTask(event, eventQueue));
|
| - }
|
| -
|
| - ~EventDispatcherTask() override
|
| - {
|
| - if (m_event) {
|
| - InspectorInstrumentation::asyncTaskCanceled(m_event->target()->getExecutionContext(), m_event);
|
| - m_eventQueue->m_eventTaskMap.remove(m_event);
|
| - }
|
| - }
|
| -
|
| - void dispatchEvent(ExecutionContext* context, Event* event)
|
| - {
|
| - InspectorInstrumentation::AsyncTask asyncTask(context, event);
|
| - event->target()->dispatchEvent(event);
|
| - }
|
| -
|
| - virtual void performTask(ExecutionContext* context)
|
| - {
|
| - if (m_isCancelled)
|
| - return;
|
| -
|
| - m_eventQueue->m_eventTaskMap.remove(m_event.get());
|
| - dispatchEvent(context, m_event);
|
| - m_event.clear();
|
| - }
|
| -
|
| - void cancel()
|
| - {
|
| - m_isCancelled = true;
|
| - m_event.clear();
|
| - }
|
| -
|
| -private:
|
| - EventDispatcherTask(Event* event, WorkerEventQueue* eventQueue)
|
| - : m_event(event)
|
| - , m_eventQueue(eventQueue)
|
| - , m_isCancelled(false)
|
| - {
|
| - }
|
| -
|
| - Persistent<Event> m_event;
|
| - Persistent<WorkerEventQueue> m_eventQueue;
|
| - bool m_isCancelled;
|
| -};
|
| -
|
| bool WorkerEventQueue::enqueueEvent(Event* event)
|
| {
|
| if (m_isClosed)
|
| return false;
|
| InspectorInstrumentation::asyncTaskScheduled(event->target()->getExecutionContext(), event->type(), event);
|
| - std::unique_ptr<EventDispatcherTask> task = EventDispatcherTask::create(event, this);
|
| - m_eventTaskMap.add(event, task.get());
|
| - m_executionContext->postTask(BLINK_FROM_HERE, std::move(task));
|
| + m_pendingEvents.add(event);
|
| + m_executionContext->postTask(BLINK_FROM_HERE, createSameThreadTask(&WorkerEventQueue::dispatchEvent, wrapPersistent(this), wrapWeakPersistent(event)));
|
| return true;
|
| }
|
|
|
| bool WorkerEventQueue::cancelEvent(Event* event)
|
| {
|
| - EventDispatcherTask* task = m_eventTaskMap.get(event);
|
| - if (!task)
|
| + if (!removeEvent(event))
|
| return false;
|
| - task->cancel();
|
| InspectorInstrumentation::asyncTaskCanceled(event->target()->getExecutionContext(), event);
|
| - m_eventTaskMap.remove(event);
|
| return true;
|
| }
|
|
|
| void WorkerEventQueue::close()
|
| {
|
| m_isClosed = true;
|
| - for (const auto& entry : m_eventTaskMap) {
|
| - Event* event = entry.key.get();
|
| - EventDispatcherTask* task = entry.value;
|
| + for (const auto& event : m_pendingEvents)
|
| InspectorInstrumentation::asyncTaskCanceled(event->target()->getExecutionContext(), event);
|
| - task->cancel();
|
| - }
|
| - m_eventTaskMap.clear();
|
| + m_pendingEvents.clear();
|
| +}
|
| +
|
| +bool WorkerEventQueue::removeEvent(Event* event)
|
| +{
|
| + auto found = m_pendingEvents.find(event);
|
| + if (found == m_pendingEvents.end())
|
| + return false;
|
| + m_pendingEvents.remove(found);
|
| + return true;
|
| +}
|
| +
|
| +void WorkerEventQueue::dispatchEvent(Event* event, ExecutionContext* executionContext)
|
| +{
|
| + if (!event || !removeEvent(event))
|
| + return;
|
| +
|
| + InspectorInstrumentation::AsyncTask asyncTask(executionContext, event);
|
| + event->target()->dispatchEvent(event);
|
| }
|
|
|
| } // namespace blink
|
|
|