Chromium Code Reviews| 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 |