summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docshell/test/navigation/file_bug1379762-2.html43
-rw-r--r--docshell/test/navigation/mochitest.ini2
-rw-r--r--docshell/test/navigation/test_sessionhistory.html1
-rw-r--r--layout/base/nsDocumentViewer.cpp15
4 files changed, 59 insertions, 2 deletions
diff --git a/docshell/test/navigation/file_bug1379762-2.html b/docshell/test/navigation/file_bug1379762-2.html
new file mode 100644
index 0000000000..86033cb2e8
--- /dev/null
+++ b/docshell/test/navigation/file_bug1379762-2.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Bug 1379762</title>
+ </head>
+ <script type="text/just-data">
+ onunload = null; // enable bfcache
+ ++opener.testCount;
+ onpageshow = function(e) {
+ opener.ok(!e.persisted, "Pageshow should not be coming from bfcache " + opener.testCount);
+ }
+ if (opener.testCount == 1) {
+ onload = function () {
+ setTimeout(function() {
+ document.write(testScript);
+ }, 0);
+ }
+ } else if (opener.testCount == 2) {
+ // Do this async, just in case.
+ setTimeout(function() {
+ history.back();
+ }, 0);
+ } else if (opener.testCount == 3) {
+ // Do this async, just in case.
+ setTimeout(function() {
+ history.forward();
+ }, 0);
+ } else if (opener.testCount == 4) {
+ onload = function() {
+ opener.nextTest();
+ window.close();
+ }
+ }
+ </script>
+ <script>
+ var data = document.querySelector("script[type='text/just-data']").textContent;
+ // Store the string that does all out work in a global variable, so we can
+ // get at it later.
+ var testScript = "<script>" + data + "</" + "script>";
+ document.write(testScript);
+ </script>
+</html>
diff --git a/docshell/test/navigation/mochitest.ini b/docshell/test/navigation/mochitest.ini
index f3bb3d244f..8cff81ad13 100644
--- a/docshell/test/navigation/mochitest.ini
+++ b/docshell/test/navigation/mochitest.ini
@@ -59,7 +59,7 @@ skip-if = (toolkit == 'android') || (!debug && (os == 'mac' || os == 'win')) # B
skip-if = (toolkit == 'android') || (debug && e10s) #too slow on Android 4.3 aws only; bug 1030403; bug 1263213 for debug e10s
[test_sessionhistory.html]
skip-if = toolkit == 'android' #RANDOM
-support-files = file_bug1379762-1.html
+support-files = file_bug1379762-1.html file_bug1379762-2.html
[test_sibling-matching-parent.html]
[test_sibling-off-domain.html]
[test_triggeringprincipal_frame_nav.html]
diff --git a/docshell/test/navigation/test_sessionhistory.html b/docshell/test/navigation/test_sessionhistory.html
index b922ce4ea1..10b0cbcafe 100644
--- a/docshell/test/navigation/test_sessionhistory.html
+++ b/docshell/test/navigation/test_sessionhistory.html
@@ -33,6 +33,7 @@ var testFiles =
"file_scrollRestoration.html",
"file_bug1300461.html",
"file_bug1379762-1.html",
+ "file_bug1379762-2.html",
];
var testCount = 0; // Used by the test files.
diff --git a/layout/base/nsDocumentViewer.cpp b/layout/base/nsDocumentViewer.cpp
index 137efb3cdb..7b87349282 100644
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -1012,7 +1012,13 @@ nsDocumentViewer::LoadComplete(nsresult aStatus)
nsIDocShell *docShell = window->GetDocShell();
NS_ENSURE_TRUE(docShell, NS_ERROR_UNEXPECTED);
- docShell->GetRestoringDocument(&restoring);
+ // Unfortunately, docShell->GetRestoringDocument() might no longer be set
+ // correctly. In particular, it can be false by now if someone took it upon
+ // themselves to block onload from inside restoration and unblock it later.
+ // But we can detect the restoring case very simply: by whether our
+ // document's readyState is COMPLETE.
+ restoring = (mDocument->GetReadyStateEnum() ==
+ nsIDocument::READYSTATE_COMPLETE);
if (!restoring) {
NS_ASSERTION(mDocument->IsXULDocument() || // readyState for XUL is bogus
mDocument->GetReadyStateEnum() ==
@@ -1023,6 +1029,13 @@ nsDocumentViewer::LoadComplete(nsresult aStatus)
nsIDocument::READYSTATE_UNINITIALIZED &&
NS_IsAboutBlank(mDocument->GetDocumentURI())),
"Bad readystate");
+#ifdef DEBUG
+ bool docShellThinksWeAreRestoring;
+ docShell->GetRestoringDocument(&docShellThinksWeAreRestoring);
+ MOZ_ASSERT(!docShellThinksWeAreRestoring,
+ "How can docshell think we are restoring if we don't have a "
+ "READYSTATE_COMPLETE document?");
+#endif // DEBUG
nsCOMPtr<nsIDocument> d = mDocument;
mDocument->SetReadyStateInternal(nsIDocument::READYSTATE_COMPLETE);