blob: cb9e3d8184046fe29695e40f755d69b4dc7c3639 [file] [log] [blame]
// Copyright (c) 2012 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.
// Mac and Windows go to native certificate manager, and certificate manager
// isn't implemented if OpenSSL is used.
GEN('#if defined(USE_NSS_CERTS)');
GEN_INCLUDE(['options_browsertest_base.js']);
/**
* URL of the Certificates dialog in the Settings page.
* @const
*/
var CERTIFICATE_MANAGER_SETTINGS_PAGE_URL =
'chrome://settings-frame/certificates';
// Standalone certificate manager dialog page is implemented only in Chrome OS.
GEN('#if defined(OS_CHROMEOS)');
/**
* URL of the standalone certificate manager dialog page.
* @const
*/
var CERTIFICATE_MANAGER_STANDALONE_PAGE_URL = 'chrome://certificate-manager/';
GEN('#endif // defined(OS_CHROMEOS)');
/**
* TestFixture for certificate manager WebUI testing.
* @extends {testing.Test}
* @constructor
*/
function CertificateManagerWebUIBaseTest() {}
CertificateManagerWebUIBaseTest.prototype = {
__proto__: OptionsBrowsertestBase.prototype,
/** @override */
preLoad: function() {
// We can't check cr.isChromeOS in the preLoad since "cr" doesn't exist yet.
// This is copied from ui/webui/resources/js/cr.js, maybe
// there's a better way to do this.
this.isChromeOS = /CrOS/.test(navigator.userAgent);
this.makeAndRegisterMockHandler(
[
'editCaCertificateTrust',
'exportPersonalCertificate',
'importPersonalCertificate',
'importCaCertificate',
'exportCertificate',
'deleteCertificate',
'populateCertificateManager',
'viewCertificate',
]);
},
/** @override */
setUp: function() {
OptionsBrowsertestBase.prototype.setUp.call(this);
var ariaRoleNotScopedSelectors = [
'#tree-item-autogen-id-0',
'#tree-item-autogen-id-1',
'#tree-item-autogen-id-2',
'#tree-item-autogen-id-3',
'#tree-item-autogen-id-4',
];
// Enable when failure is resolved.
// AX_ARIA_09: http://crbug.com/570567
this.accessibilityAuditConfig.ignoreSelectors(
'ariaRoleNotScoped',
ariaRoleNotScopedSelectors);
// Enable when failure is resolved.
// AX_ARIA_10: http://crbug.com/570566
this.accessibilityAuditConfig.ignoreSelectors(
'unsupportedAriaAttribute',
'#caCertsTab-tree');
var focusableElementNotVisibleAndNotAriaHiddenSelectors = [
'#personalCertsTab-tree',
'#personalCertsTab-import',
'#personalCertsTab-import-and-bind',
'#certificate-confirm',
];
// Enable when failure is resolved.
// AX_FOCUS_01: http://crbug.com/570568
this.accessibilityAuditConfig.ignoreSelectors(
'focusableElementNotVisibleAndNotAriaHidden',
focusableElementNotVisibleAndNotAriaHiddenSelectors);
},
};
/**
* TestFixture for certificate manager WebUI testing.
* @extends {CertificateManagerWebUIBaseTest}
* @constructor
*/
function CertificateManagerWebUIUnpopulatedTest() {}
CertificateManagerWebUIUnpopulatedTest.prototype = {
__proto__: CertificateManagerWebUIBaseTest.prototype,
/**
* Browse to the certificate manager dialog in the Settings page.
*/
browsePreload: CERTIFICATE_MANAGER_SETTINGS_PAGE_URL,
/** @override */
preLoad: function() {
CertificateManagerWebUIBaseTest.prototype.preLoad.call(this);
// We expect the populateCertificateManager callback, but do not reply to
// it. This simulates what will be displayed if retrieving the cert list
// from NSS is slow.
this.mockHandler.expects(once()).populateCertificateManager();
},
};
// Test opening the certificate manager has correct location and buttons have
// correct initial states when onPopulateTree has not been called.
TEST_F('CertificateManagerWebUIUnpopulatedTest',
'testUnpopulatedCertificateManager', function() {
assertEquals(this.browsePreload, document.location.href);
// All buttons should be disabled to start.
expectTrue($('personalCertsTab-view').disabled);
expectTrue($('personalCertsTab-backup').disabled);
expectTrue($('personalCertsTab-delete').disabled);
expectTrue($('personalCertsTab-import').disabled);
if (this.isChromeOS)
expectTrue($('personalCertsTab-import-and-bind').disabled);
expectTrue($('serverCertsTab-view').disabled);
expectTrue($('serverCertsTab-export').disabled);
expectTrue($('serverCertsTab-delete').disabled);
expectTrue($('serverCertsTab-import').disabled);
expectTrue($('caCertsTab-view').disabled);
expectTrue($('caCertsTab-edit').disabled);
expectTrue($('caCertsTab-export').disabled);
expectTrue($('caCertsTab-delete').disabled);
expectTrue($('caCertsTab-import').disabled);
expectTrue($('otherCertsTab-view').disabled);
expectTrue($('otherCertsTab-export').disabled);
expectTrue($('otherCertsTab-delete').disabled);
Mock4JS.verifyAllMocks();
// If user database is not available, import buttons should be disabled.
CertificateManager.onModelReady(false /* userDbAvailable*/,
false /* tpmAvailable */);
expectTrue($('personalCertsTab-import').disabled);
expectTrue($('serverCertsTab-import').disabled);
expectTrue($('caCertsTab-import').disabled);
// Once we get the onModelReady call, the import buttons should be enabled,
// others should still be disabled.
CertificateManager.onModelReady(true /* userDbAvailable*/,
false /* tpmAvailable */);
expectTrue($('personalCertsTab-view').disabled);
expectTrue($('personalCertsTab-backup').disabled);
expectTrue($('personalCertsTab-delete').disabled);
expectFalse($('personalCertsTab-import').disabled);
expectTrue($('serverCertsTab-view').disabled);
expectTrue($('serverCertsTab-export').disabled);
expectTrue($('serverCertsTab-delete').disabled);
expectFalse($('serverCertsTab-import').disabled);
expectTrue($('caCertsTab-view').disabled);
expectTrue($('caCertsTab-edit').disabled);
expectTrue($('caCertsTab-export').disabled);
expectTrue($('caCertsTab-delete').disabled);
expectFalse($('caCertsTab-import').disabled);
expectTrue($('otherCertsTab-view').disabled);
expectTrue($('otherCertsTab-export').disabled);
expectTrue($('otherCertsTab-delete').disabled);
// On ChromeOS, the import and bind button should only be enabled if TPM is
// present.
if (this.isChromeOS) {
expectTrue($('personalCertsTab-import-and-bind').disabled);
CertificateManager.onModelReady(true /* userDbAvailable*/,
true /* tpmAvailable */);
expectFalse($('personalCertsTab-import-and-bind').disabled);
}
});
/**
* TestFixture for certificate manager WebUI testing.
* @extends {CertificateManagerWebUIBaseTest}
* @constructor
*/
function CertificateManagerWebUITest() {}
CertificateManagerWebUITest.prototype = {
__proto__: CertificateManagerWebUIBaseTest.prototype,
/** @override */
preLoad: function() {
CertificateManagerWebUIBaseTest.prototype.preLoad.call(this);
var tpmAvailable = this.isChromeOS;
var userDbAvailable = true;
this.mockHandler.expects(once()).populateCertificateManager().will(
callFunction(function() {
CertificateManager.onModelReady(userDbAvailable, tpmAvailable);
[['personalCertsTab-tree',
[{'id': 'o1',
'name': 'org1',
'subnodes': [{ 'id': 'c1',
'name': 'cert1',
'readonly': false,
'untrusted': false,
'extractable': true }],
}],
],
['caCertsTab-tree',
[{'id': 'o2',
'name': 'org2',
'subnodes': [{ 'id': 'ca_cert0',
'name': 'ca_cert0',
'readonly': false,
'untrusted': false,
'extractable': true,
'policy': false },
{ 'id': 'ca_cert1',
'name': 'ca_cert1',
'readonly': false,
'untrusted': false,
'extractable': true,
'policy': true },
{ 'id': 'ca_cert2',
'name': 'ca_cert2',
'readonly': false,
'untrusted': false,
'extractable': true,
'policy': false }],
}],
]
].forEach(CertificateManager.onPopulateTree)}));
},
};
/**
* TestFixture for testing certificate manager WebUI in the Settings page.
* @extends {CertificateManagerWebUITest}
* @constructor
*/
function CertificateManagerSettingsWebUITest() {}
CertificateManagerSettingsWebUITest.prototype = {
__proto__: CertificateManagerWebUITest.prototype,
/**
* Browse to the certificate manager dialog in the Settings page.
*/
browsePreload: CERTIFICATE_MANAGER_SETTINGS_PAGE_URL,
};
TEST_F('CertificateManagerSettingsWebUITest',
'testViewAndDeleteCert', function() {
assertEquals(this.browsePreload, document.location.href);
this.mockHandler.expects(once()).viewCertificate(['c1']);
expectTrue($('personalCertsTab-view').disabled);
expectTrue($('personalCertsTab-backup').disabled);
expectTrue($('personalCertsTab-delete').disabled);
expectFalse($('personalCertsTab-import').disabled);
if (this.isChromeOS)
expectFalse($('personalCertsTab-import-and-bind').disabled);
var personalCerts = $('personalCertsTab');
// Click on the first folder.
personalCerts.querySelector('div.tree-item').click();
// Buttons should still be in same state.
expectTrue($('personalCertsTab-view').disabled);
expectTrue($('personalCertsTab-backup').disabled);
expectTrue($('personalCertsTab-delete').disabled);
expectFalse($('personalCertsTab-import').disabled);
if (this.isChromeOS)
expectFalse($('personalCertsTab-import-and-bind').disabled);
// Click on the first cert.
personalCerts.querySelector('div.tree-item div.tree-item').click();
// Buttons should now allow you to act on the cert.
expectFalse($('personalCertsTab-view').disabled);
expectFalse($('personalCertsTab-backup').disabled);
expectFalse($('personalCertsTab-delete').disabled);
expectFalse($('personalCertsTab-import').disabled);
if (this.isChromeOS)
expectFalse($('personalCertsTab-import-and-bind').disabled);
// Click on the view button.
$('personalCertsTab-view').click();
Mock4JS.verifyAllMocks();
this.mockHandler.expects(once()).deleteCertificate(['c1']).will(callFunction(
function() {
CertificateManager.onPopulateTree(['personalCertsTab-tree', []]);
}));
// Click on the delete button.
$('personalCertsTab-delete').click();
// Click on the cancel button to verify the confirmation overlay closes.
$('alertOverlayCancel').click();
expectTrue($('alertOverlay').parentNode.classList.contains('transparent'));
// Click on the delete button.
$('personalCertsTab-delete').click();
// Click on the ok button in the confirmation overlay.
$('alertOverlayOk').click();
expectTrue($('alertOverlay').parentNode.classList.contains('transparent'));
// Context sensitive buttons should be disabled.
expectTrue($('personalCertsTab-view').disabled);
expectTrue($('personalCertsTab-backup').disabled);
expectTrue($('personalCertsTab-delete').disabled);
expectFalse($('personalCertsTab-import').disabled);
if (this.isChromeOS)
expectFalse($('personalCertsTab-import-and-bind').disabled);
// Tree should be empty.
expectTrue(personalCerts.querySelector('div.tree-item') === null);
});
// Ensure certificate objects with the 'policy' property set have
// the cert-policy CSS class appended.
TEST_F('CertificateManagerSettingsWebUITest',
'testPolicyInstalledCertificate', function() {
// Click on the first folder and get the certificates.
var caCertsTab = $('caCertsTab');
caCertsTab.querySelector('div.tree-item').click();
var certs = caCertsTab.querySelectorAll('div.tree-item div.tree-item');
// First cert shouldn't show the controlled setting badge, and the
// edit and delete buttons should be enabled.
var cert0 = certs[0];
expectEquals('ca_cert0', cert0.data.name);
expectEquals(null, cert0.querySelector('.cert-policy'));
cert0.click();
expectFalse($('caCertsTab-edit').disabled);
expectFalse($('caCertsTab-delete').disabled);
// But the second should show the controlled setting badge, and the
// edit and delete buttons should be disabled.
var cert1 = certs[1];
expectEquals('ca_cert1', cert1.data.name);
expectNotEquals(null, cert1.querySelector('.cert-policy'));
cert1.click();
expectTrue($('caCertsTab-edit').disabled);
expectTrue($('caCertsTab-delete').disabled);
});
// Standalone certificate manager dialog page is implemented only in Chrome OS.
GEN('#if defined(OS_CHROMEOS)');
/**
* TestFixture for testing standalone certificate manager WebUI.
* @extends {CertificateManagerWebUITest}
* @constructor
*/
function CertificateManagerStandaloneWebUITest() {}
CertificateManagerStandaloneWebUITest.prototype = {
__proto__: CertificateManagerWebUITest.prototype,
/**
* Browse to the certificate manager page.
*/
browsePreload: CERTIFICATE_MANAGER_STANDALONE_PAGE_URL,
};
// Ensure that the standalone certificate manager page loads and displays the
// ceertificates correctly.
TEST_F('CertificateManagerStandaloneWebUITest', 'testCertsDisplaying',
function() {
assertEquals(this.browsePreload, document.location.href);
// Click on the first folder and get the certificates.
var caCertsTab = $('caCertsTab');
caCertsTab.querySelector('div.tree-item').click();
var certs = caCertsTab.querySelectorAll('div.tree-item div.tree-item');
// There should be exactly three certificates displayed.
expectEquals(certs.length, 3);
});
GEN('#endif // defined(OS_CHROMEOS)');
GEN('#endif // defined(USE_NSS_CERTS)');