111 WebCore::Event *m_evt; |
112 WebCore::Event *m_evt; |
112 JSValue* m_dialogArguments; |
113 JSValue* m_dialogArguments; |
113 JSValue** m_returnValueSlot; |
114 JSValue** m_returnValueSlot; |
114 typedef HashMap<int, DOMWindowTimer*> TimeoutsMap; |
115 typedef HashMap<int, DOMWindowTimer*> TimeoutsMap; |
115 TimeoutsMap m_timeouts; |
116 TimeoutsMap m_timeouts; |
|
117 RArray<int> m_timersToBeCleared; |
|
118 bool m_paused; |
116 }; |
119 }; |
117 |
120 |
118 // ========================================================================================== |
121 // ========================================================================================== |
119 // Base class for JavaScript timers - start |
122 // Base class for JavaScript timers - start |
120 // ========================================================================================== |
123 // ========================================================================================== |
2126 { |
2132 { |
2127 size_t count = d->m_timeouts.size(); |
2133 size_t count = d->m_timeouts.size(); |
2128 if (count == 0) |
2134 if (count == 0) |
2129 return 0; |
2135 return 0; |
2130 |
2136 |
|
2137 d->m_paused = true; |
2131 PausedTimeout* t = new PausedTimeout [count]; |
2138 PausedTimeout* t = new PausedTimeout [count]; |
2132 PausedTimeouts* result = new PausedTimeouts(t, count); |
2139 PausedTimeouts* result = new PausedTimeouts(t, count); |
2133 |
2140 |
2134 WindowPrivate::TimeoutsMap::iterator it = d->m_timeouts.begin(); |
2141 WindowPrivate::TimeoutsMap::iterator it = d->m_timeouts.begin(); |
2135 for (size_t i = 0; i != count; ++i, ++it) { |
2142 for (size_t i = 0; i != count; ++i, ++it) { |
2155 return; |
2162 return; |
2156 size_t count = timeouts->numTimeouts(); |
2163 size_t count = timeouts->numTimeouts(); |
2157 PausedTimeout* array = timeouts->takeTimeouts(); |
2164 PausedTimeout* array = timeouts->takeTimeouts(); |
2158 for (size_t i = 0; i != count; ++i) { |
2165 for (size_t i = 0; i != count; ++i) { |
2159 int timeoutId = array[i].timeoutId; |
2166 int timeoutId = array[i].timeoutId; |
2160 DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, array[i].nestingLevel, this, array[i].action); |
2167 if (KErrNotFound == d->m_timersToBeCleared.Find(timeoutId)) { |
2161 d->m_timeouts.set(timeoutId, timer); |
2168 DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, array[i].nestingLevel, this, array[i].action); |
2162 timer->start(array[i].nextFireInterval, array[i].repeatInterval); |
2169 d->m_timeouts.set(timeoutId, timer); |
|
2170 timer->start(array[i].nextFireInterval, array[i].repeatInterval); |
|
2171 } |
2163 } |
2172 } |
2164 delete [] array; |
2173 delete [] array; |
|
2174 d->m_timersToBeCleared.Reset(); |
|
2175 d->m_paused = false; |
2165 } |
2176 } |
2166 |
2177 |
2167 void Window::clearTimeout(int timeoutId, bool delAction) |
2178 void Window::clearTimeout(int timeoutId, bool delAction) |
2168 { |
2179 { |
|
2180 if(d->m_paused) |
|
2181 d->m_timersToBeCleared.Append(timeoutId); |
2169 WindowPrivate::TimeoutsMap::iterator it = d->m_timeouts.find(timeoutId); |
2182 WindowPrivate::TimeoutsMap::iterator it = d->m_timeouts.find(timeoutId); |
2170 if (it == d->m_timeouts.end()) |
2183 if (it == d->m_timeouts.end()) |
2171 return; |
2184 return; |
2172 DOMWindowTimer* timer = it->second; |
2185 DOMWindowTimer* timer = it->second; |
2173 d->m_timeouts.remove(it); |
2186 d->m_timeouts.remove(it); |