| OLD | NEW |
| 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_view_host_manager.h" | 5 #include "content/browser/frame_host/render_frame_host_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "content/browser/child_process_security_policy_impl.h" | 12 #include "content/browser/child_process_security_policy_impl.h" |
| 13 #include "content/browser/devtools/render_view_devtools_agent_host.h" | 13 #include "content/browser/devtools/render_view_devtools_agent_host.h" |
| 14 #include "content/browser/frame_host/interstitial_page_impl.h" | 14 #include "content/browser/frame_host/interstitial_page_impl.h" |
| 15 #include "content/browser/frame_host/navigation_controller_impl.h" | 15 #include "content/browser/frame_host/navigation_controller_impl.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 26 #include "content/public/browser/notification_service.h" | 26 #include "content/public/browser/notification_service.h" |
| 27 #include "content/public/browser/notification_types.h" | 27 #include "content/public/browser/notification_types.h" |
| 28 #include "content/public/browser/render_widget_host_iterator.h" | 28 #include "content/public/browser/render_widget_host_iterator.h" |
| 29 #include "content/public/browser/user_metrics.h" | 29 #include "content/public/browser/user_metrics.h" |
| 30 #include "content/public/browser/web_ui_controller.h" | 30 #include "content/public/browser/web_ui_controller.h" |
| 31 #include "content/public/common/content_switches.h" | 31 #include "content/public/common/content_switches.h" |
| 32 #include "content/public/common/url_constants.h" | 32 #include "content/public/common/url_constants.h" |
| 33 | 33 |
| 34 namespace content { | 34 namespace content { |
| 35 | 35 |
| 36 RenderViewHostManager::PendingNavigationParams::PendingNavigationParams() | 36 RenderFrameHostManager::PendingNavigationParams::PendingNavigationParams() |
| 37 : is_transfer(false), frame_id(-1), should_replace_current_entry(false) { | 37 : is_transfer(false), frame_id(-1), should_replace_current_entry(false) { |
| 38 } | 38 } |
| 39 | 39 |
| 40 RenderViewHostManager::PendingNavigationParams::PendingNavigationParams( | 40 RenderFrameHostManager::PendingNavigationParams::PendingNavigationParams( |
| 41 const GlobalRequestID& global_request_id, | 41 const GlobalRequestID& global_request_id, |
| 42 bool is_transfer, | 42 bool is_transfer, |
| 43 const std::vector<GURL>& transfer_url_chain, | 43 const std::vector<GURL>& transfer_url_chain, |
| 44 Referrer referrer, | 44 Referrer referrer, |
| 45 PageTransition page_transition, | 45 PageTransition page_transition, |
| 46 int64 frame_id, | 46 int64 frame_id, |
| 47 bool should_replace_current_entry) | 47 bool should_replace_current_entry) |
| 48 : global_request_id(global_request_id), | 48 : global_request_id(global_request_id), |
| 49 is_transfer(is_transfer), | 49 is_transfer(is_transfer), |
| 50 transfer_url_chain(transfer_url_chain), | 50 transfer_url_chain(transfer_url_chain), |
| 51 referrer(referrer), | 51 referrer(referrer), |
| 52 page_transition(page_transition), | 52 page_transition(page_transition), |
| 53 frame_id(frame_id), | 53 frame_id(frame_id), |
| 54 should_replace_current_entry(should_replace_current_entry) { | 54 should_replace_current_entry(should_replace_current_entry) { |
| 55 } | 55 } |
| 56 | 56 |
| 57 RenderViewHostManager::PendingNavigationParams::~PendingNavigationParams() {} | 57 RenderFrameHostManager::PendingNavigationParams::~PendingNavigationParams() {} |
| 58 | 58 |
| 59 RenderViewHostManager::RenderViewHostManager( | 59 RenderFrameHostManager::RenderFrameHostManager( |
| 60 RenderViewHostDelegate* render_view_delegate, | 60 RenderViewHostDelegate* render_view_delegate, |
| 61 RenderWidgetHostDelegate* render_widget_delegate, | 61 RenderWidgetHostDelegate* render_widget_delegate, |
| 62 Delegate* delegate) | 62 Delegate* delegate) |
| 63 : delegate_(delegate), | 63 : delegate_(delegate), |
| 64 cross_navigation_pending_(false), | 64 cross_navigation_pending_(false), |
| 65 render_view_delegate_(render_view_delegate), | 65 render_view_delegate_(render_view_delegate), |
| 66 render_widget_delegate_(render_widget_delegate), | 66 render_widget_delegate_(render_widget_delegate), |
| 67 render_view_host_(NULL), | 67 render_view_host_(NULL), |
| 68 pending_render_view_host_(NULL), | 68 pending_render_view_host_(NULL), |
| 69 interstitial_page_(NULL) { | 69 interstitial_page_(NULL) { |
| 70 } | 70 } |
| 71 | 71 |
| 72 RenderViewHostManager::~RenderViewHostManager() { | 72 RenderFrameHostManager::~RenderFrameHostManager() { |
| 73 if (pending_render_view_host_) | 73 if (pending_render_view_host_) |
| 74 CancelPending(); | 74 CancelPending(); |
| 75 | 75 |
| 76 // We should always have a main RenderViewHost except in some tests. | 76 // We should always have a main RenderViewHost except in some tests. |
| 77 RenderViewHostImpl* render_view_host = render_view_host_; | 77 RenderViewHostImpl* render_view_host = render_view_host_; |
| 78 render_view_host_ = NULL; | 78 render_view_host_ = NULL; |
| 79 if (render_view_host) | 79 if (render_view_host) |
| 80 render_view_host->Shutdown(); | 80 render_view_host->Shutdown(); |
| 81 | 81 |
| 82 // Shut down any swapped out RenderViewHosts. | 82 // Shut down any swapped out RenderViewHosts. |
| 83 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); | 83 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); |
| 84 iter != swapped_out_hosts_.end(); | 84 iter != swapped_out_hosts_.end(); |
| 85 ++iter) { | 85 ++iter) { |
| 86 iter->second->Shutdown(); | 86 iter->second->Shutdown(); |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 void RenderViewHostManager::Init(BrowserContext* browser_context, | 90 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
| 91 SiteInstance* site_instance, | 91 SiteInstance* site_instance, |
| 92 int routing_id, | 92 int routing_id, |
| 93 int main_frame_routing_id) { | 93 int main_frame_routing_id) { |
| 94 // Create a RenderViewHost, once we have an instance. It is important to | 94 // Create a RenderViewHost, once we have an instance. It is important to |
| 95 // immediately give this SiteInstance to a RenderViewHost so that it is | 95 // immediately give this SiteInstance to a RenderViewHost so that it is |
| 96 // ref counted. | 96 // ref counted. |
| 97 if (!site_instance) | 97 if (!site_instance) |
| 98 site_instance = SiteInstance::Create(browser_context); | 98 site_instance = SiteInstance::Create(browser_context); |
| 99 render_view_host_ = static_cast<RenderViewHostImpl*>( | 99 render_view_host_ = static_cast<RenderViewHostImpl*>( |
| 100 RenderViewHostFactory::Create( | 100 RenderViewHostFactory::Create( |
| 101 site_instance, render_view_delegate_, render_widget_delegate_, | 101 site_instance, render_view_delegate_, render_widget_delegate_, |
| 102 routing_id, main_frame_routing_id, false, | 102 routing_id, main_frame_routing_id, false, |
| 103 delegate_->IsHidden())); | 103 delegate_->IsHidden())); |
| 104 render_view_host_->AttachToFrameTree(); | 104 render_view_host_->AttachToFrameTree(); |
| 105 | 105 |
| 106 // Keep track of renderer processes as they start to shut down or are | 106 // Keep track of renderer processes as they start to shut down or are |
| 107 // crashed/killed. | 107 // crashed/killed. |
| 108 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | 108 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 109 NotificationService::AllSources()); | 109 NotificationService::AllSources()); |
| 110 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | 110 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, |
| 111 NotificationService::AllSources()); | 111 NotificationService::AllSources()); |
| 112 } | 112 } |
| 113 | 113 |
| 114 RenderViewHostImpl* RenderViewHostManager::current_host() const { | 114 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
| 115 return render_view_host_; | 115 return render_view_host_; |
| 116 } | 116 } |
| 117 | 117 |
| 118 RenderViewHostImpl* RenderViewHostManager::pending_render_view_host() const { | 118 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { |
| 119 return pending_render_view_host_; | 119 return pending_render_view_host_; |
| 120 } | 120 } |
| 121 | 121 |
| 122 RenderWidgetHostView* RenderViewHostManager::GetRenderWidgetHostView() const { | 122 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { |
| 123 if (interstitial_page_) | 123 if (interstitial_page_) |
| 124 return interstitial_page_->GetView(); | 124 return interstitial_page_->GetView(); |
| 125 if (!render_view_host_) | 125 if (!render_view_host_) |
| 126 return NULL; | 126 return NULL; |
| 127 return render_view_host_->GetView(); | 127 return render_view_host_->GetView(); |
| 128 } | 128 } |
| 129 | 129 |
| 130 void RenderViewHostManager::SetPendingWebUI(const NavigationEntryImpl& entry) { | 130 void RenderFrameHostManager::SetPendingWebUI(const NavigationEntryImpl& entry) { |
| 131 pending_web_ui_.reset( | 131 pending_web_ui_.reset( |
| 132 delegate_->CreateWebUIForRenderManager(entry.GetURL())); | 132 delegate_->CreateWebUIForRenderManager(entry.GetURL())); |
| 133 pending_and_current_web_ui_.reset(); | 133 pending_and_current_web_ui_.reset(); |
| 134 | 134 |
| 135 // If we have assigned (zero or more) bindings to this NavigationEntry in the | 135 // If we have assigned (zero or more) bindings to this NavigationEntry in the |
| 136 // past, make sure we're not granting it different bindings than it had | 136 // past, make sure we're not granting it different bindings than it had |
| 137 // before. If so, note it and don't give it any bindings, to avoid a | 137 // before. If so, note it and don't give it any bindings, to avoid a |
| 138 // potential privilege escalation. | 138 // potential privilege escalation. |
| 139 if (pending_web_ui_.get() && | 139 if (pending_web_ui_.get() && |
| 140 entry.bindings() != NavigationEntryImpl::kInvalidBindings && | 140 entry.bindings() != NavigationEntryImpl::kInvalidBindings && |
| 141 pending_web_ui_->GetBindings() != entry.bindings()) { | 141 pending_web_ui_->GetBindings() != entry.bindings()) { |
| 142 RecordAction(UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); | 142 RecordAction(UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); |
| 143 pending_web_ui_.reset(); | 143 pending_web_ui_.reset(); |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 RenderViewHostImpl* RenderViewHostManager::Navigate( | 147 RenderViewHostImpl* RenderFrameHostManager::Navigate( |
| 148 const NavigationEntryImpl& entry) { | 148 const NavigationEntryImpl& entry) { |
| 149 TRACE_EVENT0("browser", "RenderViewHostManager:Navigate"); | 149 TRACE_EVENT0("browser", "RenderFrameHostManager:Navigate"); |
| 150 // Create a pending RenderViewHost. It will give us the one we should use | 150 // Create a pending RenderViewHost. It will give us the one we should use |
| 151 RenderViewHostImpl* dest_render_view_host = | 151 RenderViewHostImpl* dest_render_view_host = |
| 152 static_cast<RenderViewHostImpl*>(UpdateRendererStateForNavigate(entry)); | 152 static_cast<RenderViewHostImpl*>(UpdateRendererStateForNavigate(entry)); |
| 153 if (!dest_render_view_host) | 153 if (!dest_render_view_host) |
| 154 return NULL; // We weren't able to create a pending render view host. | 154 return NULL; // We weren't able to create a pending render view host. |
| 155 | 155 |
| 156 // If the current render_view_host_ isn't live, we should create it so | 156 // If the current render_view_host_ isn't live, we should create it so |
| 157 // that we don't show a sad tab while the dest_render_view_host fetches | 157 // that we don't show a sad tab while the dest_render_view_host fetches |
| 158 // its first page. (Bug 1145340) | 158 // its first page. (Bug 1145340) |
| 159 if (dest_render_view_host != render_view_host_ && | 159 if (dest_render_view_host != render_view_host_ && |
| (...skipping 22 matching lines...) Expand all Loading... |
| 182 } else { | 182 } else { |
| 183 // This is our primary renderer, notify here as we won't be calling | 183 // This is our primary renderer, notify here as we won't be calling |
| 184 // CommitPending (which does the notify). | 184 // CommitPending (which does the notify). |
| 185 delegate_->NotifySwappedFromRenderManager(NULL, render_view_host_); | 185 delegate_->NotifySwappedFromRenderManager(NULL, render_view_host_); |
| 186 } | 186 } |
| 187 } | 187 } |
| 188 | 188 |
| 189 return dest_render_view_host; | 189 return dest_render_view_host; |
| 190 } | 190 } |
| 191 | 191 |
| 192 void RenderViewHostManager::Stop() { | 192 void RenderFrameHostManager::Stop() { |
| 193 render_view_host_->Stop(); | 193 render_view_host_->Stop(); |
| 194 | 194 |
| 195 // If we are cross-navigating, we should stop the pending renderers. This | 195 // If we are cross-navigating, we should stop the pending renderers. This |
| 196 // will lead to a DidFailProvisionalLoad, which will properly destroy them. | 196 // will lead to a DidFailProvisionalLoad, which will properly destroy them. |
| 197 if (cross_navigation_pending_) { | 197 if (cross_navigation_pending_) { |
| 198 pending_render_view_host_->Send( | 198 pending_render_view_host_->Send( |
| 199 new ViewMsg_Stop(pending_render_view_host_->GetRoutingID())); | 199 new ViewMsg_Stop(pending_render_view_host_->GetRoutingID())); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 void RenderViewHostManager::SetIsLoading(bool is_loading) { | 203 void RenderFrameHostManager::SetIsLoading(bool is_loading) { |
| 204 render_view_host_->SetIsLoading(is_loading); | 204 render_view_host_->SetIsLoading(is_loading); |
| 205 if (pending_render_view_host_) | 205 if (pending_render_view_host_) |
| 206 pending_render_view_host_->SetIsLoading(is_loading); | 206 pending_render_view_host_->SetIsLoading(is_loading); |
| 207 } | 207 } |
| 208 | 208 |
| 209 bool RenderViewHostManager::ShouldCloseTabOnUnresponsiveRenderer() { | 209 bool RenderFrameHostManager::ShouldCloseTabOnUnresponsiveRenderer() { |
| 210 if (!cross_navigation_pending_) | 210 if (!cross_navigation_pending_) |
| 211 return true; | 211 return true; |
| 212 | 212 |
| 213 // We should always have a pending RVH when there's a cross-process navigation | 213 // We should always have a pending RVH when there's a cross-process navigation |
| 214 // in progress. Sanity check this for http://crbug.com/276333. | 214 // in progress. Sanity check this for http://crbug.com/276333. |
| 215 CHECK(pending_render_view_host_); | 215 CHECK(pending_render_view_host_); |
| 216 | 216 |
| 217 // If the tab becomes unresponsive during {before}unload while doing a | 217 // If the tab becomes unresponsive during {before}unload while doing a |
| 218 // cross-site navigation, proceed with the navigation. (This assumes that | 218 // cross-site navigation, proceed with the navigation. (This assumes that |
| 219 // the pending RenderViewHost is still responsive.) | 219 // the pending RenderViewHost is still responsive.) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 231 // that the beforeunload handler will later finish and possibly return | 231 // that the beforeunload handler will later finish and possibly return |
| 232 // false (meaning the navigation should not proceed), but we'll ignore it | 232 // false (meaning the navigation should not proceed), but we'll ignore it |
| 233 // in this case because it took too long. | 233 // in this case because it took too long. |
| 234 if (pending_render_view_host_->are_navigations_suspended()) | 234 if (pending_render_view_host_->are_navigations_suspended()) |
| 235 pending_render_view_host_->SetNavigationsSuspended( | 235 pending_render_view_host_->SetNavigationsSuspended( |
| 236 false, base::TimeTicks::Now()); | 236 false, base::TimeTicks::Now()); |
| 237 } | 237 } |
| 238 return false; | 238 return false; |
| 239 } | 239 } |
| 240 | 240 |
| 241 void RenderViewHostManager::SwappedOut(RenderViewHost* render_view_host) { | 241 void RenderFrameHostManager::SwappedOut(RenderViewHost* render_view_host) { |
| 242 // Make sure this is from our current RVH, and that we have a pending | 242 // Make sure this is from our current RVH, and that we have a pending |
| 243 // navigation from OnCrossSiteResponse. (There may be no pending navigation | 243 // navigation from OnCrossSiteResponse. (There may be no pending navigation |
| 244 // for data URLs that don't make network requests, for example.) If not, | 244 // for data URLs that don't make network requests, for example.) If not, |
| 245 // just return early and ignore. | 245 // just return early and ignore. |
| 246 if (render_view_host != render_view_host_ || !pending_nav_params_.get()) { | 246 if (render_view_host != render_view_host_ || !pending_nav_params_.get()) { |
| 247 pending_nav_params_.reset(); | 247 pending_nav_params_.reset(); |
| 248 return; | 248 return; |
| 249 } | 249 } |
| 250 | 250 |
| 251 // Now that the unload handler has run, we need to either initiate the | 251 // Now that the unload handler has run, we need to either initiate the |
| (...skipping 24 matching lines...) Expand all Loading... |
| 276 } else if (pending_render_view_host_) { | 276 } else if (pending_render_view_host_) { |
| 277 RenderProcessHostImpl* pending_process = | 277 RenderProcessHostImpl* pending_process = |
| 278 static_cast<RenderProcessHostImpl*>( | 278 static_cast<RenderProcessHostImpl*>( |
| 279 pending_render_view_host_->GetProcess()); | 279 pending_render_view_host_->GetProcess()); |
| 280 pending_process->ResumeDeferredNavigation( | 280 pending_process->ResumeDeferredNavigation( |
| 281 pending_nav_params_->global_request_id); | 281 pending_nav_params_->global_request_id); |
| 282 } | 282 } |
| 283 pending_nav_params_.reset(); | 283 pending_nav_params_.reset(); |
| 284 } | 284 } |
| 285 | 285 |
| 286 void RenderViewHostManager::DidNavigateMainFrame( | 286 void RenderFrameHostManager::DidNavigateMainFrame( |
| 287 RenderViewHost* render_view_host) { | 287 RenderViewHost* render_view_host) { |
| 288 if (!cross_navigation_pending_) { | 288 if (!cross_navigation_pending_) { |
| 289 DCHECK(!pending_render_view_host_); | 289 DCHECK(!pending_render_view_host_); |
| 290 | 290 |
| 291 // We should only hear this from our current renderer. | 291 // We should only hear this from our current renderer. |
| 292 DCHECK(render_view_host == render_view_host_); | 292 DCHECK(render_view_host == render_view_host_); |
| 293 | 293 |
| 294 // Even when there is no pending RVH, there may be a pending Web UI. | 294 // Even when there is no pending RVH, there may be a pending Web UI. |
| 295 if (pending_web_ui()) | 295 if (pending_web_ui()) |
| 296 CommitPending(); | 296 CommitPending(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 311 // A navigation in the original page has taken place. Cancel the pending | 311 // A navigation in the original page has taken place. Cancel the pending |
| 312 // one. | 312 // one. |
| 313 CancelPending(); | 313 CancelPending(); |
| 314 cross_navigation_pending_ = false; | 314 cross_navigation_pending_ = false; |
| 315 } else { | 315 } else { |
| 316 // No one else should be sending us DidNavigate in this state. | 316 // No one else should be sending us DidNavigate in this state. |
| 317 DCHECK(false); | 317 DCHECK(false); |
| 318 } | 318 } |
| 319 } | 319 } |
| 320 | 320 |
| 321 void RenderViewHostManager::DidDisownOpener(RenderViewHost* render_view_host) { | 321 void RenderFrameHostManager::DidDisownOpener(RenderViewHost* render_view_host) { |
| 322 // Notify all swapped out hosts, including the pending RVH. | 322 // Notify all swapped out hosts, including the pending RVH. |
| 323 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); | 323 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); |
| 324 iter != swapped_out_hosts_.end(); | 324 iter != swapped_out_hosts_.end(); |
| 325 ++iter) { | 325 ++iter) { |
| 326 DCHECK_NE(iter->second->GetSiteInstance(), | 326 DCHECK_NE(iter->second->GetSiteInstance(), |
| 327 current_host()->GetSiteInstance()); | 327 current_host()->GetSiteInstance()); |
| 328 iter->second->DisownOpener(); | 328 iter->second->DisownOpener(); |
| 329 } | 329 } |
| 330 } | 330 } |
| 331 | 331 |
| 332 void RenderViewHostManager::RendererAbortedProvisionalLoad( | 332 void RenderFrameHostManager::RendererAbortedProvisionalLoad( |
| 333 RenderViewHost* render_view_host) { | 333 RenderViewHost* render_view_host) { |
| 334 // We used to cancel the pending renderer here for cross-site downloads. | 334 // We used to cancel the pending renderer here for cross-site downloads. |
| 335 // However, it's not safe to do that because the download logic repeatedly | 335 // However, it's not safe to do that because the download logic repeatedly |
| 336 // looks for this WebContents based on a render view ID. Instead, we just | 336 // looks for this WebContents based on a render view ID. Instead, we just |
| 337 // leave the pending renderer around until the next navigation event | 337 // leave the pending renderer around until the next navigation event |
| 338 // (Navigate, DidNavigate, etc), which will clean it up properly. | 338 // (Navigate, DidNavigate, etc), which will clean it up properly. |
| 339 // TODO(creis): All of this will go away when we move the cross-site logic | 339 // TODO(creis): All of this will go away when we move the cross-site logic |
| 340 // to ResourceDispatcherHost, so that we intercept responses rather than | 340 // to ResourceDispatcherHost, so that we intercept responses rather than |
| 341 // navigation events. (That's necessary to support onunload anyway.) Once | 341 // navigation events. (That's necessary to support onunload anyway.) Once |
| 342 // we've made that change, we won't create a pending renderer until we know | 342 // we've made that change, we won't create a pending renderer until we know |
| 343 // the response is not a download. | 343 // the response is not a download. |
| 344 } | 344 } |
| 345 | 345 |
| 346 void RenderViewHostManager::RendererProcessClosing( | 346 void RenderFrameHostManager::RendererProcessClosing( |
| 347 RenderProcessHost* render_process_host) { | 347 RenderProcessHost* render_process_host) { |
| 348 // Remove any swapped out RVHs from this process, so that we don't try to | 348 // Remove any swapped out RVHs from this process, so that we don't try to |
| 349 // swap them back in while the process is exiting. Start by finding them, | 349 // swap them back in while the process is exiting. Start by finding them, |
| 350 // since there could be more than one. | 350 // since there could be more than one. |
| 351 std::list<int> ids_to_remove; | 351 std::list<int> ids_to_remove; |
| 352 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); | 352 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); |
| 353 iter != swapped_out_hosts_.end(); | 353 iter != swapped_out_hosts_.end(); |
| 354 ++iter) { | 354 ++iter) { |
| 355 if (iter->second->GetProcess() == render_process_host) | 355 if (iter->second->GetProcess() == render_process_host) |
| 356 ids_to_remove.push_back(iter->first); | 356 ids_to_remove.push_back(iter->first); |
| 357 } | 357 } |
| 358 | 358 |
| 359 // Now delete them. | 359 // Now delete them. |
| 360 while (!ids_to_remove.empty()) { | 360 while (!ids_to_remove.empty()) { |
| 361 swapped_out_hosts_[ids_to_remove.back()]->Shutdown(); | 361 swapped_out_hosts_[ids_to_remove.back()]->Shutdown(); |
| 362 swapped_out_hosts_.erase(ids_to_remove.back()); | 362 swapped_out_hosts_.erase(ids_to_remove.back()); |
| 363 ids_to_remove.pop_back(); | 363 ids_to_remove.pop_back(); |
| 364 } | 364 } |
| 365 } | 365 } |
| 366 | 366 |
| 367 void RenderViewHostManager::ShouldClosePage( | 367 void RenderFrameHostManager::ShouldClosePage( |
| 368 bool for_cross_site_transition, | 368 bool for_cross_site_transition, |
| 369 bool proceed, | 369 bool proceed, |
| 370 const base::TimeTicks& proceed_time) { | 370 const base::TimeTicks& proceed_time) { |
| 371 if (for_cross_site_transition) { | 371 if (for_cross_site_transition) { |
| 372 // Ignore if we're not in a cross-site navigation. | 372 // Ignore if we're not in a cross-site navigation. |
| 373 if (!cross_navigation_pending_) | 373 if (!cross_navigation_pending_) |
| 374 return; | 374 return; |
| 375 | 375 |
| 376 if (proceed) { | 376 if (proceed) { |
| 377 // Ok to unload the current page, so proceed with the cross-site | 377 // Ok to unload the current page, so proceed with the cross-site |
| (...skipping 24 matching lines...) Expand all Loading... |
| 402 CancelPending(); | 402 CancelPending(); |
| 403 cross_navigation_pending_ = false; | 403 cross_navigation_pending_ = false; |
| 404 } | 404 } |
| 405 | 405 |
| 406 // This is not a cross-site navigation, the tab is being closed. | 406 // This is not a cross-site navigation, the tab is being closed. |
| 407 render_view_host_->ClosePage(); | 407 render_view_host_->ClosePage(); |
| 408 } | 408 } |
| 409 } | 409 } |
| 410 } | 410 } |
| 411 | 411 |
| 412 void RenderViewHostManager::OnCrossSiteResponse( | 412 void RenderFrameHostManager::OnCrossSiteResponse( |
| 413 RenderViewHost* pending_render_view_host, | 413 RenderViewHost* pending_render_view_host, |
| 414 const GlobalRequestID& global_request_id, | 414 const GlobalRequestID& global_request_id, |
| 415 bool is_transfer, | 415 bool is_transfer, |
| 416 const std::vector<GURL>& transfer_url_chain, | 416 const std::vector<GURL>& transfer_url_chain, |
| 417 const Referrer& referrer, | 417 const Referrer& referrer, |
| 418 PageTransition page_transition, | 418 PageTransition page_transition, |
| 419 int64 frame_id, | 419 int64 frame_id, |
| 420 bool should_replace_current_entry) { | 420 bool should_replace_current_entry) { |
| 421 // This should be called either when the pending RVH is ready to commit or | 421 // This should be called either when the pending RVH is ready to commit or |
| 422 // when we realize that the current RVH's request requires a transfer. | 422 // when we realize that the current RVH's request requires a transfer. |
| 423 DCHECK( | 423 DCHECK( |
| 424 pending_render_view_host == pending_render_view_host_ || | 424 pending_render_view_host == pending_render_view_host_ || |
| 425 pending_render_view_host == render_view_host_); | 425 pending_render_view_host == render_view_host_); |
| 426 | 426 |
| 427 // TODO(creis): Eventually we will want to check all navigation responses | 427 // TODO(creis): Eventually we will want to check all navigation responses |
| 428 // here, but currently we pass information for a transfer if | 428 // here, but currently we pass information for a transfer if |
| 429 // ShouldSwapProcessesForRedirect returned true in the network stack. | 429 // ShouldSwapProcessesForRedirect returned true in the network stack. |
| 430 // In that case, we should set up a transfer after the unload handler runs. | 430 // In that case, we should set up a transfer after the unload handler runs. |
| 431 // If is_transfer is false, we will just run the unload handler and resume. | 431 // If is_transfer is false, we will just run the unload handler and resume. |
| 432 pending_nav_params_.reset(new PendingNavigationParams( | 432 pending_nav_params_.reset(new PendingNavigationParams( |
| 433 global_request_id, is_transfer, transfer_url_chain, referrer, | 433 global_request_id, is_transfer, transfer_url_chain, referrer, |
| 434 page_transition, frame_id, should_replace_current_entry)); | 434 page_transition, frame_id, should_replace_current_entry)); |
| 435 | 435 |
| 436 // Run the unload handler of the current page. | 436 // Run the unload handler of the current page. |
| 437 SwapOutOldPage(); | 437 SwapOutOldPage(); |
| 438 } | 438 } |
| 439 | 439 |
| 440 void RenderViewHostManager::SwapOutOldPage() { | 440 void RenderFrameHostManager::SwapOutOldPage() { |
| 441 // Should only see this while we have a pending renderer or transfer. | 441 // Should only see this while we have a pending renderer or transfer. |
| 442 CHECK(cross_navigation_pending_ || pending_nav_params_.get()); | 442 CHECK(cross_navigation_pending_ || pending_nav_params_.get()); |
| 443 | 443 |
| 444 // Tell the renderer to suppress any further modal dialogs so that we can swap | 444 // Tell the renderer to suppress any further modal dialogs so that we can swap |
| 445 // it out. This must be done before canceling any current dialog, in case | 445 // it out. This must be done before canceling any current dialog, in case |
| 446 // there is a loop creating additional dialogs. | 446 // there is a loop creating additional dialogs. |
| 447 render_view_host_->SuppressDialogsUntilSwapOut(); | 447 render_view_host_->SuppressDialogsUntilSwapOut(); |
| 448 | 448 |
| 449 // Now close any modal dialogs that would prevent us from swapping out. This | 449 // Now close any modal dialogs that would prevent us from swapping out. This |
| 450 // must be done separately from SwapOut, so that the PageGroupLoadDeferrer is | 450 // must be done separately from SwapOut, so that the PageGroupLoadDeferrer is |
| 451 // no longer on the stack when we send the SwapOut message. | 451 // no longer on the stack when we send the SwapOut message. |
| 452 delegate_->CancelModalDialogsForRenderManager(); | 452 delegate_->CancelModalDialogsForRenderManager(); |
| 453 | 453 |
| 454 // Tell the old renderer it is being swapped out. This will fire the unload | 454 // Tell the old renderer it is being swapped out. This will fire the unload |
| 455 // handler (without firing the beforeunload handler a second time). When the | 455 // handler (without firing the beforeunload handler a second time). When the |
| 456 // unload handler finishes and the navigation completes, we will send a | 456 // unload handler finishes and the navigation completes, we will send a |
| 457 // message to the ResourceDispatcherHost, allowing the pending RVH's response | 457 // message to the ResourceDispatcherHost, allowing the pending RVH's response |
| 458 // to resume. | 458 // to resume. |
| 459 render_view_host_->SwapOut(); | 459 render_view_host_->SwapOut(); |
| 460 | 460 |
| 461 // ResourceDispatcherHost has told us to run the onunload handler, which | 461 // ResourceDispatcherHost has told us to run the onunload handler, which |
| 462 // means it is not a download or unsafe page, and we are going to perform the | 462 // means it is not a download or unsafe page, and we are going to perform the |
| 463 // navigation. Thus, we no longer need to remember that the RenderViewHost | 463 // navigation. Thus, we no longer need to remember that the RenderViewHost |
| 464 // is part of a pending cross-site request. | 464 // is part of a pending cross-site request. |
| 465 if (pending_render_view_host_) | 465 if (pending_render_view_host_) |
| 466 pending_render_view_host_->SetHasPendingCrossSiteRequest(false); | 466 pending_render_view_host_->SetHasPendingCrossSiteRequest(false); |
| 467 } | 467 } |
| 468 | 468 |
| 469 void RenderViewHostManager::Observe( | 469 void RenderFrameHostManager::Observe( |
| 470 int type, | 470 int type, |
| 471 const NotificationSource& source, | 471 const NotificationSource& source, |
| 472 const NotificationDetails& details) { | 472 const NotificationDetails& details) { |
| 473 switch (type) { | 473 switch (type) { |
| 474 case NOTIFICATION_RENDERER_PROCESS_CLOSED: | 474 case NOTIFICATION_RENDERER_PROCESS_CLOSED: |
| 475 case NOTIFICATION_RENDERER_PROCESS_CLOSING: | 475 case NOTIFICATION_RENDERER_PROCESS_CLOSING: |
| 476 RendererProcessClosing( | 476 RendererProcessClosing( |
| 477 Source<RenderProcessHost>(source).ptr()); | 477 Source<RenderProcessHost>(source).ptr()); |
| 478 break; | 478 break; |
| 479 | 479 |
| 480 default: | 480 default: |
| 481 NOTREACHED(); | 481 NOTREACHED(); |
| 482 } | 482 } |
| 483 } | 483 } |
| 484 | 484 |
| 485 bool RenderViewHostManager::ShouldTransitionCrossSite() { | 485 bool RenderFrameHostManager::ShouldTransitionCrossSite() { |
| 486 // False in the single-process mode, as it makes RVHs to accumulate | 486 // False in the single-process mode, as it makes RVHs to accumulate |
| 487 // in swapped_out_hosts_. | 487 // in swapped_out_hosts_. |
| 488 // True if we are using process-per-site-instance (default) or | 488 // True if we are using process-per-site-instance (default) or |
| 489 // process-per-site (kProcessPerSite). | 489 // process-per-site (kProcessPerSite). |
| 490 return | 490 return |
| 491 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess) && | 491 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess) && |
| 492 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab); | 492 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessPerTab); |
| 493 } | 493 } |
| 494 | 494 |
| 495 bool RenderViewHostManager::ShouldSwapBrowsingInstancesForNavigation( | 495 bool RenderFrameHostManager::ShouldSwapBrowsingInstancesForNavigation( |
| 496 const NavigationEntry* current_entry, | 496 const NavigationEntry* current_entry, |
| 497 const NavigationEntryImpl* new_entry) const { | 497 const NavigationEntryImpl* new_entry) const { |
| 498 DCHECK(new_entry); | 498 DCHECK(new_entry); |
| 499 | 499 |
| 500 // If new_entry already has a SiteInstance, assume it is correct and use it. | 500 // If new_entry already has a SiteInstance, assume it is correct and use it. |
| 501 if (new_entry->site_instance()) | 501 if (new_entry->site_instance()) |
| 502 return false; | 502 return false; |
| 503 | 503 |
| 504 // Check for reasons to swap processes even if we are in a process model that | 504 // Check for reasons to swap processes even if we are in a process model that |
| 505 // doesn't usually swap (e.g., process-per-tab). Any time we return true, | 505 // doesn't usually swap (e.g., process-per-tab). Any time we return true, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 // without screwing up the session history sometimes (when navigating between | 547 // without screwing up the session history sometimes (when navigating between |
| 548 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat | 548 // "view-source:http://foo.com/" and "http://foo.com/", Blink doesn't treat |
| 549 // it as a new navigation). So require a BrowsingInstance switch. | 549 // it as a new navigation). So require a BrowsingInstance switch. |
| 550 if (current_entry && | 550 if (current_entry && |
| 551 current_entry->IsViewSourceMode() != new_entry->IsViewSourceMode()) | 551 current_entry->IsViewSourceMode() != new_entry->IsViewSourceMode()) |
| 552 return true; | 552 return true; |
| 553 | 553 |
| 554 return false; | 554 return false; |
| 555 } | 555 } |
| 556 | 556 |
| 557 bool RenderViewHostManager::ShouldReuseWebUI( | 557 bool RenderFrameHostManager::ShouldReuseWebUI( |
| 558 const NavigationEntry* current_entry, | 558 const NavigationEntry* current_entry, |
| 559 const NavigationEntryImpl* new_entry) const { | 559 const NavigationEntryImpl* new_entry) const { |
| 560 NavigationControllerImpl& controller = | 560 NavigationControllerImpl& controller = |
| 561 delegate_->GetControllerForRenderManager(); | 561 delegate_->GetControllerForRenderManager(); |
| 562 return current_entry && web_ui_.get() && | 562 return current_entry && web_ui_.get() && |
| 563 (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( | 563 (WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( |
| 564 controller.GetBrowserContext(), current_entry->GetURL()) == | 564 controller.GetBrowserContext(), current_entry->GetURL()) == |
| 565 WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( | 565 WebUIControllerFactoryRegistry::GetInstance()->GetWebUIType( |
| 566 controller.GetBrowserContext(), new_entry->GetURL())); | 566 controller.GetBrowserContext(), new_entry->GetURL())); |
| 567 } | 567 } |
| 568 | 568 |
| 569 SiteInstance* RenderViewHostManager::GetSiteInstanceForEntry( | 569 SiteInstance* RenderFrameHostManager::GetSiteInstanceForEntry( |
| 570 const NavigationEntryImpl& entry, | 570 const NavigationEntryImpl& entry, |
| 571 SiteInstance* current_instance, | 571 SiteInstance* current_instance, |
| 572 bool force_browsing_instance_swap) { | 572 bool force_browsing_instance_swap) { |
| 573 // Determine which SiteInstance to use for navigating to |entry|. | 573 // Determine which SiteInstance to use for navigating to |entry|. |
| 574 const GURL& dest_url = entry.GetURL(); | 574 const GURL& dest_url = entry.GetURL(); |
| 575 NavigationControllerImpl& controller = | 575 NavigationControllerImpl& controller = |
| 576 delegate_->GetControllerForRenderManager(); | 576 delegate_->GetControllerForRenderManager(); |
| 577 BrowserContext* browser_context = controller.GetBrowserContext(); | 577 BrowserContext* browser_context = controller.GetBrowserContext(); |
| 578 | 578 |
| 579 // If a swap is required, we need to force the SiteInstance AND | 579 // If a swap is required, we need to force the SiteInstance AND |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 } | 712 } |
| 713 | 713 |
| 714 // Start the new renderer in a new SiteInstance, but in the current | 714 // Start the new renderer in a new SiteInstance, but in the current |
| 715 // BrowsingInstance. It is important to immediately give this new | 715 // BrowsingInstance. It is important to immediately give this new |
| 716 // SiteInstance to a RenderViewHost (if it is different than our current | 716 // SiteInstance to a RenderViewHost (if it is different than our current |
| 717 // SiteInstance), so that it is ref counted. This will happen in | 717 // SiteInstance), so that it is ref counted. This will happen in |
| 718 // CreateRenderView. | 718 // CreateRenderView. |
| 719 return current_instance->GetRelatedSiteInstance(dest_url); | 719 return current_instance->GetRelatedSiteInstance(dest_url); |
| 720 } | 720 } |
| 721 | 721 |
| 722 int RenderViewHostManager::CreateRenderView( | 722 int RenderFrameHostManager::CreateRenderView( |
| 723 SiteInstance* instance, | 723 SiteInstance* instance, |
| 724 int opener_route_id, | 724 int opener_route_id, |
| 725 bool swapped_out, | 725 bool swapped_out, |
| 726 bool hidden) { | 726 bool hidden) { |
| 727 CHECK(instance); | 727 CHECK(instance); |
| 728 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. | 728 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. |
| 729 | 729 |
| 730 // We are creating a pending or swapped out RVH here. We should never create | 730 // We are creating a pending or swapped out RVH here. We should never create |
| 731 // it in the same SiteInstance as our current RVH. | 731 // it in the same SiteInstance as our current RVH. |
| 732 CHECK_NE(render_view_host_->GetSiteInstance(), instance); | 732 CHECK_NE(render_view_host_->GetSiteInstance(), instance); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 768 } | 768 } |
| 769 } | 769 } |
| 770 | 770 |
| 771 // Use this as our new pending RVH if it isn't swapped out. | 771 // Use this as our new pending RVH if it isn't swapped out. |
| 772 if (!swapped_out) | 772 if (!swapped_out) |
| 773 pending_render_view_host_ = new_render_view_host; | 773 pending_render_view_host_ = new_render_view_host; |
| 774 | 774 |
| 775 return new_render_view_host->GetRoutingID(); | 775 return new_render_view_host->GetRoutingID(); |
| 776 } | 776 } |
| 777 | 777 |
| 778 bool RenderViewHostManager::InitRenderView(RenderViewHost* render_view_host, | 778 bool RenderFrameHostManager::InitRenderView(RenderViewHost* render_view_host, |
| 779 int opener_route_id) { | 779 int opener_route_id) { |
| 780 // If the pending navigation is to a WebUI and the RenderView is not in a | 780 // If the pending navigation is to a WebUI and the RenderView is not in a |
| 781 // guest process, tell the RenderView about any bindings it will need enabled. | 781 // guest process, tell the RenderView about any bindings it will need enabled. |
| 782 if (pending_web_ui() && !render_view_host->GetProcess()->IsGuest()) { | 782 if (pending_web_ui() && !render_view_host->GetProcess()->IsGuest()) { |
| 783 render_view_host->AllowBindings(pending_web_ui()->GetBindings()); | 783 render_view_host->AllowBindings(pending_web_ui()->GetBindings()); |
| 784 } else { | 784 } else { |
| 785 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled | 785 // Ensure that we don't create an unprivileged RenderView in a WebUI-enabled |
| 786 // process. | 786 // process. |
| 787 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 787 CHECK(!ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 788 render_view_host->GetProcess()->GetID())); | 788 render_view_host->GetProcess()->GetID())); |
| 789 } | 789 } |
| 790 | 790 |
| 791 return delegate_->CreateRenderViewForRenderManager(render_view_host, | 791 return delegate_->CreateRenderViewForRenderManager(render_view_host, |
| 792 opener_route_id); | 792 opener_route_id); |
| 793 } | 793 } |
| 794 | 794 |
| 795 void RenderViewHostManager::CommitPending() { | 795 void RenderFrameHostManager::CommitPending() { |
| 796 // First check whether we're going to want to focus the location bar after | 796 // First check whether we're going to want to focus the location bar after |
| 797 // this commit. We do this now because the navigation hasn't formally | 797 // this commit. We do this now because the navigation hasn't formally |
| 798 // committed yet, so if we've already cleared |pending_web_ui_| the call chain | 798 // committed yet, so if we've already cleared |pending_web_ui_| the call chain |
| 799 // this triggers won't be able to figure out what's going on. | 799 // this triggers won't be able to figure out what's going on. |
| 800 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); | 800 bool will_focus_location_bar = delegate_->FocusLocationBarByDefault(); |
| 801 | 801 |
| 802 // Next commit the Web UI, if any. Either replace |web_ui_| with | 802 // Next commit the Web UI, if any. Either replace |web_ui_| with |
| 803 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or | 803 // |pending_web_ui_|, or clear |web_ui_| if there is no pending WebUI, or |
| 804 // leave |web_ui_| as is if reusing it. | 804 // leave |web_ui_| as is if reusing it. |
| 805 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); | 805 DCHECK(!(pending_web_ui_.get() && pending_and_current_web_ui_.get())); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 // Shutdown the RVH that will be replaced in the map to avoid a leak. | 890 // Shutdown the RVH that will be replaced in the map to avoid a leak. |
| 891 iter->second->Shutdown(); | 891 iter->second->Shutdown(); |
| 892 } | 892 } |
| 893 swapped_out_hosts_[old_site_instance_id] = old_render_view_host; | 893 swapped_out_hosts_[old_site_instance_id] = old_render_view_host; |
| 894 } else { | 894 } else { |
| 895 old_render_view_host->Shutdown(); | 895 old_render_view_host->Shutdown(); |
| 896 old_render_view_host = NULL; // Shutdown() deletes it. | 896 old_render_view_host = NULL; // Shutdown() deletes it. |
| 897 } | 897 } |
| 898 } | 898 } |
| 899 | 899 |
| 900 void RenderViewHostManager::ShutdownRenderViewHostsInSiteInstance( | 900 void RenderFrameHostManager::ShutdownRenderViewHostsInSiteInstance( |
| 901 int32 site_instance_id) { | 901 int32 site_instance_id) { |
| 902 // First remove any swapped out RVH for this SiteInstance from our | 902 // First remove any swapped out RVH for this SiteInstance from our |
| 903 // list. | 903 // list. |
| 904 swapped_out_hosts_.erase(site_instance_id); | 904 swapped_out_hosts_.erase(site_instance_id); |
| 905 | 905 |
| 906 scoped_ptr<RenderWidgetHostIterator> widgets( | 906 scoped_ptr<RenderWidgetHostIterator> widgets( |
| 907 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); | 907 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); |
| 908 while (RenderWidgetHost* widget = widgets->GetNextHost()) { | 908 while (RenderWidgetHost* widget = widgets->GetNextHost()) { |
| 909 if (!widget->IsRenderView()) | 909 if (!widget->IsRenderView()) |
| 910 continue; | 910 continue; |
| 911 RenderViewHostImpl* rvh = | 911 RenderViewHostImpl* rvh = |
| 912 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget)); | 912 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget)); |
| 913 if (site_instance_id == rvh->GetSiteInstance()->GetId()) | 913 if (site_instance_id == rvh->GetSiteInstance()->GetId()) |
| 914 rvh->Shutdown(); | 914 rvh->Shutdown(); |
| 915 } | 915 } |
| 916 } | 916 } |
| 917 | 917 |
| 918 RenderViewHostImpl* RenderViewHostManager::UpdateRendererStateForNavigate( | 918 RenderViewHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate( |
| 919 const NavigationEntryImpl& entry) { | 919 const NavigationEntryImpl& entry) { |
| 920 // If we are currently navigating cross-process, we want to get back to normal | 920 // If we are currently navigating cross-process, we want to get back to normal |
| 921 // and then navigate as usual. | 921 // and then navigate as usual. |
| 922 if (cross_navigation_pending_) { | 922 if (cross_navigation_pending_) { |
| 923 if (pending_render_view_host_) | 923 if (pending_render_view_host_) |
| 924 CancelPending(); | 924 CancelPending(); |
| 925 cross_navigation_pending_ = false; | 925 cross_navigation_pending_ = false; |
| 926 } | 926 } |
| 927 | 927 |
| 928 // render_view_host_'s SiteInstance and new_instance will not be deleted | 928 // render_view_host_'s SiteInstance and new_instance will not be deleted |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1060 // The renderer can exit view source mode when any error or cancellation | 1060 // The renderer can exit view source mode when any error or cancellation |
| 1061 // happen. We must overwrite to recover the mode. | 1061 // happen. We must overwrite to recover the mode. |
| 1062 if (entry.IsViewSourceMode()) { | 1062 if (entry.IsViewSourceMode()) { |
| 1063 render_view_host_->Send( | 1063 render_view_host_->Send( |
| 1064 new ViewMsg_EnableViewSourceMode(render_view_host_->GetRoutingID())); | 1064 new ViewMsg_EnableViewSourceMode(render_view_host_->GetRoutingID())); |
| 1065 } | 1065 } |
| 1066 | 1066 |
| 1067 return render_view_host_; | 1067 return render_view_host_; |
| 1068 } | 1068 } |
| 1069 | 1069 |
| 1070 void RenderViewHostManager::CancelPending() { | 1070 void RenderFrameHostManager::CancelPending() { |
| 1071 RenderViewHostImpl* pending_render_view_host = pending_render_view_host_; | 1071 RenderViewHostImpl* pending_render_view_host = pending_render_view_host_; |
| 1072 pending_render_view_host_ = NULL; | 1072 pending_render_view_host_ = NULL; |
| 1073 | 1073 |
| 1074 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( | 1074 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( |
| 1075 pending_render_view_host, | 1075 pending_render_view_host, |
| 1076 render_view_host_); | 1076 render_view_host_); |
| 1077 | 1077 |
| 1078 // We no longer need to prevent the process from exiting. | 1078 // We no longer need to prevent the process from exiting. |
| 1079 pending_render_view_host->GetProcess()->RemovePendingView(); | 1079 pending_render_view_host->GetProcess()->RemovePendingView(); |
| 1080 | 1080 |
| 1081 // The pending RVH may already be on the swapped out list if we started to | 1081 // The pending RVH may already be on the swapped out list if we started to |
| 1082 // swap it back in and then canceled. If so, make sure it gets swapped out | 1082 // swap it back in and then canceled. If so, make sure it gets swapped out |
| 1083 // again. If it's not on the swapped out list (e.g., aborting a pending | 1083 // again. If it's not on the swapped out list (e.g., aborting a pending |
| 1084 // load), then it's safe to shut down. | 1084 // load), then it's safe to shut down. |
| 1085 if (IsOnSwappedOutList(pending_render_view_host)) { | 1085 if (IsOnSwappedOutList(pending_render_view_host)) { |
| 1086 // Any currently suspended navigations are no longer needed. | 1086 // Any currently suspended navigations are no longer needed. |
| 1087 pending_render_view_host->CancelSuspendedNavigations(); | 1087 pending_render_view_host->CancelSuspendedNavigations(); |
| 1088 | 1088 |
| 1089 pending_render_view_host->SwapOut(); | 1089 pending_render_view_host->SwapOut(); |
| 1090 } else { | 1090 } else { |
| 1091 // We won't be coming back, so shut this one down. | 1091 // We won't be coming back, so shut this one down. |
| 1092 pending_render_view_host->Shutdown(); | 1092 pending_render_view_host->Shutdown(); |
| 1093 } | 1093 } |
| 1094 | 1094 |
| 1095 pending_web_ui_.reset(); | 1095 pending_web_ui_.reset(); |
| 1096 pending_and_current_web_ui_.reset(); | 1096 pending_and_current_web_ui_.reset(); |
| 1097 } | 1097 } |
| 1098 | 1098 |
| 1099 void RenderViewHostManager::RenderViewDeleted(RenderViewHost* rvh) { | 1099 void RenderFrameHostManager::RenderViewDeleted(RenderViewHost* rvh) { |
| 1100 // We are doing this in order to work around and to track a crasher | 1100 // We are doing this in order to work around and to track a crasher |
| 1101 // (http://crbug.com/23411) where it seems that pending_render_view_host_ is | 1101 // (http://crbug.com/23411) where it seems that pending_render_view_host_ is |
| 1102 // deleted (not sure from where) but not NULLed. | 1102 // deleted (not sure from where) but not NULLed. |
| 1103 if (rvh == pending_render_view_host_) { | 1103 if (rvh == pending_render_view_host_) { |
| 1104 // If you hit this NOTREACHED, please report it in the following bug | 1104 // If you hit this NOTREACHED, please report it in the following bug |
| 1105 // http://crbug.com/23411 Make sure to include what you were doing when it | 1105 // http://crbug.com/23411 Make sure to include what you were doing when it |
| 1106 // happened (navigating to a new page, closing a tab...) and if you can | 1106 // happened (navigating to a new page, closing a tab...) and if you can |
| 1107 // reproduce. | 1107 // reproduce. |
| 1108 NOTREACHED(); | 1108 NOTREACHED(); |
| 1109 pending_render_view_host_ = NULL; | 1109 pending_render_view_host_ = NULL; |
| 1110 } | 1110 } |
| 1111 | 1111 |
| 1112 // Make sure deleted RVHs are not kept in the swapped out list while we are | 1112 // Make sure deleted RVHs are not kept in the swapped out list while we are |
| 1113 // still alive. (If render_view_host_ is null, we're already being deleted.) | 1113 // still alive. (If render_view_host_ is null, we're already being deleted.) |
| 1114 if (!render_view_host_) | 1114 if (!render_view_host_) |
| 1115 return; | 1115 return; |
| 1116 // We can't look it up by SiteInstance ID, which may no longer be valid. | 1116 // We can't look it up by SiteInstance ID, which may no longer be valid. |
| 1117 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); | 1117 for (RenderViewHostMap::iterator iter = swapped_out_hosts_.begin(); |
| 1118 iter != swapped_out_hosts_.end(); | 1118 iter != swapped_out_hosts_.end(); |
| 1119 ++iter) { | 1119 ++iter) { |
| 1120 if (iter->second == rvh) { | 1120 if (iter->second == rvh) { |
| 1121 swapped_out_hosts_.erase(iter); | 1121 swapped_out_hosts_.erase(iter); |
| 1122 break; | 1122 break; |
| 1123 } | 1123 } |
| 1124 } | 1124 } |
| 1125 } | 1125 } |
| 1126 | 1126 |
| 1127 bool RenderViewHostManager::IsOnSwappedOutList(RenderViewHost* rvh) const { | 1127 bool RenderFrameHostManager::IsOnSwappedOutList(RenderViewHost* rvh) const { |
| 1128 if (!rvh->GetSiteInstance()) | 1128 if (!rvh->GetSiteInstance()) |
| 1129 return false; | 1129 return false; |
| 1130 | 1130 |
| 1131 RenderViewHostMap::const_iterator iter = swapped_out_hosts_.find( | 1131 RenderViewHostMap::const_iterator iter = swapped_out_hosts_.find( |
| 1132 rvh->GetSiteInstance()->GetId()); | 1132 rvh->GetSiteInstance()->GetId()); |
| 1133 if (iter == swapped_out_hosts_.end()) | 1133 if (iter == swapped_out_hosts_.end()) |
| 1134 return false; | 1134 return false; |
| 1135 | 1135 |
| 1136 return iter->second == rvh; | 1136 return iter->second == rvh; |
| 1137 } | 1137 } |
| 1138 | 1138 |
| 1139 RenderViewHostImpl* RenderViewHostManager::GetSwappedOutRenderViewHost( | 1139 RenderViewHostImpl* RenderFrameHostManager::GetSwappedOutRenderViewHost( |
| 1140 SiteInstance* instance) { | 1140 SiteInstance* instance) { |
| 1141 RenderViewHostMap::iterator iter = swapped_out_hosts_.find(instance->GetId()); | 1141 RenderViewHostMap::iterator iter = swapped_out_hosts_.find(instance->GetId()); |
| 1142 if (iter != swapped_out_hosts_.end()) | 1142 if (iter != swapped_out_hosts_.end()) |
| 1143 return iter->second; | 1143 return iter->second; |
| 1144 | 1144 |
| 1145 return NULL; | 1145 return NULL; |
| 1146 } | 1146 } |
| 1147 | 1147 |
| 1148 } // namespace content | 1148 } // namespace content |
| OLD | NEW |