Index: third_party/WebKit/Source/core/page/ScopedPageLoadDeferrer.cpp |
diff --git a/third_party/WebKit/Source/core/page/ScopedPageLoadDeferrer.cpp b/third_party/WebKit/Source/core/page/ScopedPageLoadDeferrer.cpp |
index c247c9985db4a237789d2a3c3af7ac0954228755..37b885324fb79e2123f8bfb178b477c3ba39a509 100644 |
--- a/third_party/WebKit/Source/core/page/ScopedPageLoadDeferrer.cpp |
+++ b/third_party/WebKit/Source/core/page/ScopedPageLoadDeferrer.cpp |
@@ -21,21 +21,45 @@ |
#include "core/page/ScopedPageLoadDeferrer.h" |
#include "core/dom/Document.h" |
-#include "core/frame/LocalFrame.h" |
#include "core/loader/FrameLoader.h" |
#include "core/page/Page.h" |
+#include "platform/heap/Handle.h" |
#include "public/platform/Platform.h" |
#include "public/platform/WebScheduler.h" |
-#include "wtf/HashSet.h" |
+#include "wtf/StdLibExtras.h" |
+#include "wtf/Vector.h" |
namespace blink { |
-ScopedPageLoadDeferrer::ScopedPageLoadDeferrer(Page* exclusion) |
+namespace { |
+ |
+using DeferredPages = Vector<Persistent<Page>, 16>; |
+ |
+unsigned s_deferralCount = 0; |
+ |
+DeferredPages& deferredPages() |
+{ |
+ DEFINE_STATIC_LOCAL(DeferredPages, pages, ()); |
+ return pages; |
+} |
+ |
+void setDefersLoading(bool isDeferred) |
+{ |
+ for (const auto& page : deferredPages()) |
+ page->setDefersLoading(isDeferred); |
+} |
+ |
+} // namespace |
+ |
+ScopedPageLoadDeferrer::ScopedPageLoadDeferrer() |
{ |
+ if (++s_deferralCount > 1) |
+ return; |
+ |
for (Page* page : Page::ordinaryPages()) { |
- if (page == exclusion || page->defersLoading()) |
+ if (page->defersLoading()) |
continue; |
- m_deferredPages.append(page); |
+ deferredPages().append(page); |
} |
setDefersLoading(true); |
@@ -44,15 +68,18 @@ ScopedPageLoadDeferrer::ScopedPageLoadDeferrer(Page* exclusion) |
ScopedPageLoadDeferrer::~ScopedPageLoadDeferrer() |
{ |
- setDefersLoading(false); |
- Platform::current()->currentThread()->scheduler()->resumeTimerQueue(); |
+ if (--s_deferralCount == 0) { |
+ setDefersLoading(false); |
+ Platform::current()->currentThread()->scheduler()->resumeTimerQueue(); |
+ } |
} |
-void ScopedPageLoadDeferrer::setDefersLoading(bool isDeferred) |
+void ScopedPageLoadDeferrer::deferIfNeeded(Page* page) |
{ |
- |
- for (const auto& page : m_deferredPages) |
- page->setDefersLoading(isDeferred); |
+ if (s_deferralCount > 0) { |
+ deferredPages().append(page); |
+ page->setDefersLoading(true); |
+ } |
} |
} // namespace blink |