Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
929 lines
31 KiB
JavaScript
Executable file
929 lines
31 KiB
JavaScript
Executable file
/* 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'));
|
||
}
|
||
);
|
||
|
||
});
|