Bug 691547. Don't record a navigationStart for a docshell when one of its descendants navigates. r=bzbarsky AURORA_BASE_20111108
authorIgor Bazarny <igor.bazarny@gmail.com>
Tue, 08 Nov 2011 11:51:20 -0500
changeset 80645 54bfd8bf682e295ffd7f22fa921ca343957b6c1c
parent 80644 53f4c8abf558a720f578a239736b4c6ce27d60d3
child 80646 63587fc7bb931a7aca7296015739fa3bc3832c81
child 80803 9e4138c55b3d42acf33f27bf03bce977f780cd1a
push idunknown
push userunknown
push dateunknown
reviewersbzbarsky
bugs691547
milestone10.0a1
Bug 691547. Don't record a navigationStart for a docshell when one of its descendants navigates. r=bzbarsky
docshell/base/nsDocShell.cpp
docshell/test/Makefile.in
docshell/test/bug691547_frame.html
docshell/test/test_bug691547.html
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -5870,23 +5870,23 @@ nsDocShell::OnStateChange(nsIWebProgress
         nsCOMPtr<nsIChannel> channel(do_QueryInterface(aRequest));
         nsCOMPtr<nsIURI> uri;
         channel->GetURI(getter_AddRefs(uri));
         nsCAutoString aURI;
         uri->GetAsciiSpec(aURI);
         // If load type is not set, this is not a 'normal' load.
         // No need to collect timing.
         if (mLoadType == 0) {
-          mTiming = nsnull;
-        }
-        else {
-          rv = MaybeInitTiming();
-        }
-        if (mTiming) {
-          mTiming->NotifyFetchStart(uri, ConvertLoadTypeToNavigationType(mLoadType));
+            mTiming = nsnull;
+        }
+        else if (this == aProgress){
+            rv = MaybeInitTiming();
+            if (mTiming) {
+                mTiming->NotifyFetchStart(uri, ConvertLoadTypeToNavigationType(mLoadType));
+            } 
         }
 
         nsCOMPtr<nsIWyciwygChannel>  wcwgChannel(do_QueryInterface(aRequest));
         nsCOMPtr<nsIWebProgress> webProgress =
             do_QueryInterface(GetAsSupports(this));
 
         // Was the wyciwyg document loaded on this docshell?
         if (wcwgChannel && !mLSHE && (mItemType == typeContent) && aProgress == webProgress.get()) {
--- a/docshell/test/Makefile.in
+++ b/docshell/test/Makefile.in
@@ -117,16 +117,18 @@ include $(topsrcdir)/config/rules.mk
 		bug668513_redirect.html \
 		bug668513_redirect.html^headers^ \
 		test_bug669671.html \
 		file_bug669671.sjs \
 		test_bug675587.html \
 		test_bfcache_plus_hash.html \
 		test_bug680257.html \
 		file_bug680257.html \
+		test_bug691547.html \
+		bug691547_frame.html \
 		$(NULL)
 
 ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
 _TEST_FILES += \
 		test_bug511449.html \
 		file_bug511449.html \
 		$(NULL)
 endif
new file mode 100644
--- /dev/null
+++ b/docshell/test/bug691547_frame.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=691547
+-->
+<head>
+  <title>Test for Bug 691547</title>
+</head>
+<body>
+<iframe style="width:95%"></iframe>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/docshell/test/test_bug691547.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=691547
+-->
+<head>
+  <title>Test for Bug 691547</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <script type="application/javascript">
+     var navStart = 0;
+     var beforeReload = 0;
+     function onContentLoad() {
+       var frame = frames[0];
+       if (!navStart) {
+         // First time we perform navigation in subframe. The bug is that
+         // load in subframe causes timing.navigationStart to be recorded
+         // as if it was a start of the next navigation.
+         var innerFrame = frame.frames[0];
+         navStart = frame.performance.timing.navigationStart;
+         innerFrame.location = 'bug570341_recordevents.html';
+         // Let's wait a bit so the difference is clear anough.
+         setTimeout(reload, 3000);
+       } 
+       else {
+         // Content reloaded, time to check. We are allowing a huge time slack,
+         // in case clock is imprecise. If we have a bug, the difference is 
+         // expected to be about the timeout value set above.  
+         var diff = frame.performance.timing.navigationStart - beforeReload;
+         ok(diff >= -200,
+            'navigationStart should be set after reload request. ' + 
+            'Measured difference: ' + diff + ' (should be positive)');
+         SimpleTest.finish();
+       }
+     }
+     function reload() {
+       var frame = frames[0];
+       ok(navStart == frame.performance.timing.navigationStart,
+          'navigationStart should not change when frame loads.');
+       beforeReload = Date.now();
+       frame.location.reload();
+     }
+  </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=570341">Mozilla Bug 570341</a>
+<div id="frames">
+<iframe name="frame0" id="frame0" src="bug691547_frame.html" onload="onContentLoad()"></iframe>
+</div>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+SimpleTest.waitForExplicitFinish();
+</script>
+</pre>
+</body>
+</html>