Commit 907173a1 authored by Daniel Hosseinian's avatar Daniel Hosseinian Committed by Commit Bot

Print Preview: Show enterprise badging when destinations are managed

When destinations are managed in print preview (through the anticipated
PrinterTypeDenyList policy) , the menu will look differently than
expected. For instance, a user may expect the 'Save as PDF' option to
appear even when it is disallowed by the administrator. The badging may
elucidate correct abnormal behavior.

Bug: 487875
Change-Id: I6d8bd29663673b41f3644940df6dd0b049d25855
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1918011
Commit-Queue: Daniel Hosseinian <dhoss@chromium.org>
Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#716334}
parent 72c45dc9
......@@ -462,7 +462,7 @@ Polymer({
},
},
controlsManaged: {
settingsManaged: {
type: Boolean,
notify: true,
value: false,
......@@ -1153,7 +1153,7 @@ Polymer({
managedSettings = managedSettings.concat(
['color', 'cssBackground', 'duplex', 'duplexShortEdge', 'pin']);
// </if>
this.controlsManaged = managedSettings.some(settingName => {
this.settingsManaged = managedSettings.some(settingName => {
const setting = this.getSetting(settingName);
return setting.available && setting.setByPolicy;
});
......
......@@ -55,6 +55,7 @@ export let LocalDestinationInfo;
* serializedAppStateStr: ?string,
* serializedDefaultDestinationSelectionRulesStr: ?string,
* pdfPrinterDisabled: boolean,
* destinationsManaged: boolean,
* cloudPrintURL: (string | undefined),
* userAccounts: (Array<string> | undefined),
* syncAvailable: boolean
......
......@@ -25,7 +25,7 @@
<print-preview-state id="state" state="{{state}}" error="{{error_}}">
</print-preview-state>
<print-preview-model id="model" settings="{{settings}}"
controls-managed="{{controlsManaged_}}" destination="[[destination_]]"
settings-managed="{{settingsManaged_}}" destination="[[destination_]]"
document-settings="[[documentSettings_]]"
margins="[[margins_]]" page-size="[[pageSize_]]"
on-preview-setting-changed="onPreviewSettingChanged_"
......
......@@ -56,11 +56,21 @@ Polymer({
cloudPrintInterface_: Object,
/** @private {boolean} */
controlsManaged_: Boolean,
controlsManaged_: {
type: Boolean,
computed: 'computeControlsManaged_(destinationsManaged_, ' +
'settingsManaged_)',
},
/** @private {Destination} */
destination_: Object,
/** @private {boolean} */
destinationsManaged_: {
type: Boolean,
value: false,
},
/** @private {!DestinationState} */
destinationState_: {
type: Number,
......@@ -88,6 +98,12 @@ Polymer({
/** @private {!PrintableArea} */
printableArea_: Object,
/** @private {boolean} */
settingsManaged_: {
type: Boolean,
value: false,
},
/** @private {?MeasurementSystem} */
measurementSystem_: {
type: Object,
......@@ -303,6 +319,7 @@ Polymer({
settings.serializedDefaultDestinationSelectionRulesStr,
settings.userAccounts || null, settings.syncAvailable,
settings.pdfPrinterDisabled);
this.destinationsManaged_ = settings.destinationsManaged;
this.isInKioskAutoPrintMode_ = settings.isInKioskAutoPrintMode;
// This is only visible in the task manager.
......@@ -335,6 +352,15 @@ Polymer({
this.onCloudPrintError_.bind(this, appKioskMode));
},
/**
* @return {boolean} Whether any of the print preview settings or destinations
* are managed.
* @private
*/
computeControlsManaged_: function() {
return this.destinationsManaged_ || this.settingsManaged_;
},
/** @private */
onDestinationStateChange_: function() {
switch (this.destinationState_) {
......
......@@ -251,6 +251,10 @@ const char kIsHeaderFooterManaged[] = "isHeaderFooterManaged";
// Name of a dictionary field indicating whether the 'Save to PDF' destination
// is disabled.
const char kPdfPrinterDisabled[] = "pdfPrinterDisabled";
// TODO(dhoss): Change this comment when the policy name is changed.
// Name of a dictionary field indicating whether the destinations are managed by
// the PrinterTypeBlacklist enterprise policy.
const char kDestinationsManaged[] = "destinationsManaged";
// Name of a dictionary field holding the cloud print URL.
const char kCloudPrintURL[] = "cloudPrintURL";
// Name of a dictionary field holding the signed in user accounts.
......@@ -1083,6 +1087,11 @@ void PrintPreviewHandler::SendInitialSettings(
kPdfPrinterDisabled,
base::Contains(printer_type_blacklist_, kPdfPrinter));
const bool destinationsManaged =
!printer_type_blacklist_.empty() &&
prefs->IsManagedPreference(prefs::kPrinterTypeBlacklist);
initial_settings.SetBoolKey(kDestinationsManaged, destinationsManaged);
base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
initial_settings.SetBoolKey(kIsInKioskAutoPrintMode,
cmdline->HasSwitch(switches::kKioskModePrinting));
......
......@@ -416,6 +416,8 @@ class PrintPreviewHandlerTest : public testing::Test {
ASSERT_TRUE(settings->FindKeyOfType("pdfPrinterDisabled",
base::Value::Type::BOOLEAN));
ASSERT_TRUE(settings->FindKeyOfType("destinationsManaged",
base::Value::Type::BOOLEAN));
ASSERT_TRUE(
settings->FindKeyOfType("cloudPrintURL", base::Value::Type::STRING));
ASSERT_TRUE(
......
......@@ -106,7 +106,7 @@ suite('ModelSettingsPolicyTest', function() {
assertEquals(subtestParams.expectedValue, model.getSettingValue('color'));
assertEquals(
subtestParams.expectedAvailable, model.settings.color.available);
assertEquals(subtestParams.expectedManaged, model.controlsManaged);
assertEquals(subtestParams.expectedManaged, model.settingsManaged);
assertEquals(
subtestParams.expectedEnforced, model.settings.color.setByPolicy);
});
......@@ -213,7 +213,7 @@ suite('ModelSettingsPolicyTest', function() {
subtestParams.expectedValue, model.getSettingValue('duplex'));
assertEquals(
subtestParams.expectedAvailable, model.settings.duplex.available);
assertEquals(subtestParams.expectedManaged, model.controlsManaged);
assertEquals(subtestParams.expectedManaged, model.settingsManaged);
assertEquals(
subtestParams.expectedEnforced, model.settings.duplex.setByPolicy);
assertEquals(
......@@ -318,7 +318,7 @@ suite('ModelSettingsPolicyTest', function() {
assertEquals(subtestParams.expectedValue, model.getSettingValue('pin'));
assertEquals(
subtestParams.expectedAvailable, model.settings.pin.available);
assertEquals(subtestParams.expectedManaged, model.controlsManaged);
assertEquals(subtestParams.expectedManaged, model.settingsManaged);
assertEquals(
subtestParams.expectedEnforced, model.settings.pin.setByPolicy);
});
......@@ -396,7 +396,7 @@ suite('ModelSettingsPolicyTest', function() {
assertEquals(
subtestParams.expectedAvailable,
model.settings.cssBackground.available);
assertEquals(subtestParams.expectedManaged, model.controlsManaged);
assertEquals(subtestParams.expectedManaged, model.settingsManaged);
assertEquals(
subtestParams.expectedEnforced,
model.settings.cssBackground.setByPolicy);
......
......@@ -15,6 +15,8 @@ print_preview_app_test.suiteName = 'PrintPreviewAppTest';
print_preview_app_test.TestNames = {
PrintToGoogleDrive: 'print to google drive',
PrintPresets: 'print presets',
DestinationsManaged: 'destinations managed',
HeaderFooterManaged: 'header footer managed',
};
suite(print_preview_app_test.suiteName, function() {
......@@ -42,36 +44,46 @@ suite(print_preview_app_test.suiteName, function() {
documentHasSelection: false,
shouldPrintSelectionOnly: false,
printerName: 'FooDevice',
isHeaderFooterManaged: false,
serializedAppStateStr: null,
serializedDefaultDestinationSelectionRulesStr: null,
pdfPrinterDisabled: false,
destinationsManaged: false,
cloudPrintURL: 'cloudprint URL',
userAccounts: ['foo@chromium.org'],
};
/**
* Set the native layer initial settings and attach the print preview app to
* the DOM.
* @return {!Promise} Returns a promise that resolves when the 'getPreview'
* method is called by the preview area contained inside the app.
*/
const initialize = () => {
nativeLayer.setInitialSettings(initialSettings);
nativeLayer.setLocalDestinationCapabilities(
getCddTemplate(initialSettings.printerName));
page = document.createElement('print-preview-app');
document.body.appendChild(page);
return nativeLayer.whenCalled('getPreview');
};
/** @override */
setup(function() {
// Stub out the native layer, the cloud print interface, and the plugin.
PolymerTest.clearBody();
nativeLayer = new NativeLayerStub();
NativeLayer.setInstance(nativeLayer);
nativeLayer.setInitialSettings(initialSettings);
nativeLayer.setLocalDestinationCapabilities(
getCddTemplate(initialSettings.printerName));
cloudPrintInterface = new CloudPrintInterfaceStub();
setCloudPrintInterfaceForTesting(cloudPrintInterface);
pluginProxy = new PDFPluginStub();
PluginProxy.setInstance(pluginProxy);
page = document.createElement('print-preview-app');
document.body.appendChild(page);
const previewArea = page.$.previewArea;
return nativeLayer.whenCalled('getPreview');
});
// Regression test for https://crbug.com/936029
test(
assert(print_preview_app_test.TestNames.PrintToGoogleDrive), async () => {
await initialize();
// Set up the UI to have Google Drive as the printer.
page.destination_ = getGoogleDriveDestination('foo@chromium.org');
page.destination_.capabilities = getCddTemplate(page.destination_.id);
......@@ -89,7 +101,8 @@ suite(print_preview_app_test.suiteName, function() {
assertEquals('1.0', JSON.parse(args.printTicket).version);
});
test(assert(print_preview_app_test.TestNames.PrintPresets), function() {
test(assert(print_preview_app_test.TestNames.PrintPresets), async () => {
await initialize();
assertEquals(1, page.settings.copies.value);
assertFalse(page.settings.duplex.value);
......@@ -103,4 +116,22 @@ suite(print_preview_app_test.suiteName, function() {
assertFalse(page.getSetting('duplex').setFromUi);
assertFalse(page.getSetting('copies').setFromUi);
});
test(
assert(print_preview_app_test.TestNames.DestinationsManaged),
async () => {
initialSettings.destinationsManaged = true;
await initialize();
const sidebar = page.$$('print-preview-sidebar');
assertTrue(sidebar.controlsManaged);
});
test(
assert(print_preview_app_test.TestNames.HeaderFooterManaged),
async () => {
initialSettings.isHeaderFooterManaged = true;
await initialize();
const sidebar = page.$$('print-preview-sidebar');
assertTrue(sidebar.controlsManaged);
});
});
......@@ -25,7 +25,9 @@ export function getDefaultInitialSettings() {
isHeaderFooterManaged: false,
printerName: 'FooDevice',
serializedAppStateStr: null,
serializedDefaultDestinationSelectionRulesStr: null
serializedDefaultDestinationSelectionRulesStr: null,
pdfPrinterDisabled: false,
destinationsManaged: false,
};
}
......
......@@ -58,6 +58,14 @@ TEST_F('PrintPreviewAppTest', 'PrintPresets', function() {
this.runMochaTest(print_preview_app_test.TestNames.PrintPresets);
});
TEST_F('PrintPreviewAppTest', 'DestinationsManaged', function() {
this.runMochaTest(print_preview_app_test.TestNames.DestinationsManaged);
});
TEST_F('PrintPreviewAppTest', 'HeaderFooterManaged', function() {
this.runMochaTest(print_preview_app_test.TestNames.HeaderFooterManaged);
});
// eslint-disable-next-line no-var
var PrintPreviewSidebarTest = class extends PrintPreviewTest {
/** @override */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment