// 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)');