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 |