cros: Fix startup page focus
- Move RestoreFocus from BrowserView::Show to OnWidgetActivationChanged
to do it when the browser window is activated;
- Remove SetInitialFocus in SessionRestoreImpl::ShowBrowser since
BrowserView change should do that as part of RestoreFocus;
- Also remove the debugging code for SetInitialFocus crash
under SessionRestoreImpl::RestoreTab since ShowBrowser no longer
calls SetInitialFocus;
Bug: 859257, 850626, 908524
Change-Id: Ia24e4d68e1386de84765f914bb75319c9887dfd1
Reviewed-on: https://chromium-review.googlesource.com/c/1313728
Commit-Queue: Xiyuan Xia <[email protected]>
Reviewed-by: Charlie Reis <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Cr-Commit-Position: refs/heads/master@{#614364}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 1b57097..ab9d125 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4100,28 +4100,9 @@
}
bool WebContentsImpl::FocusLocationBarByDefault() {
- // When the browser is started with about:blank as the startup URL, focus
- // the location bar (which will also select its contents) so people can
- // simply begin typing to navigate elsewhere.
- //
- // We need to be careful not to trigger this for anything other than the
- // startup navigation. In particular, if we allow an attacker to open a
- // popup to about:blank, then navigate, focusing the Omnibox will cause the
- // end of the new URL to be scrolled into view instead of the start,
- // allowing the attacker to spoof other URLs. The conditions checked here
- // are all aimed at ensuring no such attacker-controlled navigation can
- // trigger this.
- //
- // Note that we check the pending entry instead of the visible one; for the
- // startup URL case these are the same, but for the attacker-controlled
- // navigation case the visible entry is the committed "about:blank" URL and
- // the pending entry is the problematic navigation elsewhere.
- NavigationEntryImpl* entry = controller_.GetPendingEntry();
- if (controller_.IsInitialNavigation() && entry &&
- !entry->is_renderer_initiated() &&
- entry->GetURL() == url::kAboutBlankURL) {
+ if (should_focus_location_bar_by_default_)
return true;
- }
+
return delegate_ && delegate_->ShouldFocusLocationBarByDefault(this);
}
@@ -4138,6 +4119,24 @@
if (display_cutout_host_impl_)
display_cutout_host_impl_->DidStartNavigation(navigation_handle);
+
+ if (navigation_handle->IsInMainFrame()) {
+ // When the browser is started with about:blank as the startup URL, focus
+ // the location bar (which will also select its contents) so people can
+ // simply begin typing to navigate elsewhere.
+ //
+ // We need to be careful not to trigger this for anything other than the
+ // startup navigation. In particular, if we allow an attacker to open a
+ // popup to about:blank, then navigate, focusing the Omnibox will cause the
+ // end of the new URL to be scrolled into view instead of the start,
+ // allowing the attacker to spoof other URLs. The conditions checked here
+ // are all aimed at ensuring no such attacker-controlled navigation can
+ // trigger this.
+ should_focus_location_bar_by_default_ =
+ controller_.IsInitialNavigation() &&
+ !navigation_handle->IsRendererInitiated() &&
+ navigation_handle->GetURL() == url::kAboutBlankURL;
+ }
}
void WebContentsImpl::DidRedirectNavigation(
@@ -4233,6 +4232,13 @@
ukm::SourceIdType::NAVIGATION_ID);
}
}
+
+ // If we didn't end up on about:blank after setting this in DidStartNavigation
+ // then don't focus the location bar.
+ if (should_focus_location_bar_by_default_ &&
+ navigation_handle->GetURL() != url::kAboutBlankURL) {
+ should_focus_location_bar_by_default_ = false;
+ }
}
void WebContentsImpl::DidFailLoadWithError(
@@ -5614,6 +5620,10 @@
LoadingStateChanged(frame_tree_node->IsMainFrame() && to_different_document,
false, nullptr);
+ // Reset the focus state from DidStartNavigation to false if a new load starts
+ // afterward, in case loading logic triggers a FocusLocationBarByDefault call.
+ should_focus_location_bar_by_default_ = false;
+
// Notify accessibility that the user is navigating away from the
// current document.
//