Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(743)

Side by Side Diff: third_party/WebKit/Source/modules/indexeddb/WebIDBCallbacksImpl.cpp

Issue 2370643004: Port messages sent by WebIDBFactoryImpl to Mojo. (Closed)
Patch Set: Addressed most of dcheng@'s feedback. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 10 *
(...skipping 23 matching lines...) Expand all
34 #include "modules/indexeddb/IDBMetadata.h" 34 #include "modules/indexeddb/IDBMetadata.h"
35 #include "modules/indexeddb/IDBRequest.h" 35 #include "modules/indexeddb/IDBRequest.h"
36 #include "modules/indexeddb/IDBValue.h" 36 #include "modules/indexeddb/IDBValue.h"
37 #include "platform/SharedBuffer.h" 37 #include "platform/SharedBuffer.h"
38 #include "public/platform/modules/indexeddb/WebIDBCursor.h" 38 #include "public/platform/modules/indexeddb/WebIDBCursor.h"
39 #include "public/platform/modules/indexeddb/WebIDBDatabase.h" 39 #include "public/platform/modules/indexeddb/WebIDBDatabase.h"
40 #include "public/platform/modules/indexeddb/WebIDBDatabaseError.h" 40 #include "public/platform/modules/indexeddb/WebIDBDatabaseError.h"
41 #include "public/platform/modules/indexeddb/WebIDBKey.h" 41 #include "public/platform/modules/indexeddb/WebIDBKey.h"
42 #include "public/platform/modules/indexeddb/WebIDBValue.h" 42 #include "public/platform/modules/indexeddb/WebIDBValue.h"
43 #include "wtf/PtrUtil.h" 43 #include "wtf/PtrUtil.h"
44 #include "wtf/ThreadSpecific.h"
44 #include <memory> 45 #include <memory>
45 46
46 using blink::WebIDBCursor; 47 using blink::WebIDBCursor;
47 using blink::WebIDBDatabase; 48 using blink::WebIDBDatabase;
48 using blink::WebIDBDatabaseError; 49 using blink::WebIDBDatabaseError;
49 using blink::WebIDBKey; 50 using blink::WebIDBKey;
50 using blink::WebIDBKeyPath; 51 using blink::WebIDBKeyPath;
51 using blink::WebIDBMetadata; 52 using blink::WebIDBMetadata;
52 using blink::WebIDBValue; 53 using blink::WebIDBValue;
53 using blink::WebVector; 54 using blink::WebVector;
54 55
55 namespace blink { 56 namespace blink {
56 57
58 // This thread-specific list keeps track of instances of WebIDBCallbacksImpl
59 // created by each thread. If a thread exits before they are destroyed then they
60 // would otherwise be leaked because the IO thread can no longer post a task to
61 // the thread on which they were created.
62 using CallbacksList = std::vector<std::unique_ptr<WebIDBCallbacksImpl>>;
63 static ThreadSpecific<CallbacksList>& outstandingCallbacks() {
64 DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<CallbacksList>, callbacks,
65 new ThreadSpecific<CallbacksList>);
66 return callbacks;
67 }
68
57 // static 69 // static
58 std::unique_ptr<WebIDBCallbacksImpl> WebIDBCallbacksImpl::create( 70 std::unique_ptr<WebIDBCallbacksImpl> WebIDBCallbacksImpl::create(
59 IDBRequest* request) { 71 IDBRequest* request) {
60 return wrapUnique(new WebIDBCallbacksImpl(request)); 72 return wrapUnique(new WebIDBCallbacksImpl(request));
61 } 73 }
62 74
63 WebIDBCallbacksImpl::WebIDBCallbacksImpl(IDBRequest* request) 75 WebIDBCallbacksImpl::WebIDBCallbacksImpl(IDBRequest* request)
64 : m_request(request) { 76 : m_request(request) {
65 InspectorInstrumentation::asyncTaskScheduled( 77 InspectorInstrumentation::asyncTaskScheduled(
66 m_request->getExecutionContext(), IndexedDBNames::IndexedDB, this, true); 78 m_request->getExecutionContext(), IndexedDBNames::IndexedDB, this, true);
79 outstandingCallbacks()->push_back(wrapUnique(this));
67 } 80 }
68 81
69 WebIDBCallbacksImpl::~WebIDBCallbacksImpl() { 82 WebIDBCallbacksImpl::~WebIDBCallbacksImpl() {
70 InspectorInstrumentation::asyncTaskCanceled(m_request->getExecutionContext(), 83 if (m_request) {
71 this); 84 InspectorInstrumentation::asyncTaskCanceled(
85 m_request->getExecutionContext(), this);
86 m_request->webCallbacksDestroyed();
87 }
88
89 CallbacksList& callbacks = *outstandingCallbacks();
90 auto it =
91 std::find_if(callbacks.begin(), callbacks.end(),
cmumford 2016/10/11 18:30:54 Why can't you just do? auto it = std::find(callba
Reilly Grant (use Gerrit) 2016/10/11 23:46:13 std::unique_ptr<T> is not comparable to T so I nee
92 [this](const std::unique_ptr<WebIDBCallbacksImpl>& element) {
93 return element.get() == this;
94 });
95 if (it != callbacks.end()) {
96 it->release();
97 callbacks.erase(it);
98 }
72 } 99 }
73 100
74 void WebIDBCallbacksImpl::onError(const WebIDBDatabaseError& error) { 101 void WebIDBCallbacksImpl::onError(const WebIDBDatabaseError& error) {
75 InspectorInstrumentation::AsyncTask asyncTask( 102 if (m_request) {
76 m_request->getExecutionContext(), this); 103 InspectorInstrumentation::AsyncTask asyncTask(
77 m_request->onError(DOMException::create(error.code(), error.message())); 104 m_request->getExecutionContext(), this);
105 m_request->onError(DOMException::create(error.code(), error.message()));
106 }
78 } 107 }
79 108
80 void WebIDBCallbacksImpl::onSuccess(const WebVector<WebString>& webStringList) { 109 void WebIDBCallbacksImpl::onSuccess(const WebVector<WebString>& webStringList) {
81 Vector<String> stringList; 110 if (m_request) {
82 for (size_t i = 0; i < webStringList.size(); ++i) 111 Vector<String> stringList;
83 stringList.append(webStringList[i]); 112 for (size_t i = 0; i < webStringList.size(); ++i)
84 InspectorInstrumentation::AsyncTask asyncTask( 113 stringList.append(webStringList[i]);
85 m_request->getExecutionContext(), this); 114 InspectorInstrumentation::AsyncTask asyncTask(
86 m_request->onSuccess(stringList); 115 m_request->getExecutionContext(), this);
116 m_request->onSuccess(stringList);
117 }
87 } 118 }
88 119
89 void WebIDBCallbacksImpl::onSuccess(WebIDBCursor* cursor, 120 void WebIDBCallbacksImpl::onSuccess(WebIDBCursor* cursor,
90 const WebIDBKey& key, 121 const WebIDBKey& key,
91 const WebIDBKey& primaryKey, 122 const WebIDBKey& primaryKey,
92 const WebIDBValue& value) { 123 const WebIDBValue& value) {
93 InspectorInstrumentation::AsyncTask asyncTask( 124 if (m_request) {
94 m_request->getExecutionContext(), this); 125 InspectorInstrumentation::AsyncTask asyncTask(
95 m_request->onSuccess(wrapUnique(cursor), key, primaryKey, 126 m_request->getExecutionContext(), this);
96 IDBValue::create(value)); 127 m_request->onSuccess(wrapUnique(cursor), key, primaryKey,
128 IDBValue::create(value));
129 }
97 } 130 }
98 131
99 void WebIDBCallbacksImpl::onSuccess(WebIDBDatabase* backend, 132 void WebIDBCallbacksImpl::onSuccess(WebIDBDatabase* backend,
100 const WebIDBMetadata& metadata) { 133 const WebIDBMetadata& metadata) {
101 InspectorInstrumentation::AsyncTask asyncTask( 134 std::unique_ptr<WebIDBDatabase> db = wrapUnique(backend);
102 m_request->getExecutionContext(), this); 135 if (m_request) {
103 m_request->onSuccess(wrapUnique(backend), IDBDatabaseMetadata(metadata)); 136 InspectorInstrumentation::AsyncTask asyncTask(
137 m_request->getExecutionContext(), this);
138 m_request->onSuccess(std::move(db), IDBDatabaseMetadata(metadata));
139 } else if (db) {
140 db->close();
141 }
104 } 142 }
105 143
106 void WebIDBCallbacksImpl::onSuccess(const WebIDBKey& key) { 144 void WebIDBCallbacksImpl::onSuccess(const WebIDBKey& key) {
107 InspectorInstrumentation::AsyncTask asyncTask( 145 if (m_request) {
108 m_request->getExecutionContext(), this); 146 InspectorInstrumentation::AsyncTask asyncTask(
109 m_request->onSuccess(key); 147 m_request->getExecutionContext(), this);
148 m_request->onSuccess(key);
149 }
110 } 150 }
111 151
112 void WebIDBCallbacksImpl::onSuccess(const WebIDBValue& value) { 152 void WebIDBCallbacksImpl::onSuccess(const WebIDBValue& value) {
113 InspectorInstrumentation::AsyncTask asyncTask( 153 if (m_request) {
114 m_request->getExecutionContext(), this); 154 InspectorInstrumentation::AsyncTask asyncTask(
115 m_request->onSuccess(IDBValue::create(value)); 155 m_request->getExecutionContext(), this);
156 m_request->onSuccess(IDBValue::create(value));
157 }
116 } 158 }
117 159
118 void WebIDBCallbacksImpl::onSuccess(const WebVector<WebIDBValue>& values) { 160 void WebIDBCallbacksImpl::onSuccess(const WebVector<WebIDBValue>& values) {
119 InspectorInstrumentation::AsyncTask asyncTask( 161 if (m_request) {
120 m_request->getExecutionContext(), this); 162 InspectorInstrumentation::AsyncTask asyncTask(
121 Vector<RefPtr<IDBValue>> idbValues(values.size()); 163 m_request->getExecutionContext(), this);
122 for (size_t i = 0; i < values.size(); ++i) 164 Vector<RefPtr<IDBValue>> idbValues(values.size());
123 idbValues[i] = IDBValue::create(values[i]); 165 for (size_t i = 0; i < values.size(); ++i)
124 m_request->onSuccess(idbValues); 166 idbValues[i] = IDBValue::create(values[i]);
167 m_request->onSuccess(idbValues);
168 }
125 } 169 }
126 170
127 void WebIDBCallbacksImpl::onSuccess(long long value) { 171 void WebIDBCallbacksImpl::onSuccess(long long value) {
128 InspectorInstrumentation::AsyncTask asyncTask( 172 if (m_request) {
129 m_request->getExecutionContext(), this); 173 InspectorInstrumentation::AsyncTask asyncTask(
130 m_request->onSuccess(value); 174 m_request->getExecutionContext(), this);
175 m_request->onSuccess(value);
176 }
131 } 177 }
132 178
133 void WebIDBCallbacksImpl::onSuccess() { 179 void WebIDBCallbacksImpl::onSuccess() {
134 InspectorInstrumentation::AsyncTask asyncTask( 180 if (m_request) {
cmumford 2016/10/11 18:30:54 Nit: I think the style guide prefers: if (!m_re
Reilly Grant (use Gerrit) 2016/10/11 23:46:13 I don't see anything in the style guide about this
135 m_request->getExecutionContext(), this); 181 InspectorInstrumentation::AsyncTask asyncTask(
136 m_request->onSuccess(); 182 m_request->getExecutionContext(), this);
183 m_request->onSuccess();
184 }
137 } 185 }
138 186
139 void WebIDBCallbacksImpl::onSuccess(const WebIDBKey& key, 187 void WebIDBCallbacksImpl::onSuccess(const WebIDBKey& key,
140 const WebIDBKey& primaryKey, 188 const WebIDBKey& primaryKey,
141 const WebIDBValue& value) { 189 const WebIDBValue& value) {
142 InspectorInstrumentation::AsyncTask asyncTask( 190 if (m_request) {
143 m_request->getExecutionContext(), this); 191 InspectorInstrumentation::AsyncTask asyncTask(
144 m_request->onSuccess(key, primaryKey, IDBValue::create(value)); 192 m_request->getExecutionContext(), this);
193 m_request->onSuccess(key, primaryKey, IDBValue::create(value));
194 }
145 } 195 }
146 196
147 void WebIDBCallbacksImpl::onBlocked(long long oldVersion) { 197 void WebIDBCallbacksImpl::onBlocked(long long oldVersion) {
148 InspectorInstrumentation::AsyncTask asyncTask( 198 if (m_request) {
149 m_request->getExecutionContext(), this); 199 InspectorInstrumentation::AsyncTask asyncTask(
150 m_request->onBlocked(oldVersion); 200 m_request->getExecutionContext(), this);
201 m_request->onBlocked(oldVersion);
202 }
151 } 203 }
152 204
153 void WebIDBCallbacksImpl::onUpgradeNeeded(long long oldVersion, 205 void WebIDBCallbacksImpl::onUpgradeNeeded(long long oldVersion,
154 WebIDBDatabase* database, 206 WebIDBDatabase* database,
155 const WebIDBMetadata& metadata, 207 const WebIDBMetadata& metadata,
156 unsigned short dataLoss, 208 unsigned short dataLoss,
157 WebString dataLossMessage) { 209 WebString dataLossMessage) {
158 InspectorInstrumentation::AsyncTask asyncTask( 210 std::unique_ptr<WebIDBDatabase> db = wrapUnique(database);
159 m_request->getExecutionContext(), this); 211 if (m_request) {
160 m_request->onUpgradeNeeded( 212 InspectorInstrumentation::AsyncTask asyncTask(
161 oldVersion, wrapUnique(database), IDBDatabaseMetadata(metadata), 213 m_request->getExecutionContext(), this);
162 static_cast<WebIDBDataLoss>(dataLoss), dataLossMessage); 214 m_request->onUpgradeNeeded(
215 oldVersion, std::move(db), IDBDatabaseMetadata(metadata),
216 static_cast<WebIDBDataLoss>(dataLoss), dataLossMessage);
217 } else {
218 db->close();
219 }
220 }
221
222 void WebIDBCallbacksImpl::detach() {
223 m_request.clear();
163 } 224 }
164 225
165 } // namespace blink 226 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698