blob: 04c2ab2de663497c35e5150340674784c755dafc [file] [log] [blame]
// Copyright 2017 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.
/**
* Sets the list of current sessions.
* @param {!Array<string>} sessions List of session names.
*/
policy.Page.setSessionsList = function(sessions) {
var list = $('session-list');
// Clear the sessions list.
list.innerHTML = '';
// Set the new sessions list.
for (var i = 0; i < sessions.length; ++i) {
var option = document.createElement('OPTION');
option.value = sessions[i];
option.textContent = sessions[i];
list.appendChild(option);
}
};
policy.Page.setSessionTitle = function(name) {
$('session-title').textContent = name;
};
// Override some methods of policy.Page.
/**
* Shows error message when the session name is invalid.
*/
policy.Page.showInvalidSessionNameError = function() {
$('invalid-session-name-error').hidden = false;
};
/**
* Shows error message of rename session.
*/
policy.Page.showRenameSessionError = function(errorMessage) {
$('session-rename-error').hidden = false;
$('session-rename-error').textContent = errorMessage;
};
/**
* Close dialog of rename session.
*/
policy.Page.closeRenameSessionDialog = function() {
$('session-rename-error').textContent = '';
$('session-rename-error').hidden = true;
$('rename-dialog').close();
};
/**
* Disables editing policy values by hiding the main section and shows an
* error message instead.
*/
policy.Page.disableEditing = function() {
$('disable-editing-error').hidden = false;
$('main-section').hidden = true;
};
/**
* Disables saving to disk by hiding the 'load session' form and showing an
* error message instead.
*/
policy.Page.disableSaving = function() {
$('saving').hidden = false;
$('session-choice').hidden = true;
};
/** @override */
policy.Page.setPolicyValues = function(values) {
var page = this.getInstance();
page.enableEditing();
var table = page.policyTables['chrome'];
table.setPolicyValues(values.chromePolicies || {});
if (values.hasOwnProperty('extensionPolicies')) {
for (var extensionId in values.extensionPolicies) {
table = page.policyTables['extension-' + extensionId];
if (table) {
table.setPolicyValues(values.extensionPolicies[extensionId]);
}
}
} else {
for (var extension in page.policyTables) {
if (extension == 'chrome') {
continue;
}
table = page.policyTables[extension];
table.setPolicyValues({});
}
}
};
function loadSession(sessionName) {
$('invalid-session-name-error').hidden = true;
$('session-name-field').value = '';
if (sessionName) {
chrome.send('loadSession', [sessionName]);
}
}
/** @override */
policy.Page.prototype.initialize = function() {
cr.ui.FocusOutlineManager.forDocument(document);
this.mainSection = $('main-section');
this.policyTables = {};
// Place the initial focus on the session choice input field.
$('session-name-field').select();
$('filter').onsearch = (event) => {
for (policyTable in this.policyTables) {
this.policyTables[policyTable].setFilterPattern($('filter').value);
}
};
$('session-choice').onsubmit = () => {
loadSession($('session-name-field').value);
// Return false in order to prevent the browser from reloading the whole
// page.
return false;
};
$('session-list').ondblclick = () => {
loadSession($('session-list').value);
};
$('show-unset').onchange = () => {
for (policyTable in this.policyTables) {
this.policyTables[policyTable].filter();
}
};
$('enable-editing').onclick = () => {
this.enableEditing();
chrome.send('resetSession');
};
$('delete-session-button').onclick = () => {
var sessionName = $('session-list').value;
if (sessionName) {
chrome.send('deleteSession', [sessionName]);
}
};
$('rename-session-button').onclick = () => {
$('session-rename-error').hidden = true;
var sessionName = $('session-list').value;
if (sessionName) {
$('rename-dialog').showModal();
$('new-session-name-field').value = '';
$('new-session-name-field').select();
}
};
$('cancel-rename-button').onclick = () => {
$('rename-dialog').close();
};
$('confirm-rename-button').onclick = () => {
$('session-rename-error').textContent = '';
var sessionName = $('session-list').value;
var newSessionName = $('new-session-name-field').value;
if (sessionName && newSessionName) {
chrome.send('renameSession', [sessionName, newSessionName]);
}
};
$('export-policies-linux').onclick = (event) => {
chrome.send('exportLinux', [policy.Page.getInstance().getDictionary()]);
};
$('export-policies-mac').onclick = (event) => {
chrome.send('exportMac', [policy.Page.getInstance().getDictionary()]);
};
// Notify the browser that the page has loaded, causing it to send the
// list of all known policies and the values from the default session.
chrome.send('initialized');
};
policy.Page.prototype.enableEditing = function() {
$('main-section').hidden = false;
$('disable-editing-error').hidden = true;
};
/**
* Extracts current policy values to send to backend for saving.
* @return {Object} The dictionary containing policy values.
*/
policy.Page.prototype.getDictionary = function() {
var result = {chromePolicies: {}, extensionPolicies: {}};
for (var id in this.policyTables) {
if (id == 'chrome') {
result.chromePolicies = this.policyTables[id].getDictionary();
} else {
const PREFIX_LENGTH = 'extension-'.length;
var extensionId = id.substr(PREFIX_LENGTH);
result.extensionPolicies[extensionId] =
this.policyTables[id].getDictionary();
}
}
return result;
};
// Specify necessary columns.
policy.Page.prototype.tableHeadings = ['Name', 'Value', 'Status'];
// Override policy.Policy methods.
/** @override */
policy.Policy.prototype.decorate = function() {
this.updateToggleExpandedValueText_();
this.querySelector('.edit-button')
.addEventListener('click', this.onValueEditing_.bind(this));
this.querySelector('.value-edit-form').onsubmit =
this.submitEditedValue_.bind(this);
this.querySelector('.toggle-expanded-value')
.addEventListener('click', this.toggleExpandedValue_.bind(this));
};
/** @override */
policy.Policy.prototype.initialize = function(name, value, unknown) {
this.name = name;
this.unset = !value;
this.unknown = unknown;
this.querySelector('.name').textContent = name;
if (value) {
this.setValue_(value.value);
}
this.setStatus_(value);
};
/**
* Set the status column.
* @param {Object} value Dictionary with information about the policy value.
* @private
*/
policy.Policy.prototype.setStatus_ = function(value) {
var status;
if (this.unknown) {
status = loadTimeData.getString('unknown');
} else if (!value) {
status = loadTimeData.getString('unset');
} else if (value.error) {
status = value.error;
} else if (!value.valid) {
status = loadTimeData.getString('errorInvalidType');
} else {
status = loadTimeData.getString('ok');
}
this.querySelector('.status').textContent = status;
};
/**
* Set the policy value.
* @param {Object|string|integer|boolean} value Policy value.
* @private
*/
policy.Policy.prototype.setValue_ = function(value) {
this.value = value;
if (value === undefined) {
value = '';
} else if (typeof value != 'string') {
value = JSON.stringify(value);
}
this.unset = !value;
this.querySelector('.value').textContent = value;
this.querySelector('.expanded-value').textContent = value;
this.querySelector('.value-edit-field').value = value;
};
/** @override */
policy.Policy.prototype.getValueWidth_ = function(valueContainer) {
return valueContainer.querySelector('.value').offsetWidth +
valueContainer.querySelector('.edit-button').offsetWidth;
};
/**
* Start editing value.
* @private
*/
policy.Policy.prototype.onValueEditing_ = function() {
this.classList.add('value-editing-on');
this.classList.remove('has-overflowed-value');
this.querySelector('.value-edit-field').select();
};
/**
* Update the policy to its new edited value.
* @private
*/
policy.Policy.prototype.submitEditedValue_ = function() {
var newValue = this.querySelector('.value-edit-field').value;
this.setValue_(newValue);
this.setStatus_(newValue);
this.classList.remove('value-editing-on');
this.querySelector('.value-container').valueWidth = undefined;
this.checkOverflow();
var showUnset = $('show-unset').checked;
this.hidden = this.unset && !showUnset ||
this.name.toLowerCase().indexOf(this.parentNode.filterPattern_) == -1;
chrome.send('updateSession', [policy.Page.getInstance().getDictionary()]);
return false;
};
// Override policy.PolicyTable methods.
/**
* Get policy values stored in this table.
* @returns {Object} Dictionary with policy values.
*/
policy.PolicyTable.prototype.getDictionary = function() {
var result = {};
var policies = this.getElementsByTagName('tbody');
for (var i = 0; i < policies.length; i++) {
var policy = policies[i];
if (policy.unset) {
continue;
}
result[policy.name] = {value: policy.value};
}
return result;
};
// Call the main inttialization function when the page finishes loading.
document.addEventListener(
'DOMContentLoaded',
policy.Page.getInstance().initialize.bind(policy.Page.getInstance()));