Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
Merge pull request #12025 from gasolin/issue-907075
Browse files Browse the repository at this point in the history
907075 - [Permission] Dismiss continuous same permission request but dis..., r=alive
  • Loading branch information
gasolin committed Sep 10, 2013
2 parents 186ad6e + d1094d1 commit dcc3707
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 4 deletions.
26 changes: 23 additions & 3 deletions apps/system/js/permission_manager.js
Expand Up @@ -21,6 +21,8 @@ var PermissionManager = {
remember: document.getElementById('permission-remember-checkbox'),
rememberSection: document.getElementById('permission-remember-section'),

currentOrigin: undefined,
currentPermission: undefined,
init: function pm_init() {
var self = this;

Expand All @@ -30,6 +32,8 @@ var PermissionManager = {
switch (detail.type) {
case 'permission-prompt':
self.overlay.dataset.type = detail.permission;
self.currentPermission = detail.permission;
self.currentOrigin = detail.origin;
self.handlePermissionPrompt(detail).bind(self);
break;
case 'cancel-permission-prompt':
Expand Down Expand Up @@ -73,7 +77,7 @@ var PermissionManager = {
var message =
_('fullscreen-request', { 'origin': detail.fullscreenorigin });
this.fullscreenRequest =
this.requestPermission(message, '',
this.requestPermission(detail.origin, detail.permission, message, '',
/* yesCallback */ null,
/* noCallback */ function() {
document.mozCancelFullScreen();
Expand All @@ -95,7 +99,8 @@ var PermissionManager = {

var moreInfoText = _(permissionID + '-more-info');
var self = this;
this.requestPermission(str, moreInfoText,
this.requestPermission(detail.origin, detail.permission,
str, moreInfoText,
function pm_permYesCB() {
self.dispatchResponse(detail.id, 'permission-allow',
self.remember.checked);
Expand All @@ -106,9 +111,11 @@ var PermissionManager = {
});
},

responseStatus: undefined,
dispatchResponse: function pm_dispatchResponse(id, type, remember) {
var event = document.createEvent('CustomEvent');
remember = remember ? true : false;
this.responseStatus = type;

event.initCustomEvent('mozContentEvent', true, true, {
id: id,
Expand Down Expand Up @@ -151,6 +158,16 @@ var PermissionManager = {
if (this.pending.length == 0)
return;
var request = this.pending.shift();
// bug 907075 Dismiss continuous same permission request but
// dispatch mozContentEvent as well if remember is checked
if (this.remember.checked) {
if ((this.currentOrigin === request.origin) &&
(this.currentPermission === request.permission)) {
this.dispatchResponse(request.id, this.responseStatus,
this.remember.checked);
return;
}
}
this.showPermissionPrompt(request.id,
request.message,
request.moreInfoText,
Expand All @@ -177,7 +194,8 @@ var PermissionManager = {
this.showNextPendingRequest();
},

requestPermission: function pm_requestPermission(msg, moreInfoText,
requestPermission: function pm_requestPermission(origin, permission,
msg, moreInfoText,
yescallback, nocallback) {
var id = this.nextRequestID;
this.nextRequestID = (this.nextRequestID + 1) % 1000000;
Expand All @@ -186,7 +204,9 @@ var PermissionManager = {
// There is already a permission request being shown, queue this one.
this.pending.push({
id: id,
permission: permission,
message: msg,
origin: origin,
moreInfoText: moreInfoText,
yescallback: yescallback,
nocallback: nocallback
Expand Down
65 changes: 64 additions & 1 deletion apps/system/test/unit/permission_manager_test.js
Expand Up @@ -6,7 +6,8 @@ requireApp('system/test/unit/mock_l10n.js');
requireApp('system/js/permission_manager.js');

function sendChromeEvent(evt_type, evt_permission) {
var detail = {'type': evt_type, 'permission': evt_permission};
var detail = {'type': evt_type, 'permission': evt_permission,
'origin': 'test', 'isApp': false };
var evt = new CustomEvent('mozChromeEvent', { detail: detail });

window.dispatchEvent(evt);
Expand All @@ -30,6 +31,8 @@ suite('system/permission manager', function() {
assert.equal(PermissionManager.pending, '');
assert.equal(PermissionManager.nextRequestID, 0);
assert.equal(PermissionManager.currentRequestId, undefined);
assert.equal(PermissionManager.currentOrigin, undefined);
assert.equal(PermissionManager.currentPermission, undefined);
});
});

Expand Down Expand Up @@ -145,4 +148,64 @@ suite('system/permission manager', function() {
});
});

suite('bug 907075 dismiss same permissions request from same origin',
function() {
var spyPrompt;
var spyReq;
var spyNext;
var stubResponse;

setup(function() {
PermissionManager.overlay = document.createElement('div');
spyPrompt = this.sinon.spy(PermissionManager, 'handlePermissionPrompt');

PermissionManager.remember = document.createElement('div');
spyReq = this.sinon.spy(PermissionManager, 'requestPermission');

PermissionManager.yes = document.createElement('div');
PermissionManager.no = document.createElement('div');
PermissionManager.moreInfoLink = document.createElement('div');
PermissionManager.moreInfo = document.createElement('div');
PermissionManager.message = document.createElement('div');
PermissionManager.moreInfoBox = document.createElement('div');

spyNext = this.sinon.spy(PermissionManager, 'showNextPendingRequest');

stubResponse = this.sinon.stub(PermissionManager,
'dispatchResponse');
sendChromeEvent('permission-prompt', 'audio-capture');
sendChromeEvent('permission-prompt', 'audio-capture');
});

teardown(function() {
stubResponse.restore();
spyNext.restore();
spyReq.restore();
spyPrompt.restore();
PermissionManager.overlay = null;
PermissionManager.pending = [];
});

test('prompt called twice', function() {
assert.equal(PermissionManager.currentOrigin, 'test');
assert.equal(PermissionManager.currentPermission, 'audio-capture');

assert.isTrue(spyPrompt.calledTwice);
assert.isTrue(spyReq.called);
assert.equal(PermissionManager.pending.length, 2);
});

test('handle pending', function() {
PermissionManager.remember.checked = true;
PermissionManager.clickHandler({target: PermissionManager.yes});
assert.equal(PermissionManager.pending.length, 1);
});

test('dismiss same permissions request from same origin', function() {
PermissionManager.remember.checked = true;
PermissionManager.clickHandler({target: PermissionManager.yes});
assert.isTrue(spyNext.called);
assert.isTrue(stubResponse.called);
});
});
});

0 comments on commit dcc3707

Please sign in to comment.