OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/common/web_database_observer_impl.h" | 5 #include "content/common/web_database_observer_impl.h" |
6 | 6 |
7 #include "base/metrics/histogram.h" | |
7 #include "base/string16.h" | 8 #include "base/string16.h" |
8 #include "content/common/database_messages.h" | 9 #include "content/common/database_messages.h" |
9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" | 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" |
10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" | 11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
11 | 12 |
13 using WebKit::WebDatabase; | |
14 | |
15 namespace { | |
16 | |
17 const int kResultHistogramSize = 50; | |
18 const int kCallsiteHistogramSize = 10; | |
19 | |
20 int DetermineHistogramResult(int webSqlErrorCode, int sqliteErrorCode) { | |
21 // If we have a sqlite error, log it after trimming the extended bits. | |
22 // There are 26 possible values, but we leave room for some new ones. | |
23 if (sqliteErrorCode) | |
24 return std::min(sqliteErrorCode & 0xff, 30); | |
25 | |
26 // Otherwise, webSqlErrorCode may be an SQLExceptionCode, SQLErrorCode | |
27 // or a DOMExceptionCode, or -1 for success. | |
28 if (webSqlErrorCode == -1) | |
29 return 0; // no error | |
30 | |
31 // SQLExceptionCode starts at 1000 | |
32 if (webSqlErrorCode >= 1000) | |
33 webSqlErrorCode -= 1000; | |
34 | |
35 return std::min(webSqlErrorCode + 30, kResultHistogramSize - 1); | |
36 } | |
37 | |
38 } // namespace | |
39 | |
12 WebDatabaseObserverImpl::WebDatabaseObserverImpl( | 40 WebDatabaseObserverImpl::WebDatabaseObserverImpl( |
13 IPC::Message::Sender* sender) | 41 IPC::Message::Sender* sender) |
14 : sender_(sender), | 42 : sender_(sender), |
15 open_connections_(new webkit_database::DatabaseConnectionsWrapper) { | 43 open_connections_(new webkit_database::DatabaseConnectionsWrapper) { |
16 } | 44 } |
17 | 45 |
18 WebDatabaseObserverImpl::~WebDatabaseObserverImpl() { | 46 WebDatabaseObserverImpl::~WebDatabaseObserverImpl() { |
19 } | 47 } |
20 | 48 |
21 void WebDatabaseObserverImpl::databaseOpened( | 49 void WebDatabaseObserverImpl::databaseOpened( |
22 const WebKit::WebDatabase& database) { | 50 const WebDatabase& database) { |
23 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); | 51 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); |
24 string16 database_name = database.name(); | 52 string16 database_name = database.name(); |
25 open_connections_->AddOpenConnection(origin_identifier, database_name); | 53 open_connections_->AddOpenConnection(origin_identifier, database_name); |
26 sender_->Send(new DatabaseHostMsg_Opened( | 54 sender_->Send(new DatabaseHostMsg_Opened( |
27 origin_identifier, database_name, | 55 origin_identifier, database_name, |
28 database.displayName(), database.estimatedSize())); | 56 database.displayName(), database.estimatedSize())); |
29 } | 57 } |
30 | 58 |
31 void WebDatabaseObserverImpl::databaseModified( | 59 void WebDatabaseObserverImpl::databaseModified( |
32 const WebKit::WebDatabase& database) { | 60 const WebDatabase& database) { |
33 sender_->Send(new DatabaseHostMsg_Modified( | 61 sender_->Send(new DatabaseHostMsg_Modified( |
34 database.securityOrigin().databaseIdentifier(), database.name())); | 62 database.securityOrigin().databaseIdentifier(), database.name())); |
35 } | 63 } |
36 | 64 |
37 void WebDatabaseObserverImpl::databaseClosed( | 65 void WebDatabaseObserverImpl::databaseClosed( |
38 const WebKit::WebDatabase& database) { | 66 const WebDatabase& database) { |
39 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); | 67 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); |
40 string16 database_name = database.name(); | 68 string16 database_name = database.name(); |
41 sender_->Send(new DatabaseHostMsg_Closed( | 69 sender_->Send(new DatabaseHostMsg_Closed( |
42 origin_identifier, database_name)); | 70 origin_identifier, database_name)); |
43 open_connections_->RemoveOpenConnection(origin_identifier, database_name); | 71 open_connections_->RemoveOpenConnection(origin_identifier, database_name); |
44 } | 72 } |
45 | 73 |
74 void WebDatabaseObserverImpl::reportOpenDatabaseResult( | |
75 const WebDatabase& database, int callsite, int webSqlErrorCode, | |
76 int sqliteErrorCode) { | |
77 DCHECK(callsite < kCallsiteHistogramSize); | |
ramant (doing other things)
2011/11/29 23:29:36
nit:
could we define a routine that takes the his
michaeln
2011/11/29 23:50:13
I believe the histogram names can't vary for a par
ramant (doing other things)
2011/11/30 00:13:21
We have to define a macro. It is your call.
| |
78 int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); | |
79 if (database.isSyncDatabase()) { | |
80 UMA_HISTOGRAM_ENUMERATION("websql.Sync.OpenResult", | |
81 result, kResultHistogramSize); | |
82 if (result) { | |
83 UMA_HISTOGRAM_ENUMERATION("websql.Sync.OpenResult.ErrorSite", | |
84 callsite, kCallsiteHistogramSize); | |
85 } | |
86 } else { | |
87 UMA_HISTOGRAM_ENUMERATION("websql.Async.OpenResult", | |
88 result, kResultHistogramSize); | |
89 if (result) { | |
90 UMA_HISTOGRAM_ENUMERATION("websql.Async.OpenResult.ErrorSite", | |
91 callsite, kCallsiteHistogramSize); | |
92 } | |
93 } | |
94 } | |
95 | |
96 void WebDatabaseObserverImpl::reportChangeVersionResult( | |
97 const WebDatabase& database, int callsite, int webSqlErrorCode, | |
98 int sqliteErrorCode) { | |
99 DCHECK(callsite < kCallsiteHistogramSize); | |
100 int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); | |
101 if (database.isSyncDatabase()) { | |
102 UMA_HISTOGRAM_ENUMERATION("websql.Sync.ChangeVersionResult", | |
103 result, kResultHistogramSize); | |
104 if (result) { | |
105 UMA_HISTOGRAM_ENUMERATION("websql.Sync.ChangeVersionResult.ErrorSite", | |
106 callsite, kCallsiteHistogramSize); | |
107 } | |
108 } else { | |
109 UMA_HISTOGRAM_ENUMERATION("websql.Async.ChangeVersionResult", | |
110 result, kResultHistogramSize); | |
111 if (result) { | |
112 UMA_HISTOGRAM_ENUMERATION("websql.Async.ChangeVersionResult.ErrorSite", | |
113 callsite, kCallsiteHistogramSize); | |
114 } | |
115 } | |
116 } | |
117 | |
118 void WebDatabaseObserverImpl::reportStartTransactionResult( | |
119 const WebDatabase& database, int callsite, int webSqlErrorCode, | |
120 int sqliteErrorCode) { | |
121 DCHECK(callsite < kCallsiteHistogramSize); | |
122 int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); | |
123 if (database.isSyncDatabase()) { | |
124 UMA_HISTOGRAM_ENUMERATION("websql.Sync.BeginResult", | |
125 result, kResultHistogramSize); | |
126 if (result) { | |
127 UMA_HISTOGRAM_ENUMERATION("websql.Sync.BeginResult.ErrorSite", | |
128 callsite, kCallsiteHistogramSize); | |
129 } | |
130 } else { | |
131 UMA_HISTOGRAM_ENUMERATION("websql.Async.BeginResult", | |
132 result, kResultHistogramSize); | |
133 if (result) { | |
134 UMA_HISTOGRAM_ENUMERATION("websql.Async.BeginResult.ErrorSite", | |
135 callsite, kCallsiteHistogramSize); | |
136 } | |
137 } | |
138 } | |
139 | |
140 void WebDatabaseObserverImpl::reportCommitTransactionResult( | |
141 const WebDatabase& database, int callsite, int webSqlErrorCode, | |
142 int sqliteErrorCode) { | |
143 DCHECK(callsite < kCallsiteHistogramSize); | |
144 int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); | |
145 if (database.isSyncDatabase()) { | |
146 UMA_HISTOGRAM_ENUMERATION("websql.Sync.CommitResult", | |
147 result, kResultHistogramSize); | |
148 if (result) { | |
149 UMA_HISTOGRAM_ENUMERATION("websql.Sync.CommitResult.ErrorSite", | |
150 callsite, kCallsiteHistogramSize); | |
151 } | |
152 } else { | |
153 UMA_HISTOGRAM_ENUMERATION("websql.Async.CommitResult", result, | |
154 result, kResultHistogramSize); | |
155 if (result) { | |
156 UMA_HISTOGRAM_ENUMERATION("websql.Async.CommitResult.ErrorSite", | |
157 callsite, kCallsiteHistogramSize); | |
158 } | |
159 } | |
160 } | |
161 | |
162 void WebDatabaseObserverImpl::reportExecuteStatementResult( | |
163 const WebDatabase& database, int callsite, int webSqlErrorCode, | |
164 int sqliteErrorCode) { | |
165 DCHECK(callsite < kCallsiteHistogramSize); | |
166 int result = DetermineHistogramResult(webSqlErrorCode, sqliteErrorCode); | |
167 if (database.isSyncDatabase()) { | |
168 UMA_HISTOGRAM_ENUMERATION("websql.Sync.StatementResult", | |
169 result, kHistogramSize); | |
170 if (result) { | |
171 UMA_HISTOGRAM_ENUMERATION("websql.Sync.StatementResult.ErrorSite", | |
172 callsite, kCallsiteHistogramSize); | |
173 } | |
174 } else { | |
175 UMA_HISTOGRAM_ENUMERATION("websql.Async.StatementResult", | |
176 result, kResultHistogramSize); | |
177 if (result) { | |
178 UMA_HISTOGRAM_ENUMERATION("websql.Async.StatementResult.ErrorSite", | |
179 callsite, kCallsiteHistogramSize); | |
180 } | |
181 } | |
182 } | |
183 | |
184 void WebDatabaseObserverImpl::reportVacuumDatabaseResult( | |
185 const WebDatabase& database, int sqliteErrorCode) { | |
186 int result = DetermineHistogramResult(-1, sqliteErrorCode); | |
187 if (database.isSyncDatabase()) { | |
188 UMA_HISTOGRAM_ENUMERATION("websql.Sync.VacuumResult", | |
189 result, kResultHistogramSize); | |
190 } else { | |
191 UMA_HISTOGRAM_ENUMERATION("websql.Async.VacuumResult", | |
192 result, kResultHistogramSize); | |
193 } | |
194 } | |
195 | |
46 void WebDatabaseObserverImpl::WaitForAllDatabasesToClose() { | 196 void WebDatabaseObserverImpl::WaitForAllDatabasesToClose() { |
47 open_connections_->WaitForAllDatabasesToClose(); | 197 open_connections_->WaitForAllDatabasesToClose(); |
48 } | 198 } |
OLD | NEW |