From b80286215906c1bace028eace8176242ec873deb Mon Sep 17 00:00:00 2001 From: "yuzo@chromium.org" Date: Mon, 15 Jun 2009 08:20:17 +0000 Subject: Consider a redirect following user gesture as user-initiated in maintaining navigation entries. Also, ignore redirect- or machine-initiated- new subframe navigations. The current code treats all redirects as machine-initiated in processing navigation to a new page (to fix Bugs 9663 and 10531). This is not always appropriate, because some sites, e.g., www.google.com/ig, use redirect to implement user-initiated navigation (Bug 11896). This change assumes that a machine-initiated redirect happens within 300ms since the last document load was completed, while a user-initiated one happens later. This assumption is not always correct, e.g., a user may cause transition within 300ms. But I cannot think of any better ways to tell if a redirect is machine- initiated or user-initiated. I believe this change works good enough, at least better than the status quo. Review URL: http://codereview.chromium.org/115919 TEST=Open http://www.hp.com and observe it redirects to http://www.hp.com/#Product . Hit Back button and observe the former URL is not visited. Open http://www.google.com/ig and click tabs inside the page, and try hitting Back and Forward to see if the navigation is right. Open http://www.google.com/codesearch, search for something, click on a result item, and try hitting Back. BUG=11896,12820 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18373 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/tab_contents/navigation_controller.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'chrome/browser/tab_contents/navigation_controller.h') diff --git a/chrome/browser/tab_contents/navigation_controller.h b/chrome/browser/tab_contents/navigation_controller.h index 5a7fba9..8419e0b 100644 --- a/chrome/browser/tab_contents/navigation_controller.h +++ b/chrome/browser/tab_contents/navigation_controller.h @@ -11,6 +11,7 @@ #include "base/linked_ptr.h" #include "base/string16.h" +#include "base/time.h" #include "googleurl/src/gurl.h" #include "chrome/browser/sessions/session_id.h" #include "chrome/browser/ssl/ssl_manager.h" @@ -288,6 +289,12 @@ class NavigationController { return tab_contents_; } + // Called when a document has been loaded in a frame. + void DocumentLoadedInFrame(); + + // Called when the user presses the mouse, enter key or space bar. + void OnUserGesture(); + // For use by TabContents ---------------------------------------------------- // Handles updating the navigation state after the renderer has navigated. @@ -432,6 +439,13 @@ class NavigationController { // Discards the transient entry. void DiscardTransientEntry(); + // Returns true if the navigation is redirect. + bool IsRedirect(const ViewHostMsg_FrameNavigate_Params& params); + + // Returns true if the navigation is likley to be automatic rather than + // user-initiated. + bool IsLikelyAutoNavigation(base::TimeTicks now); + // --------------------------------------------------------------------------- // The user profile associated with this controller @@ -491,6 +505,12 @@ class NavigationController { // Unique identifier of the window we're in. Used by session restore. SessionID window_id_; + // The time ticks at which the last document was loaded. + base::TimeTicks last_document_loaded_; + + // Whether a user gesture has been observed since the last navigation. + bool user_gesture_observed_; + // Should Reload check for post data? The default is true, but is set to false // when testing. static bool check_for_repost_; -- cgit v1.1