Navigation: Factoring state update during commit in RenderFrame
This CL aims to factor a function that does pre commit update
of the navigation state in the RenderFrameImpl. Preparatory work for
https://chromium-review.googlesource.com/c/chromium/src/+/789857
BUG=784904
Change-Id: I9d131ef23df6c48b3cb35e2136d52c7a235965d2
Reviewed-on: https://chromium-review.googlesource.com/854133
Commit-Queue: Arthur Hemery <[email protected]>
Reviewed-by: Camille Lamy <[email protected]>
Cr-Commit-Position: refs/heads/master@{#528706}
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 13d894ce..e6392b7 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -4241,14 +4241,6 @@
// before updating the current history item.
SendUpdateState();
- InternalDocumentStateData* internal_data =
- InternalDocumentStateData::FromDocumentState(document_state);
-
- if (internal_data->must_reset_scroll_and_scale_state()) {
- render_view_->webview()->ResetScrollAndScaleState();
- internal_data->set_must_reset_scroll_and_scale_state(false);
- }
-
service_manager::mojom::InterfaceProviderRequest
remote_interface_provider_request;
if (!navigation_state->WasWithinSameDocument() &&
@@ -4286,11 +4278,6 @@
}
}
- bool is_new_navigation = UpdateNavigationHistory(item, commit_type);
-
- NotifyObserversOfNavigationCommit(is_new_navigation,
- navigation_state->WasWithinSameDocument());
-
// Notify the MediaPermissionDispatcher that its connection will be closed
// due to a navigation to a different document.
if (media_permission_dispatcher_ &&
@@ -4298,24 +4285,19 @@
media_permission_dispatcher_->OnNavigation();
}
- if (!frame_->Parent()) { // Only for top frames.
- RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
- if (render_thread_impl) { // Can be NULL in tests.
- render_thread_impl->histogram_customizer()->
- RenderViewNavigatedToHost(GURL(GetLoadingUrl()).host(),
- RenderView::GetRenderViewCount());
- }
- }
+ UpdateStateForCommit(item, commit_type);
- // Remember that we've already processed this request, so we don't update
- // the session history again. We do this regardless of whether this is
- // a session history navigation, because if we attempted a session history
- // navigation without valid HistoryItem state, WebCore will think it is a
- // new navigation.
- navigation_state->set_request_committed(true);
+ // This invocation must precede any calls to allowScripts(), allowImages(), or
+ // allowPlugins() for the new page. This ensures that when these functions
+ // send ViewHostMsg_ContentBlocked messages, those arrive after the browser
+ // process has already been informed of the provisional load committing.
+ GetFrameHost()->DidCommitProvisionalLoad(
+ MakeDidCommitProvisionalLoadParams(commit_type),
+ std::move(remote_interface_provider_request));
- SendDidCommitProvisionalLoad(frame_, commit_type,
- std::move(remote_interface_provider_request));
+ // If we end up reusing this WebRequest (for example, due to a #ref click),
+ // we don't want the transition type to persist. Just clear it.
+ navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK);
// Check whether we have new encoding name.
UpdateEncoding(frame_, frame_->View()->PageEncoding().Utf8());
@@ -5329,49 +5311,6 @@
: RenderFrameImpl::FromWebFrame(frame_->LocalRoot());
}
-// Tell the embedding application that the URL of the active page has changed.
-void RenderFrameImpl::SendDidCommitProvisionalLoad(
- blink::WebLocalFrame* frame,
- blink::WebHistoryCommitType commit_type,
- service_manager::mojom::InterfaceProviderRequest
- remote_interface_provider_request) {
- DCHECK_EQ(frame_, frame);
-
- DocumentState* document_state =
- DocumentState::FromDocumentLoader(frame_->GetDocumentLoader());
- NavigationStateImpl* navigation_state =
- static_cast<NavigationStateImpl*>(document_state->navigation_state());
-
- // Set the correct engagement level on the frame, and wipe the cached origin
- // so this will not be reused accidentally.
- if (url::Origin(frame_->GetSecurityOrigin()) == engagement_level_.first) {
- frame_->SetEngagementLevel(engagement_level_.second);
- engagement_level_.first = url::Origin();
- }
-
- // Set the correct high media engagement bit on the frame, and wipe the cached
- // origin so this will not be reused accidentally.
- if (url::Origin(frame_->GetSecurityOrigin()) ==
- high_media_engagement_origin_) {
- frame_->SetHasHighMediaEngagement(true);
- high_media_engagement_origin_ = url::Origin();
- }
-
- UpdateZoomLevel();
-
- // This invocation must precede any calls to allowScripts(), allowImages(), or
- // allowPlugins() for the new page. This ensures that when these functions
- // send ViewHostMsg_ContentBlocked messages, those arrive after the browser
- // process has already been informed of the provisional load committing.
- GetFrameHost()->DidCommitProvisionalLoad(
- MakeDidCommitProvisionalLoadParams(commit_type),
- std::move(remote_interface_provider_request));
-
- // If we end up reusing this WebRequest (for example, due to a #ref click),
- // we don't want the transition type to persist. Just clear it.
- navigation_state->set_transition_type(ui::PAGE_TRANSITION_LINK);
-}
-
std::unique_ptr<FrameHostMsg_DidCommitProvisionalLoad_Params>
RenderFrameImpl::MakeDidCommitProvisionalLoadParams(
blink::WebHistoryCommitType commit_type) {
@@ -5636,6 +5575,57 @@
}
}
+void RenderFrameImpl::UpdateStateForCommit(
+ 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());
+ InternalDocumentStateData* internal_data =
+ InternalDocumentStateData::FromDocumentState(document_state);
+
+ bool is_new_navigation = UpdateNavigationHistory(item, commit_type);
+ NotifyObserversOfNavigationCommit(is_new_navigation,
+ navigation_state->WasWithinSameDocument());
+
+ if (internal_data->must_reset_scroll_and_scale_state()) {
+ render_view_->webview()->ResetScrollAndScaleState();
+ internal_data->set_must_reset_scroll_and_scale_state(false);
+ }
+ UpdateZoomLevel();
+
+ if (!frame_->Parent()) { // Only for top frames.
+ RenderThreadImpl* render_thread_impl = RenderThreadImpl::current();
+ if (render_thread_impl) { // Can be NULL in tests.
+ render_thread_impl->histogram_customizer()->RenderViewNavigatedToHost(
+ GURL(GetLoadingUrl()).host(), RenderView::GetRenderViewCount());
+ }
+ }
+
+ // Remember that we've already processed this request, so we don't update
+ // the session history again. We do this regardless of whether this is
+ // a session history navigation, because if we attempted a session history
+ // navigation without valid HistoryItem state, WebCore will think it is a
+ // new navigation.
+ navigation_state->set_request_committed(true);
+
+ // Set the correct engagement level on the frame, and wipe the cached origin
+ // so this will not be reused accidentally.
+ if (url::Origin(frame_->GetSecurityOrigin()) == engagement_level_.first) {
+ frame_->SetEngagementLevel(engagement_level_.second);
+ engagement_level_.first = url::Origin();
+ }
+
+ // Set the correct high media engagement bit on the frame, and wipe the cached
+ // origin so this will not be reused accidentally.
+ if (url::Origin(frame_->GetSecurityOrigin()) ==
+ high_media_engagement_origin_) {
+ frame_->SetHasHighMediaEngagement(true);
+ high_media_engagement_origin_ = url::Origin();
+ }
+}
+
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 c11796d6..ce667b31 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -955,13 +955,6 @@
bool IsLocalRoot() const;
const RenderFrameImpl* GetLocalRoot() const;
- // Builds and sends DidCommitProvisionalLoad to the host.
- void SendDidCommitProvisionalLoad(
- blink::WebLocalFrame* frame,
- blink::WebHistoryCommitType commit_type,
- service_manager::mojom::InterfaceProviderRequest
- remote_interface_provider_request);
-
// Swaps the current frame into the frame tree, replacing the
// RenderFrameProxy it is associated with. Return value indicates whether
// the swap operation succeeded. This should only be used for provisional
@@ -1288,6 +1281,11 @@
void NotifyObserversOfNavigationCommit(bool is_new_navigation,
bool is_same_document);
+ // Updates the internal state following a navigation commit. This should be
+ // called before notifying the FrameHost of the commit.
+ void UpdateStateForCommit(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