blob: f5c6e55c690eb344862e701602b7a67d135355f0 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview 'settings-cups-printers' is a component for showing CUPS
* Printer settings subpage (chrome://settings/cupsPrinters). It is used to
* set up legacy & non-CloudPrint printers on ChromeOS by leveraging CUPS (the
* unix printing system) and the many open source drivers built for CUPS.
*/
// TODO(xdai): Rename it to 'settings-cups-printers-page'.
Polymer({
is: 'settings-cups-printers',
behaviors: [WebUIListenerBehavior],
properties: {
/** @type {!Array<!CupsPrinterInfo>} */
printers: {
type: Array,
notify: true,
},
/** @type {?CupsPrinterInfo} */
activePrinter: {
type: Object,
notify: true,
},
searchTerm: {
type: String,
},
/** @private */
canAddPrinter_: Boolean,
/** @private */
showCupsEditPrinterDialog_: Boolean,
},
listeners: {
'edit-cups-printer-details': 'onShowCupsEditPrinterDialog_',
},
/**
* @type {function()}
* @private
*/
networksChangedListener_: function() {},
/** @override */
ready: function() {
this.updateCupsPrintersList_();
this.refreshNetworks_();
},
/** @override */
attached: function() {
this.addWebUIListener('on-add-cups-printer', this.onAddPrinter_.bind(this));
this.networksChangedListener_ = this.refreshNetworks_.bind(this);
chrome.networkingPrivate.onNetworksChanged.addListener(
this.networksChangedListener_);
},
/** @override */
detached: function() {
chrome.networkingPrivate.onNetworksChanged.removeListener(
this.networksChangedListener_);
},
/**
* Callback function when networks change.
* @private
*/
refreshNetworks_: function() {
chrome.networkingPrivate.getNetworks(
{
'networkType': chrome.networkingPrivate.NetworkType.ALL,
'configured': true
},
this.onNetworksReceived_.bind(this));
},
/**
* Callback function when configured networks are received.
* @param {!Array<!chrome.networkingPrivate.NetworkStateProperties>} states
* A list of network state information for each network.
* @private
*/
onNetworksReceived_: function(states) {
this.canAddPrinter_ = states.some(function(entry) {
return entry.hasOwnProperty('ConnectionState') &&
entry.ConnectionState == 'Connected';
});
},
/**
* @param {PrinterSetupResult} result_code
* @param {string} printerName
* @private
*/
onAddPrinter_: function(result_code, printerName) {
let message;
if (result_code == PrinterSetupResult.SUCCESS) {
this.updateCupsPrintersList_();
message = this.$.addPrinterDoneMessage;
message.textContent =
loadTimeData.getStringF('printerAddedSuccessfulMessage', printerName);
} else {
message = this.$.addPrinterErrorMessage;
const messageText = this.$.addPrinterFailedMessage;
switch (result_code) {
case PrinterSetupResult.FATAL_ERROR:
messageText.textContent =
loadTimeData.getString('printerAddedFatalErrorMessage');
break;
case PrinterSetupResult.PRINTER_UNREACHABLE:
messageText.textContent =
loadTimeData.getString('printerAddedUnreachableMessage');
break;
case PrinterSetupResult.DBUS_ERROR:
// Simply display a generic error message as this error should only
// occur when a call to Dbus fails which isn't meaningful to the user.
messageText.textContent =
loadTimeData.getString('printerAddedFailedmMessage');
break;
case PrinterSetupResult.PPD_TOO_LARGE:
messageText.textContent =
loadTimeData.getString('printerAddedPpdTooLargeMessage');
break;
case PrinterSetupResult.INVALID_PPD:
messageText.textContent =
loadTimeData.getString('printerAddedInvalidPpdMessage');
break;
case PrinterSetupResult.PPD_NOT_FOUND:
messageText.textContent =
loadTimeData.getString('printerAddedPpdNotFoundMessage');
break;
case PrinterSetupResult.PPD_UNRETRIEVABLE:
messageText.textContent =
loadTimeData.getString('printerAddedPpdUnretrievableMessage');
break;
}
}
message.hidden = false;
window.setTimeout(function() {
message.hidden = true;
}, 3000);
},
/** @private */
updateCupsPrintersList_: function() {
settings.CupsPrintersBrowserProxyImpl.getInstance()
.getCupsPrintersList()
.then(this.printersChanged_.bind(this));
},
/**
* @param {!CupsPrintersList} cupsPrintersList
* @private
*/
printersChanged_: function(cupsPrintersList) {
this.printers = cupsPrintersList.printerList;
},
/** @private */
onAddPrinterTap_: function() {
this.$.addPrinterDialog.open();
this.$.addPrinterErrorMessage.hidden = true;
},
/** @private */
onAddPrinterDialogClose_: function() {
cr.ui.focusWithoutInk(assert(this.$$('#addPrinter')));
},
/** @private */
onShowCupsEditPrinterDialog_: function() {
this.showCupsEditPrinterDialog_ = true;
this.async(function() {
const dialog = this.$$('settings-cups-edit-printer-dialog');
dialog.addEventListener('close', function() {
this.showCupsEditPrinterDialog_ = false;
}.bind(this));
});
},
});