Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1512)

Side by Side Diff: content/browser/web_contents/navigation_controller_impl.cc

Issue 10871090: history.replaceState(..., location.href) clearing page-action icons. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/web_contents/navigation_controller_impl.h" 5 #include "content/browser/web_contents/navigation_controller_impl.h"
6 6
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/string_number_conversions.h" // Temporary 9 #include "base/string_number_conversions.h" // Temporary
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 (*entries)[i]->SetTransitionType(content::PAGE_TRANSITION_RELOAD); 96 (*entries)[i]->SetTransitionType(content::PAGE_TRANSITION_RELOAD);
97 (*entries)[i]->set_restore_type(from_last_session ? 97 (*entries)[i]->set_restore_type(from_last_session ?
98 NavigationEntryImpl::RESTORE_LAST_SESSION : 98 NavigationEntryImpl::RESTORE_LAST_SESSION :
99 NavigationEntryImpl::RESTORE_CURRENT_SESSION); 99 NavigationEntryImpl::RESTORE_CURRENT_SESSION);
100 // NOTE(darin): This code is only needed for backwards compat. 100 // NOTE(darin): This code is only needed for backwards compat.
101 SetContentStateIfEmpty((*entries)[i].get()); 101 SetContentStateIfEmpty((*entries)[i].get());
102 } 102 }
103 } 103 }
104 104
105 // See NavigationController::IsURLInPageNavigation for how this works and why. 105 // See NavigationController::IsURLInPageNavigation for how this works and why.
106 bool AreURLsInPageNavigation(const GURL& existing_url, const GURL& new_url) { 106 bool AreURLsInPageNavigation(const GURL& existing_url,
107 if (existing_url == new_url || !new_url.has_ref()) { 107 const GURL& new_url,
108 bool renderer_says_in_page) {
109 if (existing_url == new_url)
110 return renderer_says_in_page;
111
112 if (!new_url.has_ref()) {
108 // TODO(jcampan): what about when navigating back from a ref URL to the top 113 // TODO(jcampan): what about when navigating back from a ref URL to the top
109 // non ref URL? Nothing is loaded in that case but we return false here. 114 // non ref URL? Nothing is loaded in that case but we return false here.
110 // The user could also navigate from the ref URL to the non ref URL by 115 // The user could also navigate from the ref URL to the non ref URL by
111 // entering the non ref URL in the location bar or through a bookmark, in 116 // entering the non ref URL in the location bar or through a bookmark, in
112 // which case there would be a load. I am not sure if the non-load/load 117 // which case there would be a load. I am not sure if the non-load/load
113 // scenarios can be differentiated with the TransitionType. 118 // scenarios can be differentiated with the TransitionType.
Charlie Reis 2012/08/28 20:06:16 Is this going to be a problem for the original bug
Tom Sepez 2012/08/28 20:17:41 Yep. And my original patch tried to address this,
Charlie Reis 2012/08/28 21:48:21 What's the plan for fixing that case? Do we need
Tom Sepez 2012/08/28 22:46:58 I'd assumed it was covered by the existing TODO().
114 return false; 119 return false;
115 } 120 }
116 121
117 url_canon::Replacements<char> replacements; 122 url_canon::Replacements<char> replacements;
118 replacements.ClearRef(); 123 replacements.ClearRef();
119 return existing_url.ReplaceComponents(replacements) == 124 return existing_url.ReplaceComponents(replacements) ==
120 new_url.ReplaceComponents(replacements); 125 new_url.ReplaceComponents(replacements);
121 } 126 }
122 127
123 // Determines whether or not we should be carrying over a user agent override 128 // Determines whether or not we should be carrying over a user agent override
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 DCHECK(pending_entry_index_ == -1 || pending_entry_->site_instance()); 682 DCHECK(pending_entry_index_ == -1 || pending_entry_->site_instance());
678 683
679 // If we are doing a cross-site reload, we need to replace the existing 684 // If we are doing a cross-site reload, we need to replace the existing
680 // navigation entry, not add another entry to the history. This has the side 685 // navigation entry, not add another entry to the history. This has the side
681 // effect of removing forward browsing history, if such existed. 686 // effect of removing forward browsing history, if such existed.
682 if (pending_entry_ != NULL) { 687 if (pending_entry_ != NULL) {
683 details->did_replace_entry = pending_entry_->is_cross_site_reload(); 688 details->did_replace_entry = pending_entry_->is_cross_site_reload();
684 } 689 }
685 690
686 // is_in_page must be computed before the entry gets committed. 691 // is_in_page must be computed before the entry gets committed.
687 details->is_in_page = IsURLInPageNavigation(params.url); 692 details->is_in_page = IsURLInPageNavigation(
693 params.url, params.was_within_same_page);
688 694
689 // Do navigation-type specific actions. These will make and commit an entry. 695 // Do navigation-type specific actions. These will make and commit an entry.
690 details->type = ClassifyNavigation(params); 696 details->type = ClassifyNavigation(params);
691 697
692 switch (details->type) { 698 switch (details->type) {
693 case content::NAVIGATION_TYPE_NEW_PAGE: 699 case content::NAVIGATION_TYPE_NEW_PAGE:
694 RendererDidNavigateToNewPage(params, &(details->did_replace_entry)); 700 RendererDidNavigateToNewPage(params, &(details->did_replace_entry));
695 break; 701 break;
696 case content::NAVIGATION_TYPE_EXISTING_PAGE: 702 case content::NAVIGATION_TYPE_EXISTING_PAGE:
697 RendererDidNavigateToExistingPage(params); 703 RendererDidNavigateToExistingPage(params);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 // this). If this matches the last committed entry, we want to just ignore 870 // this). If this matches the last committed entry, we want to just ignore
865 // the pending entry and go back to where we were (the "existing entry"). 871 // the pending entry and go back to where we were (the "existing entry").
866 return content::NAVIGATION_TYPE_SAME_PAGE; 872 return content::NAVIGATION_TYPE_SAME_PAGE;
867 } 873 }
868 874
869 // Any toplevel navigations with the same base (minus the reference fragment) 875 // Any toplevel navigations with the same base (minus the reference fragment)
870 // are in-page navigations. We weeded out subframe navigations above. Most of 876 // are in-page navigations. We weeded out subframe navigations above. Most of
871 // the time this doesn't matter since WebKit doesn't tell us about subframe 877 // the time this doesn't matter since WebKit doesn't tell us about subframe
872 // navigations that don't actually navigate, but it can happen when there is 878 // navigations that don't actually navigate, but it can happen when there is
873 // an encoding override (it always sends a navigation request). 879 // an encoding override (it always sends a navigation request).
874 if (AreURLsInPageNavigation(existing_entry->GetURL(), params.url)) 880 if (AreURLsInPageNavigation(existing_entry->GetURL(), params.url, false))
875 return content::NAVIGATION_TYPE_IN_PAGE; 881 return content::NAVIGATION_TYPE_IN_PAGE;
876 882
877 // Since we weeded out "new" navigations above, we know this is an existing 883 // Since we weeded out "new" navigations above, we know this is an existing
878 // (back/forward) navigation. 884 // (back/forward) navigation.
879 return content::NAVIGATION_TYPE_EXISTING_PAGE; 885 return content::NAVIGATION_TYPE_EXISTING_PAGE;
880 } 886 }
881 887
882 bool NavigationControllerImpl::IsRedirect( 888 bool NavigationControllerImpl::IsRedirect(
883 const ViewHostMsg_FrameNavigate_Params& params) { 889 const ViewHostMsg_FrameNavigate_Params& params) {
884 // For main frame transition, we judge by params.transition. 890 // For main frame transition, we judge by params.transition.
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 1078
1073 int NavigationControllerImpl::GetIndexOfEntry( 1079 int NavigationControllerImpl::GetIndexOfEntry(
1074 const NavigationEntryImpl* entry) const { 1080 const NavigationEntryImpl* entry) const {
1075 const NavigationEntries::const_iterator i(std::find( 1081 const NavigationEntries::const_iterator i(std::find(
1076 entries_.begin(), 1082 entries_.begin(),
1077 entries_.end(), 1083 entries_.end(),
1078 entry)); 1084 entry));
1079 return (i == entries_.end()) ? -1 : static_cast<int>(i - entries_.begin()); 1085 return (i == entries_.end()) ? -1 : static_cast<int>(i - entries_.begin());
1080 } 1086 }
1081 1087
1082 bool NavigationControllerImpl::IsURLInPageNavigation(const GURL& url) const { 1088 bool NavigationControllerImpl::IsURLInPageNavigation(
1089 const GURL& url, bool renderer_says_in_page) const {
1083 NavigationEntry* last_committed = GetLastCommittedEntry(); 1090 NavigationEntry* last_committed = GetLastCommittedEntry();
1084 if (!last_committed) 1091 return last_committed && AreURLsInPageNavigation(
1085 return false; 1092 last_committed->GetURL(), url, renderer_says_in_page);
1086 return AreURLsInPageNavigation(last_committed->GetURL(), url);
1087 } 1093 }
1088 1094
1089 void NavigationControllerImpl::CopyStateFrom( 1095 void NavigationControllerImpl::CopyStateFrom(
1090 const NavigationController& temp) { 1096 const NavigationController& temp) {
1091 const NavigationControllerImpl& source = 1097 const NavigationControllerImpl& source =
1092 static_cast<const NavigationControllerImpl&>(temp); 1098 static_cast<const NavigationControllerImpl&>(temp);
1093 // Verify that we look new. 1099 // Verify that we look new.
1094 DCHECK(GetEntryCount() == 0 && !GetPendingEntry()); 1100 DCHECK(GetEntryCount() == 0 && !GetPendingEntry());
1095 1101
1096 if (source.GetEntryCount() == 0) 1102 if (source.GetEntryCount() == 0)
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 for (int i = 0; i < max_index; i++) { 1553 for (int i = 0; i < max_index; i++) {
1548 // When cloning a tab, copy all entries except interstitial pages 1554 // When cloning a tab, copy all entries except interstitial pages
1549 if (source.entries_[i].get()->GetPageType() != 1555 if (source.entries_[i].get()->GetPageType() !=
1550 content::PAGE_TYPE_INTERSTITIAL) { 1556 content::PAGE_TYPE_INTERSTITIAL) {
1551 entries_.insert(entries_.begin() + insert_index++, 1557 entries_.insert(entries_.begin() + insert_index++,
1552 linked_ptr<NavigationEntryImpl>( 1558 linked_ptr<NavigationEntryImpl>(
1553 new NavigationEntryImpl(*source.entries_[i]))); 1559 new NavigationEntryImpl(*source.entries_[i])));
1554 } 1560 }
1555 } 1561 }
1556 } 1562 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698