| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 #include "chrome/browser/prerender/prerender_link_manager.h" | 5 #include "chrome/browser/prerender/prerender_link_manager.h" |
| 6 | 6 |
| 7 #include <functional> | 7 #include <functional> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> | 11 #include <utility> |
| 12 | 12 |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/metrics/field_trial.h" | 14 #include "base/metrics/field_trial.h" |
| 15 #include "base/metrics/histogram.h" |
| 15 #include "chrome/browser/prerender/prerender_contents.h" | 16 #include "chrome/browser/prerender/prerender_contents.h" |
| 16 #include "chrome/browser/prerender/prerender_handle.h" | 17 #include "chrome/browser/prerender/prerender_handle.h" |
| 17 #include "chrome/browser/prerender/prerender_manager.h" | 18 #include "chrome/browser/prerender/prerender_manager.h" |
| 18 #include "chrome/browser/prerender/prerender_manager_factory.h" | 19 #include "chrome/browser/prerender/prerender_manager_factory.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/common/prerender_messages.h" | 21 #include "chrome/common/prerender_messages.h" |
| 21 #include "chrome/common/prerender_types.h" | 22 #include "chrome/common/prerender_types.h" |
| 22 #include "content/public/browser/render_process_host.h" | 23 #include "content/public/browser/render_process_host.h" |
| 23 #include "content/public/browser/render_view_host.h" | 24 #include "content/public/browser/render_view_host.h" |
| 24 #include "content/public/browser/session_storage_namespace.h" | 25 #include "content/public/browser/session_storage_namespace.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 35 | 36 |
| 36 namespace { | 37 namespace { |
| 37 | 38 |
| 38 bool ShouldStartRelNextPrerenders() { | 39 bool ShouldStartRelNextPrerenders() { |
| 39 const std::string experiment_name = | 40 const std::string experiment_name = |
| 40 base::FieldTrialList::FindFullName("PrerenderRelNextTrial"); | 41 base::FieldTrialList::FindFullName("PrerenderRelNextTrial"); |
| 41 | 42 |
| 42 return experiment_name.find("Yes") != std::string::npos; | 43 return experiment_name.find("Yes") != std::string::npos; |
| 43 } | 44 } |
| 44 | 45 |
| 45 bool ShouldStartPrerender(uint32 rel_types) { | 46 bool ShouldStartPrerender(const uint32 rel_types) { |
| 46 const bool should_start_rel_next_prerenders = | 47 const bool should_start_rel_next_prerenders = |
| 47 ShouldStartRelNextPrerenders(); | 48 ShouldStartRelNextPrerenders(); |
| 48 | 49 |
| 49 if (rel_types & PrerenderRelTypePrerender) { | 50 if (rel_types & PrerenderRelTypePrerender) { |
| 50 return true; | 51 return true; |
| 51 } else if (should_start_rel_next_prerenders && | 52 } else if (should_start_rel_next_prerenders && |
| 52 (rel_types & PrerenderRelTypeNext) == PrerenderRelTypeNext) { | 53 (rel_types & PrerenderRelTypeNext) == PrerenderRelTypeNext) { |
| 53 return true; | 54 return true; |
| 54 } | 55 } |
| 55 return false; | 56 return false; |
| 56 } | 57 } |
| 57 | 58 |
| 59 COMPILE_ASSERT(PrerenderRelTypePrerender == 0x1, |
| 60 RelTypeHistogramEnum_must_match_PrerenderRelType); |
| 61 COMPILE_ASSERT(PrerenderRelTypeNext == 0x2, |
| 62 RelTypeHistogramEnum_must_match_PrerenderRelType); |
| 63 enum RelTypeHistogramEnum { |
| 64 RelTypeHistogramEnumNone = 0, |
| 65 RelTypeHistogramEnumPrerender = PrerenderRelTypePrerender, |
| 66 RelTypeHistogramEnumNext = PrerenderRelTypeNext, |
| 67 RelTypeHistogramEnumPrerenderAndNext = |
| 68 PrerenderRelTypePrerender | PrerenderRelTypeNext, |
| 69 RelTypeHistogramEnumMax, |
| 70 }; |
| 71 |
| 72 void RecordLinkManagerAdded(const uint32 rel_types) { |
| 73 const uint32 enum_value = rel_types & (RelTypeHistogramEnumMax - 1); |
| 74 UMA_HISTOGRAM_ENUMERATION("Prerender.RelTypesLinkAdded", enum_value, |
| 75 RelTypeHistogramEnumMax); |
| 76 } |
| 77 |
| 78 void RecordLinkManagerStarting(const uint32 rel_types) { |
| 79 const uint32 enum_value = rel_types & (RelTypeHistogramEnumMax - 1); |
| 80 UMA_HISTOGRAM_ENUMERATION("Prerender.RelTypesLinkStarted", enum_value, |
| 81 RelTypeHistogramEnumMax); |
| 82 } |
| 83 |
| 58 void Send(int child_id, IPC::Message* raw_message) { | 84 void Send(int child_id, IPC::Message* raw_message) { |
| 59 using content::RenderProcessHost; | 85 using content::RenderProcessHost; |
| 60 scoped_ptr<IPC::Message> own_message(raw_message); | 86 scoped_ptr<IPC::Message> own_message(raw_message); |
| 61 | 87 |
| 62 RenderProcessHost* render_process_host = RenderProcessHost::FromID(child_id); | 88 RenderProcessHost* render_process_host = RenderProcessHost::FromID(child_id); |
| 63 if (!render_process_host) | 89 if (!render_process_host) |
| 64 return; | 90 return; |
| 65 render_process_host->Send(own_message.release()); | 91 render_process_host->Send(own_message.release()); |
| 66 } | 92 } |
| 67 | 93 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 // its AddLinkRelPrerender message raced with shutdown. Ignore it. | 182 // its AddLinkRelPrerender message raced with shutdown. Ignore it. |
| 157 DCHECK_NE(FINAL_STATUS_USED, prerender_contents->final_status()); | 183 DCHECK_NE(FINAL_STATUS_USED, prerender_contents->final_status()); |
| 158 return; | 184 return; |
| 159 } | 185 } |
| 160 | 186 |
| 161 LinkPrerender | 187 LinkPrerender |
| 162 prerender(launcher_child_id, prerender_id, url, rel_types, referrer, size, | 188 prerender(launcher_child_id, prerender_id, url, rel_types, referrer, size, |
| 163 render_view_route_id, manager_->GetCurrentTimeTicks(), | 189 render_view_route_id, manager_->GetCurrentTimeTicks(), |
| 164 prerender_contents); | 190 prerender_contents); |
| 165 prerenders_.push_back(prerender); | 191 prerenders_.push_back(prerender); |
| 192 RecordLinkManagerAdded(rel_types); |
| 166 if (prerender_contents) | 193 if (prerender_contents) |
| 167 pending_prerender_manager_->ObserveLauncher(prerender_contents); | 194 pending_prerender_manager_->ObserveLauncher(prerender_contents); |
| 168 else | 195 else |
| 169 StartPrerenders(); | 196 StartPrerenders(); |
| 170 } | 197 } |
| 171 | 198 |
| 172 void PrerenderLinkManager::OnCancelPrerender(int child_id, int prerender_id) { | 199 void PrerenderLinkManager::OnCancelPrerender(int child_id, int prerender_id) { |
| 173 LinkPrerender* prerender = FindByLauncherChildIdAndPrerenderId(child_id, | 200 LinkPrerender* prerender = FindByLauncherChildIdAndPrerenderId(child_id, |
| 174 prerender_id); | 201 prerender_id); |
| 175 if (!prerender) | 202 if (!prerender) |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 prerenders_.erase(*i); | 380 prerenders_.erase(*i); |
| 354 continue; | 381 continue; |
| 355 } | 382 } |
| 356 | 383 |
| 357 // We have successfully started a new prerender. | 384 // We have successfully started a new prerender. |
| 358 (*i)->handle = handle; | 385 (*i)->handle = handle; |
| 359 ++total_started_prerender_count; | 386 ++total_started_prerender_count; |
| 360 handle->SetObserver(this); | 387 handle->SetObserver(this); |
| 361 if (handle->IsPrerendering()) | 388 if (handle->IsPrerendering()) |
| 362 OnPrerenderStart(handle); | 389 OnPrerenderStart(handle); |
| 390 RecordLinkManagerStarting((*i)->rel_types); |
| 363 | 391 |
| 364 running_launcher_and_render_view_routes.insert( | 392 running_launcher_and_render_view_routes.insert( |
| 365 launcher_and_render_view_route); | 393 launcher_and_render_view_route); |
| 366 } | 394 } |
| 367 } | 395 } |
| 368 | 396 |
| 369 PrerenderLinkManager::LinkPrerender* | 397 PrerenderLinkManager::LinkPrerender* |
| 370 PrerenderLinkManager::FindByLauncherChildIdAndPrerenderId(int launcher_child_id, | 398 PrerenderLinkManager::FindByLauncherChildIdAndPrerenderId(int launcher_child_id, |
| 371 int prerender_id) { | 399 int prerender_id) { |
| 372 for (std::list<LinkPrerender>::iterator i = prerenders_.begin(); | 400 for (std::list<LinkPrerender>::iterator i = prerenders_.begin(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 DCHECK(!prerender->is_match_complete_replacement); | 523 DCHECK(!prerender->is_match_complete_replacement); |
| 496 prerender->is_match_complete_replacement = true; | 524 prerender->is_match_complete_replacement = true; |
| 497 Send(prerender->launcher_child_id, | 525 Send(prerender->launcher_child_id, |
| 498 new PrerenderMsg_OnPrerenderStop(prerender->prerender_id)); | 526 new PrerenderMsg_OnPrerenderStop(prerender->prerender_id)); |
| 499 // Do not call RemovePrerender here. The replacement needs to stay connected | 527 // Do not call RemovePrerender here. The replacement needs to stay connected |
| 500 // to the HTMLLinkElement in the renderer so it notices renderer-triggered | 528 // to the HTMLLinkElement in the renderer so it notices renderer-triggered |
| 501 // cancelations. | 529 // cancelations. |
| 502 } | 530 } |
| 503 | 531 |
| 504 } // namespace prerender | 532 } // namespace prerender |
| OLD | NEW |