Index: third_party/WebKit/Source/web/WebLeakDetector.cpp |
diff --git a/third_party/WebKit/Source/web/WebLeakDetector.cpp b/third_party/WebKit/Source/web/WebLeakDetector.cpp |
index e1ddecbab86bf329b6cd9c60d7956be2f3b50bd0..17cc3978090aaaa3311b0b7995ce6bf1e2a49141 100644 |
--- a/third_party/WebKit/Source/web/WebLeakDetector.cpp |
+++ b/third_party/WebKit/Source/web/WebLeakDetector.cpp |
@@ -59,6 +59,7 @@ public: |
, m_delayedGCAndReportTimer(this, &WebLeakDetectorImpl::delayedGCAndReport) |
, m_delayedReportTimer(this, &WebLeakDetectorImpl::delayedReport) |
, m_numberOfGCNeeded(0) |
+ , m_delayFinalGarbageCollection(false) |
{ |
ASSERT(m_client); |
} |
@@ -67,6 +68,9 @@ public: |
void collectGarbageAndGetDOMCounts(WebLocalFrame*) override; |
+ void delayFinalGarbageCollection() override { m_delayFinalGarbageCollection = true; } |
+ void collectFinalGarbage() override; |
+ |
private: |
void delayedGCAndReport(Timer<WebLeakDetectorImpl>*); |
void delayedReport(Timer<WebLeakDetectorImpl>*); |
@@ -75,8 +79,21 @@ private: |
Timer<WebLeakDetectorImpl> m_delayedGCAndReportTimer; |
Timer<WebLeakDetectorImpl> m_delayedReportTimer; |
int m_numberOfGCNeeded; |
+ bool m_delayFinalGarbageCollection; |
}; |
+void WebLeakDetectorImpl::collectFinalGarbage() |
+{ |
+ ASSERT(m_delayFinalGarbageCollection); |
+ |
+ // Task queue may contain delayed object destruction tasks. |
+ // This method is called from navigation hook inside FrameLoader, |
+ // so previous document is still held by the loader until the next event loop. |
+ // Complete all pending tasks before proceeding to gc. |
+ m_numberOfGCNeeded = 2; |
+ m_delayedGCAndReportTimer.startOneShot(0, BLINK_FROM_HERE); |
+} |
+ |
void WebLeakDetectorImpl::collectGarbageAndGetDOMCounts(WebLocalFrame* frame) |
haraken
2015/11/24 23:54:51
Instead of introducing a notion of "delayed", I'd
|
{ |
v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
@@ -105,12 +122,10 @@ void WebLeakDetectorImpl::collectGarbageAndGetDOMCounts(WebLocalFrame* frame) |
V8PerIsolateData::from(isolate)->clearScriptRegexpContext(); |
- // Task queue may contain delayed object destruction tasks. |
- // This method is called from navigation hook inside FrameLoader, |
- // so previous document is still held by the loader until the next event loop. |
- // Complete all pending tasks before proceeding to gc. |
- m_numberOfGCNeeded = 2; |
- m_delayedGCAndReportTimer.startOneShot(0, BLINK_FROM_HERE); |
+ if (m_delayFinalGarbageCollection) |
+ return; |
+ |
+ collectFinalGarbage(); |
} |
void WebLeakDetectorImpl::delayedGCAndReport(Timer<WebLeakDetectorImpl>*) |