From 2dcb455ba6dbac6c1fea1166b584ee234a3c8c5f Mon Sep 17 00:00:00 2001 From: Henri Sivonen Date: Fri, 28 May 2010 15:20:13 +0300 Subject: [PATCH] Bug 568470 - Flush ops from off-the-main-thread HTML5 tree builder into executor immediately when stopping speculating. r=bnewman. --HG-- extra : rebase_source : 12abdc2cab8f8e96587ef11ba8b62cabb2b2acbb --- parser/html/nsHtml5StreamParser.cpp | 7 +++ parser/htmlparser/tests/mochitest/Makefile.in | 3 ++ .../tests/mochitest/file_bug568470-script.sjs | 14 +++++ .../tests/mochitest/file_bug568470.sjs | 19 +++++++ .../tests/mochitest/test_bug568470.html | 51 +++++++++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 parser/htmlparser/tests/mochitest/file_bug568470-script.sjs create mode 100644 parser/htmlparser/tests/mochitest/file_bug568470.sjs create mode 100644 parser/htmlparser/tests/mochitest/test_bug568470.html diff --git a/parser/html/nsHtml5StreamParser.cpp b/parser/html/nsHtml5StreamParser.cpp index 9f511983936e..ebece6ca64ec 100644 --- a/parser/html/nsHtml5StreamParser.cpp +++ b/parser/html/nsHtml5StreamParser.cpp @@ -992,6 +992,13 @@ nsHtml5StreamParser::ContinueAfterScripts(nsHtml5Tokenizer* aTokenizer, mSpeculations.RemoveElementAt(0); if (mSpeculations.IsEmpty()) { // yes, it was still the only speculation. Now stop speculating + if (mTreeBuilder->IsDiscretionaryFlushSafe()) { + // However, before telling the executor to read from stage, flush + // any pending ops straight to the executor, because otherwise + // they remain unflushed until we get more data from the network. + mTreeBuilder->SetOpSink(mExecutor); + mTreeBuilder->Flush(); + } mTreeBuilder->SetOpSink(mExecutor->GetStage()); mExecutor->StartReadingFromStage(); mSpeculating = PR_FALSE; diff --git a/parser/htmlparser/tests/mochitest/Makefile.in b/parser/htmlparser/tests/mochitest/Makefile.in index 9bc8270947b0..9f93acdc4d94 100644 --- a/parser/htmlparser/tests/mochitest/Makefile.in +++ b/parser/htmlparser/tests/mochitest/Makefile.in @@ -62,6 +62,9 @@ _TEST_FILES = parser_datreader.js \ test_bug566879.html \ test_compatmode.html \ invalidchar.xml \ + test_bug568470.html \ + file_bug568470.sjs \ + file_bug568470-script.sjs \ $(NULL) libs:: $(_TEST_FILES) diff --git a/parser/htmlparser/tests/mochitest/file_bug568470-script.sjs b/parser/htmlparser/tests/mochitest/file_bug568470-script.sjs new file mode 100644 index 000000000000..6ba6ff08a6b1 --- /dev/null +++ b/parser/htmlparser/tests/mochitest/file_bug568470-script.sjs @@ -0,0 +1,14 @@ +function handleRequest(request, response) +{ + response.setHeader("Cache-Control", "no-cache", false); + response.setHeader("Content-Type", "text/javascript", false); + response.write("var i = 0;"); + response.bodyOutputStream.flush(); + response.processAsync(); + var timer = Components.classes["@mozilla.org/timer;1"] + .createInstance(Components.interfaces.nsITimer); + timer.initWithCallback(function() { + response.finish(); + }, 500, Components.interfaces.nsITimer.TYPE_ONE_SHOT); +} + diff --git a/parser/htmlparser/tests/mochitest/file_bug568470.sjs b/parser/htmlparser/tests/mochitest/file_bug568470.sjs new file mode 100644 index 000000000000..2a5b7d8deaf8 --- /dev/null +++ b/parser/htmlparser/tests/mochitest/file_bug568470.sjs @@ -0,0 +1,19 @@ +function handleRequest(request, response) +{ + response.setHeader("Cache-Control", "no-cache", false); + response.setHeader("Content-Type", "text/html", false); + response.write(""); + response.write("
"); + for (var i = 0; i < 2000; i++) { + response.write("Lorem ipsum dolor sit amet. "); + } + response.write("
"); + response.bodyOutputStream.flush(); + response.processAsync(); + var timer = Components.classes["@mozilla.org/timer;1"] + .createInstance(Components.interfaces.nsITimer); + timer.initWithCallback(function() { + response.finish(); + }, 1200, Components.interfaces.nsITimer.TYPE_ONE_SHOT); +} + diff --git a/parser/htmlparser/tests/mochitest/test_bug568470.html b/parser/htmlparser/tests/mochitest/test_bug568470.html new file mode 100644 index 000000000000..f25059f11adb --- /dev/null +++ b/parser/htmlparser/tests/mochitest/test_bug568470.html @@ -0,0 +1,51 @@ + + + + + Test for Bug 568470 + + + + + +Mozilla Bug 568470 +

+
+
+
+ + + +