tizen beta release
[profile/ivi/webkit-efl.git] / Source / WebCore / workers / WorkerEventQueue.cpp
1 /*
2  * Copyright (C) 2010 Google Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  *
25  */
26
27 #include "config.h"
28 #include "WorkerEventQueue.h"
29
30 #include "DOMWindow.h"
31 #include "Document.h"
32 #include "Event.h"
33 #include "EventNames.h"
34 #include "ScriptExecutionContext.h"
35
36 namespace WebCore {
37
38 PassOwnPtr<WorkerEventQueue> WorkerEventQueue::create(ScriptExecutionContext* context)
39 {
40     return adoptPtr(new WorkerEventQueue(context));
41 }
42
43 WorkerEventQueue::WorkerEventQueue(ScriptExecutionContext* context)
44     : m_scriptExecutionContext(context)
45     , m_isClosed(false)
46 {
47 }
48
49 WorkerEventQueue::~WorkerEventQueue()
50 {
51     close();
52 }
53
54 class WorkerEventQueue::EventDispatcherTask : public ScriptExecutionContext::Task {
55 public:
56     static PassOwnPtr<EventDispatcherTask> create(PassRefPtr<Event> event, WorkerEventQueue* eventQueue)
57     {
58         return adoptPtr(new EventDispatcherTask(event, eventQueue));
59     }
60
61     void dispatchEvent(ScriptExecutionContext*, PassRefPtr<Event> event)
62     {
63         event->target()->dispatchEvent(event);
64     }
65
66     virtual void performTask(ScriptExecutionContext* context)
67     {
68         if (m_isCancelled)
69             return;
70         m_eventQueue->removeEvent(m_event.get());
71         dispatchEvent(context, m_event);
72     }
73
74     void cancel()
75     {
76         m_isCancelled = true;
77         m_event.clear();
78     }
79
80 private:
81     EventDispatcherTask(PassRefPtr<Event> event, WorkerEventQueue* eventQueue)
82         : m_event(event)
83         , m_eventQueue(eventQueue)
84         , m_isCancelled(false)
85     {
86     }
87
88     RefPtr<Event> m_event;
89     WorkerEventQueue* m_eventQueue;
90     bool m_isCancelled;
91 };
92
93 void WorkerEventQueue::removeEvent(Event* event)
94 {
95     m_eventTaskMap.remove(event);
96 }
97
98 bool WorkerEventQueue::enqueueEvent(PassRefPtr<Event> prpEvent)
99 {
100     if (m_isClosed)
101         return false;
102     RefPtr<Event> event = prpEvent;
103     OwnPtr<EventDispatcherTask> task = EventDispatcherTask::create(event, this);
104     m_eventTaskMap.add(event.release(), task.get());
105     m_scriptExecutionContext->postTask(task.release());
106     return true;
107 }
108
109 bool WorkerEventQueue::cancelEvent(Event* event)
110 {
111     EventDispatcherTask* task = m_eventTaskMap.get(event);
112     if (!task)
113         return false;
114     task->cancel();
115     removeEvent(event);
116     return true;
117 }
118
119 void WorkerEventQueue::close()
120 {
121     m_isClosed = true;
122     for (EventTaskMap::iterator it = m_eventTaskMap.begin(); it != m_eventTaskMap.end(); ++it) {
123         EventDispatcherTask* task = it->second;
124         task->cancel();
125     }
126     m_eventTaskMap.clear();
127 }
128
129 }