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 |