1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_NET_CACHE_STATS_H_
#define CHROME_BROWSER_NET_CACHE_STATS_H_
#include <map>
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "base/time.h"
#include "chrome/browser/net/chrome_url_request_context.h"
#include "content/public/browser/web_contents_observer.h"
#include "net/base/network_delegate.h"
class TabContents;
namespace base {
class Histogram;
}
namespace net {
class URLRequest;
class URLRequestContext;
}
#if defined(COMPILER_GCC)
namespace BASE_HASH_NAMESPACE {
template <>
struct hash<const net::URLRequestContext*> {
std::size_t operator()(const net::URLRequestContext* value) const {
return reinterpret_cast<std::size_t>(value);
}
};
}
#endif
namespace chrome_browser_net {
// This class collects UMA stats about cache performance.
class CacheStats {
public:
enum TabEvent {
SPINNER_START,
SPINNER_STOP
};
CacheStats();
~CacheStats();
void OnCacheWaitStateChange(const net::URLRequest& request,
net::NetworkDelegate::CacheWaitState state);
void OnTabEvent(std::pair<int, int> render_view_id, TabEvent event);
void RegisterURLRequestContext(const net::URLRequestContext* context,
ChromeURLRequestContext::ContextType type);
void UnregisterURLRequestContext(const net::URLRequestContext* context);
private:
struct TabLoadStats;
// A map mapping a renderer's process id and route id to a TabLoadStats,
// representing that renderer's load statistics.
typedef std::map<std::pair<int, int>, TabLoadStats*> TabLoadStatsMap;
// Gets TabLoadStats for a given RenderView.
TabLoadStats* GetTabLoadStats(std::pair<int, int> render_view_id);
// Deletes TabLoadStats no longer needed for a render view.
void RemoveTabLoadStats(std::pair<int, int> render_view_id);
// Sets a timer for a given tab to collect stats. |timer_index| indicates
// how many times stats have been collected since the navigation has started
// for this tab.
void ScheduleTimer(TabLoadStats* stats);
// The callback when a timer fires to collect stats again.
void TimerCallback(TabLoadStats* stats);
// Helper function to put the current set of cache statistics into an UMA
// histogram.
void RecordCacheFractionHistogram(base::TimeDelta elapsed,
base::TimeDelta cache_time,
bool is_load_done,
int timer_index);
TabLoadStatsMap tab_load_stats_;
std::vector<base::Histogram*> final_histograms_;
std::vector<base::Histogram*> intermediate_histograms_;
base::hash_set<const net::URLRequestContext*> main_request_contexts_;
DISALLOW_COPY_AND_ASSIGN(CacheStats);
};
// A WebContentsObserver watching all tabs, notifying CacheStats
// whenever the spinner starts or stops for a given tab, and when a renderer
// is no longer used.
class CacheStatsTabHelper : public content::WebContentsObserver {
public:
explicit CacheStatsTabHelper(TabContents* tab);
virtual ~CacheStatsTabHelper();
// content::WebContentsObserver implementation
virtual void DidStartProvisionalLoadForFrame(
int64 frame_id,
bool is_main_frame,
const GURL& validated_url,
bool is_error_page,
content::RenderViewHost* render_view_host) OVERRIDE;
virtual void DidStopLoading(
content::RenderViewHost* render_view_host) OVERRIDE;
private:
// Calls into CacheStats to notify that a reportable event has occurred
// for the tab being observed.
void NotifyCacheStats(CacheStats::TabEvent event,
content::RenderViewHost* render_view_host);
CacheStats* cache_stats_;
bool is_otr_profile_;
DISALLOW_COPY_AND_ASSIGN(CacheStatsTabHelper);
};
} // namespace chrome_browser_net
#endif // CHROME_BROWSER_NET_CACHE_STATS_H_
|