Index: chrome/browser/resources/print_preview/data/destination_store.js |
diff --git a/chrome/browser/resources/print_preview/data/destination_store.js b/chrome/browser/resources/print_preview/data/destination_store.js |
index 06d227b451664f8f349d528cfc1f28cfe68d9a98..27769ccc3d99d47cb72ed58e9edec34801dac7f1 100644 |
--- a/chrome/browser/resources/print_preview/data/destination_store.js |
+++ b/chrome/browser/resources/print_preview/data/destination_store.js |
@@ -69,24 +69,8 @@ cr.define('print_preview', function() { |
this.selectedDestination_ = null; |
/** |
- * Initial destination ID used to auto-select the first inserted destination |
- * that matches. If {@code null}, the first destination inserted into the |
- * store will be selected. |
- * @type {?string} |
- * @private |
- */ |
- this.initialDestinationId_ = null; |
- |
- /** |
- * Initial origin used to auto-select destination. |
- * @type {print_preview.Destination.Origin} |
- * @private |
- */ |
- this.initialDestinationOrigin_ = print_preview.Destination.Origin.LOCAL; |
- |
- /** |
* Whether the destination store will auto select the destination that |
- * matches the initial destination. |
+ * matches the last used destination stored in appState_. |
* @type {boolean} |
* @private |
*/ |
@@ -107,12 +91,12 @@ cr.define('print_preview', function() { |
this.cloudPrintInterface_ = null; |
/** |
- * Whether the destination store has already loaded or is loading all cloud |
- * destinations. |
- * @type {boolean} |
+ * Maps user account to the list of origins for which destinations are |
+ * already loaded. |
+ * @type {!Object.<string, Array.<print_preview.Destination.Origin>>} |
* @private |
*/ |
- this.hasLoadedAllCloudDestinations_ = false; |
+ this.loadedCloudOrigins_ = {}; |
/** |
* ID of a timeout after the initial destination ID is set. If no inserted |
@@ -242,11 +226,19 @@ cr.define('print_preview', function() { |
__proto__: cr.EventTarget.prototype, |
/** |
- * @return {!Array.<!print_preview.Destination>} List of destinations in |
- * the store. |
+ * @param {string=} opt_account Account to filter destinations by. When |
+ * omitted, all destinations are returned. |
+ * @return {!Array.<!print_preview.Destination>} List of destinations |
+ * accessible by the {@code account}. |
*/ |
- get destinations() { |
- return this.destinations_.slice(0); |
+ destinations: function(opt_account) { |
+ if (opt_account) { |
+ return this.destinations_.filter(function(destination) { |
+ return !destination.account || destination.account == opt_account; |
+ }); |
+ } else { |
+ return this.destinations_.slice(0); |
+ } |
}, |
/** |
@@ -281,33 +273,32 @@ cr.define('print_preview', function() { |
* @private |
*/ |
init: function() { |
- if (this.appState_.selectedDestinationId && |
- this.appState_.selectedDestinationOrigin) { |
- this.initialDestinationId_ = this.appState_.selectedDestinationId; |
- this.initialDestinationOrigin_ = |
- this.appState_.selectedDestinationOrigin; |
- } |
this.isInAutoSelectMode_ = true; |
- if (!this.initialDestinationId_ || !this.initialDestinationOrigin_) { |
+ if (!this.appState_.selectedDestinationId || |
+ !this.appState_.selectedDestinationOrigin) { |
this.onAutoSelectFailed_(); |
} else { |
- var key = this.getDestinationKey_(this.initialDestinationOrigin_, |
- this.initialDestinationId_); |
+ var key = this.getDestinationKey_( |
+ this.appState_.selectedDestinationOrigin, |
+ this.appState_.selectedDestinationId, |
+ this.appState_.selectedDestinationAccount); |
var candidate = this.destinationMap_[key]; |
if (candidate != null) { |
this.selectDestination(candidate); |
- } else if (this.initialDestinationOrigin_ == |
+ } else if (this.appState_.selectedDestinationOrigin == |
print_preview.Destination.Origin.LOCAL) { |
this.nativeLayer_.startGetLocalDestinationCapabilities( |
- this.initialDestinationId_); |
+ this.appState_.selectedDestinationId); |
} else if (this.cloudPrintInterface_ && |
- (this.initialDestinationOrigin_ == |
- print_preview.Destination.Origin.COOKIES || |
- this.initialDestinationOrigin_ == |
- print_preview.Destination.Origin.DEVICE)) { |
- this.cloudPrintInterface_.printer(this.initialDestinationId_, |
- this.initialDestinationOrigin_); |
- } else if (this.initialDestinationOrigin_ == |
+ (this.appState_.selectedDestinationOrigin == |
+ print_preview.Destination.Origin.COOKIES || |
+ this.appState_.selectedDestinationOrigin == |
+ print_preview.Destination.Origin.DEVICE)) { |
+ this.cloudPrintInterface_.printer( |
+ this.appState_.selectedDestinationId, |
+ this.appState_.selectedDestinationOrigin, |
+ this.appState_.selectedDestinationAccount); |
+ } else if (this.appState_.selectedDestinationOrigin == |
print_preview.Destination.Origin.PRIVET) { |
// TODO(noamsml): Resolve a specific printer instead of listing all |
// privet printers in this case. |
@@ -319,7 +310,7 @@ cr.define('print_preview', function() { |
// destination store. When the real destination is created, this |
// destination will be overwritten. |
this.selectedDestination_ = new print_preview.Destination( |
- this.initialDestinationId_, |
+ this.appState_.selectedDestinationId, |
print_preview.Destination.Type.LOCAL, |
print_preview.Destination.Origin.PRIVET, |
destinationName, |
@@ -352,7 +343,7 @@ cr.define('print_preview', function() { |
this.tracker_.add( |
this.cloudPrintInterface_, |
cloudprint.CloudPrintInterface.EventType.SEARCH_FAILED, |
- this.onCloudPrintSearchFailed_.bind(this)); |
+ this.onCloudPrintSearchDone_.bind(this)); |
this.tracker_.add( |
this.cloudPrintInterface_, |
cloudprint.CloudPrintInterface.EventType.PRINTER_DONE, |
@@ -368,6 +359,7 @@ cr.define('print_preview', function() { |
* loaded. |
*/ |
hasOnlyDefaultCloudDestinations: function() { |
+ // TODO: Move the logic to print_preview. |
return this.destinations_.every(function(dest) { |
return dest.isLocal || |
dest.id == print_preview.Destination.GooglePromotedId.DOCS || |
@@ -377,30 +369,34 @@ cr.define('print_preview', function() { |
/** @param {!print_preview.Destination} Destination to select. */ |
selectDestination: function(destination) { |
- this.selectedDestination_ = destination; |
- this.selectedDestination_.isRecent = true; |
this.isInAutoSelectMode_ = false; |
- if (this.autoSelectTimeout_ != null) { |
- clearTimeout(this.autoSelectTimeout_); |
- this.autoSelectTimeout_ = null; |
+ this.cancelAutoSelectTimeout_(); |
+ if (destination == this.selectedDestination_) { |
+ return; |
+ } |
+ if (destination == null) { |
+ this.selectedDestination_ = null; |
+ cr.dispatchSimpleEvent( |
+ this, DestinationStore.EventType.DESTINATION_SELECT); |
+ return; |
} |
+ // Update and persist selected destination. |
+ this.selectedDestination_ = destination; |
+ this.selectedDestination_.isRecent = true; |
if (destination.id == print_preview.Destination.GooglePromotedId.FEDEX && |
!destination.isTosAccepted) { |
assert(this.cloudPrintInterface_ != null, |
- 'Selected FedEx Office destination, but Google Cloud Print is ' + |
- 'not enabled'); |
+ 'Selected FedEx destination, but GCP API is not available'); |
destination.isTosAccepted = true; |
- this.cloudPrintInterface_.updatePrinterTosAcceptance(destination.id, |
- destination.origin, |
- true); |
+ this.cloudPrintInterface_.updatePrinterTosAcceptance(destination, true); |
} |
this.appState_.persistSelectedDestination(this.selectedDestination_); |
- |
+ // Adjust metrics. |
if (destination.cloudID && |
- this.destinations.some(function(otherDestination) { |
+ this.destinations_.some(function(otherDestination) { |
return otherDestination.cloudID == destination.cloudID && |
otherDestination != destination; |
- })) { |
+ })) { |
if (destination.isPrivet) { |
this.metrics_.incrementDestinationSearchBucket( |
print_preview.Metrics.DestinationSearchBucket. |
@@ -411,9 +407,10 @@ cr.define('print_preview', function() { |
CLOUD_DUPLICATE_SELECTED); |
} |
} |
- |
+ // Notify about selected destination change. |
cr.dispatchSimpleEvent( |
this, DestinationStore.EventType.DESTINATION_SELECT); |
+ // Request destination capabilities, of not known yet. |
if (destination.capabilities == null) { |
if (destination.isPrivet) { |
this.nativeLayer_.startGetPrivetDestinationCapabilities( |
@@ -424,10 +421,9 @@ cr.define('print_preview', function() { |
destination.id); |
} else { |
assert(this.cloudPrintInterface_ != null, |
- 'Selected destination is a cloud destination, but Google ' + |
- 'Cloud Print is not enabled'); |
- this.cloudPrintInterface_.printer(destination.id, |
- destination.origin); |
+ 'Cloud destination selected, but GCP is not enabled'); |
+ this.cloudPrintInterface_.printer( |
+ destination.id, destination.origin, destination.account); |
} |
} else { |
cr.dispatchSimpleEvent( |
@@ -437,78 +433,16 @@ cr.define('print_preview', function() { |
}, |
/** |
- * Inserts a print destination to the data store and dispatches a |
- * DESTINATIONS_INSERTED event. If the destination matches the initial |
- * destination ID, then the destination will be automatically selected. |
- * @param {!print_preview.Destination} destination Print destination to |
- * insert. |
- */ |
- insertDestination: function(destination) { |
- if (this.insertDestination_(destination)) { |
- cr.dispatchSimpleEvent( |
- this, DestinationStore.EventType.DESTINATIONS_INSERTED); |
- if (this.isInAutoSelectMode_ && |
- this.matchInitialDestination_(destination.id, destination.origin)) { |
- this.selectDestination(destination); |
- } |
- } |
- }, |
- |
- /** |
- * Inserts multiple print destinations to the data store and dispatches one |
- * DESTINATIONS_INSERTED event. If any of the destinations match the initial |
- * destination ID, then that destination will be automatically selected. |
- * @param {!Array.<print_preview.Destination>} destinations Print |
- * destinations to insert. |
- */ |
- insertDestinations: function(destinations) { |
- var insertedDestination = false; |
- var destinationToAutoSelect = null; |
- destinations.forEach(function(dest) { |
- if (this.insertDestination_(dest)) { |
- insertedDestination = true; |
- if (this.isInAutoSelectMode_ && |
- destinationToAutoSelect == null && |
- this.matchInitialDestination_(dest.id, dest.origin)) { |
- destinationToAutoSelect = dest; |
- } |
- } |
- }, this); |
- if (insertedDestination) { |
- cr.dispatchSimpleEvent( |
- this, DestinationStore.EventType.DESTINATIONS_INSERTED); |
- } |
- if (destinationToAutoSelect != null) { |
- this.selectDestination(destinationToAutoSelect); |
- } |
- }, |
- |
- /** |
- * Updates an existing print destination with capabilities and display name |
- * information. If the destination doesn't already exist, it will be added. |
- * @param {!print_preview.Destination} destination Destination to update. |
- * @return {!print_preview.Destination} The existing destination that was |
- * updated or {@code null} if it was the new destination. |
+ * Selects 'Save to PDF' destination (since it always exists). |
+ * @private |
*/ |
- updateDestination: function(destination) { |
- assert(destination.constructor !== Array, 'Single printer expected'); |
- var key = this.getDestinationKey_(destination.origin, destination.id); |
- var existingDestination = this.destinationMap_[key]; |
- if (existingDestination != null) { |
- existingDestination.capabilities = destination.capabilities; |
- } else { |
- this.insertDestination(destination); |
- } |
- |
- if (existingDestination == this.selectedDestination_ || |
- destination == this.selectedDestination_) { |
- this.appState_.persistSelectedDestination(this.selectedDestination_); |
- cr.dispatchSimpleEvent( |
- this, |
- DestinationStore.EventType.SELECTED_DESTINATION_CAPABILITIES_READY); |
- } |
- |
- return existingDestination; |
+ selectDefaultDestination_: function() { |
+ var destination = this.destinationMap_[this.getDestinationKey_( |
+ print_preview.Destination.Origin.LOCAL, |
+ print_preview.Destination.GooglePromotedId.SAVE_AS_PDF, |
+ '')] || null; |
+ assert(destination != null, 'Save to PDF printer not found'); |
+ this.selectDestination(destination); |
}, |
/** Initiates loading of local print destinations. */ |
@@ -541,12 +475,27 @@ cr.define('print_preview', function() { |
* for the specified origin only. |
*/ |
startLoadCloudDestinations: function(opt_origin) { |
- if (this.cloudPrintInterface_ != null && |
- !this.hasLoadedAllCloudDestinations_) { |
- this.hasLoadedAllCloudDestinations_ = true; |
- this.cloudPrintInterface_.search(opt_origin); |
+ if (this.cloudPrintInterface_ != null) { |
+ var origins = this.loadedCloudOrigins_[this.userInfo_.activeUser] || []; |
+ if (origins.length == 0 || |
+ (opt_origin && origins.indexOf(opt_origin) < 0)) { |
+ this.cloudPrintInterface_.search( |
+ this.userInfo_.activeUser, opt_origin); |
+ cr.dispatchSimpleEvent( |
+ this, DestinationStore.EventType.DESTINATION_SEARCH_STARTED); |
+ } |
+ } |
+ }, |
+ |
+ /** Requests load of COOKIE based cloud destinations. */ |
+ reloadUserCookieBasedDestinations: function() { |
+ var origins = this.loadedCloudOrigins_[this.userInfo_.activeUser] || []; |
+ if (origins.indexOf(print_preview.Destination.Origin.COOKIES) >= 0) { |
cr.dispatchSimpleEvent( |
- this, DestinationStore.EventType.DESTINATION_SEARCH_STARTED); |
+ this, DestinationStore.EventType.DESTINATION_SEARCH_DONE); |
+ } else { |
+ this.startLoadCloudDestinations( |
+ print_preview.Destination.Origin.COOKIES); |
} |
}, |
@@ -559,6 +508,87 @@ cr.define('print_preview', function() { |
}, |
/** |
+ * Inserts {@code destination} to the data store and dispatches a |
+ * DESTINATIONS_INSERTED event. |
+ * @param {!print_preview.Destination} destination Print destination to |
+ * insert. |
+ * @private |
+ */ |
+ insertDestination_: function(destination) { |
+ if (this.insertIntoStore_(destination)) { |
+ this.destinationsInserted_(destination); |
+ } |
+ }, |
+ |
+ /** |
+ * Inserts multiple {@code destinations} to the data store and dispatches |
+ * single DESTINATIONS_INSERTED event. |
+ * @param {!Array.<print_preview.Destination>} destinations Print |
+ * destinations to insert. |
+ * @private |
+ */ |
+ insertDestinations_: function(destinations) { |
+ var inserted = false; |
+ destinations.forEach(function(destination) { |
+ inserted = this.insertIntoStore_(destination) || inserted; |
+ }, this); |
+ if (inserted) { |
+ this.destinationsInserted_(); |
+ } |
+ }, |
+ |
+ /** |
+ * Dispatches DESTINATIONS_INSERTED event. In auto select mode, tries to |
+ * update selected destination to match {@code appState_} settings. |
+ * @param {print_preview.Destination=} opt_destination The only destination |
+ * that was changed or skipped if possibly more than one destination was |
+ * changed. Used as a hint to limit destination search scope in |
+ * {@code isInAutoSelectMode_). |
+ */ |
+ destinationsInserted_: function(opt_destination) { |
+ cr.dispatchSimpleEvent( |
+ this, DestinationStore.EventType.DESTINATIONS_INSERTED); |
+ if (this.isInAutoSelectMode_) { |
+ var destinationsToSearch = |
+ opt_destination && [opt_destination] || this.destinations_; |
+ destinationsToSearch.some(function(destination) { |
+ if (this.matchPersistedDestination_(destination)) { |
+ this.selectDestination(destination); |
+ return true; |
+ } |
+ }, this); |
+ } |
+ }, |
+ |
+ /** |
+ * Updates an existing print destination with capabilities and display name |
+ * information. If the destination doesn't already exist, it will be added. |
+ * @param {!print_preview.Destination} destination Destination to update. |
+ * @return {!print_preview.Destination} The existing destination that was |
+ * updated or {@code null} if it was the new destination. |
+ * @private |
+ */ |
+ updateDestination_: function(destination) { |
+ assert(destination.constructor !== Array, 'Single printer expected'); |
+ var existingDestination = this.destinationMap_[this.getKey_(destination)]; |
+ if (existingDestination != null) { |
+ existingDestination.capabilities = destination.capabilities; |
+ } else { |
+ this.insertDestination_(destination); |
+ } |
+ |
+ if (existingDestination == this.selectedDestination_ || |
+ destination == this.selectedDestination_) { |
+ this.appState_.persistSelectedDestination(this.selectedDestination_); |
+ cr.dispatchSimpleEvent( |
+ this, |
+ DestinationStore.EventType.SELECTED_DESTINATION_CAPABILITIES_READY); |
+ } |
+ |
+ return existingDestination; |
+ }, |
+ |
+ /** |
* Called when the search for Privet printers is done. |
* @private |
*/ |
@@ -576,8 +606,8 @@ cr.define('print_preview', function() { |
* store. |
* @private |
*/ |
- insertDestination_: function(destination) { |
- var key = this.getDestinationKey_(destination.origin, destination.id); |
+ insertIntoStore_: function(destination) { |
+ var key = this.getKey_(destination); |
var existingDestination = this.destinationMap_[key]; |
if (existingDestination == null) { |
this.destinations_.push(destination); |
@@ -623,10 +653,6 @@ cr.define('print_preview', function() { |
this.nativeLayer_, |
print_preview.NativeLayer.EventType.PRIVET_CAPABILITIES_SET, |
this.onPrivetCapabilitiesSet_.bind(this)); |
- this.tracker_.add( |
- this.userInfo_, |
- print_preview.UserInfo.EventType.ACTIVE_USER_CHANGED, |
- this.onActiveUserChanged_.bind(this)); |
}, |
/** |
@@ -636,57 +662,34 @@ cr.define('print_preview', function() { |
reset_: function() { |
this.destinations_ = []; |
this.destinationMap_ = {}; |
- this.selectedDestination_ = null; |
- this.hasLoadedAllCloudDestinations_ = false; |
+ this.selectDestination(null); |
+ this.loadedCloudOrigins_ = {}; |
this.hasLoadedAllLocalDestinations_ = false; |
- this.insertDestination( |
+ this.insertDestination_( |
DestinationStore.createLocalPdfPrintDestination_()); |
this.resetAutoSelectTimeout_(); |
}, |
/** |
- * Resets the state of the destination store to its initial state. |
- * @private |
- */ |
- resetCookiesDestinations_: function() { |
- // Forget all cookies based destinations. |
- this.destinations_ = this.destinations_.filter(function(destination) { |
- if (destination.origin == print_preview.Destination.Origin.COOKIES) { |
- delete this.destinationMap_[ |
- this.getDestinationKey_(destination.origin, destination.id)]; |
- return false; |
- } |
- return true; |
- }, this); |
- // Reset selected destination, if necessary. |
- if (this.selectedDestination_ && |
- this.selectedDestination_.origin == |
- print_preview.Destination.Origin.COOKIES) { |
- this.selectedDestination_ = null; |
- } |
- this.hasLoadedAllCloudDestinations_ = false; |
- this.resetAutoSelectTimeout_(); |
- }, |
- |
- /** |
* Resets destination auto selection timeout. |
* @private |
*/ |
resetAutoSelectTimeout_: function() { |
+ this.cancelAutoSelectTimeout_(); |
this.autoSelectTimeout_ = |
setTimeout(this.onAutoSelectFailed_.bind(this), |
DestinationStore.AUTO_SELECT_TIMEOUT_); |
}, |
/** |
- * Called when active user changes. Resets cookie based destinations |
- * and starts loading cloud destinations for the active user. |
+ * Cancels destination auto selection timeout. |
* @private |
*/ |
- onActiveUserChanged_: function() { |
- this.resetCookiesDestinations_(); |
- this.isInAutoSelectMode_ = true; |
- this.startLoadCloudDestinations(print_preview.Destination.Origin.COOKIES); |
+ cancelAutoSelectTimeout_: function() { |
+ if (this.autoSelectTimeout_ != null) { |
+ clearTimeout(this.autoSelectTimeout_); |
+ this.autoSelectTimeout_ = null; |
+ } |
}, |
/** |
@@ -698,7 +701,7 @@ cr.define('print_preview', function() { |
var localDestinations = event.destinationInfos.map(function(destInfo) { |
return print_preview.LocalDestinationParser.parse(destInfo); |
}); |
- this.insertDestinations(localDestinations); |
+ this.insertDestinations_(localDestinations); |
this.isLocalDestinationSearchInProgress_ = false; |
cr.dispatchSimpleEvent( |
this, DestinationStore.EventType.DESTINATION_SEARCH_DONE); |
@@ -715,9 +718,10 @@ cr.define('print_preview', function() { |
*/ |
onLocalDestinationCapabilitiesSet_: function(event) { |
var destinationId = event.settingsInfo['printerId']; |
- var key = |
- this.getDestinationKey_(print_preview.Destination.Origin.LOCAL, |
- destinationId); |
+ var key = this.getDestinationKey_( |
+ print_preview.Destination.Origin.LOCAL, |
+ destinationId, |
+ ''); |
var destination = this.destinationMap_[key]; |
var capabilities = print_preview.LocalCapabilitiesParser.parse( |
event.settingsInfo); |
@@ -735,7 +739,7 @@ cr.define('print_preview', function() { |
destination = print_preview.LocalDestinationParser.parse( |
{deviceName: destinationId, printerName: destinationId}); |
destination.capabilities = capabilities; |
- this.insertDestination(destination); |
+ this.insertDestination_(destination); |
} |
if (this.selectedDestination_ && |
this.selectedDestination_.id == destinationId) { |
@@ -756,33 +760,28 @@ cr.define('print_preview', function() { |
console.error('Failed to get print capabilities for printer ' + |
event.destinationId); |
if (this.isInAutoSelectMode_ && |
- this.matchInitialDestinationStrict_(event.destinationId, |
- event.destinationOrigin)) { |
- assert(this.destinations_.length > 0, |
- 'No destinations were loaded when failed to get initial ' + |
- 'destination'); |
- this.selectDestination(this.destinations_[0]); |
+ this.sameAsPersistedDestination_(event.destinationId, |
+ event.destinationOrigin)) { |
+ this.selectDefaultDestination_(); |
} |
}, |
/** |
- * Called when the /search call completes. Adds the fetched destinations to |
- * the destination store. |
- * @param {Event} event Contains the fetched destinations. |
+ * Called when the /search call completes, either successfully or not. |
+ * In case of success, stores fetched destinations. |
+ * @param {Event} event Contains the request result. |
* @private |
*/ |
onCloudPrintSearchDone_: function(event) { |
- this.insertDestinations(event.printers); |
- cr.dispatchSimpleEvent( |
- this, DestinationStore.EventType.DESTINATION_SEARCH_DONE); |
- }, |
- |
- /** |
- * Called when the /search call fails. Updates outstanding request count and |
- * dispatches CLOUD_DESTINATIONS_LOADED event. |
- * @private |
- */ |
- onCloudPrintSearchFailed_: function() { |
+ if (event.printers) { |
+ this.insertDestinations_(event.printers); |
+ } |
+ if (event.searchDone) { |
+ var origins = this.loadedCloudOrigins_[event.user] || []; |
+ if (origins.indexOf(event.origin) < 0) { |
+ this.loadedCloudOrigins_[event.user] = origins.concat([event.origin]); |
+ } |
+ } |
cr.dispatchSimpleEvent( |
this, DestinationStore.EventType.DESTINATION_SEARCH_DONE); |
}, |
@@ -795,7 +794,7 @@ cr.define('print_preview', function() { |
* @private |
*/ |
onCloudPrintPrinterDone_: function(event) { |
- this.updateDestination(event.printer); |
+ this.updateDestination_(event.printer); |
}, |
/** |
@@ -808,13 +807,11 @@ cr.define('print_preview', function() { |
*/ |
onCloudPrintPrinterFailed_: function(event) { |
if (this.isInAutoSelectMode_ && |
- this.matchInitialDestinationStrict_(event.destinationId, |
- event.destinationOrigin)) { |
- console.error('Could not find initial printer: ' + event.destinationId); |
- assert(this.destinations_.length > 0, |
- 'No destinations were loaded when failed to get initial ' + |
- 'destination'); |
- this.selectDestination(this.destinations_[0]); |
+ this.sameAsPersistedDestination_(event.destinationId, |
+ event.destinationOrigin)) { |
+ console.error( |
+ 'Failed to fetch last used printer caps: ' + event.destinationId); |
+ this.selectDefaultDestination_(); |
} |
}, |
@@ -829,7 +826,7 @@ cr.define('print_preview', function() { |
this.waitForRegisterDestination_ = null; |
this.onDestinationsReload_(); |
} else { |
- this.insertDestinations( |
+ this.insertDestinations_( |
print_preview.PrivetDestinationParser.parse(event.printer)); |
} |
}, |
@@ -845,7 +842,7 @@ cr.define('print_preview', function() { |
print_preview.PrivetDestinationParser.parse(event.printer); |
destinations.forEach(function(dest) { |
dest.capabilities = event.capabilities; |
- this.updateDestination(dest); |
+ this.updateDestination_(dest); |
}, this); |
}, |
@@ -867,10 +864,8 @@ cr.define('print_preview', function() { |
* @private |
*/ |
onAutoSelectFailed_: function() { |
- this.autoSelectTimeout_ = null; |
- assert(this.destinations_.length > 0, |
- 'No destinations were loaded before auto-select timeout expired'); |
- this.selectDestination(this.destinations_[0]); |
+ this.cancelAutoSelectTimeout_(); |
+ this.selectDefaultDestination_(); |
}, |
// TODO(vitalybuka): Remove three next functions replacing Destination.id |
@@ -878,23 +873,35 @@ cr.define('print_preview', function() { |
/** |
* Returns key to be used with {@code destinationMap_}. |
* @param {!print_preview.Destination.Origin} origin Destination origin. |
- * @return {!string} id Destination id. |
+ * @return {string} id Destination id. |
+ * @return {string} account User account destination is registered for. |
* @private |
*/ |
- getDestinationKey_: function(origin, id) { |
- return origin + '/' + id; |
+ getDestinationKey_: function(origin, id, account) { |
+ return origin + '/' + id + '/' + account; |
}, |
/** |
- * @param {?string} id Id of the destination. |
- * @param {?string} origin Oring of the destination. |
- * @return {boolean} Whether a initial destination matches provided. |
+ * Returns key to be used with {@code destinationMap_}. |
+ * @param {!print_preview.Destination} destination Destination. |
+ * @private |
+ */ |
+ getKey_: function(destination) { |
+ return this.getDestinationKey_( |
+ destination.origin, destination.id, destination.account); |
+ }, |
+ |
+ /** |
+ * @param {!print_preview.Destination} destination Destination to match. |
+ * @return {boolean} Whether {@code destination} matches the last user |
+ * selected one. |
* @private |
*/ |
- matchInitialDestination_: function(id, origin) { |
- return this.initialDestinationId_ == null || |
- this.initialDestinationOrigin_ == null || |
- this.matchInitialDestinationStrict_(id, origin); |
+ matchPersistedDestination_: function(destination) { |
+ return !this.appState_.selectedDestinationId || |
+ !this.appState_.selectedDestinationOrigin || |
+ this.sameAsPersistedDestination_( |
+ destination.id, destination.origin); |
}, |
/** |
@@ -903,9 +910,9 @@ cr.define('print_preview', function() { |
* @return {boolean} Whether destination is the same as initial. |
* @private |
*/ |
- matchInitialDestinationStrict_: function(id, origin) { |
- return id == this.initialDestinationId_ && |
- origin == this.initialDestinationOrigin_; |
+ sameAsPersistedDestination_: function(id, origin) { |
+ return id == this.appState_.selectedDestinationId && |
+ origin == this.appState_.selectedDestinationOrigin; |
} |
}; |