webengine/osswebengine/WebCore/bindings/js/kjs_window.cpp
branchRCL_3
changeset 42 a1a5d4e727e8
parent 40 8bfb9186a8b8
child 47 e1bea15f9a39
equal deleted inserted replaced
41:4bd5176e1bc8 42:a1a5d4e727e8
    98     WindowPrivate()
    98     WindowPrivate()
    99         : loc(0)
    99         : loc(0)
   100         , m_evt(0)
   100         , m_evt(0)
   101         , m_dialogArguments(0)
   101         , m_dialogArguments(0)
   102         , m_returnValueSlot(0)
   102         , m_returnValueSlot(0)
       
   103         , m_paused(false)
   103     {
   104     {
   104     }
   105     }
   105 
   106 
   106     Window::ListenersMap jsEventListeners;
   107     Window::ListenersMap jsEventListeners;
   107     Window::ListenersMap jsHTMLEventListeners;
   108     Window::ListenersMap jsHTMLEventListeners;
   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 // ==========================================================================================
   765 }
   768 }
   766 
   769 
   767 Window::~Window()
   770 Window::~Window()
   768 {
   771 {
   769     clearAllTimeouts();
   772     clearAllTimeouts();
   770 
   773     d->m_timersToBeCleared.Close();
       
   774     
   771     // Clear any backpointers to the window
   775     // Clear any backpointers to the window
   772 
   776 
   773     ListenersMap::iterator i2 = d->jsEventListeners.begin();
   777     ListenersMap::iterator i2 = d->jsEventListeners.begin();
   774     ListenersMap::iterator e2 = d->jsEventListeners.end();
   778     ListenersMap::iterator e2 = d->jsEventListeners.end();
   775     for (; i2 != e2; ++i2)
   779     for (; i2 != e2; ++i2)
  2085             if (interval < cMinimumTimerInterval && (timerNestingLevel + 1) >= cMaxTimerNestingLevel) {
  2089             if (interval < cMinimumTimerInterval && (timerNestingLevel + 1) >= cMaxTimerNestingLevel) {
  2086                 interval = cMinimumTimerInterval;
  2090                 interval = cMinimumTimerInterval;
  2087             }
  2091             }
  2088             impl()->frame()->page()->chrome()->wait(interval);
  2092             impl()->frame()->page()->chrome()->wait(interval);
  2089             a->execute(this);
  2093             a->execute(this);
       
  2094             // clear the event after it is handled. 
       
  2095             d->m_evt = 0; 
  2090             return lastUsedTimeoutId;
  2096             return lastUsedTimeoutId;
  2091         }
  2097         }
  2092     }
  2098     }
  2093 #endif        
  2099 #endif        
  2094 
  2100 
  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);