VulpesOS/gaia/apps/system/test/unit/permission_manager_test.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

929 lines
31 KiB
JavaScript
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* global PermissionManager, Applications, MocksHelper, MockL10n,
MockApplications, MockAppWindow, MockService, applications */
'use strict';
require('/shared/test/unit/load_body_html_helper.js');
require('/shared/js/sanitizer.js');
require('/shared/test/unit/mocks/mock_lazy_loader.js');
require('/shared/test/unit/mocks/mock_l10n.js');
require('/shared/test/unit/mocks/mock_service.js');
require('/test/unit/mock_applications.js');
require('/test/unit/mock_app_window.js');
require('/shared/test/unit/mocks/mock_manifest_helper.js');
// to emulate permission events
function sendChromeEvent(evt_type, evt_permission, remember) {
var permissions = {};
permissions[evt_permission] = [''];
var detail = {'type': evt_type, 'permissions': permissions,
'origin': 'test', 'isApp': false, 'remember': remember,
'id': 'perm1' };
var evt = new CustomEvent('mozChromeEvent', { detail: detail });
window.dispatchEvent(evt);
}
function createMediaEvent(evt_type, evt_permissions, isApp, isGranted) {
return {
'type': evt_type,
'permissions': evt_permissions,
'origin': 'test',
'isApp': isApp || false,
'remember': true,
'isGranted': isGranted || false,
'manifestURL': isApp ? 'app://uitest.gaiamobile.org/manifest.webapp' : null,
'id': 'perm1'
};
}
// to emulate getUserMedia events
function sendMediaEvent(evt_type, evt_permissions, app, isGranted) {
var detail = createMediaEvent(evt_type, evt_permissions, app, isGranted);
var evt = new CustomEvent('mozChromeEvent', { detail: detail });
window.dispatchEvent(evt);
}
var mocksForLazyLoader = new MocksHelper([
'LazyLoader',
'Applications',
'ManifestHelper',
'Service'
]).init();
suite('system/permission manager', function() {
var permissionManager;
var realL10n;
mocksForLazyLoader.attachTestHelpers();
suiteSetup(function(done) {
loadBodyHTML('/index.html');
realL10n = navigator.mozL10n;
navigator.mozL10n = MockL10n;
requireApp('system/js/permission_manager.js', function() {
permissionManager = new PermissionManager();
done();
});
window.applications = Applications;
});
suiteTeardown(function() {
navigator.mozL10n = realL10n;
});
setup(function() {
MockService.mockQueryWith('getTopMostWindow', new MockAppWindow());
permissionManager.start();
});
teardown(function() {
permissionManager.stop();
});
test('dispatch event when hidden', function() {
var dispatched = false;
window.addEventListener('permissiondialoghide', function onhide() {
window.removeEventListener('permissiondialoghide', onhide);
dispatched = true;
});
permissionManager.hidePermissionPrompt();
assert.isTrue(dispatched);
});
test('.permission-promt class added and removed from screen', function() {
assert(!permissionManager.screen.classList.contains('permission-prompt'),
'screen starts with no permission-prompt class');
sendChromeEvent('permission-prompt', 'test');
assert(permissionManager.screen.classList.contains('permission-prompt'),
'showing permission prompt adds appropriate css class');
permissionManager.hidePermissionPrompt();
assert(!permissionManager.screen.classList.contains('permission-prompt'),
'hiding permission prompt removes css class');
});
suite('`Remember my choice`', function() {
test('`Remember my choice` is hidden for non-app content', function() {
var rememberSection =
document.getElementById('permission-remember-section');
sendChromeEvent('permission-prompt', 'geolocation');
assert.equal(rememberSection.style.display, 'none');
});
test('`Remember my choice` is displayed for app content', function() {
this.sinon.stub(applications, 'getByManifestURL').returns(
{ name: 'UITest' }
);
var rememberSection =
document.getElementById('permission-remember-section');
sendMediaEvent(
'permission-prompt', {'geolocation': [''] },/* isapp */ true
);
assert.equal(rememberSection.style.display, 'block');
});
});
suite('default value', function() {
test('default values', function() {
assert.equal(permissionManager.isFullscreenRequest, false);
assert.equal(permissionManager.pending, '');
assert.equal(permissionManager.currentRequestId, undefined);
assert.equal(permissionManager.currentOrigin, undefined);
assert.equal(permissionManager.permissionType, undefined);
});
});
suite('permission-prompt Handler', function() {
setup(function() {
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
sendChromeEvent('permission-prompt', 'test');
});
test('permission-prompt', function() {
assert.equal(permissionManager.overlay.dataset.type, 'test');
assert.isTrue(permissionManager.handlePermissionPrompt.called);
});
});
suite('permission-prompt queue (when requesting more than one)', function() {
setup(function() {
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
this.sinon.spy(permissionManager, 'queuePrompt');
sendChromeEvent('permission-prompt', 'test');
sendChromeEvent('permission-prompt', 'test');
sendChromeEvent('permission-prompt', 'test');
});
test('permission-prompt queue must be 2 elements length', function() {
assert.equal(permissionManager.overlay.dataset.type, 'test');
assert.isTrue(permissionManager.handlePermissionPrompt.calledOnce);
assert.isTrue(permissionManager.queuePrompt.calledTwice);
assert.equal(permissionManager.pending.length, 2);
});
test('dispatchEvent must be called 3 times', function(done) {
var i = 0;
this.sinon.stub(permissionManager, 'dispatchResponse', function() {
if (++i === 3) {
assert.equal(permissionManager.dispatchResponse.callCount, 3);
done();
}
});
// Click on the first 'allow' prompt
permissionManager.clickHandler({target: permissionManager.yes});
});
});
suite('cancel-permission-prompt Handler', function() {
setup(function() {
this.sinon.stub(permissionManager, 'discardPermissionRequest');
sendChromeEvent('cancel-permission-prompt', '');
});
test('cancel-permission-prompt', function() {
assert.isTrue(permissionManager.discardPermissionRequest.called);
});
});
suite('attentionopening Handler', function() {
setup(function() {
this.sinon.stub(permissionManager, 'discardPermissionRequest');
});
test('discardPermissionRequest is called', function() {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('attentionopening', true, true, {origin: ''});
permissionManager.currentOrigin = 'app://fakecall.com';
window.dispatchEvent(evt);
assert.isTrue(permissionManager.discardPermissionRequest.called);
});
test('discardPermissionRequest should not be called' +
' if it comes from the same origin', function() {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('attentionopening', true, true,
{origin: 'app://fakecall.com'});
permissionManager.currentOrigin = 'app://fakecall.com';
window.dispatchEvent(evt);
assert.isFalse(permissionManager.discardPermissionRequest.called);
});
});
suite('attentionopened Handler', function() {
setup(function() {
this.sinon.stub(permissionManager, 'discardPermissionRequest');
});
test('discardPermissionRequest is called', function() {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('attentionopened', true, true, {origin: ''});
permissionManager.currentOrigin = 'app://fakecall.com';
window.dispatchEvent(evt);
assert.isTrue(permissionManager.discardPermissionRequest.called);
});
test('discardPermissionRequest should not be called' +
' if it comes from the same origin', function() {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('attentionopened', true, true,
{origin: 'app://fakecall.com'});
permissionManager.currentOrigin = 'app://fakecall.com';
window.dispatchEvent(evt);
assert.isFalse(permissionManager.discardPermissionRequest.called);
});
});
suite('fullscreenoriginchange Handler', function() {
function sendFullscreenRequest() {
var detail = {
type: 'fullscreenoriginchange',
fullscreenorigin: 'http://www.foo.com'
};
var evt = new CustomEvent('mozChromeEvent', { detail: detail });
window.dispatchEvent(evt);
}
setup(function() {
MockService.mockQueryWith('getTopMostWindow', {
origin: ''
});
this.sinon.spy(permissionManager, 'cleanDialog');
this.sinon.spy(permissionManager, 'handleFullscreenOriginChange');
this.sinon.spy(permissionManager, 'cancelRequest');
this.sinon.spy(permissionManager, 'showPermissionPrompt');
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
this.sinon.spy(navigator.mozL10n, 'get');
});
teardown(function() {
permissionManager.cancelRequest('fullscreen');
permissionManager.isFullscreenRequest = false;
});
test('fullscreenoriginchange handlers are called', function() {
sendFullscreenRequest();
// We clean the dialog and we must call the right handler
assert.isTrue(permissionManager.cleanDialog.calledOnce);
assert.isTrue(permissionManager.handleFullscreenOriginChange.calledOnce);
assert.isTrue(permissionManager.showPermissionPrompt.calledOnce);
});
test('showPermissionPrompt should be called with id "fullscreen"',
function() {
sendFullscreenRequest();
assert.equal(
permissionManager.showPermissionPrompt.args[0][0].id,
'fullscreen'
);
});
test('showPermissionPrompt must use the right strings', function() {
sendFullscreenRequest();
var l10nAttrs =
navigator.mozL10n.getAttributes(permissionManager.message);
assert.equal(l10nAttrs.id, 'fullscreen-request');
var detail = permissionManager.showPermissionPrompt.args[0][0];
assert.deepEqual(l10nAttrs.args, {
origin: detail.fullscreenorigin
});
// No "more info" string should be translated
var strings = permissionManager.getStrings(detail);
// "More info" should be empty
assert.isTrue(!strings.moreInfoText);
});
test('previous dialog should be cancelled', function() {
// Send a first dialog
sendFullscreenRequest();
assert.isFalse(permissionManager.cancelRequest.called);
// A new dialog must cancel the previous one
sendFullscreenRequest();
assert.isTrue(permissionManager.cancelRequest.calledOnce);
assert.isTrue(permissionManager.cancelRequest.calledWith('fullscreen'));
assert.isTrue(permissionManager.isFullscreenRequest);
});
test('other permission (e.g. geolocation) after fullscreen',
function(done) {
// Send a first dialog based on fullscreen (for example youtube video)
sendFullscreenRequest();
assert.isFalse(permissionManager.cancelRequest.called);
permissionManager.yes.callback = function() {
// If after the fullscreen scenario we have a new prompt, this must
// be rendered properly
var geolocationDetail =
{
'type': 'permission-prompt',
'permission': 'geolocation'
};
var evt =
new CustomEvent('mozChromeEvent', { detail: geolocationDetail });
window.dispatchEvent(evt);
assert.isTrue(permissionManager.handlePermissionPrompt.called);
assert.isFalse(permissionManager.isFullscreenRequest);
done();
};
permissionManager.clickHandler({target: permissionManager.yes});
});
});
suite('lockscreen-appopened Handler', function() {
setup(function() {
this.sinon.stub(permissionManager, 'discardPermissionRequest');
});
test('discardPermissionRequest is called', function() {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('lockscreen-appopened', true, true, {});
permissionManager.currentRequestId = 'fullscreen';
window.dispatchEvent(evt);
assert.isTrue(permissionManager.discardPermissionRequest.called);
});
test('discardPermissionRequest should not be called ' +
'if currentRequestId is not \'fullscreen\'', function() {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent('lockscreen-appopened', true, true, {});
permissionManager.currentRequestId = 123;
window.dispatchEvent(evt);
assert.isFalse(permissionManager.discardPermissionRequest.called);
});
});
suite('discardPermissionRequest', function() {
setup(function() {
this.sinon.stub(permissionManager, 'dispatchResponse');
this.sinon.stub(permissionManager, 'hidePermissionPrompt');
});
test('no currentRequestId', function() {
permissionManager.discardPermissionRequest();
assert.isFalse(permissionManager.dispatchResponse.called);
assert.isFalse(permissionManager.hidePermissionPrompt.called);
});
test('has currentRequestId', function() {
permissionManager.currentRequestId = 123;
permissionManager.discardPermissionRequest();
assert.isTrue(permissionManager.dispatchResponse.called);
assert.isTrue(permissionManager.hidePermissionPrompt.called);
});
test('currentRequestId is \'fullscreen\'', function() {
permissionManager.currentRequestId = 'fullscreen';
permissionManager.isFullscreenRequest = true;
permissionManager.no.callback = this.sinon.stub();
permissionManager.discardPermissionRequest();
assert.isTrue(permissionManager.no.callback.called);
assert.isFalse(permissionManager.isFullscreenRequest);
});
});
suite('handlePermissionPrompt', function() {
var detail;
setup(function() {
detail = {'type': 'permission-prompt', 'permission': 'geolocation'};
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
});
teardown(function() {
permissionManager.discardPermissionRequest();
detail = null;
});
test('permission-prompt', function() {
sendChromeEvent('permission-prompt', 'test');
assert.equal(permissionManager.remember.checked, false);
assert.isTrue(permissionManager.handlePermissionPrompt.called);
});
test('permission-prompt remember', function() {
sendChromeEvent(
'permission-prompt',
'test',
true
);
assert.equal(permissionManager.remember.checked, true);
assert.isTrue(permissionManager.handlePermissionPrompt.called);
});
});
suite('dispatchResponse', function() {
setup(function() {
this.sinon.stub(window, 'dispatchEvent');
});
test('permission-allow', function() {
permissionManager.dispatchResponse(123, 'permission-allow', true);
assert.equal(permissionManager.responseStatus, 'permission-allow');
assert.isTrue(window.dispatchEvent.called);
});
test('permission-deny', function() {
permissionManager.dispatchResponse(123, 'permission-deny', true);
assert.equal(permissionManager.responseStatus, 'permission-deny');
assert.isTrue(window.dispatchEvent.called);
});
});
suite('bug 907075 dismiss same permissions request from same origin',
function() {
setup(function() {
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
this.sinon.spy(permissionManager, 'queuePrompt');
this.sinon.spy(permissionManager, 'showNextPendingRequest');
this.sinon.spy(permissionManager, 'dispatchResponse');
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
});
test('handle repeated prompt must be rendered once', function() {
// We stablish 'remember me' in the first prompt, but we
// have other 'pending' prompt waiting in the queue
permissionManager.remember.checked = true;
assert.equal(permissionManager.pending.length, 1);
assert.isFalse(permissionManager.showNextPendingRequest.calledOnce);
// We accept the permission prompt with 'remember me', so next
// one must not be shown
permissionManager.clickHandler({target: permissionManager.yes});
assert.isTrue(permissionManager.showNextPendingRequest.calledTwice);
// Based on than, handlePermissionPrompt must be called once
assert.isTrue(permissionManager.handlePermissionPrompt.calledOnce);
// Now the queue must be empty
assert.equal(permissionManager.pending.length, 0);
});
});
// bug 935557 compatibility with old permission
suite('compatibility with old detail.permission', function() {
setup(function() {
this.sinon.spy(permissionManager, 'showPermissionPrompt');
var detail = {'type': 'permission-prompt',
'permission': 'geolocation',
'origin': 'test', 'isApp': false, id: 'perm1' };
var evt = new CustomEvent('mozChromeEvent', { detail: detail });
window.dispatchEvent(evt);
});
test('permission id matched', function() {
assert.equal(permissionManager.permissionType, 'geolocation');
});
});
// bug 952244 compatibility with old audio permission
suite('compatibility with old audio detail.permission', function() {
setup(function() {
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
var detail = {'type': 'permission-prompt',
'permission': 'audio-capture',
'origin': 'test', 'isApp': false, id: 'perm1' };
var evt = new CustomEvent('mozChromeEvent', { detail: detail });
window.dispatchEvent(evt);
});
test('permission id matched', function() {
assert.equal(permissionManager.permissionType, 'audio-capture');
});
test('not show remember my choice option', function() {
assert.equal(permissionManager.rememberSection.style.display, 'none');
});
});
// test getUserMedia related permissions
suite('audio capture permission', function() {
var detail;
var appMock = {
'isActivity': false,
'url': 'app://uitest.gaiamobile.org/manifest.webapp',
'name': 'UITest',
'manifestURL': 'app://uitest.gaiamobile.org/manifest.webapp',
'origin': 'app://uitest.gaiamobile.org/',
'manifest': {
'name': 'UITest',
'role': 'UITest',
},
target: {}
};
setup(function() {
MockApplications.mRegisterMockApp(appMock);
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
});
teardown(function() {
MockApplications.mTeardown();
});
test('permission-prompt', function() {
assert.equal(permissionManager.permissionType, 'audio-capture');
});
test('Web: All strings are matching', function() {
detail = createMediaEvent(
'permission-prompt',
{'audio-capture': ['']},
false
);
var strings = permissionManager.getStrings(detail);
// l10n must be Web related
assert.equal(strings.message.id, 'perm-audio-capture-webRequest');
// In this case we will take the origin of the requester
assert.deepEqual(strings.message.args, {
site: detail.origin
});
});
test('App: All strings are matching', function() {
detail = createMediaEvent(
'permission-prompt',
{'audio-capture': ['']},
true
);
var strings = permissionManager.getStrings(detail);
// l10n must be APP related
assert.equal(strings.message.id, 'perm-audio-capture-appRequest');
// In this case we will take the origin of the requester
assert.deepEqual(strings.message.args, {
app: appMock.manifest.name
});
});
test('Remember me is disabled by default', function() {
assert.isFalse(permissionManager.remember.checked);
});
test('default choice', function() {
assert.equal(permissionManager.currentChoices['video-capture'],
undefined);
assert.equal(permissionManager.currentChoices['audio-capture'],
'');
});
test('not show remember my choice option', function() {
assert.equal(permissionManager.rememberSection.style.display, 'none');
});
});
suite('video capture permission', function() {
var detail;
var appMock = {
'isActivity': false,
'url': 'app://uitest.gaiamobile.org/manifest.webapp',
'name': 'UITest',
'manifestURL': 'app://uitest.gaiamobile.org/manifest.webapp',
'origin': 'app://uitest.gaiamobile.org/',
'manifest': {
'name': 'UITest',
'role': 'UITest',
},
target: {}
};
setup(function() {
MockApplications.mRegisterMockApp(appMock);
this.sinon.spy(permissionManager, 'handlePermissionPrompt');
sendMediaEvent(
'permission-prompt',
{'video-capture': ['back', 'front']}
);
});
teardown(function() {
MockApplications.mTeardown();
});
test('permission-prompt', function() {
assert.equal(permissionManager.permissionType, 'video-capture');
});
test('Web: All strings are matching', function() {
detail = createMediaEvent(
'permission-prompt',
{'audio-capture': ['']},
false
);
var strings = permissionManager.getStrings(detail);
// l10n must be Web related
assert.equal(strings.message.id, 'perm-video-capture-webRequest');
// In this case we will take the origin of the requester
assert.deepEqual(strings.message.args, {
site: detail.origin
});
});
test('App: All strings are matching', function() {
detail = createMediaEvent(
'permission-prompt',
{'audio-capture': ['']},
true
);
var strings = permissionManager.getStrings(detail);
// l10n must be APP related
assert.equal(strings.message.id, 'perm-video-capture-appRequest');
// In this case we will take the origin of the requester
assert.deepEqual(strings.message.args, {
app: appMock.manifest.name
});
});
test('Remember me is disabled by default', function() {
assert.isFalse(permissionManager.remember.checked);
});
test('default choice', function() {
assert.equal(permissionManager.currentChoices['video-capture'],
'back');
});
test('not show remember my choice option', function() {
assert.equal(permissionManager.rememberSection.style.display, 'none');
});
});
suite('camera selector dialog', function() {
// the general is identical to normal video-capture,
// only UI changed
var appMock = {
'isActivity': false,
'url': 'app://uitest.gaiamobile.org/manifest.webapp',
'name': 'UITest',
'manifestURL': 'app://uitest.gaiamobile.org/manifest.webapp',
'origin': 'app://uitest.gaiamobile.org/',
'manifest': {
'name': 'UITest',
'role': 'UITest',
},
target: {}
};
setup(function() {
MockApplications.mRegisterMockApp(appMock);
sendMediaEvent(
'permission-prompt',
{'video-capture': ['back', 'front']},
true,
true
);
});
teardown(function() {
MockApplications.mTeardown();
});
test('is camera selector', function() {
assert.equal(permissionManager.isCamSelector, true);
});
test('permission selector is shown', function() {
assert.equal(permissionManager.buttons.dataset.items, 1);
assert.equal(permissionManager.rememberSection.style.display, 'none');
assert.equal(permissionManager.no.style.display, 'none');
});
test('permission-prompt', function() {
assert.equal(permissionManager.permissionType, 'video-capture');
});
test('default choice', function() {
assert.equal(permissionManager.currentChoices['video-capture'],
'back');
});
test('remember my choice option is checked in app mode', function() {
assert.equal(permissionManager.remember.checked, true);
});
});
suite('media capture permission', function() {
var detail;
var appMock = {
'isActivity': false,
'url': 'app://uitest.gaiamobile.org/manifest.webapp',
'name': 'UITest',
'manifestURL': 'app://uitest.gaiamobile.org/manifest.webapp',
'origin': 'app://uitest.gaiamobile.org/',
'manifest': {
'name': 'UITest',
'role': 'UITest',
},
target: {}
};
setup(function() {
MockApplications.mRegisterMockApp(appMock);
sendMediaEvent(
'permission-prompt',
{
'video-capture': ['front', 'back'],
'audio-capture': ['']
}
);
this.sinon.spy(navigator.mozL10n, 'get');
});
teardown(function() {
MockApplications.mTeardown();
});
test('permission-prompt', function() {
assert.equal(permissionManager.permissionType, 'media-capture');
});
test('Web: All strings are matching', function() {
detail = createMediaEvent(
'permission-prompt',
{'audio-capture': ['']},
false
);
var strings = permissionManager.getStrings(detail);
// l10n must be Web related
assert.equal(strings.message.id, 'perm-media-capture-webRequest');
// In this case we will take the origin of the requester
assert.deepEqual(strings.message.args, {
site: detail.origin
});
});
test('App: All strings are matching', function() {
detail = createMediaEvent(
'permission-prompt',
{'audio-capture': ['']},
true
);
var strings = permissionManager.getStrings(detail);
// l10n must be APP related
assert.equal(strings.message.id, 'perm-media-capture-appRequest');
// In this case we will take the origin of the requester
assert.deepEqual(strings.message.args, {
app: appMock.manifest.name
});
});
test('default choice', function() {
assert.equal(permissionManager.currentChoices['video-capture'], 'front');
assert.equal(permissionManager.currentChoices['audio-capture'], '');
});
test('not show remember my choice option', function() {
assert.equal(permissionManager.rememberSection.style.display, 'none');
});
test('remember my choice option is unchecked in web mode', function() {
assert.equal(permissionManager.remember.checked, false);
});
});
suite('bug 981550 Apps can cause permissions prompts in other apps',
function() {
setup(function() {
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
permissionManager.currentRequestId = 123;
sendMediaEvent('permission-prompt', {'video-capture': ['']});
permissionManager.discardPermissionRequest();
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
sendMediaEvent('permission-prompt', {'video-capture': ['']});
});
test('should have 1 pending', function() {
assert.equal(permissionManager.pending.length, 1);
});
});
suite('bug 1013509 Permission Prompt Never Hides',
function() {
setup(function() {
this.sinon.stub(permissionManager, 'discardPermissionRequest');
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
});
test('should discard permission request when requester killed', function() {
assert.equal(permissionManager.currentOrigin, 'test');
assert.equal(permissionManager.permissionType, 'audio-capture');
var event = new CustomEvent('appterminated',
{ 'detail': { 'origin': 'test'} });
window.dispatchEvent(event);
assert.isTrue(permissionManager.discardPermissionRequest.called);
});
});
suite('when screenoff it should hide the prompt', function() {
var evt;
setup(function() {
this.sinon.stub(permissionManager, 'discardPermissionRequest');
MockService.mockQueryWith('locked', true);
evt = {
type: 'screenchange',
detail: {
screenEnabled: false
}
};
});
test('screenoff', function() {
permissionManager.handleEvent(evt);
assert.isTrue(permissionManager.discardPermissionRequest.called);
});
teardown(function() {
delete window.Service;
});
});
suite('Toggle more/hide info in permission dialog',
function() {
setup(function() {
this.sinon.spy(permissionManager, 'toggleInfo');
this.sinon.spy(permissionManager, 'hidePermissionPrompt');
});
test('should toggle info when more info is clicked', function() {
permissionManager.clickHandler({
target: permissionManager.moreInfoLink
});
assert.isTrue(permissionManager.toggleInfo.called);
assert.isFalse(permissionManager.hidePermissionPrompt.called);
assert.isFalse(
permissionManager.moreInfoBox.classList.contains('hidden'));
});
test('should toggle info when hide info is clicked', function() {
permissionManager.clickHandler({
target: permissionManager.hideInfoLink
});
assert.isTrue(permissionManager.toggleInfo.called);
assert.isFalse(permissionManager.hidePermissionPrompt.called);
assert.isTrue(
permissionManager.moreInfoBox.classList.contains('hidden'));
});
test('should not handle click event when dialog is hidden',
function(done) {
this.sinon.spy(permissionManager, 'clickHandler');
window.addEventListener('permissiondialoghide', function onhide() {
window.removeEventListener('permissiondialoghide', onhide);
permissionManager.moreInfoLink.click();
assert.isFalse(permissionManager.clickHandler.called);
permissionManager.hideInfoLink.click();
assert.isFalse(permissionManager.clickHandler.called);
done();
});
permissionManager.hidePermissionPrompt();
});
test('should "More info..." be hidden when we accept/deny the prompt',
function() {
this.sinon.stub(permissionManager, 'getStrings').returns({
message: 'message',
moreInfoText: 'moreInfoText'
}
);
// Launch
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
assert.isFalse(
permissionManager.moreInfo.classList.contains('hidden'));
permissionManager.clickHandler({
target: permissionManager.yes
});
assert.isTrue(
permissionManager.moreInfo.classList.contains('hidden'));
});
});
test('"More info..." must not be shown if there is not text',
function() {
this.sinon.stub(permissionManager, 'getStrings').returns({
message: 'message',
moreInfoText: null
}
);
sendMediaEvent('permission-prompt', {'audio-capture': ['']});
assert.isTrue(
permissionManager.moreInfo.classList.contains('hidden'));
}
);
});