Navigation: Extracting UpdateHistory in its own function
This CL aims to provide a separate function that handles history update
during the commit process. Preparatory work for
https://chromium-review.googlesource.com/c/chromium/src/+/789857
BUG=784904
Change-Id: Ia62eb3bad4f2a46aa19cdb1cf3d19522268e7182
Reviewed-on: https://chromium-review.googlesource.com/852454
Commit-Queue: Arthur Hemery <[email protected]>
Reviewed-by: Camille Lamy <[email protected]>
Cr-Commit-Position: refs/heads/master@{#527603}
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 4e3a7491..29d906e8 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4221,13 +4221,6 @@
// before updating the current history item.
SendUpdateState();
- // Update the current history item for this frame.
- current_history_item_ = item;
- // Note: don't reference |item| after this point, as its value may not match
- // |current_history_item_|.
- current_history_item_.SetTarget(
- blink::WebString::FromUTF8(unique_name_helper_.value()));
-
InternalDocumentStateData* internal_data =
InternalDocumentStateData::FromDocumentState(document_state);
@@ -4236,30 +4229,6 @@
internal_data->set_must_reset_scroll_and_scale_state(false);
}
- const RequestNavigationParams& request_params =
- navigation_state->request_params();
- bool is_new_navigation = commit_type == blink::kWebStandardCommit;
- if (is_new_navigation) {
- DCHECK(!navigation_state->common_params().should_replace_current_entry ||
- render_view_->history_list_length_ > 0);
- if (!navigation_state->common_params().should_replace_current_entry) {
- // Advance our offset in session history, applying the length limit.
- // There is now no forward history.
- render_view_->history_list_offset_++;
- if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries)
- render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1;
- render_view_->history_list_length_ =
- render_view_->history_list_offset_ + 1;
- }
- } else {
- if (request_params.nav_entry_id != 0 &&
- !request_params.intended_as_new_entry) {
- // This is a successful session history navigation!
- render_view_->history_list_offset_ =
- request_params.pending_history_list_offset;
- }
- }
-
service_manager::mojom::InterfaceProviderRequest
remote_interface_provider_request;
if (!navigation_state->WasWithinSameDocument() &&
@@ -4297,8 +4266,7 @@
}
}
- if (commit_type == blink::WebHistoryCommitType::kWebBackForwardCommit)
- render_view_->DidCommitProvisionalHistoryLoad();
+ bool is_new_navigation = UpdateNavigationHistory(item, commit_type);
for (auto& observer : render_view_->observers_)
observer.DidCommitProvisionalLoad(frame_, is_new_navigation);
@@ -5593,6 +5561,47 @@
}
}
+bool RenderFrameImpl::UpdateNavigationHistory(
+ const blink::WebHistoryItem& item,
+ blink::WebHistoryCommitType commit_type) {
+ DocumentState* document_state =
+ DocumentState::FromDocumentLoader(frame_->GetDocumentLoader());
+ NavigationStateImpl* navigation_state =
+ static_cast<NavigationStateImpl*>(document_state->navigation_state());
+ const RequestNavigationParams& request_params =
+ navigation_state->request_params();
+
+ // Update the current history item for this frame.
+ current_history_item_ = item;
+ // Note: don't reference |item| after this point, as its value may not match
+ // |current_history_item_|.
+ current_history_item_.SetTarget(
+ blink::WebString::FromUTF8(unique_name_helper_.value()));
+ bool is_new_navigation = commit_type == blink::kWebStandardCommit;
+ if (is_new_navigation) {
+ DCHECK(!navigation_state->common_params().should_replace_current_entry ||
+ render_view_->history_list_length_ > 0);
+ if (!navigation_state->common_params().should_replace_current_entry) {
+ // Advance our offset in session history, applying the length limit.
+ // There is now no forward history.
+ render_view_->history_list_offset_++;
+ if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries)
+ render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1;
+ render_view_->history_list_length_ =
+ render_view_->history_list_offset_ + 1;
+ }
+ } else if (request_params.nav_entry_id != 0 &&
+ !request_params.intended_as_new_entry) {
+ render_view_->history_list_offset_ =
+ navigation_state->request_params().pending_history_list_offset;
+ }
+
+ if (commit_type == blink::WebHistoryCommitType::kWebBackForwardCommit)
+ render_view_->DidCommitProvisionalHistoryLoad();
+
+ return is_new_navigation;
+}
+
bool RenderFrameImpl::SwapIn() {
CHECK_NE(proxy_routing_id_, MSG_ROUTING_NONE);
CHECK(!in_frame_tree_);
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 2114e45..5030ef9 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -1266,6 +1266,13 @@
// Updates the Zoom level of the render view to match current content.
void UpdateZoomLevel();
+ // Updates the navigation history depending on the passed parameters.
+ // This could result either in the creation of a new entry or a modification
+ // of the current entry or nothing. If a new entry was created,
+ // returns true, false otherwise.
+ bool UpdateNavigationHistory(const blink::WebHistoryItem& item,
+ blink::WebHistoryCommitType commit_type);
+
// Stores the WebLocalFrame we are associated with. This is null from the
// constructor until BindToFrame() is called, and it is null after
// FrameDetached() is called until destruction (which is asynchronous in the