OLD | NEW |
| (Empty) |
1 /** | |
2 * A client-side key-value store with support for indexes. | |
3 * | |
4 * Many browsers support IndexedDB—a web standard for | |
5 * an indexed database. | |
6 * By storing data on the client in an IndexedDB, | |
7 * a web app gets some advantages, such as faster performance and persistence. | |
8 * To find out which browsers support IndexedDB, | |
9 * refer to [Can I Use?](http://caniuse.com/#feat=indexeddb) | |
10 * | |
11 * In IndexedDB, each record is identified by a unique index or key, | |
12 * making data retrieval speedy. | |
13 * You can store structured data, | |
14 * such as images, arrays, and maps using IndexedDB. | |
15 * The standard does not specify size limits for individual data items | |
16 * or for the database itself, but browsers may impose storage limits. | |
17 * | |
18 * ## Using indexed_db | |
19 * | |
20 * The classes in this library provide an interface | |
21 * to the browser's IndexedDB, if it has one. | |
22 * To use this library in your code: | |
23 * | |
24 * import 'dart:indexed_db'; | |
25 * | |
26 * A web app can determine if the browser supports | |
27 * IndexedDB with [IdbFactory.supported]: | |
28 * | |
29 * if (IdbFactory.supported) | |
30 * // Use indexeddb. | |
31 * else | |
32 * // Find an alternative. | |
33 * | |
34 * Access to the browser's IndexedDB is provided by the app's top-level | |
35 * [Window] object, which your code can refer to with `window.indexedDB`. | |
36 * So, for example, | |
37 * here's how to use window.indexedDB to open a database: | |
38 * | |
39 * Future open() { | |
40 * return window.indexedDB.open('myIndexedDB', | |
41 * version: 1, | |
42 * onUpgradeNeeded: _initializeDatabase) | |
43 * .then(_loadFromDB); | |
44 * } | |
45 * void _initializeDatabase(VersionChangeEvent e) { | |
46 * ... | |
47 * } | |
48 * Future _loadFromDB(Database db) { | |
49 * ... | |
50 * } | |
51 * | |
52 * | |
53 * All data in an IndexedDB is stored within an [ObjectStore]. | |
54 * To manipulate the database use [Transaction]s. | |
55 * | |
56 * ## Other resources | |
57 * | |
58 * Other options for client-side data storage include: | |
59 * | |
60 * * [Window.localStorage]—a | |
61 * basic mechanism that stores data as a [Map], | |
62 * and where both the keys and the values are strings. | |
63 * | |
64 * * [dart:web_sql]—a database that can be queried with SQL. | |
65 * | |
66 * For a tutorial about using the indexed_db library with Dart, | |
67 * check out | |
68 * [Use IndexedDB](http://www.dartlang.org/docs/tutorials/indexeddb/). | |
69 * | |
70 * [IndexedDB reference](http://docs.webplatform.org/wiki/apis/indexeddb) | |
71 * provides wiki-style docs about indexedDB | |
72 */ | |
73 library dart.dom.indexed_db; | |
74 | |
75 import 'dart:async'; | |
76 import 'dart:html'; | |
77 import 'dart:html_common'; | |
78 import 'dart:nativewrappers'; | |
79 import 'dart:_blink' as _blink; | |
80 import 'dart:js' as js; | |
81 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
82 // for details. All rights reserved. Use of this source code is governed by a | |
83 // BSD-style license that can be found in the LICENSE file. | |
84 | |
85 // DO NOT EDIT | |
86 // Auto-generated dart:indexed_db library. | |
87 | |
88 class _KeyRangeFactoryProvider { | |
89 static KeyRange createKeyRange_only(/*IDBKey*/ value) => | |
90 KeyRange.only_(value); | |
91 | |
92 static KeyRange createKeyRange_lowerBound( | |
93 /*IDBKey*/ bound, | |
94 [bool open = false]) => | |
95 KeyRange.lowerBound_(bound, open); | |
96 | |
97 static KeyRange createKeyRange_upperBound( | |
98 /*IDBKey*/ bound, | |
99 [bool open = false]) => | |
100 KeyRange.upperBound_(bound, open); | |
101 | |
102 static KeyRange createKeyRange_bound( | |
103 /*IDBKey*/ lower, | |
104 /*IDBKey*/ upper, | |
105 [bool lowerOpen = false, | |
106 bool upperOpen = false]) => | |
107 KeyRange.bound_(lower, upper, lowerOpen, upperOpen); | |
108 } | |
109 | |
110 // FIXME: Can we make this private? | |
111 @Deprecated("Internal Use Only") | |
112 final indexed_dbBlinkMap = { | |
113 'IDBCursor': () => Cursor.instanceRuntimeType, | |
114 'IDBCursorWithValue': () => CursorWithValue.instanceRuntimeType, | |
115 'IDBDatabase': () => Database.instanceRuntimeType, | |
116 'IDBFactory': () => IdbFactory.instanceRuntimeType, | |
117 'IDBIndex': () => Index.instanceRuntimeType, | |
118 'IDBKeyRange': () => KeyRange.instanceRuntimeType, | |
119 'IDBObjectStore': () => ObjectStore.instanceRuntimeType, | |
120 'IDBOpenDBRequest': () => OpenDBRequest.instanceRuntimeType, | |
121 'IDBRequest': () => Request.instanceRuntimeType, | |
122 'IDBTransaction': () => Transaction.instanceRuntimeType, | |
123 'IDBVersionChangeEvent': () => VersionChangeEvent.instanceRuntimeType, | |
124 }; | |
125 | |
126 // | |
127 // Per http://www.w3.org/TR/IndexedDB/#key-construct | |
128 // | |
129 // "A value is said to be a valid key if it is one of the following types: Array | |
130 // JavaScript objects [ECMA-262], DOMString [WEBIDL], Date [ECMA-262] or float | |
131 // [WEBIDL]. However Arrays are only valid keys if every item in the array is | |
132 // defined and is a valid key (i.e. sparse arrays can not be valid keys) and if | |
133 // the Array doesn't directly or indirectly contain itself. Any non-numeric | |
134 // properties are ignored, and thus does not affect whether the Array is a valid | |
135 // key. Additionally, if the value is of type float, it is only a valid key if | |
136 // it is not NaN, and if the value is of type Date it is only a valid key if its | |
137 // [[PrimitiveValue]] internal property, as defined by [ECMA-262], is not NaN." | |
138 | |
139 // What is required is to ensure that an Lists in the key are actually | |
140 // JavaScript arrays, and any Dates are JavaScript Dates. | |
141 | |
142 /** | |
143 * Converts a native IDBKey into a Dart object. | |
144 * | |
145 * May return the original input. May mutate the original input (but will be | |
146 * idempotent if mutation occurs). It is assumed that this conversion happens | |
147 * on native IDBKeys on all paths that return IDBKeys from native DOM calls. | |
148 * | |
149 * If necessary, JavaScript Dates are converted into Dart Dates. | |
150 */ | |
151 _convertNativeToDart_IDBKey(nativeKey) { | |
152 containsDate(object) { | |
153 if (object is DateTime) return true; | |
154 if (object is List) { | |
155 for (int i = 0; i < object.length; i++) { | |
156 if (containsDate(object[i])) return true; | |
157 } | |
158 } | |
159 return false; // number, string. | |
160 } | |
161 | |
162 if (nativeKey is DateTime) { | |
163 throw new UnimplementedError('Key containing DateTime'); | |
164 } | |
165 // TODO: Cache conversion somewhere? | |
166 return nativeKey; | |
167 } | |
168 | |
169 /** | |
170 * Converts a Dart object into a valid IDBKey. | |
171 * | |
172 * May return the original input. Does not mutate input. | |
173 * | |
174 * If necessary, [dartKey] may be copied to ensure all lists are converted into | |
175 * JavaScript Arrays and Dart Dates into JavaScript Dates. | |
176 */ | |
177 _convertDartToNative_IDBKey(dartKey) { | |
178 // TODO: Implement. | |
179 return dartKey; | |
180 } | |
181 | |
182 /// May modify original. If so, action is idempotent. | |
183 _convertNativeToDart_IDBAny(object) { | |
184 return convertNativeToDart_AcceptStructuredClone(object, mustCopy: false); | |
185 } // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
186 // for details. All rights reserved. Use of this source code is governed by a | |
187 // BSD-style license that can be found in the LICENSE file. | |
188 | |
189 @DomName('IDBCursor') | |
190 @Unstable() | |
191 class Cursor extends DartHtmlDomObject { | |
192 @DomName('IDBCursor.delete') | |
193 Future delete() { | |
194 try { | |
195 return _completeRequest(_delete()); | |
196 } catch (e, stacktrace) { | |
197 return new Future.error(e, stacktrace); | |
198 } | |
199 } | |
200 | |
201 @DomName('IDBCursor.value') | |
202 Future update(value) { | |
203 try { | |
204 return _completeRequest(_update(value)); | |
205 } catch (e, stacktrace) { | |
206 return new Future.error(e, stacktrace); | |
207 } | |
208 } | |
209 | |
210 // To suppress missing implicit constructor warnings. | |
211 factory Cursor._() { | |
212 throw new UnsupportedError("Not supported"); | |
213 } | |
214 | |
215 @Deprecated("Internal Use Only") | |
216 external static Type get instanceRuntimeType; | |
217 | |
218 @Deprecated("Internal Use Only") | |
219 Cursor.internal_() {} | |
220 | |
221 @DomName('IDBCursor.direction') | |
222 @DocsEditable() | |
223 String get direction => | |
224 _blink.BlinkIDBCursor.instance.direction_Getter_(this); | |
225 | |
226 @DomName('IDBCursor.key') | |
227 @DocsEditable() | |
228 Object get key => (_blink.BlinkIDBCursor.instance.key_Getter_(this)); | |
229 | |
230 @DomName('IDBCursor.primaryKey') | |
231 @DocsEditable() | |
232 Object get primaryKey => | |
233 (_blink.BlinkIDBCursor.instance.primaryKey_Getter_(this)); | |
234 | |
235 @DomName('IDBCursor.source') | |
236 @DocsEditable() | |
237 Object get source => (_blink.BlinkIDBCursor.instance.source_Getter_(this)); | |
238 | |
239 @DomName('IDBCursor.advance') | |
240 @DocsEditable() | |
241 void advance(int count) => | |
242 _blink.BlinkIDBCursor.instance.advance_Callback_1_(this, count); | |
243 | |
244 @DomName('IDBCursor.continuePrimaryKey') | |
245 @DocsEditable() | |
246 @Experimental() // untriaged | |
247 void continuePrimaryKey(Object key, Object primaryKey) => | |
248 _blink.BlinkIDBCursor.instance | |
249 .continuePrimaryKey_Callback_2_(this, key, primaryKey); | |
250 | |
251 @DomName('IDBCursor.delete') | |
252 @DocsEditable() | |
253 Request _delete() => _blink.BlinkIDBCursor.instance.delete_Callback_0_(this); | |
254 | |
255 void next([Object key]) { | |
256 if (key != null) { | |
257 _blink.BlinkIDBCursor.instance.continue_Callback_1_(this, key); | |
258 return; | |
259 } | |
260 _blink.BlinkIDBCursor.instance.continue_Callback_0_(this); | |
261 return; | |
262 } | |
263 | |
264 @DomName('IDBCursor.update') | |
265 @DocsEditable() | |
266 Request _update(Object value) => | |
267 _blink.BlinkIDBCursor.instance.update_Callback_1_( | |
268 this, convertDartToNative_SerializedScriptValue(value)); | |
269 } | |
270 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
271 // for details. All rights reserved. Use of this source code is governed by a | |
272 // BSD-style license that can be found in the LICENSE file. | |
273 | |
274 // WARNING: Do not edit - generated code. | |
275 | |
276 @DocsEditable() | |
277 @DomName('IDBCursorWithValue') | |
278 @Unstable() | |
279 class CursorWithValue extends Cursor { | |
280 // To suppress missing implicit constructor warnings. | |
281 factory CursorWithValue._() { | |
282 throw new UnsupportedError("Not supported"); | |
283 } | |
284 | |
285 @Deprecated("Internal Use Only") | |
286 external static Type get instanceRuntimeType; | |
287 | |
288 @Deprecated("Internal Use Only") | |
289 CursorWithValue.internal_() : super.internal_(); | |
290 | |
291 @DomName('IDBCursorWithValue.value') | |
292 @DocsEditable() | |
293 Object get value => _convertNativeToDart_IDBAny( | |
294 _blink.BlinkIDBCursorWithValue.instance.value_Getter_(this)); | |
295 } | |
296 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
297 // for details. All rights reserved. Use of this source code is governed by a | |
298 // BSD-style license that can be found in the LICENSE file. | |
299 | |
300 @DocsEditable() | |
301 /** | |
302 * An indexed database object for storing client-side data | |
303 * in web apps. | |
304 */ | |
305 @DomName('IDBDatabase') | |
306 @SupportedBrowser(SupportedBrowser.CHROME) | |
307 @SupportedBrowser(SupportedBrowser.FIREFOX, '15') | |
308 @SupportedBrowser(SupportedBrowser.IE, '10') | |
309 @Experimental() | |
310 @Unstable() | |
311 class Database extends EventTarget { | |
312 @DomName('IDBDatabase.createObjectStore') | |
313 @DocsEditable() | |
314 ObjectStore createObjectStore(String name, | |
315 {String keyPath, bool autoIncrement}) { | |
316 var options = {}; | |
317 if (keyPath != null) { | |
318 options['keyPath'] = keyPath; | |
319 } | |
320 if (autoIncrement != null) { | |
321 options['autoIncrement'] = autoIncrement; | |
322 } | |
323 | |
324 return _createObjectStore(name, options); | |
325 } | |
326 | |
327 Transaction transaction(storeName_OR_storeNames, String mode) { | |
328 if (mode != 'readonly' && mode != 'readwrite') { | |
329 throw new ArgumentError("Invalid transaction mode $mode"); | |
330 } | |
331 var names; | |
332 if (storeName_OR_storeNames == null) { | |
333 throw new ArgumentError("stores may not be null in transaction"); | |
334 } else if (storeName_OR_storeNames is String || | |
335 storeName_OR_storeNames is DomStringList) { | |
336 names = storeName_OR_storeNames; | |
337 } else if (storeName_OR_storeNames is List<String>) { | |
338 names = convertDartToNative_List(storeName_OR_storeNames); | |
339 } else { | |
340 throw new ArgumentError("Invalid store(s) $store_Name_OR_storeNames"); | |
341 } | |
342 | |
343 return _blink.BlinkIDBDatabase.instance | |
344 .transaction_Callback_2_(this, names, mode); | |
345 } | |
346 | |
347 Transaction transactionList(List<String> storeNames, String mode) => | |
348 transaction(storeNames, mode); | |
349 Transaction transactionStores(List<String> storeNames, String mode) => | |
350 transaction(storeNames, mode); | |
351 Transaction transactionStore(String storeName, String mode) => | |
352 transaction(storeName, mode); | |
353 | |
354 // To suppress missing implicit constructor warnings. | |
355 factory Database._() { | |
356 throw new UnsupportedError("Not supported"); | |
357 } | |
358 | |
359 /** | |
360 * Static factory designed to expose `abort` events to event | |
361 * handlers that are not necessarily instances of [Database]. | |
362 * | |
363 * See [EventStreamProvider] for usage information. | |
364 */ | |
365 @DomName('IDBDatabase.abortEvent') | |
366 @DocsEditable() | |
367 static const EventStreamProvider<Event> abortEvent = | |
368 const EventStreamProvider<Event>('abort'); | |
369 | |
370 /** | |
371 * Static factory designed to expose `close` events to event | |
372 * handlers that are not necessarily instances of [Database]. | |
373 * | |
374 * See [EventStreamProvider] for usage information. | |
375 */ | |
376 @DomName('IDBDatabase.closeEvent') | |
377 @DocsEditable() | |
378 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540 | |
379 @Experimental() | |
380 static const EventStreamProvider<Event> closeEvent = | |
381 const EventStreamProvider<Event>('close'); | |
382 | |
383 /** | |
384 * Static factory designed to expose `error` events to event | |
385 * handlers that are not necessarily instances of [Database]. | |
386 * | |
387 * See [EventStreamProvider] for usage information. | |
388 */ | |
389 @DomName('IDBDatabase.errorEvent') | |
390 @DocsEditable() | |
391 static const EventStreamProvider<Event> errorEvent = | |
392 const EventStreamProvider<Event>('error'); | |
393 | |
394 /** | |
395 * Static factory designed to expose `versionchange` events to event | |
396 * handlers that are not necessarily instances of [Database]. | |
397 * | |
398 * See [EventStreamProvider] for usage information. | |
399 */ | |
400 @DomName('IDBDatabase.versionchangeEvent') | |
401 @DocsEditable() | |
402 static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = | |
403 const EventStreamProvider<VersionChangeEvent>('versionchange'); | |
404 | |
405 @Deprecated("Internal Use Only") | |
406 external static Type get instanceRuntimeType; | |
407 | |
408 @Deprecated("Internal Use Only") | |
409 Database.internal_() : super.internal_(); | |
410 | |
411 @DomName('IDBDatabase.name') | |
412 @DocsEditable() | |
413 String get name => _blink.BlinkIDBDatabase.instance.name_Getter_(this); | |
414 | |
415 @DomName('IDBDatabase.objectStoreNames') | |
416 @DocsEditable() | |
417 List<String> get objectStoreNames => | |
418 _blink.BlinkIDBDatabase.instance.objectStoreNames_Getter_(this); | |
419 | |
420 @DomName('IDBDatabase.version') | |
421 @DocsEditable() | |
422 int get version => _blink.BlinkIDBDatabase.instance.version_Getter_(this); | |
423 | |
424 @DomName('IDBDatabase.close') | |
425 @DocsEditable() | |
426 void close() => _blink.BlinkIDBDatabase.instance.close_Callback_0_(this); | |
427 | |
428 ObjectStore _createObjectStore(String name, [Map options]) { | |
429 if (options != null) { | |
430 return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_2_( | |
431 this, name, convertDartToNative_Dictionary(options)); | |
432 } | |
433 return _blink.BlinkIDBDatabase.instance | |
434 .createObjectStore_Callback_1_(this, name); | |
435 } | |
436 | |
437 @DomName('IDBDatabase.deleteObjectStore') | |
438 @DocsEditable() | |
439 void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.instance | |
440 .deleteObjectStore_Callback_1_(this, name); | |
441 | |
442 /// Stream of `abort` events handled by this [Database]. | |
443 @DomName('IDBDatabase.onabort') | |
444 @DocsEditable() | |
445 Stream<Event> get onAbort => abortEvent.forTarget(this); | |
446 | |
447 /// Stream of `close` events handled by this [Database]. | |
448 @DomName('IDBDatabase.onclose') | |
449 @DocsEditable() | |
450 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540 | |
451 @Experimental() | |
452 Stream<Event> get onClose => closeEvent.forTarget(this); | |
453 | |
454 /// Stream of `error` events handled by this [Database]. | |
455 @DomName('IDBDatabase.onerror') | |
456 @DocsEditable() | |
457 Stream<Event> get onError => errorEvent.forTarget(this); | |
458 | |
459 /// Stream of `versionchange` events handled by this [Database]. | |
460 @DomName('IDBDatabase.onversionchange') | |
461 @DocsEditable() | |
462 Stream<VersionChangeEvent> get onVersionChange => | |
463 versionChangeEvent.forTarget(this); | |
464 } | |
465 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
466 // for details. All rights reserved. Use of this source code is governed by a | |
467 // BSD-style license that can be found in the LICENSE file. | |
468 | |
469 @DomName('IDBFactory') | |
470 @SupportedBrowser(SupportedBrowser.CHROME) | |
471 @SupportedBrowser(SupportedBrowser.FIREFOX, '15') | |
472 @SupportedBrowser(SupportedBrowser.IE, '10') | |
473 @Experimental() | |
474 @Unstable() | |
475 class IdbFactory extends DartHtmlDomObject { | |
476 /** | |
477 * Checks to see if Indexed DB is supported on the current platform. | |
478 */ | |
479 static bool get supported { | |
480 return true; | |
481 } | |
482 | |
483 @DomName('IDBFactory.open') | |
484 Future<Database> open(String name, | |
485 {int version, | |
486 void onUpgradeNeeded(VersionChangeEvent), | |
487 void onBlocked(Event)}) { | |
488 if ((version == null) != (onUpgradeNeeded == null)) { | |
489 return new Future.error(new ArgumentError( | |
490 'version and onUpgradeNeeded must be specified together')); | |
491 } | |
492 try { | |
493 var request; | |
494 if (version != null) { | |
495 request = _open(name, version); | |
496 } else { | |
497 request = _open(name); | |
498 } | |
499 | |
500 if (onUpgradeNeeded != null) { | |
501 request.onUpgradeNeeded.listen(onUpgradeNeeded); | |
502 } | |
503 if (onBlocked != null) { | |
504 request.onBlocked.listen(onBlocked); | |
505 } | |
506 return _completeRequest(request); | |
507 } catch (e, stacktrace) { | |
508 return new Future.error(e, stacktrace); | |
509 } | |
510 } | |
511 | |
512 @DomName('IDBFactory.deleteDatabase') | |
513 Future<IdbFactory> deleteDatabase(String name, {void onBlocked(Event e)}) { | |
514 try { | |
515 var request = _deleteDatabase(name); | |
516 | |
517 if (onBlocked != null) { | |
518 request.onBlocked.listen(onBlocked); | |
519 } | |
520 var completer = new Completer<IdbFactory>.sync(); | |
521 request.onSuccess.listen((e) { | |
522 completer.complete(this); | |
523 }); | |
524 request.onError.listen(completer.completeError); | |
525 return completer.future; | |
526 } catch (e, stacktrace) { | |
527 return new Future.error(e, stacktrace); | |
528 } | |
529 } | |
530 | |
531 @DomName('IDBFactory.getDatabaseNames') | |
532 @SupportedBrowser(SupportedBrowser.CHROME) | |
533 @Experimental() | |
534 Future<List<String>> getDatabaseNames() { | |
535 try { | |
536 var request = _webkitGetDatabaseNames(); | |
537 | |
538 return _completeRequest(request); | |
539 } catch (e, stacktrace) { | |
540 return new Future.error(e, stacktrace); | |
541 } | |
542 } | |
543 | |
544 /** | |
545 * Checks to see if getDatabaseNames is supported by the current platform. | |
546 */ | |
547 bool get supportsDatabaseNames { | |
548 return true; | |
549 } | |
550 | |
551 // To suppress missing implicit constructor warnings. | |
552 factory IdbFactory._() { | |
553 throw new UnsupportedError("Not supported"); | |
554 } | |
555 | |
556 @Deprecated("Internal Use Only") | |
557 external static Type get instanceRuntimeType; | |
558 | |
559 @Deprecated("Internal Use Only") | |
560 IdbFactory.internal_() {} | |
561 | |
562 @DomName('IDBFactory.cmp') | |
563 @DocsEditable() | |
564 int cmp(Object first, Object second) => | |
565 _blink.BlinkIDBFactory.instance.cmp_Callback_2_(this, first, second); | |
566 | |
567 @DomName('IDBFactory.deleteDatabase') | |
568 @DocsEditable() | |
569 OpenDBRequest _deleteDatabase(String name) => | |
570 _blink.BlinkIDBFactory.instance.deleteDatabase_Callback_1_(this, name); | |
571 | |
572 OpenDBRequest _open(String name, [int version]) { | |
573 if (version != null) { | |
574 return _blink.BlinkIDBFactory.instance | |
575 .open_Callback_2_(this, name, version); | |
576 } | |
577 return _blink.BlinkIDBFactory.instance.open_Callback_1_(this, name); | |
578 } | |
579 | |
580 @DomName('IDBFactory.webkitGetDatabaseNames') | |
581 @DocsEditable() | |
582 @SupportedBrowser(SupportedBrowser.CHROME) | |
583 @SupportedBrowser(SupportedBrowser.SAFARI) | |
584 @Experimental() | |
585 Request _webkitGetDatabaseNames() => | |
586 _blink.BlinkIDBFactory.instance.webkitGetDatabaseNames_Callback_0_(this); | |
587 } | |
588 | |
589 /** | |
590 * Ties a request to a completer, so the completer is completed when it succeeds | |
591 * and errors out when the request errors. | |
592 */ | |
593 Future/*<T>*/ _completeRequest/*<T>*/(Request request) { | |
594 var completer = new Completer/*<T>*/ .sync(); | |
595 // TODO: make sure that completer.complete is synchronous as transactions | |
596 // may be committed if the result is not processed immediately. | |
597 request.onSuccess.listen((e) { | |
598 var result = _cast/*<T>*/(request.result); | |
599 completer.complete(result); | |
600 }); | |
601 request.onError.listen(completer.completeError); | |
602 return completer.future; | |
603 } | |
604 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
605 // for details. All rights reserved. Use of this source code is governed by a | |
606 // BSD-style license that can be found in the LICENSE file. | |
607 | |
608 @DomName('IDBIndex') | |
609 @Unstable() | |
610 class Index extends DartHtmlDomObject { | |
611 @DomName('IDBIndex.count') | |
612 Future<int> count([key_OR_range]) { | |
613 try { | |
614 var request = _count(key_OR_range); | |
615 return _completeRequest(request); | |
616 } catch (e, stacktrace) { | |
617 return new Future.error(e, stacktrace); | |
618 } | |
619 } | |
620 | |
621 @DomName('IDBIndex.get') | |
622 Future get(key) { | |
623 try { | |
624 var request = _get(key); | |
625 | |
626 return _completeRequest(request); | |
627 } catch (e, stacktrace) { | |
628 return new Future.error(e, stacktrace); | |
629 } | |
630 } | |
631 | |
632 @DomName('IDBIndex.getKey') | |
633 Future getKey(key) { | |
634 try { | |
635 var request = _getKey(key); | |
636 | |
637 return _completeRequest(request); | |
638 } catch (e, stacktrace) { | |
639 return new Future.error(e, stacktrace); | |
640 } | |
641 } | |
642 | |
643 /** | |
644 * Creates a stream of cursors over the records in this object store. | |
645 * | |
646 * See also: | |
647 * | |
648 * * [ObjectStore.openCursor] | |
649 */ | |
650 Stream<CursorWithValue> openCursor( | |
651 {key, KeyRange range, String direction, bool autoAdvance}) { | |
652 var key_OR_range = null; | |
653 if (key != null) { | |
654 if (range != null) { | |
655 throw new ArgumentError('Cannot specify both key and range.'); | |
656 } | |
657 key_OR_range = key; | |
658 } else { | |
659 key_OR_range = range; | |
660 } | |
661 var request; | |
662 if (direction == null) { | |
663 // FIXME: Passing in "next" should be unnecessary. | |
664 request = _openCursor(key_OR_range, "next"); | |
665 } else { | |
666 request = _openCursor(key_OR_range, direction); | |
667 } | |
668 return ObjectStore._cursorStreamFromResult(request, autoAdvance); | |
669 } | |
670 | |
671 /** | |
672 * Creates a stream of cursors over the records in this object store. | |
673 * | |
674 * See also: | |
675 * | |
676 * * [ObjectStore.openCursor] | |
677 */ | |
678 Stream<Cursor> openKeyCursor( | |
679 {key, KeyRange range, String direction, bool autoAdvance}) { | |
680 var key_OR_range = null; | |
681 if (key != null) { | |
682 if (range != null) { | |
683 throw new ArgumentError('Cannot specify both key and range.'); | |
684 } | |
685 key_OR_range = key; | |
686 } else { | |
687 key_OR_range = range; | |
688 } | |
689 var request; | |
690 if (direction == null) { | |
691 // FIXME: Passing in "next" should be unnecessary. | |
692 request = _openKeyCursor(key_OR_range, "next"); | |
693 } else { | |
694 request = _openKeyCursor(key_OR_range, direction); | |
695 } | |
696 return ObjectStore._cursorStreamFromResult(request, autoAdvance); | |
697 } | |
698 | |
699 // To suppress missing implicit constructor warnings. | |
700 factory Index._() { | |
701 throw new UnsupportedError("Not supported"); | |
702 } | |
703 | |
704 @Deprecated("Internal Use Only") | |
705 external static Type get instanceRuntimeType; | |
706 | |
707 @Deprecated("Internal Use Only") | |
708 Index.internal_() {} | |
709 | |
710 @DomName('IDBIndex.keyPath') | |
711 @DocsEditable() | |
712 Object get keyPath => (_blink.BlinkIDBIndex.instance.keyPath_Getter_(this)); | |
713 | |
714 @DomName('IDBIndex.multiEntry') | |
715 @DocsEditable() | |
716 bool get multiEntry => _blink.BlinkIDBIndex.instance.multiEntry_Getter_(this); | |
717 | |
718 @DomName('IDBIndex.name') | |
719 @DocsEditable() | |
720 String get name => _blink.BlinkIDBIndex.instance.name_Getter_(this); | |
721 | |
722 @DomName('IDBIndex.objectStore') | |
723 @DocsEditable() | |
724 ObjectStore get objectStore => | |
725 _blink.BlinkIDBIndex.instance.objectStore_Getter_(this); | |
726 | |
727 @DomName('IDBIndex.unique') | |
728 @DocsEditable() | |
729 bool get unique => _blink.BlinkIDBIndex.instance.unique_Getter_(this); | |
730 | |
731 @DomName('IDBIndex.count') | |
732 @DocsEditable() | |
733 Request _count(Object key) => | |
734 _blink.BlinkIDBIndex.instance.count_Callback_1_(this, key); | |
735 | |
736 @DomName('IDBIndex.get') | |
737 @DocsEditable() | |
738 Request _get(Object key) => | |
739 _blink.BlinkIDBIndex.instance.get_Callback_1_(this, key); | |
740 | |
741 Request getAll(Object range, [int maxCount]) { | |
742 if (maxCount != null) { | |
743 return _blink.BlinkIDBIndex.instance | |
744 .getAll_Callback_2_(this, range, maxCount); | |
745 } | |
746 return _blink.BlinkIDBIndex.instance.getAll_Callback_1_(this, range); | |
747 } | |
748 | |
749 Request getAllKeys(Object range, [int maxCount]) { | |
750 if (maxCount != null) { | |
751 return _blink.BlinkIDBIndex.instance | |
752 .getAllKeys_Callback_2_(this, range, maxCount); | |
753 } | |
754 return _blink.BlinkIDBIndex.instance.getAllKeys_Callback_1_(this, range); | |
755 } | |
756 | |
757 @DomName('IDBIndex.getKey') | |
758 @DocsEditable() | |
759 Request _getKey(Object key) => | |
760 _blink.BlinkIDBIndex.instance.getKey_Callback_1_(this, key); | |
761 | |
762 Request _openCursor(Object range, [String direction]) { | |
763 if (direction != null) { | |
764 return _blink.BlinkIDBIndex.instance | |
765 .openCursor_Callback_2_(this, range, direction); | |
766 } | |
767 return _blink.BlinkIDBIndex.instance.openCursor_Callback_1_(this, range); | |
768 } | |
769 | |
770 Request _openKeyCursor(Object range, [String direction]) { | |
771 if (direction != null) { | |
772 return _blink.BlinkIDBIndex.instance | |
773 .openKeyCursor_Callback_2_(this, range, direction); | |
774 } | |
775 return _blink.BlinkIDBIndex.instance.openKeyCursor_Callback_1_(this, range); | |
776 } | |
777 } | |
778 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
779 // for details. All rights reserved. Use of this source code is governed by a | |
780 // BSD-style license that can be found in the LICENSE file. | |
781 | |
782 @DomName('IDBKeyRange') | |
783 @Unstable() | |
784 class KeyRange extends DartHtmlDomObject { | |
785 @DomName('IDBKeyRange.only') | |
786 factory KeyRange.only(/*Key*/ value) => | |
787 _KeyRangeFactoryProvider.createKeyRange_only(value); | |
788 | |
789 @DomName('IDBKeyRange.lowerBound') | |
790 factory KeyRange.lowerBound(/*Key*/ bound, [bool open = false]) => | |
791 _KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open); | |
792 | |
793 @DomName('IDBKeyRange.upperBound') | |
794 factory KeyRange.upperBound(/*Key*/ bound, [bool open = false]) => | |
795 _KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open); | |
796 | |
797 @DomName('KeyRange.bound') | |
798 factory KeyRange.bound(/*Key*/ lower, /*Key*/ upper, | |
799 [bool lowerOpen = false, bool upperOpen = false]) => | |
800 _KeyRangeFactoryProvider.createKeyRange_bound( | |
801 lower, upper, lowerOpen, upperOpen); | |
802 | |
803 // To suppress missing implicit constructor warnings. | |
804 factory KeyRange._() { | |
805 throw new UnsupportedError("Not supported"); | |
806 } | |
807 | |
808 @Deprecated("Internal Use Only") | |
809 external static Type get instanceRuntimeType; | |
810 | |
811 @Deprecated("Internal Use Only") | |
812 KeyRange.internal_() {} | |
813 | |
814 @DomName('IDBKeyRange.lower') | |
815 @DocsEditable() | |
816 Object get lower => (_blink.BlinkIDBKeyRange.instance.lower_Getter_(this)); | |
817 | |
818 @DomName('IDBKeyRange.lowerOpen') | |
819 @DocsEditable() | |
820 bool get lowerOpen => | |
821 _blink.BlinkIDBKeyRange.instance.lowerOpen_Getter_(this); | |
822 | |
823 @DomName('IDBKeyRange.upper') | |
824 @DocsEditable() | |
825 Object get upper => (_blink.BlinkIDBKeyRange.instance.upper_Getter_(this)); | |
826 | |
827 @DomName('IDBKeyRange.upperOpen') | |
828 @DocsEditable() | |
829 bool get upperOpen => | |
830 _blink.BlinkIDBKeyRange.instance.upperOpen_Getter_(this); | |
831 | |
832 static KeyRange bound_(Object lower, Object upper, | |
833 [bool lowerOpen, bool upperOpen]) { | |
834 if (upperOpen != null) { | |
835 return _blink.BlinkIDBKeyRange.instance | |
836 .bound_Callback_4_(lower, upper, lowerOpen, upperOpen); | |
837 } | |
838 if (lowerOpen != null) { | |
839 return _blink.BlinkIDBKeyRange.instance | |
840 .bound_Callback_3_(lower, upper, lowerOpen); | |
841 } | |
842 return _blink.BlinkIDBKeyRange.instance.bound_Callback_2_(lower, upper); | |
843 } | |
844 | |
845 static KeyRange lowerBound_(Object bound, [bool open]) { | |
846 if (open != null) { | |
847 return _blink.BlinkIDBKeyRange.instance | |
848 .lowerBound_Callback_2_(bound, open); | |
849 } | |
850 return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_1_(bound); | |
851 } | |
852 | |
853 @DomName('IDBKeyRange.only_') | |
854 @DocsEditable() | |
855 @Experimental() // non-standard | |
856 static KeyRange only_(Object value) => | |
857 _blink.BlinkIDBKeyRange.instance.only_Callback_1_(value); | |
858 | |
859 static KeyRange upperBound_(Object bound, [bool open]) { | |
860 if (open != null) { | |
861 return _blink.BlinkIDBKeyRange.instance | |
862 .upperBound_Callback_2_(bound, open); | |
863 } | |
864 return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_1_(bound); | |
865 } | |
866 } | |
867 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
868 // for details. All rights reserved. Use of this source code is governed by a | |
869 // BSD-style license that can be found in the LICENSE file. | |
870 | |
871 @DomName('IDBObjectStore') | |
872 @Unstable() | |
873 class ObjectStore extends DartHtmlDomObject { | |
874 @DomName('IDBObjectStore.add') | |
875 Future add(value, [key]) { | |
876 try { | |
877 var request; | |
878 if (key != null) { | |
879 request = _add(value, key); | |
880 } else { | |
881 request = _add(value); | |
882 } | |
883 return _completeRequest(request); | |
884 } catch (e, stacktrace) { | |
885 return new Future.error(e, stacktrace); | |
886 } | |
887 } | |
888 | |
889 @DomName('IDBObjectStore.clear') | |
890 Future clear() { | |
891 try { | |
892 return _completeRequest(_clear()); | |
893 } catch (e, stacktrace) { | |
894 return new Future.error(e, stacktrace); | |
895 } | |
896 } | |
897 | |
898 @DomName('IDBObjectStore.delete') | |
899 Future delete(key_OR_keyRange) { | |
900 try { | |
901 return _completeRequest(_delete(key_OR_keyRange)); | |
902 } catch (e, stacktrace) { | |
903 return new Future.error(e, stacktrace); | |
904 } | |
905 } | |
906 | |
907 @DomName('IDBObjectStore.count') | |
908 Future<int> count([key_OR_range]) { | |
909 try { | |
910 var request = _count(key_OR_range); | |
911 return _completeRequest(request); | |
912 } catch (e, stacktrace) { | |
913 return new Future.error(e, stacktrace); | |
914 } | |
915 } | |
916 | |
917 @DomName('IDBObjectStore.put') | |
918 Future put(value, [key]) { | |
919 try { | |
920 var request; | |
921 if (key != null) { | |
922 request = _put(value, key); | |
923 } else { | |
924 request = _put(value); | |
925 } | |
926 return _completeRequest(request); | |
927 } catch (e, stacktrace) { | |
928 return new Future.error(e, stacktrace); | |
929 } | |
930 } | |
931 | |
932 @DomName('IDBObjectStore.get') | |
933 Future getObject(key) { | |
934 try { | |
935 var request = _get(key); | |
936 | |
937 return _completeRequest(request); | |
938 } catch (e, stacktrace) { | |
939 return new Future.error(e, stacktrace); | |
940 } | |
941 } | |
942 | |
943 /** | |
944 * Creates a stream of cursors over the records in this object store. | |
945 * | |
946 * **The stream must be manually advanced by calling [Cursor.next] after | |
947 * each item or by specifying autoAdvance to be true.** | |
948 * | |
949 * var cursors = objectStore.openCursor().listen( | |
950 * (cursor) { | |
951 * // ...some processing with the cursor | |
952 * cursor.next(); // advance onto the next cursor. | |
953 * }, | |
954 * onDone: () { | |
955 * // called when there are no more cursors. | |
956 * print('all done!'); | |
957 * }); | |
958 * | |
959 * Asynchronous operations which are not related to the current transaction | |
960 * will cause the transaction to automatically be committed-- all processing | |
961 * must be done synchronously unless they are additional async requests to | |
962 * the current transaction. | |
963 */ | |
964 @DomName('IDBObjectStore.openCursor') | |
965 Stream<CursorWithValue> openCursor( | |
966 {key, KeyRange range, String direction, bool autoAdvance}) { | |
967 var key_OR_range = null; | |
968 if (key != null) { | |
969 if (range != null) { | |
970 throw new ArgumentError('Cannot specify both key and range.'); | |
971 } | |
972 key_OR_range = key; | |
973 } else { | |
974 key_OR_range = range; | |
975 } | |
976 | |
977 // TODO: try/catch this and return a stream with an immediate error. | |
978 var request; | |
979 if (direction == null) { | |
980 request = _openCursor(key_OR_range); | |
981 } else { | |
982 request = _openCursor(key_OR_range, direction); | |
983 } | |
984 return _cursorStreamFromResult(request, autoAdvance); | |
985 } | |
986 | |
987 @DomName('IDBObjectStore.createIndex') | |
988 Index createIndex(String name, keyPath, {bool unique, bool multiEntry}) { | |
989 var options = {}; | |
990 if (unique != null) { | |
991 options['unique'] = unique; | |
992 } | |
993 if (multiEntry != null) { | |
994 options['multiEntry'] = multiEntry; | |
995 } | |
996 | |
997 return _createIndex(name, keyPath, options); | |
998 } | |
999 | |
1000 // To suppress missing implicit constructor warnings. | |
1001 factory ObjectStore._() { | |
1002 throw new UnsupportedError("Not supported"); | |
1003 } | |
1004 | |
1005 @Deprecated("Internal Use Only") | |
1006 external static Type get instanceRuntimeType; | |
1007 | |
1008 @Deprecated("Internal Use Only") | |
1009 ObjectStore.internal_() {} | |
1010 | |
1011 @DomName('IDBObjectStore.autoIncrement') | |
1012 @DocsEditable() | |
1013 bool get autoIncrement => | |
1014 _blink.BlinkIDBObjectStore.instance.autoIncrement_Getter_(this); | |
1015 | |
1016 @DomName('IDBObjectStore.indexNames') | |
1017 @DocsEditable() | |
1018 List<String> get indexNames => | |
1019 _blink.BlinkIDBObjectStore.instance.indexNames_Getter_(this); | |
1020 | |
1021 @DomName('IDBObjectStore.keyPath') | |
1022 @DocsEditable() | |
1023 Object get keyPath => | |
1024 (_blink.BlinkIDBObjectStore.instance.keyPath_Getter_(this)); | |
1025 | |
1026 @DomName('IDBObjectStore.name') | |
1027 @DocsEditable() | |
1028 String get name => _blink.BlinkIDBObjectStore.instance.name_Getter_(this); | |
1029 | |
1030 @DomName('IDBObjectStore.transaction') | |
1031 @DocsEditable() | |
1032 Transaction get transaction => | |
1033 _blink.BlinkIDBObjectStore.instance.transaction_Getter_(this); | |
1034 | |
1035 Request _add(Object value, [Object key]) { | |
1036 if (key != null) { | |
1037 return _blink.BlinkIDBObjectStore.instance.add_Callback_2_( | |
1038 this, | |
1039 convertDartToNative_SerializedScriptValue(value), | |
1040 convertDartToNative_SerializedScriptValue(key)); | |
1041 } | |
1042 return _blink.BlinkIDBObjectStore.instance.add_Callback_1_( | |
1043 this, convertDartToNative_SerializedScriptValue(value)); | |
1044 } | |
1045 | |
1046 @DomName('IDBObjectStore.clear') | |
1047 @DocsEditable() | |
1048 Request _clear() => | |
1049 _blink.BlinkIDBObjectStore.instance.clear_Callback_0_(this); | |
1050 | |
1051 @DomName('IDBObjectStore.count') | |
1052 @DocsEditable() | |
1053 Request _count(Object key) => | |
1054 _blink.BlinkIDBObjectStore.instance.count_Callback_1_(this, key); | |
1055 | |
1056 Index _createIndex(String name, Object keyPath, [Map options]) { | |
1057 if (options != null) { | |
1058 return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_( | |
1059 this, name, keyPath, convertDartToNative_Dictionary(options)); | |
1060 } | |
1061 return _blink.BlinkIDBObjectStore.instance | |
1062 .createIndex_Callback_2_(this, name, keyPath); | |
1063 } | |
1064 | |
1065 @DomName('IDBObjectStore.delete') | |
1066 @DocsEditable() | |
1067 Request _delete(Object key) => | |
1068 _blink.BlinkIDBObjectStore.instance.delete_Callback_1_(this, key); | |
1069 | |
1070 @DomName('IDBObjectStore.deleteIndex') | |
1071 @DocsEditable() | |
1072 void deleteIndex(String name) => | |
1073 _blink.BlinkIDBObjectStore.instance.deleteIndex_Callback_1_(this, name); | |
1074 | |
1075 @DomName('IDBObjectStore.get') | |
1076 @DocsEditable() | |
1077 Request _get(Object key) => | |
1078 _blink.BlinkIDBObjectStore.instance.get_Callback_1_(this, key); | |
1079 | |
1080 Request getAll(Object range, [int maxCount]) { | |
1081 if (maxCount != null) { | |
1082 return _blink.BlinkIDBObjectStore.instance | |
1083 .getAll_Callback_2_(this, range, maxCount); | |
1084 } | |
1085 return _blink.BlinkIDBObjectStore.instance.getAll_Callback_1_(this, range); | |
1086 } | |
1087 | |
1088 Request getAllKeys(Object range, [int maxCount]) { | |
1089 if (maxCount != null) { | |
1090 return _blink.BlinkIDBObjectStore.instance | |
1091 .getAllKeys_Callback_2_(this, range, maxCount); | |
1092 } | |
1093 return _blink.BlinkIDBObjectStore.instance | |
1094 .getAllKeys_Callback_1_(this, range); | |
1095 } | |
1096 | |
1097 @DomName('IDBObjectStore.index') | |
1098 @DocsEditable() | |
1099 Index index(String name) => | |
1100 _blink.BlinkIDBObjectStore.instance.index_Callback_1_(this, name); | |
1101 | |
1102 Request _openCursor(Object range, [String direction]) { | |
1103 if (direction != null) { | |
1104 return _blink.BlinkIDBObjectStore.instance | |
1105 .openCursor_Callback_2_(this, range, direction); | |
1106 } | |
1107 return _blink.BlinkIDBObjectStore.instance | |
1108 .openCursor_Callback_1_(this, range); | |
1109 } | |
1110 | |
1111 Request openKeyCursor(Object range, [String direction]) { | |
1112 if (direction != null) { | |
1113 return _blink.BlinkIDBObjectStore.instance | |
1114 .openKeyCursor_Callback_2_(this, range, direction); | |
1115 } | |
1116 return _blink.BlinkIDBObjectStore.instance | |
1117 .openKeyCursor_Callback_1_(this, range); | |
1118 } | |
1119 | |
1120 Request _put(Object value, [Object key]) { | |
1121 if (key != null) { | |
1122 return _blink.BlinkIDBObjectStore.instance.put_Callback_2_( | |
1123 this, | |
1124 convertDartToNative_SerializedScriptValue(value), | |
1125 convertDartToNative_SerializedScriptValue(key)); | |
1126 } | |
1127 return _blink.BlinkIDBObjectStore.instance.put_Callback_1_( | |
1128 this, convertDartToNative_SerializedScriptValue(value)); | |
1129 } | |
1130 | |
1131 /** | |
1132 * Helper for iterating over cursors in a request. | |
1133 */ | |
1134 static Stream/*<T>*/ _cursorStreamFromResult/*<T extends Cursor>*/( | |
1135 Request request, bool autoAdvance) { | |
1136 // TODO: need to guarantee that the controller provides the values | |
1137 // immediately as waiting until the next tick will cause the transaction to | |
1138 // close. | |
1139 var controller = new StreamController/*<T>*/(sync: true); | |
1140 | |
1141 //TODO: Report stacktrace once issue 4061 is resolved. | |
1142 request.onError.listen(controller.addError); | |
1143 | |
1144 request.onSuccess.listen((e) { | |
1145 var cursor = _cast/*<T>*/(request.result); | |
1146 if (cursor == null) { | |
1147 controller.close(); | |
1148 } else { | |
1149 controller.add(cursor); | |
1150 if (autoAdvance == true && controller.hasListener) { | |
1151 cursor.next(); | |
1152 } | |
1153 } | |
1154 }); | |
1155 return controller.stream; | |
1156 } | |
1157 } | |
1158 | |
1159 // ignore: STRONG_MODE_DOWN_CAST_COMPOSITE | |
1160 /*=To*/ _cast/*<To>*/(dynamic x) => x; | |
1161 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
1162 // for details. All rights reserved. Use of this source code is governed by a | |
1163 // BSD-style license that can be found in the LICENSE file. | |
1164 | |
1165 // WARNING: Do not edit - generated code. | |
1166 | |
1167 @DocsEditable() | |
1168 @DomName('IDBOpenDBRequest') | |
1169 @Unstable() | |
1170 class OpenDBRequest extends Request { | |
1171 // To suppress missing implicit constructor warnings. | |
1172 factory OpenDBRequest._() { | |
1173 throw new UnsupportedError("Not supported"); | |
1174 } | |
1175 | |
1176 /** | |
1177 * Static factory designed to expose `blocked` events to event | |
1178 * handlers that are not necessarily instances of [OpenDBRequest]. | |
1179 * | |
1180 * See [EventStreamProvider] for usage information. | |
1181 */ | |
1182 @DomName('IDBOpenDBRequest.blockedEvent') | |
1183 @DocsEditable() | |
1184 static const EventStreamProvider<Event> blockedEvent = | |
1185 const EventStreamProvider<Event>('blocked'); | |
1186 | |
1187 /** | |
1188 * Static factory designed to expose `upgradeneeded` events to event | |
1189 * handlers that are not necessarily instances of [OpenDBRequest]. | |
1190 * | |
1191 * See [EventStreamProvider] for usage information. | |
1192 */ | |
1193 @DomName('IDBOpenDBRequest.upgradeneededEvent') | |
1194 @DocsEditable() | |
1195 static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = | |
1196 const EventStreamProvider<VersionChangeEvent>('upgradeneeded'); | |
1197 | |
1198 @Deprecated("Internal Use Only") | |
1199 external static Type get instanceRuntimeType; | |
1200 | |
1201 @Deprecated("Internal Use Only") | |
1202 OpenDBRequest.internal_() : super.internal_(); | |
1203 | |
1204 /// Stream of `blocked` events handled by this [OpenDBRequest]. | |
1205 @DomName('IDBOpenDBRequest.onblocked') | |
1206 @DocsEditable() | |
1207 Stream<Event> get onBlocked => blockedEvent.forTarget(this); | |
1208 | |
1209 /// Stream of `upgradeneeded` events handled by this [OpenDBRequest]. | |
1210 @DomName('IDBOpenDBRequest.onupgradeneeded') | |
1211 @DocsEditable() | |
1212 Stream<VersionChangeEvent> get onUpgradeNeeded => | |
1213 upgradeNeededEvent.forTarget(this); | |
1214 } | |
1215 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
1216 // for details. All rights reserved. Use of this source code is governed by a | |
1217 // BSD-style license that can be found in the LICENSE file. | |
1218 | |
1219 // WARNING: Do not edit - generated code. | |
1220 | |
1221 @DocsEditable() | |
1222 @DomName('IDBRequest') | |
1223 @Unstable() | |
1224 class Request extends EventTarget { | |
1225 // To suppress missing implicit constructor warnings. | |
1226 factory Request._() { | |
1227 throw new UnsupportedError("Not supported"); | |
1228 } | |
1229 | |
1230 /** | |
1231 * Static factory designed to expose `error` events to event | |
1232 * handlers that are not necessarily instances of [Request]. | |
1233 * | |
1234 * See [EventStreamProvider] for usage information. | |
1235 */ | |
1236 @DomName('IDBRequest.errorEvent') | |
1237 @DocsEditable() | |
1238 static const EventStreamProvider<Event> errorEvent = | |
1239 const EventStreamProvider<Event>('error'); | |
1240 | |
1241 /** | |
1242 * Static factory designed to expose `success` events to event | |
1243 * handlers that are not necessarily instances of [Request]. | |
1244 * | |
1245 * See [EventStreamProvider] for usage information. | |
1246 */ | |
1247 @DomName('IDBRequest.successEvent') | |
1248 @DocsEditable() | |
1249 static const EventStreamProvider<Event> successEvent = | |
1250 const EventStreamProvider<Event>('success'); | |
1251 | |
1252 @Deprecated("Internal Use Only") | |
1253 external static Type get instanceRuntimeType; | |
1254 | |
1255 @Deprecated("Internal Use Only") | |
1256 Request.internal_() : super.internal_(); | |
1257 | |
1258 @DomName('IDBRequest.error') | |
1259 @DocsEditable() | |
1260 DomException get error => _blink.BlinkIDBRequest.instance.error_Getter_(this); | |
1261 | |
1262 @DomName('IDBRequest.readyState') | |
1263 @DocsEditable() | |
1264 String get readyState => | |
1265 _blink.BlinkIDBRequest.instance.readyState_Getter_(this); | |
1266 | |
1267 @DomName('IDBRequest.result') | |
1268 @DocsEditable() | |
1269 Object get result => _convertNativeToDart_IDBAny( | |
1270 _blink.BlinkIDBRequest.instance.result_Getter_(this)); | |
1271 | |
1272 @DomName('IDBRequest.source') | |
1273 @DocsEditable() | |
1274 Object get source => (_blink.BlinkIDBRequest.instance.source_Getter_(this)); | |
1275 | |
1276 @DomName('IDBRequest.transaction') | |
1277 @DocsEditable() | |
1278 Transaction get transaction => | |
1279 _blink.BlinkIDBRequest.instance.transaction_Getter_(this); | |
1280 | |
1281 /// Stream of `error` events handled by this [Request]. | |
1282 @DomName('IDBRequest.onerror') | |
1283 @DocsEditable() | |
1284 Stream<Event> get onError => errorEvent.forTarget(this); | |
1285 | |
1286 /// Stream of `success` events handled by this [Request]. | |
1287 @DomName('IDBRequest.onsuccess') | |
1288 @DocsEditable() | |
1289 Stream<Event> get onSuccess => successEvent.forTarget(this); | |
1290 } | |
1291 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
1292 // for details. All rights reserved. Use of this source code is governed by a | |
1293 // BSD-style license that can be found in the LICENSE file. | |
1294 | |
1295 @DomName('IDBTransaction') | |
1296 @Unstable() | |
1297 class Transaction extends EventTarget { | |
1298 /** | |
1299 * Provides a Future which will be completed once the transaction has | |
1300 * completed. | |
1301 * | |
1302 * The future will error if an error occurrs on the transaction or if the | |
1303 * transaction is aborted. | |
1304 */ | |
1305 Future<Database> get completed { | |
1306 var completer = new Completer<Database>(); | |
1307 | |
1308 this.onComplete.first.then((_) { | |
1309 completer.complete(db); | |
1310 }); | |
1311 | |
1312 this.onError.first.then((e) { | |
1313 completer.completeError(e); | |
1314 }); | |
1315 | |
1316 this.onAbort.first.then((e) { | |
1317 // Avoid completing twice if an error occurs. | |
1318 if (!completer.isCompleted) { | |
1319 completer.completeError(e); | |
1320 } | |
1321 }); | |
1322 | |
1323 return completer.future; | |
1324 } | |
1325 | |
1326 // To suppress missing implicit constructor warnings. | |
1327 factory Transaction._() { | |
1328 throw new UnsupportedError("Not supported"); | |
1329 } | |
1330 | |
1331 /** | |
1332 * Static factory designed to expose `abort` events to event | |
1333 * handlers that are not necessarily instances of [Transaction]. | |
1334 * | |
1335 * See [EventStreamProvider] for usage information. | |
1336 */ | |
1337 @DomName('IDBTransaction.abortEvent') | |
1338 @DocsEditable() | |
1339 static const EventStreamProvider<Event> abortEvent = | |
1340 const EventStreamProvider<Event>('abort'); | |
1341 | |
1342 /** | |
1343 * Static factory designed to expose `complete` events to event | |
1344 * handlers that are not necessarily instances of [Transaction]. | |
1345 * | |
1346 * See [EventStreamProvider] for usage information. | |
1347 */ | |
1348 @DomName('IDBTransaction.completeEvent') | |
1349 @DocsEditable() | |
1350 static const EventStreamProvider<Event> completeEvent = | |
1351 const EventStreamProvider<Event>('complete'); | |
1352 | |
1353 /** | |
1354 * Static factory designed to expose `error` events to event | |
1355 * handlers that are not necessarily instances of [Transaction]. | |
1356 * | |
1357 * See [EventStreamProvider] for usage information. | |
1358 */ | |
1359 @DomName('IDBTransaction.errorEvent') | |
1360 @DocsEditable() | |
1361 static const EventStreamProvider<Event> errorEvent = | |
1362 const EventStreamProvider<Event>('error'); | |
1363 | |
1364 @Deprecated("Internal Use Only") | |
1365 external static Type get instanceRuntimeType; | |
1366 | |
1367 @Deprecated("Internal Use Only") | |
1368 Transaction.internal_() : super.internal_(); | |
1369 | |
1370 @DomName('IDBTransaction.db') | |
1371 @DocsEditable() | |
1372 Database get db => _blink.BlinkIDBTransaction.instance.db_Getter_(this); | |
1373 | |
1374 @DomName('IDBTransaction.error') | |
1375 @DocsEditable() | |
1376 DomException get error => | |
1377 _blink.BlinkIDBTransaction.instance.error_Getter_(this); | |
1378 | |
1379 @DomName('IDBTransaction.mode') | |
1380 @DocsEditable() | |
1381 String get mode => _blink.BlinkIDBTransaction.instance.mode_Getter_(this); | |
1382 | |
1383 @DomName('IDBTransaction.objectStoreNames') | |
1384 @DocsEditable() | |
1385 @Experimental() // untriaged | |
1386 List<String> get objectStoreNames => | |
1387 _blink.BlinkIDBTransaction.instance.objectStoreNames_Getter_(this); | |
1388 | |
1389 @DomName('IDBTransaction.abort') | |
1390 @DocsEditable() | |
1391 void abort() => _blink.BlinkIDBTransaction.instance.abort_Callback_0_(this); | |
1392 | |
1393 @DomName('IDBTransaction.objectStore') | |
1394 @DocsEditable() | |
1395 ObjectStore objectStore(String name) => | |
1396 _blink.BlinkIDBTransaction.instance.objectStore_Callback_1_(this, name); | |
1397 | |
1398 /// Stream of `abort` events handled by this [Transaction]. | |
1399 @DomName('IDBTransaction.onabort') | |
1400 @DocsEditable() | |
1401 Stream<Event> get onAbort => abortEvent.forTarget(this); | |
1402 | |
1403 /// Stream of `complete` events handled by this [Transaction]. | |
1404 @DomName('IDBTransaction.oncomplete') | |
1405 @DocsEditable() | |
1406 Stream<Event> get onComplete => completeEvent.forTarget(this); | |
1407 | |
1408 /// Stream of `error` events handled by this [Transaction]. | |
1409 @DomName('IDBTransaction.onerror') | |
1410 @DocsEditable() | |
1411 Stream<Event> get onError => errorEvent.forTarget(this); | |
1412 } | |
1413 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
1414 // for details. All rights reserved. Use of this source code is governed by a | |
1415 // BSD-style license that can be found in the LICENSE file. | |
1416 | |
1417 // WARNING: Do not edit - generated code. | |
1418 | |
1419 @DocsEditable() | |
1420 @DomName('IDBVersionChangeEvent') | |
1421 @Unstable() | |
1422 class VersionChangeEvent extends Event { | |
1423 // To suppress missing implicit constructor warnings. | |
1424 factory VersionChangeEvent._() { | |
1425 throw new UnsupportedError("Not supported"); | |
1426 } | |
1427 | |
1428 @DomName('IDBVersionChangeEvent.IDBVersionChangeEvent') | |
1429 @DocsEditable() | |
1430 factory VersionChangeEvent(String type, [Map eventInitDict]) { | |
1431 if (eventInitDict != null) { | |
1432 var eventInitDict_1 = convertDartToNative_Dictionary(eventInitDict); | |
1433 return _blink.BlinkIDBVersionChangeEvent.instance | |
1434 .constructorCallback_2_(type, eventInitDict_1); | |
1435 } | |
1436 return _blink.BlinkIDBVersionChangeEvent.instance | |
1437 .constructorCallback_1_(type); | |
1438 } | |
1439 | |
1440 @Deprecated("Internal Use Only") | |
1441 external static Type get instanceRuntimeType; | |
1442 | |
1443 @Deprecated("Internal Use Only") | |
1444 VersionChangeEvent.internal_() : super.internal_(); | |
1445 | |
1446 @DomName('IDBVersionChangeEvent.dataLoss') | |
1447 @DocsEditable() | |
1448 @Experimental() // untriaged | |
1449 String get dataLoss => | |
1450 _blink.BlinkIDBVersionChangeEvent.instance.dataLoss_Getter_(this); | |
1451 | |
1452 @DomName('IDBVersionChangeEvent.dataLossMessage') | |
1453 @DocsEditable() | |
1454 @Experimental() // untriaged | |
1455 String get dataLossMessage => | |
1456 _blink.BlinkIDBVersionChangeEvent.instance.dataLossMessage_Getter_(this); | |
1457 | |
1458 @DomName('IDBVersionChangeEvent.newVersion') | |
1459 @DocsEditable() | |
1460 int get newVersion => | |
1461 _blink.BlinkIDBVersionChangeEvent.instance.newVersion_Getter_(this); | |
1462 | |
1463 @DomName('IDBVersionChangeEvent.oldVersion') | |
1464 @DocsEditable() | |
1465 int get oldVersion => | |
1466 _blink.BlinkIDBVersionChangeEvent.instance.oldVersion_Getter_(this); | |
1467 } | |
OLD | NEW |