OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 // Represents the browser side of the browser <--> renderer communication | 5 // Represents the browser side of the browser <--> renderer communication |
6 // channel. There will be one RenderProcessHost per renderer process. | 6 // channel. There will be one RenderProcessHost per renderer process. |
7 | 7 |
8 #include "content/browser/renderer_host/render_process_host_impl.h" | 8 #include "content/browser/renderer_host/render_process_host_impl.h" |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 1436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1447 } | 1447 } |
1448 | 1448 |
1449 void RenderProcessHostImpl::Resume() { | 1449 void RenderProcessHostImpl::Resume() { |
1450 Send(new ChildProcessMsg_Resume()); | 1450 Send(new ChildProcessMsg_Resume()); |
1451 } | 1451 } |
1452 | 1452 |
1453 mojom::Renderer* RenderProcessHostImpl::GetRendererInterface() { | 1453 mojom::Renderer* RenderProcessHostImpl::GetRendererInterface() { |
1454 return renderer_interface_.get(); | 1454 return renderer_interface_.get(); |
1455 } | 1455 } |
1456 | 1456 |
| 1457 void RenderProcessHostImpl::SetIsNeverSuitableForReuse() { |
| 1458 is_never_suitable_for_reuse_ = true; |
| 1459 } |
| 1460 |
| 1461 bool RenderProcessHostImpl::MayReuseHost() { |
| 1462 if (is_never_suitable_for_reuse_) |
| 1463 return false; |
| 1464 |
| 1465 return GetContentClient()->browser()->MayReuseHost(this); |
| 1466 } |
| 1467 |
1457 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() { | 1468 mojom::RouteProvider* RenderProcessHostImpl::GetRemoteRouteProvider() { |
1458 return remote_route_provider_.get(); | 1469 return remote_route_provider_.get(); |
1459 } | 1470 } |
1460 | 1471 |
1461 void RenderProcessHostImpl::AddRoute(int32_t routing_id, | 1472 void RenderProcessHostImpl::AddRoute(int32_t routing_id, |
1462 IPC::Listener* listener) { | 1473 IPC::Listener* listener) { |
1463 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " | 1474 CHECK(!listeners_.Lookup(routing_id)) << "Found Routing ID Conflict: " |
1464 << routing_id; | 1475 << routing_id; |
1465 listeners_.AddWithID(listener, routing_id); | 1476 listeners_.AddWithID(listener, routing_id); |
1466 } | 1477 } |
(...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2509 // static | 2520 // static |
2510 RenderProcessHost* RenderProcessHost::GetExistingProcessHost( | 2521 RenderProcessHost* RenderProcessHost::GetExistingProcessHost( |
2511 BrowserContext* browser_context, | 2522 BrowserContext* browser_context, |
2512 const GURL& site_url) { | 2523 const GURL& site_url) { |
2513 // First figure out which existing renderers we can use. | 2524 // First figure out which existing renderers we can use. |
2514 std::vector<RenderProcessHost*> suitable_renderers; | 2525 std::vector<RenderProcessHost*> suitable_renderers; |
2515 suitable_renderers.reserve(g_all_hosts.Get().size()); | 2526 suitable_renderers.reserve(g_all_hosts.Get().size()); |
2516 | 2527 |
2517 iterator iter(AllHostsIterator()); | 2528 iterator iter(AllHostsIterator()); |
2518 while (!iter.IsAtEnd()) { | 2529 while (!iter.IsAtEnd()) { |
2519 if (GetContentClient()->browser()->MayReuseHost(iter.GetCurrentValue()) && | 2530 if (iter.GetCurrentValue()->MayReuseHost() && |
2520 RenderProcessHostImpl::IsSuitableHost(iter.GetCurrentValue(), | 2531 RenderProcessHostImpl::IsSuitableHost(iter.GetCurrentValue(), |
2521 browser_context, site_url)) { | 2532 browser_context, site_url)) { |
2522 suitable_renderers.push_back(iter.GetCurrentValue()); | 2533 suitable_renderers.push_back(iter.GetCurrentValue()); |
2523 } | 2534 } |
2524 iter.Advance(); | 2535 iter.Advance(); |
2525 } | 2536 } |
2526 | 2537 |
2527 // Now pick a random suitable renderer, if we have any. | 2538 // Now pick a random suitable renderer, if we have any. |
2528 if (!suitable_renderers.empty()) { | 2539 if (!suitable_renderers.empty()) { |
2529 int suitable_count = static_cast<int>(suitable_renderers.size()); | 2540 int suitable_count = static_cast<int>(suitable_renderers.size()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2565 BrowserContext* browser_context, | 2576 BrowserContext* browser_context, |
2566 const GURL& url) { | 2577 const GURL& url) { |
2567 // Look up the map of site to process for the given browser_context. | 2578 // Look up the map of site to process for the given browser_context. |
2568 SiteProcessMap* map = GetSiteProcessMapForBrowserContext(browser_context); | 2579 SiteProcessMap* map = GetSiteProcessMapForBrowserContext(browser_context); |
2569 | 2580 |
2570 // See if we have an existing process with appropriate bindings for this site. | 2581 // See if we have an existing process with appropriate bindings for this site. |
2571 // If not, the caller should create a new process and register it. | 2582 // If not, the caller should create a new process and register it. |
2572 std::string site = | 2583 std::string site = |
2573 SiteInstance::GetSiteForURL(browser_context, url).possibly_invalid_spec(); | 2584 SiteInstance::GetSiteForURL(browser_context, url).possibly_invalid_spec(); |
2574 RenderProcessHost* host = map->FindProcess(site); | 2585 RenderProcessHost* host = map->FindProcess(site); |
2575 if (host && (!GetContentClient()->browser()->MayReuseHost(host) || | 2586 if (host && (!host->MayReuseHost() || |
2576 !IsSuitableHost(host, browser_context, url))) { | 2587 !IsSuitableHost(host, browser_context, url))) { |
2577 // The registered process does not have an appropriate set of bindings for | 2588 // The registered process does not have an appropriate set of bindings for |
2578 // the url. Remove it from the map so we can register a better one. | 2589 // the url. Remove it from the map so we can register a better one. |
2579 RecordAction( | 2590 RecordAction( |
2580 base::UserMetricsAction("BindingsMismatch_GetProcessHostPerSite")); | 2591 base::UserMetricsAction("BindingsMismatch_GetProcessHostPerSite")); |
2581 map->RemoveProcess(host); | 2592 map->RemoveProcess(host); |
2582 host = NULL; | 2593 host = NULL; |
2583 } | 2594 } |
2584 | 2595 |
2585 return host; | 2596 return host; |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3019 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; | 3030 LOG(ERROR) << "Terminating render process for bad Mojo message: " << error; |
3020 | 3031 |
3021 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. | 3032 // The ReceivedBadMessage call below will trigger a DumpWithoutCrashing. |
3022 // Capture the error message in a crash key value. | 3033 // Capture the error message in a crash key value. |
3023 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); | 3034 base::debug::ScopedCrashKey error_key_value("mojo-message-error", error); |
3024 bad_message::ReceivedBadMessage(render_process_id, | 3035 bad_message::ReceivedBadMessage(render_process_id, |
3025 bad_message::RPH_MOJO_PROCESS_ERROR); | 3036 bad_message::RPH_MOJO_PROCESS_ERROR); |
3026 } | 3037 } |
3027 | 3038 |
3028 } // namespace content | 3039 } // namespace content |
OLD | NEW |