#include "config.h"
#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 "wtf/HashSet.h"
namespace WebCore {
using namespace std;
ScopedPageLoadDeferrer::ScopedPageLoadDeferrer(Page* exclusion)
{
const HashSet<Page*>& pages = Page::ordinaryPages();
HashSet<Page*>::const_iterator end = pages.end();
for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) {
Page* page = *it;
if (page == exclusion || page->defersLoading())
continue;
m_deferredFrames.append(page->mainFrame());
page->mainFrame()->loader().notifyIfInitialDocumentAccessed();
for (LocalFrame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext())
frame->document()->suspendScheduledTasks();
}
size_t count = m_deferredFrames.size();
for (size_t i = 0; i < count; ++i) {
if (Page* page = m_deferredFrames[i]->page())
page->setDefersLoading(true);
}
}
ScopedPageLoadDeferrer::~ScopedPageLoadDeferrer()
{
for (size_t i = 0; i < m_deferredFrames.size(); ++i) {
if (Page* page = m_deferredFrames[i]->page()) {
page->setDefersLoading(false);
for (LocalFrame* frame = page->mainFrame(); frame; frame = frame->tree().traverseNext())
frame->document()->resumeScheduledTasks();
}
}
}
}