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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1406103005: Preserve page-level focus for subframe cross-process navigations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@focus-page
Patch Set: Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 #include "content/browser/frame_host/render_frame_host_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 2143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2154 // aren't crossing process boundaries. If so, we just needed to handle the Web 2154 // aren't crossing process boundaries. If so, we just needed to handle the Web
2155 // UI committing above and we're done. 2155 // UI committing above and we're done.
2156 if (!pending_render_frame_host_ && !speculative_render_frame_host_) { 2156 if (!pending_render_frame_host_ && !speculative_render_frame_host_) {
2157 if (will_focus_location_bar) 2157 if (will_focus_location_bar)
2158 delegate_->SetFocusToLocationBar(false); 2158 delegate_->SetFocusToLocationBar(false);
2159 return; 2159 return;
2160 } 2160 }
2161 2161
2162 // Remember if the page was focused so we can focus the new renderer in 2162 // Remember if the page was focused so we can focus the new renderer in
2163 // that case. 2163 // that case.
2164 bool focus_render_view = !will_focus_location_bar && 2164 RenderWidgetHostView* root_view = frame_tree_node_->frame_tree()
2165 render_frame_host_->GetView() && 2165 ->root()
2166 render_frame_host_->GetView()->HasFocus(); 2166 ->render_manager()
alexmos 2015/10/22 21:33:40 For subframes, this routed to RWHVChildFrame, whic
Charlie Reis 2015/10/23 21:41:52 That sounds like a better change to me, since anyo
alexmos 2015/10/24 00:41:43 I went ahead and did that to see what it'll look l
2167 ->GetRenderWidgetHostView();
2168 bool focus_render_view =
2169 !will_focus_location_bar && root_view && root_view->HasFocus();
2167 2170
2168 bool is_main_frame = frame_tree_node_->IsMainFrame(); 2171 bool is_main_frame = frame_tree_node_->IsMainFrame();
2169 2172
2170 // Swap in the pending or speculative frame and make it active. Also ensure 2173 // Swap in the pending or speculative frame and make it active. Also ensure
2171 // the FrameTree stays in sync. 2174 // the FrameTree stays in sync.
2172 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; 2175 scoped_ptr<RenderFrameHostImpl> old_render_frame_host;
2173 if (!browser_side_navigation) { 2176 if (!browser_side_navigation) {
2174 DCHECK(!speculative_render_frame_host_); 2177 DCHECK(!speculative_render_frame_host_);
2175 old_render_frame_host = 2178 old_render_frame_host =
2176 SetRenderFrameHost(pending_render_frame_host_.Pass()); 2179 SetRenderFrameHost(pending_render_frame_host_.Pass());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2210 old_render_frame_host->render_view_host()->GetWidget()->GetView()) { 2213 old_render_frame_host->render_view_host()->GetWidget()->GetView()) {
2211 old_render_frame_host->render_view_host()->GetWidget()->GetView()->Hide(); 2214 old_render_frame_host->render_view_host()->GetWidget()->GetView()->Hide();
2212 } 2215 }
2213 2216
2214 // Make sure the size is up to date. (Fix for bug 1079768.) 2217 // Make sure the size is up to date. (Fix for bug 1079768.)
2215 delegate_->UpdateRenderViewSizeForRenderManager(); 2218 delegate_->UpdateRenderViewSizeForRenderManager();
2216 2219
2217 if (will_focus_location_bar) { 2220 if (will_focus_location_bar) {
2218 delegate_->SetFocusToLocationBar(false); 2221 delegate_->SetFocusToLocationBar(false);
2219 } else if (focus_render_view && render_frame_host_->GetView()) { 2222 } else if (focus_render_view && render_frame_host_->GetView()) {
2220 render_frame_host_->GetView()->Focus(); 2223 if (is_main_frame) {
2224 render_frame_host_->GetView()->Focus();
2225 } else {
2226 // The main frame's view is already focused, but we need to set
2227 // page-level focus in the subframe's renderer.
2228 frame_tree_node_->frame_tree()->SetPageFocus(
2229 render_frame_host_->GetSiteInstance(), true);
2230 }
2221 } 2231 }
2222 2232
2223 // Notify that we've swapped RenderFrameHosts. We do this before shutting down 2233 // Notify that we've swapped RenderFrameHosts. We do this before shutting down
2224 // the RFH so that we can clean up RendererResources related to the RFH first. 2234 // the RFH so that we can clean up RendererResources related to the RFH first.
2225 delegate_->NotifySwappedFromRenderManager( 2235 delegate_->NotifySwappedFromRenderManager(
2226 old_render_frame_host.get(), render_frame_host_.get(), is_main_frame); 2236 old_render_frame_host.get(), render_frame_host_.get(), is_main_frame);
2227 2237
2228 // The RenderViewHost keeps track of the main RenderFrameHost routing id. 2238 // The RenderViewHost keeps track of the main RenderFrameHost routing id.
2229 // If this is committing a main frame navigation, update it and set the 2239 // If this is committing a main frame navigation, update it and set the
2230 // routing id in the RenderViewHost associated with the old RenderFrameHost 2240 // routing id in the RenderViewHost associated with the old RenderFrameHost
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
2650 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) { 2660 int RenderFrameHostManager::GetOpenerRoutingID(SiteInstance* instance) {
2651 if (!frame_tree_node_->opener()) 2661 if (!frame_tree_node_->opener())
2652 return MSG_ROUTING_NONE; 2662 return MSG_ROUTING_NONE;
2653 2663
2654 return frame_tree_node_->opener() 2664 return frame_tree_node_->opener()
2655 ->render_manager() 2665 ->render_manager()
2656 ->GetRoutingIdForSiteInstance(instance); 2666 ->GetRoutingIdForSiteInstance(instance);
2657 } 2667 }
2658 2668
2659 } // namespace content 2669 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698