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

Side by Side Diff: third_party/WebKit/Source/modules/webdatabase/SQLTransactionBackend.cpp

Issue 2395473002: reflow comments in modules/webdatabase (Closed)
Patch Set: 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) 2007, 2008, 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008, 2013 Apple 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 29 matching lines...) Expand all
40 #include "modules/webdatabase/SQLTransactionCoordinator.h" 40 #include "modules/webdatabase/SQLTransactionCoordinator.h"
41 #include "modules/webdatabase/StorageLog.h" 41 #include "modules/webdatabase/StorageLog.h"
42 #include "modules/webdatabase/sqlite/SQLValue.h" 42 #include "modules/webdatabase/sqlite/SQLValue.h"
43 #include "modules/webdatabase/sqlite/SQLiteTransaction.h" 43 #include "modules/webdatabase/sqlite/SQLiteTransaction.h"
44 #include "wtf/PtrUtil.h" 44 #include "wtf/PtrUtil.h"
45 #include "wtf/StdLibExtras.h" 45 #include "wtf/StdLibExtras.h"
46 #include <memory> 46 #include <memory>
47 47
48 // How does a SQLTransaction work? 48 // How does a SQLTransaction work?
49 // ============================== 49 // ==============================
50 // The SQLTransaction is a state machine that executes a series of states / step s. 50 // The SQLTransaction is a state machine that executes a series of states /
51 // steps.
51 // 52 //
52 // The work of the transaction states are defined in section of 4.3.2 of the 53 // The work of the transaction states are defined in section of 4.3.2 of the
53 // webdatabase spec: http://dev.w3.org/html5/webdatabase/#processing-model 54 // webdatabase spec: http://dev.w3.org/html5/webdatabase/#processing-model
54 // 55 //
55 // the State Transition Graph at a glance: 56 // the State Transition Graph at a glance:
56 // ====================================== 57 // ======================================
57 // 58 //
58 // Backend . Frontend 59 // Backend . Frontend
59 // (works with SQLiteDatabase) . (works with Script) 60 // (works with SQLiteDatabase) . (works with Script)
60 // =========================== . =================== 61 // =========================== . ===================
61 // . 62 // .
62 // 1. Idle . 63 // 1. Idle .
63 // v . 64 // v .
64 // 2. AcquireLock . 65 // 2. AcquireLock .
65 // v . 66 // v .
66 // 3. OpenTransactionAndPreflight ------------------------------------------ . 67 // 3. OpenTransactionAndPreflight -----------------------------------.
67 // | . | 68 // | . |
68 // `-------------------------------> 8. DeliverTransactionCallback --. | 69 // `-------------------------> 8. DeliverTransactionCallback --. |
69 // . | v v 70 // . | v v
70 // ,-------------------------------------' 9. DeliverTransactionErrorC allback + 71 // ,------------------------------' 9. DeliverTransactionErrorCallback +
71 // | . ^ ^ ^ | 72 // | . ^ ^ ^ |
72 // v . | | | | 73 // v . | | | |
73 // 4. RunStatements -----------------------------------------------------' | | | 74 // 4. RunStatements -----------------------------------------------' | | |
74 // | ^ ^ | ^ | . | | | 75 // | ^ ^ | ^ | . | | |
75 // |--------' | | | `------------> 10. DeliverStatementCallback +----- ' | | 76 // |--------' | | | `------> 10. DeliverStatementCallback +----' | |
76 // | | | `---------------------------------------------' | | 77 // | | | `---------------------------------------' | |
77 // | | `-----------------> 11. DeliverQuotaIncreaseCallback + | | 78 // | | `-----------> 11. DeliverQuotaIncreaseCallback + | |
78 // | `-----------------------------------------------------' | | 79 // | `-----------------------------------------------' | |
79 // v . | | 80 // v . | |
80 // 5. PostflightAndCommit --+----------------------------------------------- ---' | 81 // 5. PostflightAndCommit --+------------------------------------------' |
81 // |----------> 12. DeliverSuccessCallback + | 82 // |----> 12. DeliverSuccessCallback + |
82 // ,--------------------' . | | 83 // ,--------------------' . | |
83 // v . | | 84 // v . | |
84 // 6. CleanupAndTerminate <-----------------------------------------' | 85 // 6. CleanupAndTerminate <-----------------------------------' |
85 // v ^ . | 86 // v ^ . |
86 // 0. End | . | 87 // 0. End | . |
87 // | . | 88 // | . |
88 // 7: CleanupAfterTransactionErrorCallback <--------------------- -------' 89 // 7: CleanupAfterTransactionErrorCallback <--------------------'
89 // . 90 // .
90 // 91 //
91 // the States and State Transitions: 92 // the States and State Transitions:
92 // ================================ 93 // ================================
93 // 0. SQLTransactionState::End 94 // 0. SQLTransactionState::End
94 // - the end state. 95 // - the end state.
95 // 96 //
96 // 1. SQLTransactionState::Idle 97 // 1. SQLTransactionState::Idle
97 // - placeholder state while waiting on frontend/backend, etc. See comme nt on 98 // - placeholder state while waiting on frontend/backend, etc. See
98 // "State transitions between SQLTransaction and SQLTransactionBackend " 99 // comment on "State transitions between SQLTransaction and
99 // below. 100 // SQLTransactionBackend" below.
100 // 101 //
101 // 2. SQLTransactionState::AcquireLock (runs in backend) 102 // 2. SQLTransactionState::AcquireLock (runs in backend)
102 // - this is the start state. 103 // - this is the start state.
103 // - acquire the "lock". 104 // - acquire the "lock".
104 // - on "lock" acquisition, goto SQLTransactionState::OpenTransactionAnd Preflight. 105 // - on "lock" acquisition, goto
106 // SQLTransactionState::OpenTransactionAndPreflight.
105 // 107 //
106 // 3. SQLTransactionState::openTransactionAndPreflight (runs in backend) 108 // 3. SQLTransactionState::openTransactionAndPreflight (runs in backend)
107 // - Sets up an SQLiteTransaction. 109 // - Sets up an SQLiteTransaction.
108 // - begin the SQLiteTransaction. 110 // - begin the SQLiteTransaction.
109 // - call the SQLTransactionWrapper preflight if available. 111 // - call the SQLTransactionWrapper preflight if available.
110 // - schedule script callback. 112 // - schedule script callback.
111 // - on error, goto SQLTransactionState::DeliverTransactionErrorCallback . 113 // - on error, goto
114 // SQLTransactionState::DeliverTransactionErrorCallback.
112 // - goto SQLTransactionState::DeliverTransactionCallback. 115 // - goto SQLTransactionState::DeliverTransactionCallback.
113 // 116 //
114 // 4. SQLTransactionState::DeliverTransactionCallback (runs in frontend) 117 // 4. SQLTransactionState::DeliverTransactionCallback (runs in frontend)
115 // - invoke the script function callback() if available. 118 // - invoke the script function callback() if available.
116 // - on error, goto SQLTransactionState::DeliverTransactionErrorCallback . 119 // - on error, goto
120 // SQLTransactionState::DeliverTransactionErrorCallback.
117 // - goto SQLTransactionState::RunStatements. 121 // - goto SQLTransactionState::RunStatements.
118 // 122 //
119 // 5. SQLTransactionState::DeliverTransactionErrorCallback (runs in frontend ) 123 // 5. SQLTransactionState::DeliverTransactionErrorCallback (runs in
124 // frontend)
120 // - invoke the script function errorCallback if available. 125 // - invoke the script function errorCallback if available.
121 // - goto SQLTransactionState::CleanupAfterTransactionErrorCallback. 126 // - goto SQLTransactionState::CleanupAfterTransactionErrorCallback.
122 // 127 //
123 // 6. SQLTransactionState::RunStatements (runs in backend) 128 // 6. SQLTransactionState::RunStatements (runs in backend)
124 // - while there are statements { 129 // - while there are statements {
125 // - run a statement. 130 // - run a statement.
126 // - if statementCallback is available, goto SQLTransactionState::De liverStatementCallback. 131 // - if statementCallback is available, goto
132 // SQLTransactionState::DeliverStatementCallback.
127 // - on error, 133 // - on error,
128 // goto SQLTransactionState::DeliverQuotaIncreaseCallback, or 134 // goto SQLTransactionState::DeliverQuotaIncreaseCallback, or
129 // goto SQLTransactionState::DeliverStatementCallback, or 135 // goto SQLTransactionState::DeliverStatementCallback, or
130 // goto SQLTransactionState::deliverTransactionErrorCallback. 136 // goto SQLTransactionState::deliverTransactionErrorCallback.
131 // } 137 // }
132 // - goto SQLTransactionState::PostflightAndCommit. 138 // - goto SQLTransactionState::PostflightAndCommit.
133 // 139 //
134 // 7. SQLTransactionState::DeliverStatementCallback (runs in frontend) 140 // 7. SQLTransactionState::DeliverStatementCallback (runs in frontend)
135 // - invoke script statement callback (assume available). 141 // - invoke script statement callback (assume available).
136 // - on error, goto SQLTransactionState::DeliverTransactionErrorCallback . 142 // - on error, goto
143 // SQLTransactionState::DeliverTransactionErrorCallback.
137 // - goto SQLTransactionState::RunStatements. 144 // - goto SQLTransactionState::RunStatements.
138 // 145 //
139 // 8. SQLTransactionState::DeliverQuotaIncreaseCallback (runs in frontend) 146 // 8. SQLTransactionState::DeliverQuotaIncreaseCallback (runs in frontend)
140 // - give client a chance to increase the quota. 147 // - give client a chance to increase the quota.
141 // - goto SQLTransactionState::RunStatements. 148 // - goto SQLTransactionState::RunStatements.
142 // 149 //
143 // 9. SQLTransactionState::PostflightAndCommit (runs in backend) 150 // 9. SQLTransactionState::PostflightAndCommit (runs in backend)
144 // - call the SQLTransactionWrapper postflight if available. 151 // - call the SQLTransactionWrapper postflight if available.
145 // - commit the SQLiteTansaction. 152 // - commit the SQLiteTansaction.
146 // - on error, goto SQLTransactionState::DeliverTransactionErrorCallback . 153 // - on error, goto
147 // - if successCallback is available, goto SQLTransactionState::DeliverS uccessCallback. 154 // SQLTransactionState::DeliverTransactionErrorCallback.
155 // - if successCallback is available, goto
156 // SQLTransactionState::DeliverSuccessCallback.
148 // else goto SQLTransactionState::CleanupAndTerminate. 157 // else goto SQLTransactionState::CleanupAndTerminate.
149 // 158 //
150 // 10. SQLTransactionState::DeliverSuccessCallback (runs in frontend) 159 // 10. SQLTransactionState::DeliverSuccessCallback (runs in frontend)
151 // - invoke the script function successCallback() if available. 160 // - invoke the script function successCallback() if available.
152 // - goto SQLTransactionState::CleanupAndTerminate. 161 // - goto SQLTransactionState::CleanupAndTerminate.
153 // 162 //
154 // 11. SQLTransactionState::CleanupAndTerminate (runs in backend) 163 // 11. SQLTransactionState::CleanupAndTerminate (runs in backend)
155 // - stop and clear the SQLiteTransaction. 164 // - stop and clear the SQLiteTransaction.
156 // - release the "lock". 165 // - release the "lock".
157 // - goto SQLTransactionState::End. 166 // - goto SQLTransactionState::End.
158 // 167 //
159 // 12. SQLTransactionState::CleanupAfterTransactionErrorCallback (runs in ba ckend) 168 // 12. SQLTransactionState::CleanupAfterTransactionErrorCallback (runs in
169 // backend)
160 // - rollback the SQLiteTransaction. 170 // - rollback the SQLiteTransaction.
161 // - goto SQLTransactionState::CleanupAndTerminate. 171 // - goto SQLTransactionState::CleanupAndTerminate.
162 // 172 //
163 // State transitions between SQLTransaction and SQLTransactionBackend 173 // State transitions between SQLTransaction and SQLTransactionBackend
164 // ================================================================== 174 // ==================================================================
165 // As shown above, there are state transitions that crosses the boundary between 175 // As shown above, there are state transitions that crosses the boundary between
166 // the frontend and backend. For example, 176 // the frontend and backend. For example,
167 // 177 //
168 // OpenTransactionAndPreflight (state 3 in the backend) 178 // OpenTransactionAndPreflight (state 3 in the backend)
169 // transitions to DeliverTransactionCallback (state 8 in the frontend), 179 // transitions to DeliverTransactionCallback (state 8 in the frontend),
170 // which in turn transitions to RunStatements (state 4 in the backend). 180 // which in turn transitions to RunStatements (state 4 in the backend).
171 // 181 //
172 // This cross boundary transition is done by posting transition requests to the 182 // This cross boundary transition is done by posting transition requests to the
173 // other side and letting the other side's state machine execute the state 183 // other side and letting the other side's state machine execute the state
174 // transition in the appropriate thread (i.e. the script thread for the frontend , 184 // transition in the appropriate thread (i.e. the script thread for the
175 // and the database thread for the backend). 185 // frontend, and the database thread for the backend).
176 // 186 //
177 // Logically, the state transitions work as shown in the graph above. But 187 // Logically, the state transitions work as shown in the graph above. But
178 // physically, the transition mechanism uses the Idle state (both in the fronten d 188 // physically, the transition mechanism uses the Idle state (both in the
179 // and backend) as a waiting state for further activity. For example, taking a 189 // frontend and backend) as a waiting state for further activity. For example,
180 // closer look at the 3 state transition example above, what actually happens 190 // taking a closer look at the 3 state transition example above, what actually
181 // is as follows: 191 // happens is as follows:
182 // 192 //
183 // Step 1: 193 // Step 1:
184 // ====== 194 // ======
185 // In the frontend thread: 195 // In the frontend thread:
186 // - waiting quietly is Idle. Not doing any work. 196 // - waiting quietly is Idle. Not doing any work.
187 // 197 //
188 // In the backend: 198 // In the backend:
189 // - is in OpenTransactionAndPreflight, and doing its work. 199 // - is in OpenTransactionAndPreflight, and doing its work.
190 // - when done, it transits to the backend DeliverTransactionCallback. 200 // - when done, it transits to the backend DeliverTransactionCallback.
191 // - the backend DeliverTransactionCallback sends a request to the frontend 201 // - the backend DeliverTransactionCallback sends a request to the frontend
(...skipping 14 matching lines...) Expand all
206 // Step 3: 216 // Step 3:
207 // ====== 217 // ======
208 // In the frontend thread: 218 // In the frontend thread:
209 // - waiting quietly is Idle. Not doing any work. 219 // - waiting quietly is Idle. Not doing any work.
210 // 220 //
211 // In the backend: 221 // In the backend:
212 // - transits to RunStatements, and does its work. 222 // - transits to RunStatements, and does its work.
213 // ... 223 // ...
214 // 224 //
215 // So, when the frontend or backend are not active, they will park themselves in 225 // So, when the frontend or backend are not active, they will park themselves in
216 // their Idle states. This means their m_nextState is set to Idle, but they neve r 226 // their Idle states. This means their m_nextState is set to Idle, but they
217 // actually run the corresponding state function. Note: for both the frontend an d 227 // never actually run the corresponding state function. Note: for both the
218 // backend, the state function for Idle is unreachableState(). 228 // frontend and backend, the state function for Idle is unreachableState().
219 // 229 //
220 // The states that send a request to their peer across the front/back boundary 230 // The states that send a request to their peer across the front/back boundary
221 // are implemented with just 2 functions: SQLTransaction::sendToBackendState() 231 // are implemented with just 2 functions: SQLTransaction::sendToBackendState()
222 // and SQLTransactionBackend::sendToFrontendState(). These state functions do 232 // and SQLTransactionBackend::sendToFrontendState(). These state functions do
223 // nothing but sends a request to the other side to transit to the current 233 // nothing but sends a request to the other side to transit to the current
224 // state (indicated by m_nextState), and then transits itself to the Idle state 234 // state (indicated by m_nextState), and then transits itself to the Idle state
225 // to wait for further action. 235 // to wait for further action.
226 236
227 // The Life-Cycle of a SQLTransaction i.e. Who's keeping the SQLTransaction aliv e? 237 // The Life-Cycle of a SQLTransaction i.e. Who's keeping the SQLTransaction
238 // alive?
228 // ============================================================================= = 239 // ============================================================================= =
229 // The RefPtr chain goes something like this: 240 // The RefPtr chain goes something like this:
230 // 241 //
231 // At birth (in Database::runTransaction()): 242 // At birth (in Database::runTransaction()):
232 // ==================================================== 243 // ====================================================
233 // Database // HeapDeque<Member<SQLTransactionBack end>> m_transactionQueue points to ... 244 // Database
234 // --> SQLTransactionBackend // Member<SQLTransaction> m_frontend p oints to ... 245 // // HeapDeque<Member<SQLTransactionBackend>> m_transactionQueue
235 // --> SQLTransaction // Member<SQLTransactionBackend> m_bac kend points to ... 246 // // points to ...
236 // --> SQLTransactionBackend // which is a circular reference. 247 // --> SQLTransactionBackend
248 // // Member<SQLTransaction> m_frontend points to ...
249 // --> SQLTransaction
250 // // Member<SQLTransactionBackend> m_backend points to ...
251 // --> SQLTransactionBackend // which is a circular reference.
237 // 252 //
238 // Note: there's a circular reference between the SQLTransaction front-end a nd 253 // Note: there's a circular reference between the SQLTransaction front-end
239 // back-end. This circular reference is established in the constructor of th e 254 // and back-end. This circular reference is established in the constructor
240 // SQLTransactionBackend. The circular reference will be broken by calling 255 // of the SQLTransactionBackend. The circular reference will be broken by
241 // doCleanup() to nullify m_frontend. This is done at the end of the transac tion's 256 // calling doCleanup() to nullify m_frontend. This is done at the end of the
242 // clean up state (i.e. when the transaction should no longer be in use ther eafter), 257 // transaction's clean up state (i.e. when the transaction should no longer
243 // or if the database was interrupted. See comments on "What happens if a tr ansaction 258 // be in use thereafter), or if the database was interrupted. See comments
244 // is interrupted?" below for details. 259 // on "What happens if a transaction is interrupted?" below for details.
245 // 260 //
246 // After scheduling the transaction with the DatabaseThread (Database::sched uleTransaction()): 261 // After scheduling the transaction with the DatabaseThread
262 // (Database::scheduleTransaction()):
247 // ========================================================================= ============================= 263 // ========================================================================= =============================
248 // DatabaseThread // MessageQueue<DatabaseTask> m_qu eue points to ... 264 // DatabaseThread
249 // --> DatabaseTransactionTask // Member<SQLTransactionBackend> m _transaction points to ... 265 // // MessageQueue<DatabaseTask> m_queue points to ...
250 // --> SQLTransactionBackend // Member<SQLTransaction> m_fronte nd points to ... 266 // --> DatabaseTransactionTask
251 // --> SQLTransaction // Member<SQLTransactionBackend> m _backend points to ... 267 // // Member<SQLTransactionBackend> m_transaction points to ...
252 // --> SQLTransactionBackend // which is a circular reference. 268 // --> SQLTransactionBackend
269 // // Member<SQLTransaction> m_frontend points to ...
270 // --> SQLTransaction
271 // // Member<SQLTransactionBackend> m_backend points to ...
272 // --> SQLTransactionBackend // which is a circular reference.
253 // 273 //
254 // When executing the transaction (in DatabaseThread::databaseThread()): 274 // When executing the transaction (in DatabaseThread::databaseThread()):
255 // ==================================================================== 275 // ====================================================================
256 // std::unique_ptr<DatabaseTask> task; // points to ... 276 // std::unique_ptr<DatabaseTask> task;
257 // --> DatabaseTransactionTask // Member<SQLTransactionBackend> m _transaction points to ... 277 // // points to ...
258 // --> SQLTransactionBackend // Member<SQLTransaction> m_fronte nd; 278 // --> DatabaseTransactionTask
259 // --> SQLTransaction // Member<SQLTransactionBackend> m _backend points to ... 279 // // Member<SQLTransactionBackend> m_transaction points to ...
260 // --> SQLTransactionBackend // which is a circular reference. 280 // --> SQLTransactionBackend
281 // // Member<SQLTransaction> m_frontend;
282 // --> SQLTransaction
283 // // Member<SQLTransactionBackend> m_backend points to ...
284 // --> SQLTransactionBackend // which is a circular reference.
261 // 285 //
262 // At the end of cleanupAndTerminate(): 286 // At the end of cleanupAndTerminate():
263 // =================================== 287 // ===================================
264 // At the end of the cleanup state, the SQLTransactionBackend::m_frontend is nullified. 288 // At the end of the cleanup state, the SQLTransactionBackend::m_frontend is
265 // If by then, a JSObject wrapper is referring to the SQLTransaction, then t he reference 289 // nullified. If by then, a JSObject wrapper is referring to the
266 // chain looks like this: 290 // SQLTransaction, then the reference chain looks like this:
267 // 291 //
268 // JSObjectWrapper 292 // JSObjectWrapper
269 // --> SQLTransaction // in Member<SQLTransactionBackend> m_back end points to ... 293 // --> SQLTransaction
270 // --> SQLTransactionBackend // which no longer points back to its SQLT ransaction. 294 // // in Member<SQLTransactionBackend> m_backend points to ...
295 // --> SQLTransactionBackend
296 // // which no longer points back to its SQLTransaction.
271 // 297 //
272 // When the GC collects the corresponding JSObject, the above chain will be cleaned up 298 // When the GC collects the corresponding JSObject, the above chain will be
273 // and deleted. 299 // cleaned up and deleted.
274 // 300 //
275 // If there is no JSObject wrapper referring to the SQLTransaction when the cleanup 301 // If there is no JSObject wrapper referring to the SQLTransaction when the
276 // states nullify SQLTransactionBackend::m_frontend, the SQLTransaction will deleted then. 302 // cleanup states nullify SQLTransactionBackend::m_frontend, the
277 // However, there will still be a DatabaseTask pointing to the SQLTransactio nBackend (see 303 // SQLTransaction will deleted then. However, there will still be a
278 // the "When executing the transaction" chain above). This will keep the 304 // DatabaseTask pointing to the SQLTransactionBackend (see the "When
279 // SQLTransactionBackend alive until DatabaseThread::databaseThread() releas es its 305 // executing the transaction" chain above). This will keep the
280 // task std::unique_ptr. 306 // SQLTransactionBackend alive until DatabaseThread::databaseThread()
307 // releases its task std::unique_ptr.
281 // 308 //
282 // What happens if a transaction is interrupted? 309 // What happens if a transaction is interrupted?
283 // ============================================ 310 // ============================================
284 // If the transaction is interrupted half way, it won't get to run to state 311 // If the transaction is interrupted half way, it won't get to run to state
285 // CleanupAndTerminate, and hence, would not have called SQLTransactionBacke nd's 312 // CleanupAndTerminate, and hence, would not have called
286 // doCleanup(). doCleanup() is where we nullify SQLTransactionBackend::m_fro ntend 313 // SQLTransactionBackend's doCleanup(). doCleanup() is where we nullify
287 // to break the reference cycle between the frontend and backend. Hence, we need 314 // SQLTransactionBackend::m_frontend to break the reference cycle between
288 // to cleanup the transaction by other means. 315 // the frontend and backend. Hence, we need to cleanup the transaction by
316 // other means.
289 // 317 //
290 // Note: calling SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown() 318 // Note: calling SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown()
291 // is effectively the same as calling SQLTransactionBackend::doClean(). 319 // is effectively the same as calling SQLTransactionBackend::doClean().
292 // 320 //
293 // In terms of who needs to call doCleanup(), there are 5 phases in the 321 // In terms of who needs to call doCleanup(), there are 5 phases in the
294 // SQLTransactionBackend life-cycle. These are the phases and how the clean 322 // SQLTransactionBackend life-cycle. These are the phases and how the clean
295 // up is done: 323 // up is done:
296 // 324 //
297 // Phase 1. After Birth, before scheduling 325 // Phase 1. After Birth, before scheduling
298 // 326 //
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 } 399 }
372 400
373 DEFINE_TRACE(SQLTransactionBackend) { 401 DEFINE_TRACE(SQLTransactionBackend) {
374 visitor->trace(m_database); 402 visitor->trace(m_database);
375 visitor->trace(m_wrapper); 403 visitor->trace(m_wrapper);
376 } 404 }
377 405
378 void SQLTransactionBackend::doCleanup() { 406 void SQLTransactionBackend::doCleanup() {
379 if (!m_frontend) 407 if (!m_frontend)
380 return; 408 return;
381 m_frontend = 409 // Break the reference cycle. See comment about the life-cycle above.
382 nullptr; // Break the reference cycle. See comment about the life-cycle a bove. 410 m_frontend = nullptr;
383 411
384 ASSERT( 412 ASSERT(
385 database()->getDatabaseContext()->databaseThread()->isDatabaseThread()); 413 database()->getDatabaseContext()->databaseThread()->isDatabaseThread());
386 414
387 MutexLocker locker(m_statementMutex); 415 MutexLocker locker(m_statementMutex);
388 m_statementQueue.clear(); 416 m_statementQueue.clear();
389 417
390 if (m_sqliteTransaction) { 418 if (m_sqliteTransaction) {
391 // In the event we got here because of an interruption or error (i.e. if 419 // In the event we got here because of an interruption or error (i.e. if
392 // the transaction is in progress), we should roll it back here. Clearing 420 // the transaction is in progress), we should roll it back here. Clearing
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 SQLTransactionState state) { 471 SQLTransactionState state) {
444 static const StateFunction stateFunctions[] = { 472 static const StateFunction stateFunctions[] = {
445 &SQLTransactionBackend::unreachableState, // 0. end 473 &SQLTransactionBackend::unreachableState, // 0. end
446 &SQLTransactionBackend::unreachableState, // 1. idle 474 &SQLTransactionBackend::unreachableState, // 1. idle
447 &SQLTransactionBackend::acquireLock, // 2. 475 &SQLTransactionBackend::acquireLock, // 2.
448 &SQLTransactionBackend::openTransactionAndPreflight, // 3. 476 &SQLTransactionBackend::openTransactionAndPreflight, // 3.
449 &SQLTransactionBackend::runStatements, // 4. 477 &SQLTransactionBackend::runStatements, // 4.
450 &SQLTransactionBackend::postflightAndCommit, // 5. 478 &SQLTransactionBackend::postflightAndCommit, // 5.
451 &SQLTransactionBackend::cleanupAndTerminate, // 6. 479 &SQLTransactionBackend::cleanupAndTerminate, // 6.
452 &SQLTransactionBackend::cleanupAfterTransactionErrorCallback, // 7. 480 &SQLTransactionBackend::cleanupAfterTransactionErrorCallback, // 7.
453 &SQLTransactionBackend:: 481 // 8. deliverTransactionCallback
454 sendToFrontendState, // 8. deliverTransactionCallback 482 &SQLTransactionBackend::sendToFrontendState,
455 &SQLTransactionBackend:: 483 // 9. deliverTransactionErrorCallback
456 sendToFrontendState, // 9. deliverTransactionErrorCallback 484 &SQLTransactionBackend::sendToFrontendState,
457 &SQLTransactionBackend:: 485 // 10. deliverStatementCallback
458 sendToFrontendState, // 10. deliverStatementCallback 486 &SQLTransactionBackend::sendToFrontendState,
459 &SQLTransactionBackend:: 487 // 11. deliverQuotaIncreaseCallback
460 sendToFrontendState, // 11. deliverQuotaIncreaseCallback 488 &SQLTransactionBackend::sendToFrontendState,
461 &SQLTransactionBackend::sendToFrontendState // 12. deliverSuccessCallback 489 // 12. deliverSuccessCallback
490 &SQLTransactionBackend::sendToFrontendState,
462 }; 491 };
463 492
464 ASSERT(WTF_ARRAY_LENGTH(stateFunctions) == 493 ASSERT(WTF_ARRAY_LENGTH(stateFunctions) ==
465 static_cast<int>(SQLTransactionState::NumberOfStates)); 494 static_cast<int>(SQLTransactionState::NumberOfStates));
466 ASSERT(state < SQLTransactionState::NumberOfStates); 495 ASSERT(state < SQLTransactionState::NumberOfStates);
467 496
468 return stateFunctions[static_cast<int>(state)]; 497 return stateFunctions[static_cast<int>(state)];
469 } 498 }
470 499
471 void SQLTransactionBackend::enqueueStatementBackend( 500 void SQLTransactionBackend::enqueueStatementBackend(
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 } 585 }
557 586
558 SQLTransactionState SQLTransactionBackend::openTransactionAndPreflight() { 587 SQLTransactionState SQLTransactionBackend::openTransactionAndPreflight() {
559 DCHECK( 588 DCHECK(
560 database()->getDatabaseContext()->databaseThread()->isDatabaseThread()); 589 database()->getDatabaseContext()->databaseThread()->isDatabaseThread());
561 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 590 ASSERT(!m_database->sqliteDatabase().transactionInProgress());
562 ASSERT(m_lockAcquired); 591 ASSERT(m_lockAcquired);
563 592
564 STORAGE_DVLOG(1) << "Opening and preflighting transaction " << this; 593 STORAGE_DVLOG(1) << "Opening and preflighting transaction " << this;
565 594
566 // Set the maximum usage for this transaction if this transactions is not read -only 595 // Set the maximum usage for this transaction if this transactions is not
596 // read-only.
567 if (!m_readOnly) 597 if (!m_readOnly)
568 m_database->sqliteDatabase().setMaximumSize(m_database->maximumSize()); 598 m_database->sqliteDatabase().setMaximumSize(m_database->maximumSize());
569 599
570 ASSERT(!m_sqliteTransaction); 600 ASSERT(!m_sqliteTransaction);
571 m_sqliteTransaction = wrapUnique( 601 m_sqliteTransaction = wrapUnique(
572 new SQLiteTransaction(m_database->sqliteDatabase(), m_readOnly)); 602 new SQLiteTransaction(m_database->sqliteDatabase(), m_readOnly));
573 603
574 m_database->resetDeletes(); 604 m_database->resetDeletes();
575 m_database->disableAuthorizer(); 605 m_database->disableAuthorizer();
576 m_sqliteTransaction->begin(); 606 m_sqliteTransaction->begin();
577 m_database->enableAuthorizer(); 607 m_database->enableAuthorizer();
578 608
579 // Spec 4.3.2.1+2: Open a transaction to the database, jumping to the error ca llback if that fails 609 // Spec 4.3.2.1+2: Open a transaction to the database, jumping to the error
610 // callback if that fails.
580 if (!m_sqliteTransaction->inProgress()) { 611 if (!m_sqliteTransaction->inProgress()) {
581 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 612 ASSERT(!m_database->sqliteDatabase().transactionInProgress());
582 m_database->reportStartTransactionResult( 613 m_database->reportStartTransactionResult(
583 2, SQLError::kDatabaseErr, m_database->sqliteDatabase().lastError()); 614 2, SQLError::kDatabaseErr, m_database->sqliteDatabase().lastError());
584 m_transactionError = SQLErrorData::create( 615 m_transactionError = SQLErrorData::create(
585 SQLError::kDatabaseErr, "unable to begin transaction", 616 SQLError::kDatabaseErr, "unable to begin transaction",
586 m_database->sqliteDatabase().lastError(), 617 m_database->sqliteDatabase().lastError(),
587 m_database->sqliteDatabase().lastErrorMsg()); 618 m_database->sqliteDatabase().lastErrorMsg());
588 m_sqliteTransaction.reset(); 619 m_sqliteTransaction.reset();
589 return nextStateForTransactionError(); 620 return nextStateForTransactionError();
590 } 621 }
591 622
592 // Note: We intentionally retrieve the actual version even with an empty expec ted version. 623 // Note: We intentionally retrieve the actual version even with an empty
593 // In multi-process browsers, we take this opportinutiy to update the cached v alue for 624 // expected version. In multi-process browsers, we take this opportunity to
594 // the actual version. In single-process browsers, this is just a map lookup. 625 // update the cached value for the actual version. In single-process browsers,
626 // this is just a map lookup.
595 String actualVersion; 627 String actualVersion;
596 if (!m_database->getActualVersionForTransaction(actualVersion)) { 628 if (!m_database->getActualVersionForTransaction(actualVersion)) {
597 m_database->reportStartTransactionResult( 629 m_database->reportStartTransactionResult(
598 3, SQLError::kDatabaseErr, m_database->sqliteDatabase().lastError()); 630 3, SQLError::kDatabaseErr, m_database->sqliteDatabase().lastError());
599 m_transactionError = 631 m_transactionError =
600 SQLErrorData::create(SQLError::kDatabaseErr, "unable to read version", 632 SQLErrorData::create(SQLError::kDatabaseErr, "unable to read version",
601 m_database->sqliteDatabase().lastError(), 633 m_database->sqliteDatabase().lastError(),
602 m_database->sqliteDatabase().lastErrorMsg()); 634 m_database->sqliteDatabase().lastErrorMsg());
603 m_database->disableAuthorizer(); 635 m_database->disableAuthorizer();
604 m_sqliteTransaction.reset(); 636 m_sqliteTransaction.reset();
605 m_database->enableAuthorizer(); 637 m_database->enableAuthorizer();
606 return nextStateForTransactionError(); 638 return nextStateForTransactionError();
607 } 639 }
608 m_hasVersionMismatch = !m_database->expectedVersion().isEmpty() && 640 m_hasVersionMismatch = !m_database->expectedVersion().isEmpty() &&
609 (m_database->expectedVersion() != actualVersion); 641 (m_database->expectedVersion() != actualVersion);
610 642
611 // Spec 4.3.2.3: Perform preflight steps, jumping to the error callback if the y fail 643 // Spec 4.3.2.3: Perform preflight steps, jumping to the error callback if
644 // they fail.
612 if (m_wrapper && !m_wrapper->performPreflight(this)) { 645 if (m_wrapper && !m_wrapper->performPreflight(this)) {
613 m_database->disableAuthorizer(); 646 m_database->disableAuthorizer();
614 m_sqliteTransaction.reset(); 647 m_sqliteTransaction.reset();
615 m_database->enableAuthorizer(); 648 m_database->enableAuthorizer();
616 if (m_wrapper->sqlError()) { 649 if (m_wrapper->sqlError()) {
617 m_transactionError = SQLErrorData::create(*m_wrapper->sqlError()); 650 m_transactionError = SQLErrorData::create(*m_wrapper->sqlError());
618 } else { 651 } else {
619 m_database->reportStartTransactionResult(4, SQLError::kUnknownErr, 0); 652 m_database->reportStartTransactionResult(4, SQLError::kUnknownErr, 0);
620 m_transactionError = SQLErrorData::create( 653 m_transactionError = SQLErrorData::create(
621 SQLError::kUnknownErr, 654 SQLError::kUnknownErr,
622 "unknown error occurred during transaction preflight"); 655 "unknown error occurred during transaction preflight");
623 } 656 }
624 return nextStateForTransactionError(); 657 return nextStateForTransactionError();
625 } 658 }
626 659
627 // Spec 4.3.2.4: Invoke the transaction callback with the new SQLTransaction o bject 660 // Spec 4.3.2.4: Invoke the transaction callback with the new SQLTransaction
661 // object.
628 if (m_hasCallback) 662 if (m_hasCallback)
629 return SQLTransactionState::DeliverTransactionCallback; 663 return SQLTransactionState::DeliverTransactionCallback;
630 664
631 // If we have no callback to make, skip pass to the state after: 665 // If we have no callback to make, skip pass to the state after:
632 return SQLTransactionState::RunStatements; 666 return SQLTransactionState::RunStatements;
633 } 667 }
634 668
635 SQLTransactionState SQLTransactionBackend::runStatements() { 669 SQLTransactionState SQLTransactionBackend::runStatements() {
636 DCHECK( 670 DCHECK(
637 database()->getDatabaseContext()->databaseThread()->isDatabaseThread()); 671 database()->getDatabaseContext()->databaseThread()->isDatabaseThread());
638 ASSERT(m_lockAcquired); 672 ASSERT(m_lockAcquired);
639 SQLTransactionState nextState; 673 SQLTransactionState nextState;
640 674
641 // If there is a series of statements queued up that are all successful and ha ve no associated 675 // If there is a series of statements queued up that are all successful and
642 // SQLStatementCallback objects, then we can burn through the queue 676 // have no associated SQLStatementCallback objects, then we can burn through
677 // the queue.
643 do { 678 do {
644 if (m_shouldRetryCurrentStatement && 679 if (m_shouldRetryCurrentStatement &&
645 !m_sqliteTransaction->wasRolledBackBySqlite()) { 680 !m_sqliteTransaction->wasRolledBackBySqlite()) {
646 m_shouldRetryCurrentStatement = false; 681 m_shouldRetryCurrentStatement = false;
647 // FIXME - Another place that needs fixing up after <rdar://problem/562846 8> is addressed. 682 // FIXME - Another place that needs fixing up after
683 // <rdar://problem/5628468> is addressed.
648 // See ::openTransactionAndPreflight() for discussion 684 // See ::openTransactionAndPreflight() for discussion
649 685
650 // Reset the maximum size here, as it was increased to allow us to retry t his statement. 686 // Reset the maximum size here, as it was increased to allow us to retry
651 // m_shouldRetryCurrentStatement is set to true only when a statement exce eds 687 // this statement. m_shouldRetryCurrentStatement is set to true only when
652 // the quota, which can happen only in a read-write transaction. Therefore , there 688 // a statement exceeds the quota, which can happen only in a read-write
653 // is no need to check here if the transaction is read-write. 689 // transaction. Therefore, there is no need to check here if the
690 // transaction is read-write.
654 m_database->sqliteDatabase().setMaximumSize(m_database->maximumSize()); 691 m_database->sqliteDatabase().setMaximumSize(m_database->maximumSize());
655 } else { 692 } else {
656 // If the current statement has already been run, failed due to quota cons traints, and we're not retrying it, 693 // If the current statement has already been run, failed due to quota
657 // that means it ended in an error. Handle it now 694 // constraints, and we're not retrying it, that means it ended in an
695 // error. Handle it now.
658 if (m_currentStatementBackend && 696 if (m_currentStatementBackend &&
659 m_currentStatementBackend->lastExecutionFailedDueToQuota()) { 697 m_currentStatementBackend->lastExecutionFailedDueToQuota()) {
660 return nextStateForCurrentStatementError(); 698 return nextStateForCurrentStatementError();
661 } 699 }
662 700
663 // Otherwise, advance to the next statement 701 // Otherwise, advance to the next statement
664 getNextStatement(); 702 getNextStatement();
665 } 703 }
666 nextState = runCurrentStatementAndGetNextState(); 704 nextState = runCurrentStatementAndGetNextState();
667 } while (nextState == SQLTransactionState::RunStatements); 705 } while (nextState == SQLTransactionState::RunStatements);
(...skipping 18 matching lines...) Expand all
686 return SQLTransactionState::PostflightAndCommit; 724 return SQLTransactionState::PostflightAndCommit;
687 } 725 }
688 726
689 m_database->resetAuthorizer(); 727 m_database->resetAuthorizer();
690 728
691 if (m_hasVersionMismatch) 729 if (m_hasVersionMismatch)
692 m_currentStatementBackend->setVersionMismatchedError(m_database.get()); 730 m_currentStatementBackend->setVersionMismatchedError(m_database.get());
693 731
694 if (m_currentStatementBackend->execute(m_database.get())) { 732 if (m_currentStatementBackend->execute(m_database.get())) {
695 if (m_database->lastActionChangedDatabase()) { 733 if (m_database->lastActionChangedDatabase()) {
696 // Flag this transaction as having changed the database for later delegate notification 734 // Flag this transaction as having changed the database for later delegate
735 // notification.
697 m_modifiedDatabase = true; 736 m_modifiedDatabase = true;
698 } 737 }
699 738
700 if (m_currentStatementBackend->hasStatementCallback()) { 739 if (m_currentStatementBackend->hasStatementCallback()) {
701 return SQLTransactionState::DeliverStatementCallback; 740 return SQLTransactionState::DeliverStatementCallback;
702 } 741 }
703 742
704 // If we get here, then the statement doesn't have a callback to invoke. 743 // If we get here, then the statement doesn't have a callback to invoke.
705 // We can move on to the next statement. Hence, stay in this state. 744 // We can move on to the next statement. Hence, stay in this state.
706 return SQLTransactionState::RunStatements; 745 return SQLTransactionState::RunStatements;
707 } 746 }
708 747
709 if (m_currentStatementBackend->lastExecutionFailedDueToQuota()) { 748 if (m_currentStatementBackend->lastExecutionFailedDueToQuota()) {
710 return SQLTransactionState::DeliverQuotaIncreaseCallback; 749 return SQLTransactionState::DeliverQuotaIncreaseCallback;
711 } 750 }
712 751
713 return nextStateForCurrentStatementError(); 752 return nextStateForCurrentStatementError();
714 } 753 }
715 754
716 SQLTransactionState SQLTransactionBackend::nextStateForCurrentStatementError() { 755 SQLTransactionState SQLTransactionBackend::nextStateForCurrentStatementError() {
717 // Spec 4.3.2.6.6: error - Call the statement's error callback, but if there w as no error callback, 756 // Spec 4.3.2.6.6: error - Call the statement's error callback, but if there
718 // or the transaction was rolled back, jump to the transaction error callback 757 // was no error callback, or the transaction was rolled back, jump to the
758 // transaction error callback.
719 if (m_currentStatementBackend->hasStatementErrorCallback() && 759 if (m_currentStatementBackend->hasStatementErrorCallback() &&
720 !m_sqliteTransaction->wasRolledBackBySqlite()) 760 !m_sqliteTransaction->wasRolledBackBySqlite())
721 return SQLTransactionState::DeliverStatementCallback; 761 return SQLTransactionState::DeliverStatementCallback;
722 762
723 if (m_currentStatementBackend->sqlError()) { 763 if (m_currentStatementBackend->sqlError()) {
724 m_transactionError = 764 m_transactionError =
725 SQLErrorData::create(*m_currentStatementBackend->sqlError()); 765 SQLErrorData::create(*m_currentStatementBackend->sqlError());
726 } else { 766 } else {
727 m_database->reportCommitTransactionResult(1, SQLError::kDatabaseErr, 0); 767 m_database->reportCommitTransactionResult(1, SQLError::kDatabaseErr, 0);
728 m_transactionError = SQLErrorData::create( 768 m_transactionError = SQLErrorData::create(
729 SQLError::kDatabaseErr, "the statement failed to execute"); 769 SQLError::kDatabaseErr, "the statement failed to execute");
730 } 770 }
731 return nextStateForTransactionError(); 771 return nextStateForTransactionError();
732 } 772 }
733 773
734 SQLTransactionState SQLTransactionBackend::postflightAndCommit() { 774 SQLTransactionState SQLTransactionBackend::postflightAndCommit() {
735 ASSERT(m_lockAcquired); 775 ASSERT(m_lockAcquired);
736 776
737 // Spec 4.3.2.7: Perform postflight steps, jumping to the error callback if th ey fail. 777 // Spec 4.3.2.7: Perform postflight steps, jumping to the error callback if
778 // they fail.
738 if (m_wrapper && !m_wrapper->performPostflight(this)) { 779 if (m_wrapper && !m_wrapper->performPostflight(this)) {
739 if (m_wrapper->sqlError()) { 780 if (m_wrapper->sqlError()) {
740 m_transactionError = SQLErrorData::create(*m_wrapper->sqlError()); 781 m_transactionError = SQLErrorData::create(*m_wrapper->sqlError());
741 } else { 782 } else {
742 m_database->reportCommitTransactionResult(3, SQLError::kUnknownErr, 0); 783 m_database->reportCommitTransactionResult(3, SQLError::kUnknownErr, 0);
743 m_transactionError = SQLErrorData::create( 784 m_transactionError = SQLErrorData::create(
744 SQLError::kUnknownErr, 785 SQLError::kUnknownErr,
745 "unknown error occurred during transaction postflight"); 786 "unknown error occurred during transaction postflight");
746 } 787 }
747 return nextStateForTransactionError(); 788 return nextStateForTransactionError();
748 } 789 }
749 790
750 // Spec 4.3.2.7: Commit the transaction, jumping to the error callback if that fails. 791 // Spec 4.3.2.7: Commit the transaction, jumping to the error callback if that
792 // fails.
751 ASSERT(m_sqliteTransaction); 793 ASSERT(m_sqliteTransaction);
752 794
753 m_database->disableAuthorizer(); 795 m_database->disableAuthorizer();
754 m_sqliteTransaction->commit(); 796 m_sqliteTransaction->commit();
755 m_database->enableAuthorizer(); 797 m_database->enableAuthorizer();
756 798
757 // If the commit failed, the transaction will still be marked as "in progress" 799 // If the commit failed, the transaction will still be marked as "in progress"
758 if (m_sqliteTransaction->inProgress()) { 800 if (m_sqliteTransaction->inProgress()) {
759 if (m_wrapper) 801 if (m_wrapper)
760 m_wrapper->handleCommitFailedAfterPostflight(this); 802 m_wrapper->handleCommitFailedAfterPostflight(this);
761 m_database->reportCommitTransactionResult( 803 m_database->reportCommitTransactionResult(
762 4, SQLError::kDatabaseErr, m_database->sqliteDatabase().lastError()); 804 4, SQLError::kDatabaseErr, m_database->sqliteDatabase().lastError());
763 m_transactionError = SQLErrorData::create( 805 m_transactionError = SQLErrorData::create(
764 SQLError::kDatabaseErr, "unable to commit transaction", 806 SQLError::kDatabaseErr, "unable to commit transaction",
765 m_database->sqliteDatabase().lastError(), 807 m_database->sqliteDatabase().lastError(),
766 m_database->sqliteDatabase().lastErrorMsg()); 808 m_database->sqliteDatabase().lastErrorMsg());
767 return nextStateForTransactionError(); 809 return nextStateForTransactionError();
768 } 810 }
769 811
770 m_database->reportCommitTransactionResult(0, -1, 0); // OK 812 m_database->reportCommitTransactionResult(0, -1, 0); // OK
771 813
772 // Vacuum the database if anything was deleted. 814 // Vacuum the database if anything was deleted.
773 if (m_database->hadDeletes()) 815 if (m_database->hadDeletes())
774 m_database->incrementalVacuumIfNeeded(); 816 m_database->incrementalVacuumIfNeeded();
775 817
776 // The commit was successful. If the transaction modified this database, notif y the delegates. 818 // The commit was successful. If the transaction modified this database,
819 // notify the delegates.
777 if (m_modifiedDatabase) 820 if (m_modifiedDatabase)
778 m_database->transactionClient()->didCommitWriteTransaction(database()); 821 m_database->transactionClient()->didCommitWriteTransaction(database());
779 822
780 // Spec 4.3.2.8: Deliver success callback, if there is one. 823 // Spec 4.3.2.8: Deliver success callback, if there is one.
781 return SQLTransactionState::DeliverSuccessCallback; 824 return SQLTransactionState::DeliverSuccessCallback;
782 } 825 }
783 826
784 SQLTransactionState SQLTransactionBackend::cleanupAndTerminate() { 827 SQLTransactionState SQLTransactionBackend::cleanupAndTerminate() {
785 ASSERT(m_lockAcquired); 828 ASSERT(m_lockAcquired);
786 829
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 return SQLTransactionState::End; 889 return SQLTransactionState::End;
847 } 890 }
848 891
849 SQLTransactionState SQLTransactionBackend::sendToFrontendState() { 892 SQLTransactionState SQLTransactionBackend::sendToFrontendState() {
850 ASSERT(m_nextState != SQLTransactionState::Idle); 893 ASSERT(m_nextState != SQLTransactionState::Idle);
851 m_frontend->requestTransitToState(m_nextState); 894 m_frontend->requestTransitToState(m_nextState);
852 return SQLTransactionState::Idle; 895 return SQLTransactionState::Idle;
853 } 896 }
854 897
855 } // namespace blink 898 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698