diff options
author | yuzo@chromium.org <yuzo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-15 08:20:17 +0000 |
---|---|---|
committer | yuzo@chromium.org <yuzo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-15 08:20:17 +0000 |
commit | b80286215906c1bace028eace8176242ec873deb (patch) | |
tree | 33e0b83da08542a71ea47170c875165076fa4ce6 /chrome/browser/tab_contents/navigation_controller.h | |
parent | 291a8adf16a35fdf4ecddbd802bc4cc1f4575096 (diff) | |
download | chromium_src-b80286215906c1bace028eace8176242ec873deb.zip chromium_src-b80286215906c1bace028eace8176242ec873deb.tar.gz chromium_src-b80286215906c1bace028eace8176242ec873deb.tar.bz2 |
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
Diffstat (limited to 'chrome/browser/tab_contents/navigation_controller.h')
-rw-r--r-- | chrome/browser/tab_contents/navigation_controller.h | 20 |
1 files changed, 20 insertions, 0 deletions
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_; |