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

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

Issue 2889003002: Change NavigationEntry to use virtual URL in error pages for blocked navigations (Closed)
Patch Set: Add a test for reload. Created 3 years, 7 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 /* 5 /*
6 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
9 * (http://www.torchmobile.com/) 9 * (http://www.torchmobile.com/)
10 * 10 *
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 return true; 155 return true;
156 } 156 }
157 157
158 if (ui::PageTransitionCoreTypeIs(entry->GetTransitionType(), 158 if (ui::PageTransitionCoreTypeIs(entry->GetTransitionType(),
159 ui::PAGE_TRANSITION_LINK)) { 159 ui::PAGE_TRANSITION_LINK)) {
160 return true; 160 return true;
161 } 161 }
162 return false; 162 return false;
163 } 163 }
164 164
165 bool IsBlockedNavigation(net::Error error_code) {
166 switch (error_code) {
Charlie Reis 2017/05/18 22:41:46 I'm nervous about hand picking these out of net_er
nasko 2017/05/18 22:55:11 I don't think that such a distinction exists actua
167 case net::ERR_ACCESS_DENIED:
168 case net::ERR_NOT_IMPLEMENTED:
169 case net::ERR_BLOCKED_BY_CLIENT:
170 case net::ERR_BLOCKED_BY_ADMINISTRATOR:
171 case net::ERR_BLOCKED_BY_RESPONSE:
172 case net::ERR_BLOCKED_BY_XSS_AUDITOR:
173 case net::ERR_CLEARTEXT_NOT_PERMITTED:
174 case net::ERR_NETWORK_ACCESS_DENIED: // Does this mean blocked?
Charlie Reis 2017/05/18 22:41:46 I would probably remove this. Network access deni
nasko 2017/05/18 22:55:11 My goal was to pick the errors that aren't transie
175 case net::ERR_INVALID_URL:
Charlie Reis 2017/05/18 22:41:46 Should we remove this to get the test to pass, or
nasko 2017/05/18 22:55:11 I don't think the test is doing what it is expecti
Charlie Reis 2017/05/18 23:15:51 Agreed-- let's look more closely at it tomorrow.
176 case net::ERR_DISALLOWED_URL_SCHEME:
177 case net::ERR_UNSAFE_REDIRECT:
178 case net::ERR_UNSAFE_PORT:
179 return true;
180 default:
181 return false;
182 }
183 }
184
165 } // namespace 185 } // namespace
166 186
167 // NavigationControllerImpl ---------------------------------------------------- 187 // NavigationControllerImpl ----------------------------------------------------
168 188
169 const size_t kMaxEntryCountForTestingNotSet = static_cast<size_t>(-1); 189 const size_t kMaxEntryCountForTestingNotSet = static_cast<size_t>(-1);
170 190
171 // static 191 // static
172 size_t NavigationControllerImpl::max_entry_count_for_testing_ = 192 size_t NavigationControllerImpl::max_entry_count_for_testing_ =
173 kMaxEntryCountForTestingNotSet; 193 kMaxEntryCountForTestingNotSet;
174 194
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
878 case NAVIGATION_TYPE_NEW_SUBFRAME: 898 case NAVIGATION_TYPE_NEW_SUBFRAME:
879 RendererDidNavigateNewSubframe(rfh, params, details->is_same_document, 899 RendererDidNavigateNewSubframe(rfh, params, details->is_same_document,
880 details->did_replace_entry); 900 details->did_replace_entry);
881 break; 901 break;
882 case NAVIGATION_TYPE_AUTO_SUBFRAME: 902 case NAVIGATION_TYPE_AUTO_SUBFRAME:
883 if (!RendererDidNavigateAutoSubframe(rfh, params)) { 903 if (!RendererDidNavigateAutoSubframe(rfh, params)) {
884 // We don't send a notification about auto-subframe PageState during 904 // We don't send a notification about auto-subframe PageState during
885 // UpdateStateForFrame, since it looks like nothing has changed. Send 905 // UpdateStateForFrame, since it looks like nothing has changed. Send
886 // it here at commit time instead. 906 // it here at commit time instead.
887 NotifyEntryChanged(GetLastCommittedEntry()); 907 NotifyEntryChanged(GetLastCommittedEntry());
888 return false; 908 return false;
Charlie Reis 2017/05/18 22:41:46 If we later extend this fix to subframes, we'll ne
nasko 2017/05/18 22:55:11 Noted! Should we add a TODO/Note?
Charlie Reis 2017/05/18 23:15:51 Yes, maybe down on the comment you're adding for t
nasko 2017/05/19 18:30:52 Done.
889 } 909 }
890 break; 910 break;
891 case NAVIGATION_TYPE_NAV_IGNORE: 911 case NAVIGATION_TYPE_NAV_IGNORE:
892 // If a pending navigation was in progress, this canceled it. We should 912 // If a pending navigation was in progress, this canceled it. We should
893 // discard it and make sure it is removed from the URL bar. After that, 913 // discard it and make sure it is removed from the URL bar. After that,
894 // there is nothing we can do with this navigation, so we just return to 914 // there is nothing we can do with this navigation, so we just return to
895 // the caller that nothing has happened. 915 // the caller that nothing has happened.
896 if (pending_entry_) { 916 if (pending_entry_) {
897 DiscardNonCommittedEntries(); 917 DiscardNonCommittedEntries();
898 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_URL); 918 delegate_->NotifyNavigationStateChanged(INVALIDATE_TYPE_URL);
(...skipping 27 matching lines...) Expand all
926 FrameNavigationEntry* frame_entry = 946 FrameNavigationEntry* frame_entry =
927 active_entry->GetFrameEntry(rfh->frame_tree_node()); 947 active_entry->GetFrameEntry(rfh->frame_tree_node());
928 // Update the frame-specific PageState and RedirectChain 948 // Update the frame-specific PageState and RedirectChain
929 // We may not find a frame_entry in some cases; ignore the PageState if so. 949 // We may not find a frame_entry in some cases; ignore the PageState if so.
930 // TODO(creis): Remove the "if" once https://crbug.com/522193 is fixed. 950 // TODO(creis): Remove the "if" once https://crbug.com/522193 is fixed.
931 if (frame_entry) { 951 if (frame_entry) {
932 frame_entry->SetPageState(params.page_state); 952 frame_entry->SetPageState(params.page_state);
933 frame_entry->set_redirect_chain(params.redirects); 953 frame_entry->set_redirect_chain(params.redirects);
934 } 954 }
935 955
956 // When a navigation in the main frame is blocked, it will display an error
957 // page. To avoid committing the blocked URL in back/forward/reload
958 // navigations, ensure the underlying URL is safe to load and preserve the
959 // UX by setting the blocked URL as the virtual URL on |active_entry|. To
960 // ensure the renderer process doesn't also navigate there, overwrite the
961 // PageState with a new one.
Charlie Reis 2017/05/18 22:41:46 Sounds good. Slight rephrase: ... To avoid loadi
nasko 2017/05/18 22:55:11 Done.
962 if (!rfh->GetParent() &&
963 IsBlockedNavigation(navigation_handle->GetNetErrorCode())) {
964 DCHECK(params.url_is_unreachable);
Charlie Reis 2017/05/18 22:41:46 Heh, I have some mixed feelings here. We generall
nasko 2017/05/18 22:55:11 I wanted it mainly for discovering potential issue
965 active_entry->SetURL(GURL(url::kAboutBlankURL));
966 active_entry->SetVirtualURL(params.url);
967 if (frame_entry)
Charlie Reis 2017/05/18 22:41:46 nit: Needs braces.
nasko 2017/05/18 22:55:11 Done.
968 frame_entry->SetPageState(
969 PageState::CreateFromURL(active_entry->GetURL()));
970 }
971
936 // Use histogram to track memory impact of redirect chain because it's now 972 // Use histogram to track memory impact of redirect chain because it's now
937 // not cleared for committed entries. 973 // not cleared for committed entries.
938 size_t redirect_chain_size = 0; 974 size_t redirect_chain_size = 0;
939 for (size_t i = 0; i < params.redirects.size(); ++i) { 975 for (size_t i = 0; i < params.redirects.size(); ++i) {
940 redirect_chain_size += params.redirects[i].spec().length(); 976 redirect_chain_size += params.redirects[i].spec().length();
941 } 977 }
942 UMA_HISTOGRAM_COUNTS("Navigation.RedirectChainSize", redirect_chain_size); 978 UMA_HISTOGRAM_COUNTS("Navigation.RedirectChainSize", redirect_chain_size);
943 979
944 // Once it is committed, we no longer need to track several pieces of state on 980 // Once it is committed, we no longer need to track several pieces of state on
945 // the entry. 981 // the entry.
(...skipping 1247 matching lines...) Expand 10 before | Expand all | Expand 10 after
2193 DCHECK(pending_entry_index_ == -1 || 2229 DCHECK(pending_entry_index_ == -1 ||
2194 pending_entry_ == GetEntryAtIndex(pending_entry_index_)); 2230 pending_entry_ == GetEntryAtIndex(pending_entry_index_));
2195 } 2231 }
2196 2232
2197 void NavigationControllerImpl::SetGetTimestampCallbackForTest( 2233 void NavigationControllerImpl::SetGetTimestampCallbackForTest(
2198 const base::Callback<base::Time()>& get_timestamp_callback) { 2234 const base::Callback<base::Time()>& get_timestamp_callback) {
2199 get_timestamp_callback_ = get_timestamp_callback; 2235 get_timestamp_callback_ = get_timestamp_callback;
2200 } 2236 }
2201 2237
2202 } // namespace content 2238 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698