Chromium Code Reviews| Index: third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
| diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
| index 76d5cc57c1ab501165292e5c0af4c86959339347..8705094481042e071a260558471091e9ef83f458 100644 |
| --- a/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
| +++ b/third_party/WebKit/Source/modules/indexeddb/IDBRequest.cpp |
| @@ -44,6 +44,7 @@ |
| #include "modules/indexeddb/IDBTracing.h" |
| #include "modules/indexeddb/IDBValue.h" |
| #include "modules/indexeddb/WebIDBCallbacksImpl.h" |
| +#include "platform/Histogram.h" |
| #include "platform/SharedBuffer.h" |
| #include "public/platform/WebBlobInfo.h" |
| @@ -51,10 +52,34 @@ using blink::WebIDBCursor; |
| namespace blink { |
| -IDBRequest* IDBRequest::Create(ScriptState* script_state, |
| - IDBAny* source, |
| - IDBTransaction* transaction) { |
| - IDBRequest* request = new IDBRequest(script_state, source, transaction); |
| +IDBRequest::ScopedMetricsTracker::ScopedMetricsTracker(const char* uma_name, |
| + const char* tracing_name, |
| + void* id) |
| + : uma_name_(uma_name), |
| + tracing_name_(tracing_name), |
| + id_(id), |
| + start_(uma_name_ ? WTF::TimeTicks::Now() : WTF::TimeTicks()) { |
| + if (tracing_name_) |
| + TRACE_EVENT_ASYNC_BEGIN0("IndexedDB", tracing_name_, id); |
| +} |
| + |
| +IDBRequest::ScopedMetricsTracker::~ScopedMetricsTracker() { |
| + if (tracing_name_) |
| + TRACE_EVENT_ASYNC_END0("IndexedDB", tracing_name_, id_); |
| +} |
| + |
| +void IDBRequest::ScopedMetricsTracker::RecordUMAMetrics() const { |
| + if (uma_name_) |
| + UMA_HISTOGRAM_MEDIUM_TIMES(uma_name_, WTF::TimeTicks::Now() - start_); |
|
pwnall
2017/05/18 22:14:32
Does this not record UMA data?
dmurph
2017/05/18 23:51:15
not anymore :P
|
| +} |
| + |
| +IDBRequest* IDBRequest::Create( |
| + ScriptState* script_state, |
| + IDBAny* source, |
| + IDBTransaction* transaction, |
| + std::unique_ptr<IDBRequest::ScopedMetricsTracker> metrics) { |
| + IDBRequest* request = |
| + new IDBRequest(script_state, source, transaction, std::move(metrics)); |
| request->SuspendIfNeeded(); |
| // Requests associated with IDBFactory (open/deleteDatabase/getDatabaseNames) |
| // are not associated with transactions. |
| @@ -65,11 +90,13 @@ IDBRequest* IDBRequest::Create(ScriptState* script_state, |
| IDBRequest::IDBRequest(ScriptState* script_state, |
| IDBAny* source, |
| - IDBTransaction* transaction) |
| + IDBTransaction* transaction, |
| + std::unique_ptr<ScopedMetricsTracker> metrics) |
| : SuspendableObject(ExecutionContext::From(script_state)), |
| transaction_(transaction), |
| isolate_(script_state->GetIsolate()), |
| - source_(source) {} |
| + source_(source), |
| + metrics_(std::move(metrics)) {} |
| IDBRequest::~IDBRequest() { |
| DCHECK(ready_state_ == DONE || ready_state_ == kEarlyDeath || |
| @@ -249,6 +276,7 @@ void IDBRequest::EnqueueResponse(DOMException* error) { |
| SetResult(IDBAny::CreateUndefined()); |
| pending_cursor_.Clear(); |
| EnqueueEvent(Event::CreateCancelableBubble(EventTypeNames::error)); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResponse(const Vector<String>& string_list) { |
| @@ -260,6 +288,7 @@ void IDBRequest::EnqueueResponse(const Vector<String>& string_list) { |
| for (size_t i = 0; i < string_list.size(); ++i) |
| dom_string_list->Append(string_list[i]); |
| EnqueueResultInternal(IDBAny::Create(dom_string_list)); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResponse(std::unique_ptr<WebIDBCursor> backend, |
| @@ -286,6 +315,7 @@ void IDBRequest::EnqueueResponse(std::unique_ptr<WebIDBCursor> backend, |
| NOTREACHED(); |
| } |
| SetResultCursor(cursor, key, primary_key, std::move(value)); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResponse(IDBKey* idb_key) { |
| @@ -298,6 +328,7 @@ void IDBRequest::EnqueueResponse(IDBKey* idb_key) { |
| EnqueueResultInternal(IDBAny::Create(idb_key)); |
| else |
| EnqueueResultInternal(IDBAny::CreateUndefined()); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResponse(const Vector<RefPtr<IDBValue>>& values) { |
| @@ -307,6 +338,7 @@ void IDBRequest::EnqueueResponse(const Vector<RefPtr<IDBValue>>& values) { |
| AckReceivedBlobs(values); |
| EnqueueResultInternal(IDBAny::Create(values)); |
| + MaybeRecordMetrics(); |
| } |
| #if DCHECK_IS_ON() |
| @@ -343,6 +375,7 @@ void IDBRequest::EnqueueResponse(PassRefPtr<IDBValue> prp_value) { |
| #endif |
| EnqueueResultInternal(IDBAny::Create(value.Release())); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResponse(int64_t value) { |
| @@ -350,6 +383,7 @@ void IDBRequest::EnqueueResponse(int64_t value) { |
| if (!ShouldEnqueueEvent()) |
| return; |
| EnqueueResultInternal(IDBAny::Create(value)); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResponse() { |
| @@ -357,6 +391,7 @@ void IDBRequest::EnqueueResponse() { |
| if (!ShouldEnqueueEvent()) |
| return; |
| EnqueueResultInternal(IDBAny::CreateUndefined()); |
| + MaybeRecordMetrics(); |
| } |
| void IDBRequest::EnqueueResultInternal(IDBAny* result) { |
| @@ -382,6 +417,7 @@ void IDBRequest::EnqueueResponse(IDBKey* key, |
| DCHECK(pending_cursor_); |
| SetResultCursor(pending_cursor_.Release(), key, primary_key, |
| std::move(value)); |
| + MaybeRecordMetrics(); |
| } |
| bool IDBRequest::HasPendingActivity() const { |