VulpesOS/assets/webapps/system.gaiamobile.org/js/identity.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

127 lines
4.1 KiB
JavaScript

/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
'use strict';
const kIdentityScreen = '/sign_in#NATIVE';
const kIdentityFrame = '/communication_iframe';
var Identity = (function() {
var iframe;
return {
trustedUILayers: {},
init: function() {
window.addEventListener('mozChromeEvent', this);
},
handleEvent: function onMozChromeEvent(e) {
var chromeEventId = e.detail.id;
var personaUri = e.detail.uri;
var requestId = e.detail.requestId;
switch (e.detail.type) {
// Chrome asks Gaia to show the identity dialog.
case 'id-dialog-open':
if (!chromeEventId) {
return;
}
// When opening the dialog, we record the chrome event id, which
// we will need to send back to the TrustedWindowManager when asking
// to close.
this.trustedUILayers[requestId] = chromeEventId;
if (!e.detail.showUI && iframe) {
this._dispatchEvent({
id: chromeEventId,
frame: iframe
});
return;
}
var frame = document.createElement('iframe');
frame.setAttribute('mozbrowser', 'true');
frame.setAttribute('remote', true);
frame.classList.add('screen');
frame.src = personaUri +
(e.detail.showUI ? kIdentityScreen : kIdentityFrame);
frame.dataset.url = frame.src;
frame.addEventListener('mozbrowserloadstart',
function loadStart(evt) {
// After creating the new frame containing the identity flow, we
// send it back to chrome so the identity callbacks can be injected.
this._dispatchEvent({
id: chromeEventId,
frame: evt.target
});
}.bind(this));
if (e.detail.showUI) {
// We need to tell the chrome side about the user manually closing
// the identity flow so the mozId API can notify to the caller about
// the flow being canceled.
var ontrustedclosed = (function(event) {
if (!event.detail ||
!event.detail.config ||
!event.detail.config.requestId) {
return;
}
window.removeEventListener('trustedclosed', ontrustedclosed);
this._dispatchEvent({
id: event.detail.config.requestId,
type: 'cancel',
errorMsg: 'DIALOG_CLOSED_BY_USER'
});
}).bind(this);
window.addEventListener('trustedclosed', ontrustedclosed);
navigator.mozL10n.formatValue('persona-signin').then(value => {
window.dispatchEvent(new CustomEvent('launchtrusted', {
detail: {
name: value,
frame: frame,
requestId: requestId,
chromeId: chromeEventId
}
}));
});
} else {
var container = document.getElementById('screen');
container.appendChild(frame);
frame.classList.add('communication-frame');
iframe = frame;
}
break;
case 'id-dialog-done':
if (e.detail.showUI) {
window.dispatchEvent(new CustomEvent('killtrusted', {
detail: {
requestId: requestId,
chromeId: chromeEventId
}
}));
}
this._dispatchEvent({ id: chromeEventId });
break;
case 'id-dialog-close-iframe':
if (iframe) {
iframe.parentNode.removeChild(iframe);
iframe = null;
}
break;
}
},
_dispatchEvent: function su_dispatchEvent(obj) {
var event = document.createEvent('CustomEvent');
event.initCustomEvent('mozContentEvent', true, true, obj);
window.dispatchEvent(event);
}
};
})();
// unit tests call init() manually
if (navigator.mozL10n) {
navigator.mozL10n.once(Identity.init.bind(Identity));
}