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/platform/WebString.h" | 11 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/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 websql_error, int sqlite_error) { |
| 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 (sqlite_error) |
| 24 return std::min(sqlite_error & 0xff, 30); |
| 25 |
| 26 // Otherwise, websql_error may be an SQLExceptionCode, SQLErrorCode |
| 27 // or a DOMExceptionCode, or -1 for success. |
| 28 if (websql_error == -1) |
| 29 return 0; // no error |
| 30 |
| 31 // SQLExceptionCode starts at 1000 |
| 32 if (websql_error >= 1000) |
| 33 websql_error -= 1000; |
| 34 |
| 35 return std::min(websql_error + 30, kResultHistogramSize - 1); |
| 36 } |
| 37 |
| 38 #define HISTOGRAM_WEBSQL_RESULT(name, database, callsite, \ |
| 39 websql_error, sqlite_error) \ |
| 40 do { \ |
| 41 DCHECK(callsite < kCallsiteHistogramSize); \ |
| 42 int result = DetermineHistogramResult(websql_error, sqlite_error); \ |
| 43 if (database.isSyncDatabase()) { \ |
| 44 UMA_HISTOGRAM_ENUMERATION("websql.Sync." name, \ |
| 45 result, kResultHistogramSize); \ |
| 46 if (result) { \ |
| 47 UMA_HISTOGRAM_ENUMERATION("websql.Sync." name ".ErrorSite", \ |
| 48 callsite, kCallsiteHistogramSize); \ |
| 49 } \ |
| 50 } else { \ |
| 51 UMA_HISTOGRAM_ENUMERATION("websql.Async." name, \ |
| 52 result, kResultHistogramSize); \ |
| 53 if (result) { \ |
| 54 UMA_HISTOGRAM_ENUMERATION("websql.Async." name ".ErrorSite", \ |
| 55 callsite, kCallsiteHistogramSize); \ |
| 56 } \ |
| 57 } \ |
| 58 } while (0) |
| 59 |
| 60 } // namespace |
| 61 |
12 WebDatabaseObserverImpl::WebDatabaseObserverImpl( | 62 WebDatabaseObserverImpl::WebDatabaseObserverImpl( |
13 IPC::Message::Sender* sender) | 63 IPC::Message::Sender* sender) |
14 : sender_(sender), | 64 : sender_(sender), |
15 open_connections_(new webkit_database::DatabaseConnectionsWrapper) { | 65 open_connections_(new webkit_database::DatabaseConnectionsWrapper) { |
16 } | 66 } |
17 | 67 |
18 WebDatabaseObserverImpl::~WebDatabaseObserverImpl() { | 68 WebDatabaseObserverImpl::~WebDatabaseObserverImpl() { |
19 } | 69 } |
20 | 70 |
21 void WebDatabaseObserverImpl::databaseOpened( | 71 void WebDatabaseObserverImpl::databaseOpened( |
22 const WebKit::WebDatabase& database) { | 72 const WebDatabase& database) { |
23 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); | 73 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); |
24 string16 database_name = database.name(); | 74 string16 database_name = database.name(); |
25 open_connections_->AddOpenConnection(origin_identifier, database_name); | 75 open_connections_->AddOpenConnection(origin_identifier, database_name); |
26 sender_->Send(new DatabaseHostMsg_Opened( | 76 sender_->Send(new DatabaseHostMsg_Opened( |
27 origin_identifier, database_name, | 77 origin_identifier, database_name, |
28 database.displayName(), database.estimatedSize())); | 78 database.displayName(), database.estimatedSize())); |
29 } | 79 } |
30 | 80 |
31 void WebDatabaseObserverImpl::databaseModified( | 81 void WebDatabaseObserverImpl::databaseModified( |
32 const WebKit::WebDatabase& database) { | 82 const WebDatabase& database) { |
33 sender_->Send(new DatabaseHostMsg_Modified( | 83 sender_->Send(new DatabaseHostMsg_Modified( |
34 database.securityOrigin().databaseIdentifier(), database.name())); | 84 database.securityOrigin().databaseIdentifier(), database.name())); |
35 } | 85 } |
36 | 86 |
37 void WebDatabaseObserverImpl::databaseClosed( | 87 void WebDatabaseObserverImpl::databaseClosed( |
38 const WebKit::WebDatabase& database) { | 88 const WebDatabase& database) { |
39 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); | 89 string16 origin_identifier = database.securityOrigin().databaseIdentifier(); |
40 string16 database_name = database.name(); | 90 string16 database_name = database.name(); |
41 sender_->Send(new DatabaseHostMsg_Closed( | 91 sender_->Send(new DatabaseHostMsg_Closed( |
42 origin_identifier, database_name)); | 92 origin_identifier, database_name)); |
43 open_connections_->RemoveOpenConnection(origin_identifier, database_name); | 93 open_connections_->RemoveOpenConnection(origin_identifier, database_name); |
44 } | 94 } |
45 | 95 |
| 96 void WebDatabaseObserverImpl::reportOpenDatabaseResult( |
| 97 const WebDatabase& database, int callsite, int websql_error, |
| 98 int sqlite_error) { |
| 99 HISTOGRAM_WEBSQL_RESULT("OpenResult", database, callsite, |
| 100 websql_error, sqlite_error); |
| 101 } |
| 102 |
| 103 void WebDatabaseObserverImpl::reportChangeVersionResult( |
| 104 const WebDatabase& database, int callsite, int websql_error, |
| 105 int sqlite_error) { |
| 106 HISTOGRAM_WEBSQL_RESULT("ChangeVersionResult", database, callsite, |
| 107 websql_error, sqlite_error); |
| 108 } |
| 109 |
| 110 void WebDatabaseObserverImpl::reportStartTransactionResult( |
| 111 const WebDatabase& database, int callsite, int websql_error, |
| 112 int sqlite_error) { |
| 113 HISTOGRAM_WEBSQL_RESULT("BeginResult", database, callsite, |
| 114 websql_error, sqlite_error); |
| 115 } |
| 116 |
| 117 void WebDatabaseObserverImpl::reportCommitTransactionResult( |
| 118 const WebDatabase& database, int callsite, int websql_error, |
| 119 int sqlite_error) { |
| 120 HISTOGRAM_WEBSQL_RESULT("CommitResult", database, callsite, |
| 121 websql_error, sqlite_error); |
| 122 } |
| 123 |
| 124 void WebDatabaseObserverImpl::reportExecuteStatementResult( |
| 125 const WebDatabase& database, int callsite, int websql_error, |
| 126 int sqlite_error) { |
| 127 HISTOGRAM_WEBSQL_RESULT("StatementResult", database, callsite, |
| 128 websql_error, sqlite_error); |
| 129 } |
| 130 |
| 131 void WebDatabaseObserverImpl::reportVacuumDatabaseResult( |
| 132 const WebDatabase& database, int sqlite_error) { |
| 133 int result = DetermineHistogramResult(-1, sqlite_error); |
| 134 if (database.isSyncDatabase()) { |
| 135 UMA_HISTOGRAM_ENUMERATION("websql.Sync.VacuumResult", |
| 136 result, kResultHistogramSize); |
| 137 } else { |
| 138 UMA_HISTOGRAM_ENUMERATION("websql.Async.VacuumResult", |
| 139 result, kResultHistogramSize); |
| 140 } |
| 141 } |
| 142 |
46 void WebDatabaseObserverImpl::WaitForAllDatabasesToClose() { | 143 void WebDatabaseObserverImpl::WaitForAllDatabasesToClose() { |
47 open_connections_->WaitForAllDatabasesToClose(); | 144 open_connections_->WaitForAllDatabasesToClose(); |
48 } | 145 } |
OLD | NEW |