Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / bindings / core / v8 / V8GCForContextDispose.cpp
index 541a45a..0aaad17 100644 (file)
@@ -32,6 +32,7 @@
 #include "bindings/core/v8/V8GCForContextDispose.h"
 
 #include "bindings/core/v8/V8PerIsolateData.h"
+#include "wtf/CurrentTime.h"
 #include "wtf/StdLibExtras.h"
 #include <v8.h>
 
@@ -39,30 +40,28 @@ namespace blink {
 
 V8GCForContextDispose::V8GCForContextDispose()
     : m_pseudoIdleTimer(this, &V8GCForContextDispose::pseudoIdleTimerFired)
-    , m_didDisposeContextForMainFrame(false)
 {
+    reset();
 }
 
 void V8GCForContextDispose::notifyContextDisposed(bool isMainFrame)
 {
     m_didDisposeContextForMainFrame = isMainFrame;
+    m_lastContextDisposalTime = WTF::currentTime();
     V8PerIsolateData::mainThreadIsolate()->ContextDisposedNotification();
-    if (!m_didDisposeContextForMainFrame && !m_pseudoIdleTimer.isActive())
-        m_pseudoIdleTimer.startOneShot(0.8, FROM_HERE);
+    if (m_pseudoIdleTimer.isActive())
+        m_pseudoIdleTimer.stop();
 }
 
-void V8GCForContextDispose::notifyIdleSooner(double maximumFireInterval)
+void V8GCForContextDispose::notifyIdle()
 {
-    if (!m_didDisposeContextForMainFrame && m_pseudoIdleTimer.isActive()) {
-        double nextFireInterval = m_pseudoIdleTimer.nextFireInterval();
-        if (nextFireInterval > maximumFireInterval) {
-            m_pseudoIdleTimer.stop();
-            m_pseudoIdleTimer.startOneShot(maximumFireInterval, FROM_HERE);
-        }
+    double maxTimeSinceLastContextDisposal = .2;
+    if (!m_didDisposeContextForMainFrame && !m_pseudoIdleTimer.isActive() && m_lastContextDisposalTime + maxTimeSinceLastContextDisposal >= WTF::currentTime()) {
+        m_pseudoIdleTimer.startOneShot(0, FROM_HERE);
     }
 }
 
-V8GCForContextDispose& V8GCForContextDispose::instanceTemplate()
+V8GCForContextDispose& V8GCForContextDispose::instance()
 {
     DEFINE_STATIC_LOCAL(V8GCForContextDispose, staticInstance, ());
     return staticInstance;
@@ -70,9 +69,14 @@ V8GCForContextDispose& V8GCForContextDispose::instanceTemplate()
 
 void V8GCForContextDispose::pseudoIdleTimerFired(Timer<V8GCForContextDispose>*)
 {
-    const int idlePauseInMs = 10;
-    if (!m_didDisposeContextForMainFrame)
-        V8PerIsolateData::mainThreadIsolate()->IdleNotification(idlePauseInMs);
+    V8PerIsolateData::mainThreadIsolate()->IdleNotification(0);
+    reset();
+}
+
+void V8GCForContextDispose::reset()
+{
+    m_didDisposeContextForMainFrame = false;
+    m_lastContextDisposalTime = -1;
 }
 
 } // namespace blink