Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 cr.define('print_preview', function() { | 5 cr.define('print_preview', function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 /** | 8 /** |
| 9 * A data store that stores destinations and dispatches events when the data | 9 * A data store that stores destinations and dispatches events when the data |
| 10 * store changes. | 10 * store changes. |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 24 this.nativeLayer_ = nativeLayer; | 24 this.nativeLayer_ = nativeLayer; |
| 25 | 25 |
| 26 /** | 26 /** |
| 27 * Internal backing store for the data store. | 27 * Internal backing store for the data store. |
| 28 * @type {!Array.<!print_preview.Destination>} | 28 * @type {!Array.<!print_preview.Destination>} |
| 29 * @private | 29 * @private |
| 30 */ | 30 */ |
| 31 this.destinations_ = []; | 31 this.destinations_ = []; |
| 32 | 32 |
| 33 /** | 33 /** |
| 34 * Cache used for constant lookup of printers. | 34 * Cache used for constant lookup of destinations. |
| 35 * @type {object.<string, !print_preview.Destination>} | 35 * @type {object.<string, !print_preview.Destination>} |
| 36 * @private | 36 * @private |
| 37 */ | 37 */ |
| 38 this.destinationMap_ = {}; | 38 this.destinationMap_ = {}; |
| 39 | 39 |
| 40 /** | 40 /** |
| 41 * Currently selected destination. | 41 * Currently selected destination. |
| 42 * @type {print_preview.Destination} | 42 * @type {print_preview.Destination} |
| 43 * @private | 43 * @private |
| 44 */ | 44 */ |
| 45 this.selectedDestination_ = null; | 45 this.selectedDestination_ = null; |
| 46 | 46 |
| 47 /** | 47 /** |
| 48 * Initial destination ID used to auto-select the first inserted destination | 48 * Initial destination ID used to auto-select the first inserted destination |
| 49 * that matches. If {@code null}, the first destination inserted into the | 49 * that matches. If {@code null}, the first destination inserted into the |
| 50 * store will be selected. | 50 * store will be selected. |
| 51 * @type {?string} | 51 * @type {?string} |
| 52 * @private | 52 * @private |
| 53 */ | 53 */ |
| 54 this.initialDestinationId_ = null; | 54 this.initialDestinationId_ = null; |
| 55 | 55 |
| 56 /** | 56 /** |
| 57 * Whether the initial destination is a local one or not. | |
| 58 * @type {boolean} | |
| 59 * @private | |
| 60 */ | |
| 61 this.isInitialDestinationLocal_ = true; | |
| 62 | |
| 63 /** | |
| 57 * Whether the destination store will auto select the destination that | 64 * Whether the destination store will auto select the destination that |
| 58 * matches the initial destination. | 65 * matches the initial destination. |
| 59 * @type {boolean} | 66 * @type {boolean} |
| 60 * @private | 67 * @private |
| 61 */ | 68 */ |
| 62 this.isInAutoSelectMode_ = false; | 69 this.isInAutoSelectMode_ = false; |
| 63 | 70 |
| 64 /** | 71 /** |
| 65 * Event tracker used to track event listeners of the destination store. | 72 * Event tracker used to track event listeners of the destination store. |
| 66 * @type {!EventTracker} | 73 * @type {!EventTracker} |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 */ | 169 */ |
| 163 get selectedDestination() { | 170 get selectedDestination() { |
| 164 return this.selectedDestination_; | 171 return this.selectedDestination_; |
| 165 }, | 172 }, |
| 166 | 173 |
| 167 /** | 174 /** |
| 168 * Sets the initially selected destination. If any inserted destinations | 175 * Sets the initially selected destination. If any inserted destinations |
| 169 * match this ID, that destination will be automatically selected. This | 176 * match this ID, that destination will be automatically selected. This |
| 170 * occurs only once for every time this setter is called or if the store is | 177 * occurs only once for every time this setter is called or if the store is |
| 171 * cleared. | 178 * cleared. |
| 172 * @param {?string} ID of the destination that should be selected | 179 * @param {?string} initialDestinationId ID of the destination that should |
| 173 * automatically when added to the store or {@code null} if the first | 180 * be selected automatically when added to the store or {@code null} if |
| 174 * destination that is inserted should be selected. | 181 * the first destination that is inserted should be selected. |
| 182 * @param {boolean} isLocalDestination Whether the initial destination is | |
| 183 * local. | |
| 175 */ | 184 */ |
| 176 setInitialDestinationId: function(initialDestinationId) { | 185 setInitialDestinationId: function( |
| 186 initialDestinationId, isLocalDestination) { | |
| 177 this.initialDestinationId_ = initialDestinationId; | 187 this.initialDestinationId_ = initialDestinationId; |
| 188 this.isInitialDestinationLocal_ = isLocalDestination; | |
| 178 this.isInAutoSelectMode_ = true; | 189 this.isInAutoSelectMode_ = true; |
| 179 if (this.initialDestinationId_ == null) { | 190 if (this.initialDestinationId_ == null) { |
| 180 assert(this.destinations_.length > 0, | 191 assert(this.destinations_.length > 0, |
| 181 'No destinations available to select'); | 192 'No destinations available to select'); |
| 182 this.selectDestination(this.destinations_[0]); | 193 this.selectDestination(this.destinations_[0]); |
| 183 } else { | 194 } else { |
| 184 var candidate = this.destinationMap_[this.initialDestinationId_]; | 195 var candidate = this.destinationMap_[this.initialDestinationId_]; |
| 185 if (candidate != null) { | 196 if (candidate != null) { |
| 186 this.selectDestination(candidate); | 197 this.selectDestination(candidate); |
| 187 } else { | 198 } else if (!cr.isChromeOS && isLocalDestination) { |
| 188 // Try and fetch the destination | 199 this.nativeLayer_.startGetLocalDestinationCapabilities( |
| 189 // TODO(rltoscano): Since we don't know if the initialDestinationId is | 200 initialDestinationId); |
| 190 // a local printer or a cloud printer, we are going to assume based on | |
| 191 // platform. The C++ layer should be modified to return more | |
| 192 // information about the initially selected printer so this assumption | |
| 193 // does not have to be made. See http://crbug.com/132831. | |
| 194 if (!cr.isChromeOS) { | |
| 195 this.nativeLayer_.startGetLocalDestinationCapabilities( | |
| 196 initialDestinationId); | |
| 197 } | |
| 198 } | 201 } |
| 199 } | 202 } |
| 200 }, | 203 }, |
| 201 | 204 |
| 202 /** | 205 /** |
| 203 * Sets the destination store's Google Cloud Print interface. | 206 * Sets the destination store's Google Cloud Print interface. |
| 204 * @param {!print_preview.CloudPrintInterface} cloudPrintInterface Interface | 207 * @param {!print_preview.CloudPrintInterface} cloudPrintInterface Interface |
| 205 * to set. | 208 * to set. |
| 206 */ | 209 */ |
| 207 setCloudPrintInterface: function(cloudPrintInterface) { | 210 setCloudPrintInterface: function(cloudPrintInterface) { |
| 208 this.cloudPrintInterface_ = cloudPrintInterface; | 211 this.cloudPrintInterface_ = cloudPrintInterface; |
| 209 this.tracker_.add( | 212 this.tracker_.add( |
| 210 this.cloudPrintInterface_, | 213 this.cloudPrintInterface_, |
| 211 cloudprint.CloudPrintInterface.EventType.SEARCH_DONE, | 214 cloudprint.CloudPrintInterface.EventType.SEARCH_DONE, |
| 212 this.onCloudPrintSearchDone_.bind(this)); | 215 this.onCloudPrintSearchDone_.bind(this)); |
| 213 this.tracker_.add( | 216 this.tracker_.add( |
| 214 this.cloudPrintInterface_, | 217 this.cloudPrintInterface_, |
| 215 cloudprint.CloudPrintInterface.EventType.PRINTER_DONE, | 218 cloudprint.CloudPrintInterface.EventType.PRINTER_DONE, |
| 216 this.onCloudPrintPrinterDone_.bind(this)); | 219 this.onCloudPrintPrinterDone_.bind(this)); |
| 220 this.tracker_.add( | |
| 221 this.cloudPrintInterface_, | |
| 222 cloudprint.CloudPrintInterface.EventType.PRINTER_FAILED, | |
| 223 this.onPrinterFailed_.bind(this)); | |
| 224 // Fetch initial destination if its a cloud destination. | |
| 225 if (this.isInAutoSelectMode_ && !this.isInitialDestinationLocal_) { | |
| 226 this.cloudPrintInterface_.printer(this.initialDestinationId_); | |
| 227 } | |
| 217 }, | 228 }, |
| 218 | 229 |
| 219 /** @param {!print_preview.Destination} Destination to select. */ | 230 /** @param {!print_preview.Destination} Destination to select. */ |
| 220 selectDestination: function(destination) { | 231 selectDestination: function(destination) { |
| 221 this.selectedDestination_ = destination; | 232 this.selectedDestination_ = destination; |
| 222 this.selectedDestination_.isRecent = true; | 233 this.selectedDestination_.isRecent = true; |
| 223 this.isInAutoSelectMode_ = false; | 234 this.isInAutoSelectMode_ = false; |
| 224 if (this.autoSelectTimeout_ != null) { | 235 if (this.autoSelectTimeout_ != null) { |
| 225 clearTimeout(this.autoSelectTimeout_); | 236 clearTimeout(this.autoSelectTimeout_); |
| 226 this.autoSelectTimeout_ = null; | 237 this.autoSelectTimeout_ = null; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 371 this.tracker_.add( | 382 this.tracker_.add( |
| 372 this.nativeLayer_, | 383 this.nativeLayer_, |
| 373 print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET, | 384 print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET, |
| 374 this.onLocalDestinationsSet_.bind(this)); | 385 this.onLocalDestinationsSet_.bind(this)); |
| 375 this.tracker_.add( | 386 this.tracker_.add( |
| 376 this.nativeLayer_, | 387 this.nativeLayer_, |
| 377 print_preview.NativeLayer.EventType.CAPABILITIES_SET, | 388 print_preview.NativeLayer.EventType.CAPABILITIES_SET, |
| 378 this.onLocalDestinationCapabilitiesSet_.bind(this)); | 389 this.onLocalDestinationCapabilitiesSet_.bind(this)); |
| 379 this.tracker_.add( | 390 this.tracker_.add( |
| 380 this.nativeLayer_, | 391 this.nativeLayer_, |
| 392 print_preview.NativeLayer.EventType.GET_CAPABILITIES_FAIL, | |
| 393 this.onGetCapabilitiesFail_.bind(this)); | |
| 394 this.tracker_.add( | |
| 395 this.nativeLayer_, | |
| 381 print_preview.NativeLayer.EventType.DESTINATIONS_RELOAD, | 396 print_preview.NativeLayer.EventType.DESTINATIONS_RELOAD, |
| 382 this.onDestinationsReload_.bind(this)); | 397 this.onDestinationsReload_.bind(this)); |
| 383 }, | 398 }, |
| 384 | 399 |
| 385 /** | 400 /** |
| 386 * Resets the state of the destination store to its initial state. | 401 * Resets the state of the destination store to its initial state. |
| 387 * @private | 402 * @private |
| 388 */ | 403 */ |
| 389 reset_: function() { | 404 reset_: function() { |
| 390 this.destinations_ = []; | 405 this.destinations_ = []; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 437 // the same as "printerName". We should include the "printerName" in the | 452 // the same as "printerName". We should include the "printerName" in the |
| 438 // response. See http://crbug.com/132831. | 453 // response. See http://crbug.com/132831. |
| 439 destination = print_preview.LocalDestinationParser.parse( | 454 destination = print_preview.LocalDestinationParser.parse( |
| 440 {deviceName: destinationId, printerName: destinationId}); | 455 {deviceName: destinationId, printerName: destinationId}); |
| 441 destination.capabilities = capabilities; | 456 destination.capabilities = capabilities; |
| 442 this.insertDestination(destination); | 457 this.insertDestination(destination); |
| 443 } | 458 } |
| 444 }, | 459 }, |
| 445 | 460 |
| 446 /** | 461 /** |
| 447 * Called when the /search call completes. Adds the fetched printers to the | 462 * Called when a request to get a local destination's print capabilities |
| 448 * destination store. | 463 * fails. TODO(rltoscano) |
|
Albert Bodenhamer
2012/08/24 16:07:26
TODO, what?
Robert Toscano
2012/08/24 17:27:49
Whoops, it was just a TODO to finish writing the J
| |
| 449 * @param {cr.Event} event Contains the fetched printers. | 464 */ |
| 465 onGetCapabilitiesFail_: function(event) { | |
| 466 console.error('Failed to get print capabilities for printer ' + | |
| 467 event.destinationId); | |
| 468 if (this.isInAutoSelectMode_ && | |
| 469 this.initialDestinationId_ == event.destinationId) { | |
| 470 assert(this.destinations_.length > 0, | |
| 471 'No destinations were loaded when failed to get initial ' + | |
| 472 'destination'); | |
| 473 this.selectDestination(this.destinations_[0]); | |
| 474 } | |
| 475 }, | |
| 476 | |
| 477 /** | |
| 478 * Called when the /search call completes. Adds the fetched destinations to | |
| 479 * the destination store. | |
| 480 * @param {cr.Event} event Contains the fetched destinations. | |
| 450 * @private | 481 * @private |
| 451 */ | 482 */ |
| 452 onCloudPrintSearchDone_: function(event) { | 483 onCloudPrintSearchDone_: function(event) { |
| 453 this.insertDestinations(event.printers); | 484 this.insertDestinations(event.printers); |
| 454 }, | 485 }, |
| 455 | 486 |
| 456 /** | 487 /** |
| 457 * Called when /printer call completes. Updates the specified destination's | 488 * Called when /printer call completes. Updates the specified destination's |
| 458 * print capabilities. | 489 * print capabilities. |
| 459 * @param {cr.Event} event Contains detailed information about the | 490 * @param {cr.Event} event Contains detailed information about the |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 485 /** | 516 /** |
| 486 * Called when no destination was auto-selected after some timeout. Selects | 517 * Called when no destination was auto-selected after some timeout. Selects |
| 487 * the first destination in store. | 518 * the first destination in store. |
| 488 * @private | 519 * @private |
| 489 */ | 520 */ |
| 490 onAutoSelectTimeoutExpired_: function() { | 521 onAutoSelectTimeoutExpired_: function() { |
| 491 this.autoSelectTimeout_ = null; | 522 this.autoSelectTimeout_ = null; |
| 492 assert(this.destinations_.length > 0, | 523 assert(this.destinations_.length > 0, |
| 493 'No destinations were loaded before auto-select timeout expired'); | 524 'No destinations were loaded before auto-select timeout expired'); |
| 494 this.selectDestination(this.destinations_[0]); | 525 this.selectDestination(this.destinations_[0]); |
| 526 }, | |
| 527 | |
| 528 /** | |
| 529 * Called when the Google Cloud Print interface fails to lookup a | |
| 530 * destination. Selects another destination if the failed destination was | |
| 531 * the initial destination. | |
| 532 * @param {object} event Contains the ID of the destination that was failed | |
| 533 * to be looked up. | |
| 534 * @private | |
| 535 */ | |
| 536 onPrinterFailed_: function(event) { | |
| 537 if (event.errorCode == '111' && | |
| 538 this.isInAutoSelectMode_ && | |
| 539 this.initialDestinationId_ == event.destinationId) { | |
| 540 console.error('Could not find initial printer: ' + event.destinationId); | |
| 541 assert(this.destinations_.length > 0, | |
| 542 'No destinations were loaded when failed to get initial ' + | |
| 543 'destination'); | |
| 544 this.selectDestination(this.destinations_[0]); | |
| 545 } | |
| 495 } | 546 } |
| 496 }; | 547 }; |
| 497 | 548 |
| 498 // Export | 549 // Export |
| 499 return { | 550 return { |
| 500 DestinationStore: DestinationStore | 551 DestinationStore: DestinationStore |
| 501 }; | 552 }; |
| 502 }); | 553 }); |
| OLD | NEW |