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

Side by Side Diff: content/renderer/history_controller.cc

Issue 1892273003: Fix HistoryEntry corruption when commit isn't for provisional entry (try #2). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2661
Patch Set: Created 4 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 } 180 }
181 181
182 void HistoryController::UpdateForCommit(RenderFrameImpl* frame, 182 void HistoryController::UpdateForCommit(RenderFrameImpl* frame,
183 const WebHistoryItem& item, 183 const WebHistoryItem& item,
184 WebHistoryCommitType commit_type, 184 WebHistoryCommitType commit_type,
185 bool navigation_within_page) { 185 bool navigation_within_page) {
186 switch (commit_type) { 186 switch (commit_type) {
187 case blink::WebBackForwardCommit: 187 case blink::WebBackForwardCommit:
188 if (!provisional_entry_) 188 if (!provisional_entry_)
189 return; 189 return;
190 current_entry_.reset(provisional_entry_.release()); 190
191 // If the current entry is null, this must be a main frame commit.
192 DCHECK(current_entry_ || frame->IsMainFrame());
193
194 // Commit the provisional entry, but only if it is a plausible transition.
195 // Do not commit it if the navigation is in a subframe and the provisional
196 // entry's main frame item does not match the current entry's main frame,
197 // which can happen if multiple forward navigations occur. In that case,
198 // committing the provisional entry would corrupt it, leading to a URL
199 // spoof. See https://crbug.com/597322. (Note that the race in this bug
200 // does not affect main frame navigations, only navigations in subframes.)
201 //
202 // Note that we cannot compare the provisional entry against |item|, since
203 // |item| may have redirected to a different URL and ISN. We also cannot
204 // compare against the main frame's URL, since that may have changed due
205 // to a replaceState. (Even origin can change on replaceState in certain
206 // modes.)
207 //
208 // It would be safe to additionally check the ISNs of all parent frames
209 // (and not just the root), but that is less critical because it won't
210 // lead to a URL spoof.
211 if (frame->IsMainFrame() ||
212 current_entry_->root().itemSequenceNumber() ==
213 provisional_entry_->root().itemSequenceNumber()) {
214 current_entry_.reset(provisional_entry_.release());
215 }
216
217 // We're guaranteed to have a current entry now.
218 DCHECK(current_entry_);
219
191 if (HistoryEntry::HistoryNode* node = 220 if (HistoryEntry::HistoryNode* node =
192 current_entry_->GetHistoryNodeForFrame(frame)) { 221 current_entry_->GetHistoryNodeForFrame(frame)) {
193 node->set_item(item); 222 node->set_item(item);
194 } 223 }
195 break; 224 break;
196 case blink::WebStandardCommit: 225 case blink::WebStandardCommit:
197 CreateNewBackForwardItem(frame, item, navigation_within_page); 226 CreateNewBackForwardItem(frame, item, navigation_within_page);
198 break; 227 break;
199 case blink::WebInitialCommitInChildFrame: 228 case blink::WebInitialCommitInChildFrame:
200 UpdateForInitialLoadInChildFrame(frame, item); 229 UpdateForInitialLoadInChildFrame(frame, item);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 bool clone_children_of_target) { 277 bool clone_children_of_target) {
249 if (!current_entry_) { 278 if (!current_entry_) {
250 current_entry_.reset(new HistoryEntry(new_item)); 279 current_entry_.reset(new HistoryEntry(new_item));
251 } else { 280 } else {
252 current_entry_.reset(current_entry_->CloneAndReplace( 281 current_entry_.reset(current_entry_->CloneAndReplace(
253 new_item, clone_children_of_target, target_frame, render_view_)); 282 new_item, clone_children_of_target, target_frame, render_view_));
254 } 283 }
255 } 284 }
256 285
257 } // namespace content 286 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698