[SCM] WebKit Debian packaging branch, debian/experimental, updated. debian/1.3.8-1-1049-g2e11a8e
commit-queue at webkit.org
commit-queue at webkit.org
Fri Jan 21 14:55:07 UTC 2011
The following commit has been merged in the debian/experimental branch:
commit 23475251a0e5ada6e201f4e1e1909800ac4fbddb
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Jan 4 20:20:29 2011 +0000
2011-01-04 Yong Li <yoli at rim.com>
Reviewed by Adam Barth.
Suspend HTMLParserScheduler when page load is deferred to
avoid potential JS re-entrancy. Otherwise, when JS execution is triggered
from an external script or by events, and is blocked by a modal dialog,
WebKit can parse more HTML source and also start another JS execution.
https://bugs.webkit.org/show_bug.cgi?id=48077
Test case: WebCore/manual-tests/bugzilla-48077.html.
* dom/DocumentParser.cpp:
(WebCore::DocumentParser::suspendScheduledTasks):
(WebCore::DocumentParser::resumeScheduledTasks):
* dom/DocumentParser.h:
* html/parser/HTMLDocumentParser.cpp:
(WebCore::HTMLDocumentParser::suspendScheduledTasks):
(WebCore::HTMLDocumentParser::resumeScheduledTasks):
* html/parser/HTMLParserScheduler.cpp:
(WebCore::HTMLParserScheduler::HTMLParserScheduler):
(WebCore::HTMLParserScheduler::suspend):
(WebCore::HTMLParserScheduler::resume):
* html/parser/HTMLParserScheduler.h:
(WebCore::HTMLParserScheduler::isScheduledForResume):
* page/PageGroupLoadDeferrer.cpp:
(WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer):
(WebCore::PageGroupLoadDeferrer::~PageGroupLoadDeferrer):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74992 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 95f2913..f508774 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,33 @@
+2011-01-04 Yong Li <yoli at rim.com>
+
+ Reviewed by Adam Barth.
+
+ Suspend HTMLParserScheduler when page load is deferred to
+ avoid potential JS re-entrancy. Otherwise, when JS execution is triggered
+ from an external script or by events, and is blocked by a modal dialog,
+ WebKit can parse more HTML source and also start another JS execution.
+
+ https://bugs.webkit.org/show_bug.cgi?id=48077
+
+ Test case: WebCore/manual-tests/bugzilla-48077.html.
+
+ * dom/DocumentParser.cpp:
+ (WebCore::DocumentParser::suspendScheduledTasks):
+ (WebCore::DocumentParser::resumeScheduledTasks):
+ * dom/DocumentParser.h:
+ * html/parser/HTMLDocumentParser.cpp:
+ (WebCore::HTMLDocumentParser::suspendScheduledTasks):
+ (WebCore::HTMLDocumentParser::resumeScheduledTasks):
+ * html/parser/HTMLParserScheduler.cpp:
+ (WebCore::HTMLParserScheduler::HTMLParserScheduler):
+ (WebCore::HTMLParserScheduler::suspend):
+ (WebCore::HTMLParserScheduler::resume):
+ * html/parser/HTMLParserScheduler.h:
+ (WebCore::HTMLParserScheduler::isScheduledForResume):
+ * page/PageGroupLoadDeferrer.cpp:
+ (WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer):
+ (WebCore::PageGroupLoadDeferrer::~PageGroupLoadDeferrer):
+
2011-01-04 Tony Gentilcore <tonyg at chromium.org>
Unreviewed build fix.
diff --git a/WebCore/dom/DocumentParser.cpp b/WebCore/dom/DocumentParser.cpp
index 5f8e04f..355b1cf 100644
--- a/WebCore/dom/DocumentParser.cpp
+++ b/WebCore/dom/DocumentParser.cpp
@@ -68,5 +68,13 @@ void DocumentParser::detach()
m_document = 0;
}
+void DocumentParser::suspendScheduledTasks()
+{
+}
+
+void DocumentParser::resumeScheduledTasks()
+{
+}
+
};
diff --git a/WebCore/dom/DocumentParser.h b/WebCore/dom/DocumentParser.h
index aa18a64..6f78a38 100644
--- a/WebCore/dom/DocumentParser.h
+++ b/WebCore/dom/DocumentParser.h
@@ -91,6 +91,10 @@ public:
void setDocumentWasLoadedAsPartOfNavigation() { m_documentWasLoadedAsPartOfNavigation = true; }
bool documentWasLoadedAsPartOfNavigation() const { return m_documentWasLoadedAsPartOfNavigation; }
+ // FIXME: The names are not very accurate :(
+ virtual void suspendScheduledTasks();
+ virtual void resumeScheduledTasks();
+
protected:
DocumentParser(Document*);
diff --git a/WebCore/html/parser/HTMLDocumentParser.cpp b/WebCore/html/parser/HTMLDocumentParser.cpp
index 0e3a10b..cfdc126 100644
--- a/WebCore/html/parser/HTMLDocumentParser.cpp
+++ b/WebCore/html/parser/HTMLDocumentParser.cpp
@@ -520,4 +520,14 @@ bool HTMLDocumentParser::usePreHTML5ParserQuirks(Document* document)
return document->settings() && document->settings()->usePreHTML5ParserQuirks();
}
+void HTMLDocumentParser::suspendScheduledTasks()
+{
+ m_parserScheduler->suspend();
+}
+
+void HTMLDocumentParser::resumeScheduledTasks()
+{
+ m_parserScheduler->resume();
+}
+
}
diff --git a/WebCore/html/parser/HTMLDocumentParser.h b/WebCore/html/parser/HTMLDocumentParser.h
index fca269a..80ca727 100644
--- a/WebCore/html/parser/HTMLDocumentParser.h
+++ b/WebCore/html/parser/HTMLDocumentParser.h
@@ -72,6 +72,8 @@ public:
HTMLTokenizer* tokenizer() const { return m_tokenizer.get(); }
virtual TextPosition0 textPosition() const;
+ virtual void suspendScheduledTasks();
+ virtual void resumeScheduledTasks();
protected:
virtual void insert(const SegmentedString&);
diff --git a/WebCore/html/parser/HTMLParserScheduler.cpp b/WebCore/html/parser/HTMLParserScheduler.cpp
index 6e67697..56db1aa 100644
--- a/WebCore/html/parser/HTMLParserScheduler.cpp
+++ b/WebCore/html/parser/HTMLParserScheduler.cpp
@@ -65,6 +65,7 @@ HTMLParserScheduler::HTMLParserScheduler(HTMLDocumentParser* parser)
, m_parserTimeLimit(parserTimeLimit(m_parser->document()->page()))
, m_parserChunkSize(parserChunkSize(m_parser->document()->page()))
, m_continueNextChunkTimer(this, &HTMLParserScheduler::continueNextChunkTimerFired)
+ , m_isSuspendedWithActiveTimer(false)
{
}
@@ -92,4 +93,22 @@ void HTMLParserScheduler::continueNextChunkTimerFired(Timer<HTMLParserScheduler>
m_parser->resumeParsingAfterYield();
}
+void HTMLParserScheduler::suspend()
+{
+ ASSERT(!m_isSuspendedWithActiveTimer);
+ if (!m_continueNextChunkTimer.isActive())
+ return;
+ m_isSuspendedWithActiveTimer = true;
+ m_continueNextChunkTimer.stop();
+}
+
+void HTMLParserScheduler::resume()
+{
+ ASSERT(!m_continueNextChunkTimer.isActive());
+ if (!m_isSuspendedWithActiveTimer)
+ return;
+ m_isSuspendedWithActiveTimer = false;
+ m_continueNextChunkTimer.startOneShot(0);
+}
+
}
diff --git a/WebCore/html/parser/HTMLParserScheduler.h b/WebCore/html/parser/HTMLParserScheduler.h
index 5be33b0..3a20b2b 100644
--- a/WebCore/html/parser/HTMLParserScheduler.h
+++ b/WebCore/html/parser/HTMLParserScheduler.h
@@ -71,7 +71,10 @@ public:
return true;
}
- bool isScheduledForResume() const { return m_continueNextChunkTimer.isActive(); }
+ bool isScheduledForResume() const { return m_isSuspendedWithActiveTimer || m_continueNextChunkTimer.isActive(); }
+
+ void suspend();
+ void resume();
private:
HTMLParserScheduler(HTMLDocumentParser*);
@@ -83,6 +86,7 @@ private:
double m_parserTimeLimit;
int m_parserChunkSize;
Timer<HTMLParserScheduler> m_continueNextChunkTimer;
+ bool m_isSuspendedWithActiveTimer;
};
}
diff --git a/WebCore/page/PageGroupLoadDeferrer.cpp b/WebCore/page/PageGroupLoadDeferrer.cpp
index 98a4720..781bc34 100644
--- a/WebCore/page/PageGroupLoadDeferrer.cpp
+++ b/WebCore/page/PageGroupLoadDeferrer.cpp
@@ -22,6 +22,7 @@
#include "PageGroupLoadDeferrer.h"
#include "AsyncScriptRunner.h"
+#include "DocumentParser.h"
#include "Frame.h"
#include "Page.h"
#include "PageGroup.h"
@@ -49,6 +50,8 @@ PageGroupLoadDeferrer::PageGroupLoadDeferrer(Page* page, bool deferSelf)
for (Frame* frame = otherPage->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
frame->document()->suspendActiveDOMObjects(ActiveDOMObject::WillShowDialog);
frame->document()->asyncScriptRunner()->suspend();
+ if (DocumentParser* parser = frame->document()->parser())
+ parser->suspendScheduledTasks();
}
}
}
@@ -69,6 +72,8 @@ PageGroupLoadDeferrer::~PageGroupLoadDeferrer()
for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
frame->document()->resumeActiveDOMObjects();
frame->document()->asyncScriptRunner()->resume();
+ if (DocumentParser* parser = frame->document()->parser())
+ parser->resumeScheduledTasks();
}
}
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list