| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |