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.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,4 @@
;'use strict';var AppManager={EVENT_PREFIX:'ftu-',init:function init(versionInfo){window.performance.mark('initialize');this.isInitialized=true;LanguageManager.init();UIManager.init();Navigation.init();window.performance.mark('navigationLoaded');this.publish('setup');var splashTimeout=1025;var splashScreenHidden=this.whenEvent(UIManager.splashScreen,'transitionend',splashTimeout).then(()=>{UIManager.container.removeAttribute('aria-hidden');window.performance.mark('visuallyLoaded');});var languageListReady=this.whenEvent(window,'languagelistready');Promise.all([splashScreenHidden,languageListReady]).then(()=>{window.performance.mark('fullyLoaded');});if(versionInfo&&versionInfo.isUpgrade()){var stepsKey=versionInfo.delta();UIManager.changeStatusBarColor(UIManager.DARK_THEME);UIManager.splashScreen.classList.remove('show');UIManager.activationScreen.classList.remove('show');UIManager.updateScreen.classList.add('show');Tutorial.init(stepsKey,function(){Tutorial.start();});return;}
SimManager.init();WifiManager.init();ImportIntegration.init();TimeManager.init();DataMobile.init();Tutorial.init();var kSplashTimeout=700;var conn=window.navigator.mozMobileConnections&&window.navigator.mozMobileConnections[0];if(!conn){setTimeout(function(){window.location.hash='#';UIManager.activationScreen.classList.add('show');window.location.hash='#languages';UIManager.splashScreen.classList.remove('show');window.performance.mark('navigationInteractive');window.performance.mark('contentInteractive');},kSplashTimeout);return;}
setTimeout(function(){Navigation.manageStep();UIManager.activationScreen.classList.add('show');UIManager.splashScreen.classList.remove('show');window.performance.mark('navigationInteractive');window.performance.mark('contentInteractive');},kSplashTimeout);},whenEvent:function(target,name,timeoutMs){return new Promise((resolve,reject)=>{eventSafety(target,name,resolve,timeoutMs||1000);});},publish:function(name,detail){var evt=new CustomEvent(this.EVENT_PREFIX+name,{bubbles:true,detail:detail||this});window.dispatchEvent(evt);}};function init(){VersionHelper.getVersionInfo().then(function(versionInfo){if(!AppManager.isInitialized){AppManager.init(versionInfo);}else{UIManager.initTZ();if(!UIManager.mainTitle.hasAttribute('data-l10n-id')){UIManager.mainTitle.setAttribute('data-l10n-id','language');}}});}
init();document.addEventListener('DOMRetranslated',init);document.l10n.ready.then(()=>{window.performance.mark('l10nready');});

View file

@ -0,0 +1,5 @@
;'use strict';var DataMobile={key:'ril.data.enabled',keySV:'ftu.ril.data.enabled',STEP_DATA_3G:2,apnRetrieved:false,init:function dm_init(){var settings=navigator.mozSettings;if(!settings){console.log('Settings is not available');return;}
this.settings=settings;},removeSVStatusObserver:function dm_removeSVStatusObserver(){this.settings.removeObserver(this.keySV,this.getStatus);},getStatus:function dm_getStatus(aCallback){var self=this;var reqSV=this.settings.createLock().get(this.keySV);reqSV.onsuccess=function gst_svsuccess(){var svStatus=reqSV.result[self.keySV];if(svStatus!==undefined&&!UIManager.dataConnectionChangedByUsr){self.settings.removeObserver(self.keySV,self.getStatus);if(Navigation.currentStep===self.STEP_DATA_3G){self.toggle(svStatus);if(typeof aCallback==='function'){aCallback(svStatus);}}else{self.getRealStatus(aCallback);}}else{self.getRealStatus(aCallback);}};reqSV.onerror=function gst_error(){console.log('Error retrieving '+self.keySV);};this.settings.addObserver(this.keySV,this.getStatus.bind(this,aCallback));},getRealStatus:function dm_getRealStatus(callback){var request=this.settings.createLock().get(this.key);var self=this;request.onsuccess=function gst_success(){var currentStatus=request.result[self.key];self.isDataAvailable=currentStatus;callback(currentStatus);};request.onerror=function gst_error(){console.log('Error retrieving '+self.key);};},toggle:function dm_toggle(status,callback){var options={};options[this.key]=status;if(!this.apnRetrieved){var self=this;this.getAPN(function apn_recovered(){self.settings.createLock().set(options);self.apnRetrieved=true;self.isDataAvailable=status;if(callback){callback();}});return;}
this.settings.createLock().set(options);this.apnRetrieved=true;this.isDataAvailable=status;if(callback){callback();}},getAPN:function dm_getapn(callback){var _self=this;function ensureApnSettings(){var req=_self.settings.createLock().get('ril.data.apnSettings');req.onsuccess=function loadApn(){var apnSettings=req.result['ril.data.apnSettings'];if(apnSettings){if(callback){callback(req.result);}
_self.settings.removeObserver('ril.data.apnSettings',ensureApnSettings);}};}
ensureApnSettings();this.settings.addObserver('ril.data.apnSettings',ensureApnSettings);}};

View file

@ -0,0 +1,5 @@
;(function(exports){'use strict';var currentLayout='tiny';var elementIDs=['tutorialFinished','enjoyYourPhone','enjoyYourPhoneUpdated'];var dom={};var initialized=false;var FinishScreen={init:function(isUpgrade){if(initialized){return;}
if(ScreenLayout.getCurrentLayout()!=='tiny'){currentLayout='large';}
var panelSelector='tutorial-finish-'+currentLayout;var finishPanel=document.getElementById(panelSelector);finishPanel.classList.add('show');elementIDs.forEach(function(name){dom[Utils.camelCase(name)]=document.getElementById(name);},this);if(isUpgrade){dom.enjoyYourPhone.hidden=true;dom.enjoyYourPhoneUpdated.hidden=false;}
if(currentLayout==='tiny'){dom.tutorialFinished.addEventListener('click',function ftuEnd(){window.close();});}else{navigator.mozApps.getSelf().onsuccess=function(evt){var app=evt.target.result;app.connect('ftucomms').then(function onConnAccepted(ports){ports.forEach(function(port){port.postMessage('done');});},function onConnRejected(reason){console.warn('FTU is rejected due to '+reason);});};}
initialized=true;}};exports.FinishScreen=FinishScreen;}(this));

View file

@ -0,0 +1,4 @@
;'use strict';var ImportIntegration={get liveImportButton(){delete this.liveImportButton;return(this.liveImportButton=document.getElementById('live-import-button'));},get gmailImportButton(){delete this.gmailImportButton;return(this.gmailImportButton=document.getElementById('gmail-import-button'));},init:function(){this.liveImportButton.addEventListener('click',this);this.gmailImportButton.addEventListener('click',this);},handleEvent:function(event){switch(event.type){case'click':if(event.target===this.liveImportButton){ServicesLauncher.start('live');}
else if(event.target===this.gmailImportButton){ServicesLauncher.start('gmail');}
break;}},checkImport:function(nextState){if(nextState==='disabled'){this.gmailImportButton.setAttribute('disabled','disabled');this.liveImportButton.setAttribute('disabled','disabled');}
else if(nextState==='enabled'){this.gmailImportButton.removeAttribute('disabled');this.liveImportButton.removeAttribute('disabled');}}};

View file

@ -0,0 +1,3 @@
;'use strict';var LanguageManager={settings:window.navigator.mozSettings,init:function init(){this.buildLanguageList();document.getElementById('languages').addEventListener('change',this);var onSettingChange=this._boundHandleSettingChange=this.handleSettingChange.bind(this);this.settings.addObserver('language.current',onSettingChange);this.settings.addObserver('accessibility.screenreader',onSettingChange);},uninit:function uninit(){if(this._boundHandleSettingChange){this.settings.removeObserver('language.current',this._boundHandleSettingChange);this.settings.removeObserver('accessibility.screenreader',this._boundHandleSettingChange);}},handleSettingChange:function(evt){switch(evt.settingName){case'accessibility.screenreader':this.buildLanguageList();break;case'language.current':KeyboardHelper.changeDefaultLayouts(evt.settingValue,true);break;}},handleEvent:function handleEvent(evt){if(!this.settings||evt.target.name!='language.current'){return true;}
this.setLanguage(evt.target.value);return false;},setLanguage:function settings_setLanguage(language){this.settings.createLock().set({'language.current':language});},buildLanguageList:function settings_buildLanguageList(){var panel=document.querySelector('#languages');var container=panel.querySelector('ul');container.innerHTML='';LanguageList.get(function fillLanguageList(allLanguages,currentLanguage){for(var lang in allLanguages){var label=document.createElement('label');label.textContent=LanguageList.wrapBidi(lang,allLanguages[lang]);var radio=document.createElement('gaia-radio');radio.className='checkone';radio.setAttribute('name','language.current');radio.setAttribute('value',lang);radio.checked=(lang===currentLanguage);radio.appendChild(label);radio.configureClass();var li=document.createElement('li');li.dataset.value=lang;li.appendChild(radio);container.appendChild(li);}
panel.dataset.languagesReady=true;window.dispatchEvent(new CustomEvent('languagelistready'));});}};

View file

@ -0,0 +1,56 @@
;(function(exports){'use strict';const MANIFEST_SETTING_NAME='latecustomization.url';const OPERATOR_INFO_SETTING_NAME='latecustomization.operatorInfo';const COMMS_CHANNEL='ftucomms';const ICON_SIZE=32;const IMG_PATH='style/images/late_customization';const ICON_INSTALLING_URL=`${IMG_PATH}/app_installing.svg`;const ICON_FAILED_URL=`${IMG_PATH}/app_install_unrecoverable.svg`;const ICON_DEFAULT_URL=`${IMG_PATH}/default_icon.svg`;function LateCustomizationPanel(){this.debug('LateCustomizationPanel ctor');}
LateCustomizationPanel.prototype={DEBUG:false,name:'LateCustomizationPanel',constructor:LateCustomizationPanel,_initialized:false,_downloadPossible:false,_customizationManifestUrl:'',get enabled(){return Boolean(this._customizationManifestUrl&&(this._operatorInfo||this._predefinedOperatorInfo));},get operatorInfo(){var info={};Object.assign(info,this._operatorInfo||this.getInfoFromMobileConnection(),this._predefinedOperatorInfo);return info;},get carrierName(){var info=this.operatorInfo;return info.carrier||info.operator;},get region(){return this.operatorInfo.region||'';},start:function(){window.addEventListener('hashchange',this);window.addEventListener('ftu-done',this);window.addEventListener('online',this);window.addEventListener('offline',this);this._operatorInfo=this.getInfoFromMobileConnection();this.waitForSettingValues().then((results)=>{var[url,predefinedInfo]=results;if(url){this._customizationManifestUrl=url;}
if(predefinedInfo){this._predefinedOperatorInfo=predefinedInfo;}
this.debug('start, resolved manifest url: '+this._customizationManifestUrl,' is enabled? '+this.enabled,' operatorInfo: ',this._operatorInfo);if(this.enabled){this.init();}else{this.debug('Not enabled; not initializing');if(!this._operatorInfo){this.waitForOperatorInfo().then((info)=>{if(!this._initialized&&this.enabled){this.init();}});}}}).catch(e=>{this.debug('start: didnt init, error from waitForSettingValues: ',e);});},init:function(){if(this._initialized||!this.enabled){return;}
this._initialized=true;this.appManifestUrls=[];this.render();Navigation.registerStep({hash:'#late_customization',afterStep:'firefox_accounts'});this.attemptToPopulateAppList();},postConnectMessage:function(message){navigator.mozApps.getSelf().onsuccess=function(evt){var app=evt.target.result;if(app.connect){app.connect(COMMS_CHANNEL).then(function onConnAccepted(ports){ports.forEach(function(port){port.postMessage(message);});},function onConnRejected(reason){console.error('Cannot connect to comms channel: ',reason);});}else{console.error('mozApps does not have a connect method. '+'Cannot connect to the comms channel.');}};},attemptToPopulateAppList:function(){this.debug('attemptToPopulateAppList, waiting to go online');var connected=this.whenUsableConnection();connected.then(()=>{this.debug('attemptToPopulateAppList, came online');return this.fetchAppsToInstall().then((appsMap)=>{if(!(this._appsToInstall&&this._appsToInstall.size)){this.debug('No apps in response from '+
this._customizationManifestUrl+', bailing');return;}
var urls=Array.from(this._appsToInstall.keys());var postMessageDetail={type:'late-customization-apps',urls:urls};this.postConnectMessage(postMessageDetail);this.updateAppList(this._appsToInstall);}).catch(err=>{console.warn('LateCustomizationPanel, error fetching customization '+'manifest from: '+this._customizationManifestUrl,err.message);});}).catch((e)=>{this.debug('No connection available in time to '+'fetch late customization manifest:',e);});return connected;},fetchAppsToInstall:function(){if(this._appsToInstall){return Promise.resolve(this._appsToInstall);}
return this.fetchManifest().then((manifestResp)=>{var appsMap=this.getAppsFromManifest(manifestResp);if(!appsMap){return Promise.reject('getAppsFromManifest didnt return appsMap');}
return(this._appsToInstall=appsMap);},(err)=>{console.warn('LateCustomization: ',err.message||err);});},waitForSettingValues:function(){var haveUrl,haveInfo;var lock=navigator.mozSettings.createLock();function getSetting(name){return new Promise((resolve,reject)=>{lock=(lock&&!lock.closed)?lock:navigator.mozSettings.createLock();var get=lock.get(name);get.addEventListener('success',(function(){resolve(get.result[name]);}));get.addEventListener('error',(function(){reject();}));});}
if(this._customizationManifestUrl){haveUrl=Promise.resolve(this._customizationManifestUrl);}else{haveUrl=getSetting(MANIFEST_SETTING_NAME);}
haveInfo=getSetting(OPERATOR_INFO_SETTING_NAME);return Promise.all([haveUrl,haveInfo]);},waitForOperatorInfo:function(){var info=this.getInfoFromMobileConnection();if(info){this._operatorInfo=info;return Promise.resolve(info);}
return new Promise((resolve,reject)=>{this._operatorInfoRequest={resolve:resolve,reject:reject};});},getInfoFromMobileConnection:function(){var connections=navigator.mozMobileConnections;if(connections){for(var i=0,conn;i<connections.length;i++){conn=connections[i];if(conn&&conn.voice&&conn.voice.connected){var operatorInfos=MobileOperator.userFacingInfo(conn);if(operatorInfos.operator){operatorInfos.mcc=conn.voice.network.mcc;operatorInfos.mnc=conn.voice.network.mnc;return operatorInfos;}}}}
return null;},getAppsFromManifest:function(data){var apps=new Map();var langs=navigator.languages;var list=data&&(data.apps||data.objects);if(!(list&&list.length)){return apps;}
list.filter((app)=>{return app.is_disabled!==true&&(new Set(app.device_types)).has('firefoxos');}).forEach((appData)=>{appData.manifestURL=appData.manifest_url;var appName='';langs.some(function tryLanguage(lang){if(this[lang]){appName=this[lang];return true;}},appData.name);appData.displayName=appName;this.debug('app data: ',appData.displayName,appData);apps.set(appData.manifestURL,appData);});return apps;},attemptInstalls:function(){this._installQueue=[];if(this._appsToInstall&&this._appsToInstall.size){var attempts=[];this._appsToInstall.forEach((appData,manifestURL)=>{if(appData.installState=='installed'||appData.installState=='pending'){this.debug('attemptInstalls: app install already underway: ',manifestURL,appData.installState);}else{attempts.push(this.enqueAppInstall(appData));}});return Promise.all(attempts);}else{return Promise.resolve();}},installApp:function(appData){this.debug('installApp: ',appData.manifestURL);return this.whenUsableConnection().then(()=>{return new Promise((resolve,reject)=>{var req=window.navigator.mozApps.install(appData.manifestURL);var onOutcome=(arg)=>{var selector=`li[data-manifest-url="${appData.manifestURL}"]`;var itemNode=this.appListNode.querySelector(selector);var manifestURL=req.result&&req.result.manifestURL;this.debug('appinstall DOMRequest outcome:',arg,req.result);if(req.error){delete appData.installState;itemNode&&itemNode.classList.add('failed');console.warn('Install error: ',req.error);}else if(req.result){appData.installState=req.result.installState;this.debug('Install success, app: ',manifestURL,appData.installState);}
itemNode&&itemNode.classList.remove('pending');resolve(req);};req.onsuccess=req.onerror=onOutcome;});}).catch(()=>{this.debug('Lost connection while attempting install of '+
appData.manifestURL);});},enqueAppInstall:function(app){var installQueue=this._installQueue;installQueue.push(app);this.debug('enqueAppInstall, queue: ',app.manifestURL);var currentInstallAttempt=this._installAttempt||Promise.resolve();return currentInstallAttempt.then(req=>{if(req&&req.error){console.warn('install error:',req.error);}
if(this._installQueue.length){this._installAttempt=this.installApp(this._installQueue.shift());}});},debug:function(){if(!this.DEBUG){return;}
var args=Array.from(arguments);args.unshift('LateCustomizationPanel');console.log.apply(console,args);},buildManifestUrl:function(url,infos={}){var apiURL=new URL(url);var params=new URLSearchParams(apiURL.search.substr(1));for(var key in infos){if(typeof infos[key]!=='undefined'){params.set(key,infos[key]);}}
apiURL.search=params.toString();return apiURL.href;},fetchManifest:function(){var url=this.buildManifestUrl(this._customizationManifestUrl,this.operatorInfo);if(!url){return Promise.reject(new Error('No manifest URL available'));}
this.debug('fetchManifest at: '+url);return new Promise((resolve,reject)=>{LazyLoader.getJSON(url,true).then((resp)=>{if(resp.objects){resolve(resp);}else{reject('No apps in reponse to: '+url);}}).catch(ex=>{reject(ex);});});},whenUsableConnection:function(){if(this._pendingNextOnline){return this._pendingNextOnline;}
var canDownload=navigator.onLine;if(canDownload){return Promise.resolve(true);}
return new Promise((resolve,reject)=>{this._nextOnlineRequest={resolve:resolve,reject:reject};});},handleEvent:function(evt){switch(evt.type){case'hashchange':if(this.enabled&&evt.target.location.hash==='#late_customization'){if(this._appsToInstall&&this._appsToInstall.size){this.onPanelShown();}else{Navigation.skipStep();}}
if(this._operatorInfoRequest){var info=this.getInfoFromMobileConnection();if(info){this._operatorInfo=info;this._operatorInfoRequest.resolve(info);this._operatorInfoRequest=null;}}
break;case'online':case'offline':if(navigator.onLine&&this._installQueue&&this._installQueue.length){return this.attemptInstalls();}
if(navigator.onLine&&this._nextOnlineRequest){this._nextOnlineRequest.resolve(true);}else if(this._nextOnlineRequest){this._nextOnlineRequest.reject(new Error('offline'));if(!this._appsToInstall){this.attemptToPopulateAppList();}}
this._nextOnlineRequest=null;break;case'ftu-done':if(this._operatorInfoRequest){this._operatorInfoRequest.reject(new Error('FTU complete with no viable operator'));this._operatorInfoRequest=null;}
if(this._nextOnlineRequest){this._nextOnlineRequest.reject(new Error('done before connection became available'));this._nextOnlineRequest=null;}
break;}},onPanelShown:function(){UIManager.mainTitle.setAttribute('data-l10n-id','late-customization');this.finalizeRender();this.attemptInstalls();},_createElement:function(name,options){var elm=document.createElement(name);if(options.id){elm.id=options.id;}
if(options.className){elm.className=options.className;}
if(options.dataset){for(var p in options.dataset){elm.dataset[p]=options.dataset[p];}}
if(options.attributes){for(var a in options.attributes){elm.setAttribute(a,options.attributes[a]);}}
if('textContent'in options){elm.textContent=options.textContent;}
return elm;},render:function(){var section=this.element=document.getElementById('late_customization');if(!section){section=this._createElement('section',{attributes:{role:'region'},id:'late_customization'});this.element=section;}
section.innerHTML=Sanitizer.escapeHTML`
<section id="late-customization-cando" class="content hidden">
<p id="late_customization-downloading-message"></p>
</section>
<section id="late-customization-nocando" class="content">
<p id="late_customization-download-later-message"></p>
<p id="late_customization-download-later-marketplace"></p>
</section>
<article data-type="list">
<ul id="late_customization-applist" class="hidden"></ul>
</article>`;function setTranslationById(domId,l10Id,attrs){var elem=section.querySelector('#'+domId);document.l10n.setAttributes(elem,l10Id,attrs);}
var carrierName=this.carrierName;if(carrierName){setTranslationById('late_customization-downloading-message','late-customization-downloading-message',{carrierName:this.carrierName});setTranslationById('late_customization-download-later-message','late-customization-download-later',{carrierName:this.carrierName});}else{setTranslationById('late_customization-downloading-message','late-customization-downloading-message-default');setTranslationById('late_customization-download-later-message','late-customization-download-later-default');}
setTranslationById('late_customization-download-later-marketplace','late-customization-download-later-marketplace',{carrierName:this.carrierName});if(!section.parentNode){document.querySelector('#activation-screen > article').appendChild(section);}
this.appListNode=document.querySelector('#late_customization-applist');},renderAppItem:function(appData){var itemNode=this._createElement('li',{dataset:{manifestUrl:appData.manifestURL},className:'pending'});var listNode=this.element.querySelector('#late_customization-applist');if(!listNode){this.debug('No element found to render app details into');return;}
itemNode.innerHTML=Sanitizer.escapeHTML`
<span class="icon"
style="background-image: url(${ICON_INSTALLING_URL})"></span>
<p dir="auto">${appData.displayName}</p>
`;listNode.appendChild(itemNode);var iconElem=itemNode.querySelector('.icon');this.getAppIconUrl(appData).then((iconUrl)=>{this.debug('getAppIconUrl returned:',iconUrl);var img=new Image();img.onload=()=>{iconElem.style.backgroundImage='url('+img.src+')';};img.onerror=()=>{iconElem.style.backgroundImage='url('+ICON_DEFAULT_URL+')';};img.src=iconUrl.href;});return itemNode;},getAppIconUrl:function(appData,iconSize=ICON_SIZE){var siteObj={};var manifest=appData;var manifestURL=appData.manifest_url;var origin=manifest.origin=new URL(manifestURL).origin;var hasIcons=(manifest.icons&&Object.keys(manifest.icons).length);if(!hasIcons){return Promise.resolve(new URL(ICON_DEFAULT_URL));}
siteObj.manifestURL=manifestURL;siteObj.manifest=manifest;var gotIcon=new Promise((resolve,reject)=>{IconsHelper.getIcon(origin,iconSize,null,siteObj).then((iconUrl)=>{this.debug('getIcon returned: ',iconUrl);resolve(iconUrl);}).catch(err=>{this.debug('Failed to load icon from: '+
JSON.stringify(appData.icons));console.warn('getIcon errback, err: ',err);resolve(new URL(ICON_FAILED_URL));});});return gotIcon;},finalizeRender:function(){var container=this.element;var appsMap=this._appsToInstall;var hasApps=(appsMap&&appsMap.size);var canDoElm=container.querySelector('#late-customization-cando');var noCanDoElm=container.querySelector('#late-customization-nocando');var appListElm=container.querySelector('#late_customization-applist');canDoElm.classList.toggle('hidden',!hasApps);appListElm.classList.toggle('hidden',!hasApps);noCanDoElm.classList.toggle('hidden',!!hasApps);},updateAppList:function(appsMap){var list=this.element.querySelector('#late_customization-applist');this.debug('updateAppList: ',appsMap);while(list.firstChild){list.firstChild.remove();}
if(appsMap&&appsMap.size){for(var appData of appsMap.values()){this.debug('calling renderAppItem with app: ',appData.manifestURL);this.renderAppItem(appData);}}
this.finalizeRender();}};exports.LateCustomizationPanel=LateCustomizationPanel;var panel;document.l10n.ready.then(()=>{panel=exports.lateCustomizationPanel=new LateCustomizationPanel();});window.addEventListener('ftu-setup',function onSetup(evt){window.removeEventListener('ftu-setup',onSetup);panel&&(panel.manager=evt.detail);panel&&panel.start();});})(window);

View file

@ -0,0 +1,11 @@
;'use strict';var SdManager={available:function(){return utils.sdcard.checkStorageCard();},checkSDButton:function sm_checkSDButton(){var sdOption=UIManager.sdImportButton;if(!SdManager.alreadyImported&&SdManager.available()){sdOption.removeAttribute('disabled');UIManager.noMemorycard.classList.add('hidden');}else{sdOption.setAttribute('disabled','disabled');if(!SdManager.alreadyImported){UIManager.noMemorycard.classList.remove('hidden');}}},importContacts:function sm_importContacts(){var importedContacts=0;UIManager.navBar.setAttribute('aria-disabled','true');var cancelled=false;var importer=null;var importButton;var progress=utils.overlay.show('memoryCardContacts-importing','activityBar','infiniteProgress');utils.overlay.showMenu();return new Promise((resolve,reject)=>{utils.overlay.oncancel=()=>{cancelled=true;if(importer){importer.finish();}else{UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();}
resolve();};importButton=UIManager.sdImportButton;utils.sdcard.retrieveFiles(['text/vcard','text/directory;profile=vCard','text/directory'],['vcf','vcard'],(error,fileArray)=>{if(!error&&!fileArray.length){error='No contacts were found';}
if(error){reject(error);return import_error(error);}
if(cancelled){resolve();return;}
var promises=[];fileArray.forEach(file=>{promises.push(utils.sdcard.getTextFromFile(file,onContacts));});Promise.all(promises).then(()=>{utils.misc.setTimestamp('sd');UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();if(cancelled){resolve();return;}
SdManager.alreadyImported=true;importButton.setAttribute('disabled','disabled');utils.status.show({id:'memoryCardContacts-imported3',args:{n:importedContacts}});resolve();}).catch(reject);});});function onContacts(text){if(cancelled){return Promise.reject();}
return new Promise((resolve,reject)=>{importer=new VCFReader(text);if(!text||!importer){var error='No contacts were found';import_error(error);reject(error);return;}
importer.onimported=imported_contact;importer.onerror=error=>{import_error(error);reject(error);};importer.process(()=>{if(cancelled){reject('Cancelled');utils.overlay.hide();return;}
resolve();});});}
function imported_contact(){importedContacts++;progress.update();}
function import_error(e){UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();importButton.removeAttribute('disabled');var cancel={title:'cancel',callback:function(){ConfirmDialog.hide();}};var retry={title:'retry',isRecommend:true,callback:function(){ConfirmDialog.hide();importButton.click();}};ConfirmDialog.show(null,'memoryCardContacts-error',cancel,retry);}}};

View file

@ -0,0 +1,29 @@
;(function(exports){'use strict';const DOGFOODSETTING='debug.performance_data.dogfooding';const METRICSSETTING='metrics.selectedMetrics.level';var steps=[{onlyForward:true,hash:'#languages',requireSIM:false},{onlyForward:false,hash:'#data_3g',requireSIM:true},{onlyForward:false,hash:'#wifi',requireSIM:false},{onlyForward:false,hash:'#date_and_time',requireSIM:false},{onlyForward:false,hash:'#geolocation',requireSIM:false},{onlyForward:false,hash:'#import_contacts',requireSIM:false},{onlyForward:false,hash:'#firefox_accounts',requireSIM:false},{onlyForward:false,hash:'#welcome_browser',requireSIM:false},{onlyForward:false,hash:'#browser_privacy',requireSIM:false}];exports.Navigation={get stepCount(){return this._stepOrder?this._stepOrder.length:0;},currentStepIndex:0,previousStepIndex:0,simMandatory:false,skipMobileDataScreen:false,skipDateTimeScreen:false,tzInitialized:false,_stepsById:null,_stepOrder:null,init:function n_init(){this._stepOrder=[];this._stepsById={};var settings=navigator.mozSettings;var forward=document.getElementById('forward');var back=document.getElementById('back');this._onForwardClick=this.forward.bind(this);this._onBackClick=this.back.bind(this);forward.addEventListener('click',this._onForwardClick);back.addEventListener('click',this._onBackClick);window.addEventListener('hashchange',this);this._onActivationScreenClick=this.handleExternalLinksClick.bind(this);UIManager.activationScreen.addEventListener('click',this._onActivationScreenClick);steps.forEach(step=>{this.registerStep(step);});var self=this;var reqSIM=settings&&settings.createLock().get('ftu.sim.mandatory')||{};reqSIM.onsuccess=function onSuccess(){self.simMandatory=reqSIM.result['ftu.sim.mandatory']||false;};navigator.mozApps.getSelf().onsuccess=function(evt){var app=evt.target.result;app.connect('ftucomms').then(function onConnAccepted(ports){self.ports=ports;ports.forEach(port=>port.postMessage('started'));},function onConnRejected(reason){console.warn('FTU navigation cannot use IAC: '+reason);});};},uninit:function(){this._stepOrder=null;this._stepsById=null;this.currentStepIndex=0;this.previousStepIndex=0;this.ports=null;var forward=document.getElementById('forward');var back=document.getElementById('back');var activationScreen=UIManager&&UIManager.activationScreen;if(forward&&this._onForwardClick){forward.removeEventListener('click',this._onForwardClick);}
if(back&&this._onBackClick){back.removeEventListener('click',this._onBackClick);}
if(activationScreen&&this._onActivationScreenClick){activationScreen.removeEventListener('click',this._onActivationScreenClick);}
window.removeEventListener('hashchange',this);},registerStep:function(step){if(!step.id){step.id=step.hash.substring(1);}
var id=step.id;this._stepsById[id]=step;var beforeStepIdx=step.hasOwnProperty('beforeStep')?this._stepOrder.indexOf(step.beforeStep):-1;var afterStepIdx=step.hasOwnProperty('afterStep')?this._stepOrder.indexOf(step.afterStep):-1;if(beforeStepIdx>-1){this._stepOrder.splice(beforeStepIdx,0,id);}else if(afterStepIdx>-1){this._stepOrder.splice(afterStepIdx+1,0,id);}else{this._stepOrder.push(id);}},stepAt:function(idx){var stepId=this._stepOrder[idx];if(stepId){return this._stepsById[stepId];}},indexOfStep:function(step){var id=(typeof id==='string')?step.id:step;return this._stepOrder.indexOf(id);},back:function n_back(event){var currentStep=this.stepAt(this.currentStepIndex);var actualHash=window.location.hash;if(actualHash!=currentStep.hash){window.history.back();}else{var self=this;var goToStep=function(){self.previousStepIndex=self.currentStepIndex;self.currentStepIndex--;if(self.currentStepIndex>=0){self.manageStep();}};goToStep();}},forward:function n_forward(event){var self=this;var goToStepForward=function(){self.previousStepIndex=self.currentStepIndex;self.currentStepIndex++;if(self.currentStepIndex>=self.stepCount){UIManager.sendNewsletter(function newsletterSent(result){if(result){UIManager.activationScreen.classList.remove('show');UIManager.changeStatusBarColor(UIManager.DARK_THEME);UIManager.finishScreen.classList.add('show');UIManager.hideActivationScreenFromScreenReader();}else{self.currentStepIndex--;}});return;}
self.manageStep();};goToStepForward();},handleExternalLinksClick:function n_handleExternalLinksClick(e){var link=e.target;if(!link.mozMatchesSelector('a.external')){return;}
e.preventDefault();var href=link.href,title=link.getAttribute('title')||link.textContent;if(navigator.onLine){this.displayExternalLink(href,title);}else{UIManager.displayOfflineDialog(href,title);}},displayExternalLink:function n_displayExternalLink(href,title){window.open(href,'','dialog');},ensureTZInitialized:function(){if(!this.tzInitialized){return UIManager.initTZ().then(()=>{this.skipDateTimeScreen=!UIManager.timeZoneNeedsConfirmation;this.tzInitialized=true;});}else{return Promise.resolve();}},handleEvent:function n_handleEvent(event){var actualHash=window.location.hash;switch(actualHash){case'#languages':UIManager.mainTitle.setAttribute('data-l10n-id','language');break;case'#data_3g':UIManager.mainTitle.setAttribute('data-l10n-id','3g');DataMobile.getStatus(UIManager.updateDataConnectionStatus.bind(UIManager));break;case'#wifi':DataMobile.removeSVStatusObserver();UIManager.mainTitle.setAttribute('data-l10n-id','selectNetwork');UIManager.activationScreen.classList.remove('no-options');if(UIManager.navBar.classList.contains('secondary-menu')){UIManager.navBar.classList.remove('secondary-menu');return;}
WifiManager.getNetworks(networks=>{this.ensureTZInitialized().then(()=>{WifiUI.renderNetworks(networks);});});break;case'#date_and_time':UIManager.mainTitle.setAttribute('data-l10n-id','dateAndTime');break;case'#geolocation':UIManager.mainTitle.setAttribute('data-l10n-id','geolocation');break;case'#import_contacts':UIManager.mainTitle.setAttribute('data-l10n-id','importContacts3');SimManager.checkSIMButton();SdManager.checkSDButton();var onlineState;if(!WifiManager.api){ImportIntegration.checkImport('enabled');break;}
onlineState=window.navigator.onLine?'enabled':'disabled';ImportIntegration.checkImport(onlineState);break;case'#firefox_accounts':UIManager.mainTitle.setAttribute('data-l10n-id','firefox-accounts');break;case'#welcome_browser':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');var settings=navigator.mozSettings;var basicMetrics=document.getElementById('metrics-basic');var enhancedMetrics=document.getElementById('metrics-enhanced');var noneMetrics=document.getElementById('metrics-none');var defaultLevel=settings&&settings.createLock().get(METRICSSETTING);if(defaultLevel){defaultLevel.onsuccess=function(){var result=defaultLevel.result[METRICSSETTING];if(result==='Basic'){basicMetrics.checked=true;}else if(result==='Enhanced'){enhancedMetrics.checked=true;}else if(result==='None'){noneMetrics.checked=true;}};}
var dogfood=settings&&settings.createLock().get(DOGFOODSETTING);if(dogfood){dogfood.onsuccess=function(){if(dogfood.result[DOGFOODSETTING]){basicMetrics.setAttribute('disabled','true');enhancedMetrics.setAttribute('disabled','true');noneMetrics.setAttribute('disabled','true');}else{basicMetrics.removeAttribute('disabled');enhancedMetrics.removeAttribute('disabled');noneMetrics.removeAttribute('disabled');}};}
break;case'#browser_privacy':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');break;case'#SIM_mandatory':UIManager.mainTitle.setAttribute('data-l10n-id','SIM_mandatory');break;case'#about-your-rights':case'#about-your-privacy':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');UIManager.navBar.classList.add('back-only');break;case'#sharing-performance-data':UIManager.mainTitle.setAttribute('data-l10n-id','aboutBrowser');UIManager.navBar.classList.add('back-only');break;}
if(this.simMandatory){UIManager.skipPinButton.classList.add('hidden');UIManager.backSimButton.classList.remove('hidden');}else{UIManager.skipPinButton.classList.remove('hidden');UIManager.backSimButton.classList.add('hidden');}
var lastIndex=this.stepCount-1;if(this.currentStepIndex<=lastIndex&&(this.stepAt(this.currentStepIndex).hash!=='#wifi')){UIManager.activationScreen.classList.add('no-options');}
if(this.currentStepIndex<=lastIndex&&this.stepAt(this.currentStepIndex).hash===actualHash){UIManager.navBar.classList.remove('back-only');}},postStepMessage:function n_postStepMessage(stepIndex){if(!this.ports){return;}
var step=this.stepAt(stepIndex);this.ports.forEach(function(port){port.postMessage({type:'step',hash:step.hash});});},skipStep:function n_skipStep(){var stepIndex=this.currentStepIndex;stepIndex+=stepIndex>this.previousStepIndex?1:-1;if(stepIndex<=0){this.previousStepIndex=stepIndex=0;}
if(stepIndex>this.stepCount){this.previousStepIndex=stepIndex=this.stepCount;}
this.currentStepIndex=stepIndex;this.manageStep();},manageStep:function n_manageStep(){var self=this;if(self.currentStepIndex>self.previousStepIndex){self.postStepMessage(self.previousStepIndex);}
if(self.currentStepIndex>=self.stepCount){OperatorVariant.setSIMOnFirstBootState();}
if(self.currentStepIndex===0){self.skipMobileDataScreen=false;}
var futureLocation=this.stepAt(self.currentStepIndex);if(this.simMandatory&&!IccHelper.cardState&&futureLocation.requireSIM){futureLocation.hash='#SIM_mandatory';futureLocation.requireSIM=false;futureLocation.onlyBackward=true;}
if(this.stepAt(this.currentStepIndex).onlyForward){UIManager.navBar.classList.add('forward-only');}else{UIManager.navBar.classList.remove('forward-only');}
var nextButton=document.getElementById('forward');if(this.stepAt(this.currentStepIndex).onlyBackward){nextButton.setAttribute('disabled','disabled');}else{nextButton.removeAttribute('disabled');}
if(this.currentStepIndex===this.stepCount){nextButton.setAttribute('data-l10n-id','done');}else{nextButton.setAttribute('data-l10n-id','navbar-next');}
if(futureLocation.hash==='#firefox_accounts'){nextButton.setAttribute('data-l10n-id','skip');}
window.location.hash=futureLocation.hash;if(futureLocation.requireSIM){var check_cardState=function(response){if(!response||(!SimManager.available()&&futureLocation.hash!=='#data_3g')){self.skipStep();if(self.currentStepIndex>self.previousStepIndex){self.skipMobileDataScreen=true;}}};var skipUnlockScreens=this.currentStepIndex<this.previousStepIndex;SimManager.handleCardState(check_cardState,skipUnlockScreens);}
if(this.stepAt(this.currentStepIndex).hash==='#date_and_time'){if(!self.tzInitialized){self.skipDateTimeScreen=!UIManager.timeZoneNeedsConfirmation;}
if(self.skipDateTimeScreen){self.postStepMessage(self.currentStepIndex);if(navigator.onLine){UIManager.updateSetting('time.timezone.automatic-update.enabled',true);UIManager.updateSetting('time.clock.automatic-update.enabled',true);}
self.skipStep();}}
if((futureLocation.hash==='#firefox_accounts'&&!navigator.onLine)||(futureLocation.hash==='#firefox_accounts'&&UIManager.skipFxA)){self.postStepMessage(self.currentStepIndex);self.skipStep();}}};})(window);

View file

@ -0,0 +1,7 @@
;'use strict';var OperatorVariant=(function(){var NO_SIM='000-000';function setSIMOnFirstBootState(){var cardValue;function normalizeCode(aCode){var ncode=''+aCode;while(ncode.length<3){ncode='0'+ncode;}
return ncode;}
try{if(!IccHelper||!IccHelper.cardState){cardValue=NO_SIM;}else{var mcc=IccHelper.iccInfo.mcc;var mnc=IccHelper.iccInfo.mnc;if((mcc!==undefined)&&(mcc!==null)&&(mnc!==undefined)&&(mnc!==null)){cardValue=normalizeCode(mcc)+'-'+normalizeCode(mnc);}else{cardValue=NO_SIM;}}
var settings=navigator.mozSettings;if(!settings){console.log('Settings is not available');return;}
var req=settings.createLock().get('ftu.simPresentOnFirstBoot');req.onsuccess=function ov_onsuccess(){var currentStatus=req.result['ftu.simPresentOnFirstBoot'];if(currentStatus===undefined||currentStatus===null){var result=navigator.mozSettings.createLock().set({'ftu.simPresentOnFirstBoot':cardValue});result.onerror=function ov_error(){console.error('An error occurre setting '+'ftu.simPresentOnFirstBoot: '+cardValue);};}
cardValue=null;};req.onerror=function ov_error(){console.error('Error retrieving ftu.simPresentOnFirstBoot');};}catch(e){console.error('Error setSIMOnFirstBootState. '+e);}}
return{setSIMOnFirstBootState:setSIMOnFirstBootState};})();

View file

@ -0,0 +1,9 @@
;'use strict';var FTU_APP_ORIGIN=document.location.protocol+'//'+
document.location.host;var ServicesLauncher=(function(document){var extensionFrame=document.querySelector('#iframe_extensions');var oauthFrame=document.querySelector('#iframe_oauth');var BASE_IMPORT='/shared/pages/import/import.html?ftu=1';function getServiceURI(service){return BASE_IMPORT+'&service='+service;}
var access_token,currentURI,currentService;function open(){extensionFrame.className='opening';}
function load(targetService){currentService=targetService;currentURI=getServiceURI(targetService);window.addEventListener('message',messageHandler);oauthFrame.contentWindow.postMessage({type:'start',data:{from:'friends',service:targetService}},FTU_APP_ORIGIN);}
function unload(){window.removeEventListener('message',messageHandler);extensionFrame.src=null;}
function close(messageId){extensionFrame.addEventListener('transitionend',function tclose(){extensionFrame.removeEventListener('transitionend',tclose);extensionFrame.src=null;if(messageId){utils.status.show(messageId);}});extensionFrame.className='closing';window.removeEventListener('message',messageHandler);}
function messageHandler(e){if(e.origin!==FTU_APP_ORIGIN){return;}
var data=e.data;switch(data.type){case'ready':open();break;case'abort':unload();break;case'window_close':close(data.messageId);break;case'authenticated':extensionFrame.src=currentURI;access_token=data.data;break;case'messaging_ready':extensionFrame.contentWindow.postMessage({type:'token',data:access_token},FTU_APP_ORIGIN);break;}}
return{start:load};})(document);

View file

@ -0,0 +1,33 @@
;'use strict';var SimManager=(function(){function Icc(mozIcc){this.mozIcc=mozIcc;}
Icc.prototype={skipped:false,unlocked:false,alreadyImported:false,mozIcc:null,isLocked:function(){return!this.unlocked&&lockStates.indexOf(this.mozIcc.cardState)!==-1;}};function showRetryCount(icc,lockType,uiElement){var request=icc.mozIcc.getCardLockRetryCount(lockType);request.onsuccess=function(){var retryCount=request.result.retryCount;if(retryCount){var l10nArgs={n:retryCount};document.l10n.setAttributes(uiElement,'inputCodeRetriesLeft',l10nArgs);uiElement.classList.remove('hidden');}};request.onerror=function(){console.error('Could not fetch CardLockRetryCount',request.error.name);};}
var lockStates=['pinRequired','pukRequired','networkLocked','corporateLocked','serviceProviderLocked','network1Locked','network2Locked','hrpdNetworkLocked','ruimCorporateLocked','ruimServiceProviderLocked'];return{icc0:null,icc1:null,simSlots:window.navigator.mozMobileConnections?window.navigator.mozMobileConnections.length:0,_unlockingIcc:null,init:function sm_init(){this.mobConn=window.navigator.mozMobileConnections;if(!this.mobConn){return;}
this.iccManager=window.navigator.mozIccManager;if(!this.iccManager){return;}
this.icc0=null;this.icc1=null;if(this.iccManager.iccIds[0]){this.updateIccState(this.iccManager.iccIds[0]);}
if(this.iccManager.iccIds[1]){this.updateIccState(this.iccManager.iccIds[1]);}
this.iccManager.addEventListener('iccdetected',this.handleIccState.bind(this));this.alreadyImported=false;},handleUnlockError:function sm_handleUnlockError(lockType,retryCount){var l10nArgs={n:retryCount};switch(lockType){case'pin':if(retryCount===0){this.showPukScreen(this._unlockingIcc);break;}
UIManager.pinInput.value='';UIManager.pinInput.classList.add('onerror');UIManager.pinError.classList.remove('hidden');document.l10n.setAttributes(UIManager.pinRetriesLeft,'inputCodeRetriesLeft',l10nArgs);UIManager.pinRetriesLeft.classList.remove('hidden');if(retryCount===1){UIManager.pinError.querySelector('.lastchance').classList.remove('hidden');}else{document.l10n.setAttributes(UIManager.pinError.querySelector('.main'),'pinAttemptMsg2',l10nArgs);UIManager.pinError.querySelector('.main').classList.remove('hidden');}
break;case'puk':UIManager.pukInput.value='';UIManager.pukInput.classList.add('onerror');UIManager.pukError.classList.remove('hidden');UIManager.pukInfo.classList.add('hidden');document.l10n.setAttributes(UIManager.pukRetriesLeft,'inputCodeRetriesLeft',l10nArgs);UIManager.pukRetriesLeft.classList.remove('hidden');if(retryCount===1){UIManager.pukError.querySelector('.lastchance').classList.remove('hidden');}else{document.l10n.setAttributes(UIManager.pukError.querySelector('.main'),'pukAttemptMsg2',l10nArgs);UIManager.pukError.querySelector('.main').classList.remove('hidden');}
break;case'nck':case'cck':case'spck':UIManager.xckInput.value='';UIManager.xckInput.classList.add('onerror');UIManager.xckError.classList.remove('hidden');document.l10n.setAttributes(UIManager.xckRetriesLeft,'inputCodeRetriesLeft',l10nArgs);UIManager.xckRetriesLeft.classList.remove('hidden');if(retryCount==1){UIManager.xckError.querySelector('.lastchance').classList.remove('hidden');}else{document.l10n.setAttributes(UIManager.xckError.querySelector('.main'),'nckAttemptMsg2',l10nArgs);UIManager.xckError.querySelector('.main').classList.remove('hidden');}
break;}},available:function sm_available(){var icc=this.guessIcc();return(icc&&icc.cardState==='ready');},handleIccState:function sm_handleIccState(event){this.updateIccState(event.iccId);},updateIccState:function(iccId){var iccInfo=this.iccManager.getIccById(iccId);if(!iccInfo){throw new Error('Unrecognized iccID: '+iccId);}
if(this.mobConn[0]&&iccId===this.mobConn[0].iccId){this.icc0=new Icc(iccInfo);}else if(this.mobConn[1]&&iccId===this.mobConn[1].iccId){this.icc1=new Icc(iccInfo);}else{console.warn('ICC detected in unsupported slot',iccId);}},handleCardState:function sm_handleCardState(callback,skipUnlockScreen){this._unlockingIcc=null;SimManager.checkSIMButton();if(typeof callback==='function'){this.finishCallback=callback;}
if(this.shouldShowUnlockScreen(this.icc0)&&!skipUnlockScreen){this.showUnlockScreen(this.icc0);}else if(this.shouldShowUnlockScreen(this.icc1)&&!skipUnlockScreen){this.showUnlockScreen(this.icc1);}else if(this.shouldShowSIMInfoScreen()){this.resetSkipped();this.showSIMInfoScreen();}else{this.resetSkipped();this.finish();}},finish:function(){this.hideScreen();this.hideSIMInfoScreen();var showCellData=(this.icc0&&!this.icc0.isLocked())||(this.icc1&&!this.icc1.isLocked());this.finishCallback&&this.finishCallback(showCellData);},shouldShowUnlockScreen:function sm_shouldShowLockScreen(icc){return icc&&!icc.skipped&&icc.isLocked();},shouldShowSIMInfoScreen:function sm_shouldShowSIMInfoScreen(){return(this.icc0&&this.icc1);},showUnlockScreen:function sm_showUnlockScreen(icc){if(icc.unlocked){return;}
this._unlockingIcc=icc;switch(icc.mozIcc.cardState){case'pinRequired':this.showPinScreen(icc);break;case'pukRequired':this.showPukScreen(icc);break;case'networkLocked':case'corporateLocked':case'serviceProviderLocked':case'network1Locked':case'network2Locked':case'hrpdNetworkLocked':case'ruimCorporateLocked':case'ruimServiceProviderLocked':this.showXckScreen(icc);break;default:throw new Error('Cannot show SIM unlock screen, unknown cardState '+
icc.mozIcc.cardState);}},voiceChangeListeners:[],updateSIMInfoText:function sm_updateSIMInfoText(icc){var iccNumber=(icc===this.icc0)?1:2;if(icc&&icc.isLocked()){UIManager['simInfo'+iccNumber].classList.add('locked');UIManager['simCarrier'+iccNumber].setAttribute('data-l10n-id','simPinLocked');UIManager['simNumber'+iccNumber].removeAttribute('data-l10n-id');UIManager['simNumber'+iccNumber].textContent='';}else{UIManager['simInfo'+iccNumber].classList.remove('locked');var mobConn=this.mobConn[iccNumber-1];var operator=MobileOperator.userFacingInfo(mobConn).operator;if(!operator&&!this.voiceChangeListeners[iccNumber-1]){this.voiceChangeListeners[iccNumber-1]=function(evt){var operator=MobileOperator.userFacingInfo(mobConn).operator;if(operator){UIManager['simCarrier'+iccNumber].removeAttribute('data-l10n-id');UIManager['simCarrier'+iccNumber].textContent=operator;mobConn.removeEventListener('voicechange',this.voiceChangeListeners[iccNumber-1]);this.voiceChangeListeners[iccNumber-1]=null;}}.bind(this);mobConn.addEventListener('voicechange',this.voiceChangeListeners[iccNumber-1]);}
if(operator){UIManager['simCarrier'+iccNumber].removeAttribute('data-l10n-id');UIManager['simCarrier'+iccNumber].textContent=operator;}else{UIManager['simCarrier'+iccNumber].setAttribute('data-l10n-id','searchingOperator');}
var number=icc.mozIcc.iccInfo.msisdn||icc.mozIcc.iccInfo.mdn||'';if(number){UIManager['simNumber'+iccNumber].textContent=number;UIManager['simInfo'+iccNumber].classList.remove('no-number');}else{UIManager['simInfo'+iccNumber].classList.add('no-number');}}},showSIMInfoScreen:function sm_showSIMInfoScreen(){this.updateSIMInfoText(this.icc0);this.updateSIMInfoText(this.icc1);UIManager.activationScreen.classList.remove('show');UIManager.simInfoScreen.classList.add('show');},hideSIMInfoScreen:function sm_hidescreen(){UIManager.simInfoScreen.classList.remove('show');UIManager.activationScreen.classList.add('show');},checkSIMButton:function sm_checkSIMButton(){if(!this.mobConn){UIManager.simImport.classList.add('hidden');return;}
var simOption=UIManager.simImportButton;if(!SimManager.alreadyImported&&SimManager.available()){simOption.removeAttribute('disabled');UIManager.noSim.classList.add('hidden');}else{simOption.setAttribute('disabled','disabled');if(!SimManager.alreadyImported){UIManager.noSim.classList.remove('hidden');}}},showPinScreen:function sm_showPinScreen(icc){showRetryCount(icc,'pin',UIManager.pinRetriesLeft);UIManager.unlockSimButton.disabled=true;UIManager.pinInput.addEventListener('input',function sm_checkInput(event){UIManager.unlockSimButton.disabled=(event.target.value.length<4);});UIManager.activationScreen.classList.remove('show');UIManager.unlockSimScreen.classList.add('show');UIManager.pincodeScreen.classList.add('show');UIManager.xckcodeScreen.classList.remove('show');UIManager.unlockSimHeader.setAttribute('data-l10n-id','pincode2');if(this.simSlots>1){var simNumber=icc===this.icc0?1:2;document.l10n.setAttributes(UIManager.pinLabel,'pincodeLabel',{n:simNumber});}else{UIManager.pinLabel.setAttribute('data-l10n-id','type_pin');}
UIManager.pinInput.focus();},showPukScreen:function sm_showPukScreen(icc){showRetryCount(icc,'puk',UIManager.pukRetriesLeft);UIManager.unlockSimScreen.classList.add('show');UIManager.activationScreen.classList.remove('show');UIManager.pincodeScreen.classList.remove('show');UIManager.pukcodeScreen.classList.add('show');UIManager.xckcodeScreen.classList.remove('show');UIManager.unlockSimHeader.setAttribute('data-l10n-id','pukcode');if(this.simSlots>1){var simNumber=icc===this.icc0?1:2;document.l10n.setAttributes(UIManager.pukLabel,'pukcodeLabel',{n:simNumber});}else{UIManager.pukLabel.setAttribute('data-l10n-id','type_puk');}
UIManager.pukInput.focus();},showXckScreen:function sm_showXckScreen(icc){var lockType;switch(icc.mozIcc.cardState){case'networkLocked':lockType='nck';break;case'corporateLocked':lockType='cck';break;case'serviceProviderLocked':lockType='spck';break;case'network1Locked':lockType='nck1';break;case'network2Locked':lockType='nck2';break;case'hrpdNetworkLocked':lockType='hnck';break;case'ruimCorporateLocked':lockType='rcck';break;case'ruimServiceProviderLocked':lockType='rspck';break;default:return;}
showRetryCount(icc,lockType,UIManager.xckRetriesLeft);UIManager.unlockSimScreen.classList.add('show');UIManager.activationScreen.classList.remove('show');UIManager.pincodeScreen.classList.remove('show');UIManager.pukcodeScreen.classList.remove('show');UIManager.xckcodeScreen.classList.add('show');var simNumber=icc===this.icc0?1:2;switch(icc.mozIcc.cardState){case'networkLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'nckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'nckcodeLabel',{n:simNumber});break;case'corporateLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'cckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'cckcodeLabel',{n:simNumber});break;case'serviceProviderLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'spckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'spckcodeLabel',{n:simNumber});break;case'network1Locked':document.l10n.setAttributes(UIManager.unlockSimHeader,'nck1codeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'nck1codeLabel',{n:simNumber});break;case'network2Locked':document.l10n.setAttributes(UIManager.unlockSimHeader,'nck2codeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'nck2codeLabel',{n:simNumber});break;case'hrpdNetworkLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'hnckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'hnckcodeLabel',{n:simNumber});break;case'ruimCorporateLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'rcckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'rcckcodeLabel',{n:simNumber});break;case'ruimServiceProviderLocked':document.l10n.setAttributes(UIManager.unlockSimHeader,'rspckcodeTitle',{n:simNumber});document.l10n.setAttributes(UIManager.xckLabel,'rspckcodeLabel',{n:simNumber});break;}
UIManager.xckInput.focus();},resetForm:function sm_clearInputs(){this.clearFields();UIManager.newpinInput.value='';UIManager.confirmNewpinInput.value='';UIManager.pinInput.value='';UIManager.pukInput.value='';UIManager.pukInfo.classList.remove('hidden');UIManager.xckInput.value='';UIManager.unlockSimButton.disabled=false;},hideScreen:function sm_hideScreen(){UIManager.unlockSimScreen.classList.remove('show');UIManager.pincodeScreen.classList.remove('show');UIManager.pukcodeScreen.classList.remove('show');UIManager.xckcodeScreen.classList.remove('show');UIManager.activationScreen.classList.add('show');},skip:function sm_skip(){if(this._unlockingIcc){this._unlockingIcc.skipped=true;}
this.resetForm();this.hideScreen();this.handleCardState();},resetSkipped:function sm_resetSkipped(){if(this.icc0){this.icc0.skipped=false;}
if(this.icc1){this.icc1.skipped=false;}},back:function sm_back(){this.resetForm();this.resetSkipped();this.hideScreen();this.hideSIMInfoScreen();Navigation.back();},simUnlockBack:function sm_simUnlockBack(){if(this.icc0&&this.icc0.skipped){this.icc0.skipped=false;this.hideScreen();this.handleCardState();}else{this.back();}},unlock:function sm_unlock(){var icc=this._unlockingIcc;if(!icc){throw new Error('Cannot unlock SIM, no current ICC');}
this.clearFields();switch(icc.mozIcc.cardState){case'pinRequired':this.unlockPin(icc);break;case'pukRequired':this.unlockPuk(icc);break;case'networkLocked':case'corporateLocked':case'serviceProviderLocked':case'network1Locked':case'network2Locked':case'hrpdNetworkLocked':case'ruimCorporateLocked':case'ruimServiceProviderLocked':this.unlockXck(icc);break;}},unlockPin:function sm_unlockPin(icc){var pin=UIManager.pinInput.value;if(pin.length<4||pin.length>8){UIManager.pinError.querySelector('.main').setAttribute('data-l10n-id','pinValidation');UIManager.pinInput.classList.add('onerror');UIManager.pinError.classList.remove('hidden');UIManager.pinInput.focus();return;}else{UIManager.pinInput.classList.remove('onerror');UIManager.pinError.classList.add('hidden');}
this.attemptUnlock(icc,{lockType:'pin',pin:pin});},clearFields:function sm_clearFields(){UIManager.pukInput.classList.remove('onerror');UIManager.pukError.classList.add('hidden');UIManager.newpinInput.classList.remove('onerror');UIManager.newpinError.classList.add('hidden');UIManager.confirmNewpinInput.classList.remove('onerror');UIManager.confirmNewpinError.classList.add('hidden');UIManager.pinError.classList.add('hidden');UIManager.pinError.querySelector('.main').classList.add('hidden');UIManager.pinError.querySelector('.lastchance').classList.add('hidden');UIManager.pinRetriesLeft.classList.add('hidden');UIManager.pukError.classList.add('hidden');UIManager.pukError.querySelector('.main').classList.add('hidden');UIManager.pukError.querySelector('.lastchance').classList.add('hidden');UIManager.pukRetriesLeft.classList.add('hidden');UIManager.xckError.classList.add('hidden');UIManager.xckError.querySelector('.main').classList.add('hidden');UIManager.xckError.querySelector('.lastchance').classList.add('hidden');UIManager.xckRetriesLeft.classList.add('hidden');},unlockPuk:function sm_unlockPuk(icc){var pukCode=UIManager.pukInput.value;if(pukCode.length!==8){UIManager.pukError.querySelector('.main').setAttribute('data-l10n-id','pukValidation');UIManager.pukError.classList.remove('hidden');UIManager.pukInfo.classList.add('hidden');UIManager.pukInput.classList.add('onerror');UIManager.pukError.focus();return;}
var newpinCode=UIManager.newpinInput.value;var confirmNewpin=UIManager.confirmNewpinInput.value;if(newpinCode.length<4||newpinCode.length>8){UIManager.newpinError.setAttribute('data-l10n-id','pinValidation');UIManager.newpinError.classList.remove('hidden');UIManager.newpinInput.classList.add('onerror');UIManager.newpinError.focus();return;}
if(newpinCode!=confirmNewpin){UIManager.confirmNewpinError.setAttribute('data-l10n-id','newpinConfirmation');UIManager.confirmNewpinError.classList.remove('hidden');UIManager.newpinInput.classList.add('onerror');UIManager.confirmNewpinInput.classList.add('onerror');UIManager.confirmNewpinError.focus();return;}
var options={lockType:'puk',puk:pukCode,newPin:newpinCode};this.attemptUnlock(icc,options);},unlockXck:function sm_unlockXck(icc){var xck=UIManager.xckInput.value;var lockType;switch(icc.mozIcc.cardState){case'networkLocked':lockType='nck';break;case'corporateLocked':lockType='cck';break;case'serviceProviderLocked':lockType='spck';break;case'network1Locked':lockType='nck1';break;case'network2Locked':lockType='nck2';break;case'hrpdNetworkLocked':lockType='hnck';break;case'ruimCorporateLocked':lockType='rcck';break;case'ruimServiceProviderLocked':lockType='rspck';break;}
if(xck.length<8||xck.length>16){UIManager.xckInput.classList.add('onerror');UIManager.xckError.classList.remove('hidden');UIManager.xckError.querySelector('.main').setAttribute('data-l10n-id',lockType+'Validation');UIManager.xckInput.focus();return;}else{UIManager.pinInput.classList.remove('onerror');UIManager.pinError.classList.add('hidden');}
var options={lockType:lockType,pin:xck};this.attemptUnlock(icc,options);},attemptUnlock:function sm_attemptUnlock(icc,options){var req=icc.mozIcc.unlockCardLock(options);req.onsuccess=(function sm_unlockSuccess(){icc.unlocked=true;this.resetForm();this.hideScreen();this.handleCardState();}).bind(this);req.onerror=(function sm_unlockError(){this.handleUnlockError(options.lockType,req.error.retryCount);}).bind(this);},guessIcc:function guessIcc(){var tempIcc=null;if(navigator.mozMobileConnections){for(var i=0;i<navigator.mozMobileConnections.length&&tempIcc===null;i++){if(navigator.mozMobileConnections[i]!==null&&navigator.mozMobileConnections[i].iccId!==null){tempIcc=navigator.mozIccManager.getIccById(navigator.mozMobileConnections[i].iccId);}}}else{tempIcc=navigator.mozIccManager;}
return tempIcc;},importContacts:function sm_importContacts(){var DELAY_FEEDBACK=300;UIManager.navBar.setAttribute('aria-disabled','true');var progress=utils.overlay.show('simContacts-reading','activityBar');var importButton=UIManager.simImportButton;var cancelled=false,contactsRead=false;var importer=new SimContactsImporter(SimManager.guessIcc());utils.overlay.showMenu();utils.overlay.oncancel=function oncancel(){cancelled=true;importer.finish();if(contactsRead){progress.setClass('activityBar');utils.overlay.hideMenu();progress.setHeaderMsg('messageCanceling');}else{importer.onfinish();}};var importedContacts=0;importer.onread=function sim_import_read(n){contactsRead=true;if(n>0){progress.setClass('progressBar');progress.setHeaderMsg('simContacts-importing');progress.setTotal(n);}};importer.onimported=function imported_contact(){importedContacts++;if(!cancelled){progress.update();}};importer.onfinish=function sim_import_finish(numDupsMerged,iccId){window.setTimeout(function do_sim_import_finish(){UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();if(importedContacts>0){utils.misc.setTimestamp('sim-'+iccId);}
if(!cancelled){SimManager.alreadyImported=true;importButton.setAttribute('disabled','disabled');utils.status.show({id:'simContacts-imported3',args:{n:importedContacts}});}},DELAY_FEEDBACK);importer.onfinish=null;};importer.onerror=function sim_import_error(){UIManager.navBar.removeAttribute('aria-disabled');utils.overlay.hide();importButton.removeAttribute('disabled');var cancel={title:'cancel',callback:function(){ConfirmDialog.hide();}};var retry={title:'retry',isRecommend:true,callback:function(){ConfirmDialog.hide();importButton.click();}};ConfirmDialog.show(null,'simContacts-error',cancel,retry);};importer.start();}};})();

View file

@ -0,0 +1,2 @@
;'use strict';var TimeManager={elementIDs:['tz-region','tz-city','date-configuration','time-configuration'],init:function tm_init(){if(window.navigator.mozTime){this.time=window.navigator.mozTime;}else{console.log('There is no mozTime available in window');}
this.elementIDs.forEach(function(elementID){document.getElementById(elementID+'-button').addEventListener('click',function(evt){evt.preventDefault();var input=document.getElementById(elementID);setTimeout(input.focus.bind(input),10);});});},set:function tm_set(date){this.time.set(date);}};

View file

@ -0,0 +1,11 @@
;(function(exports){'use strict';var currentLayout='tiny';var dom={};var elementIDs=['tutorial','tutorial-step-title','tutorial-step-media','tutorial-step-image','tutorial-step-video','forward-tutorial','back-tutorial'];var Tutorial={config:null,_stepsConfig:{},_stepsKey:'',_currentStep:1,_initialized:false,init:function(stepsKey,onLoaded){if(this._initialized||this._initialization){return;}
var initTasks=this._initialization=new TutorialUtils.Sequence(this.loadConfig.bind(this),this._initWithConfig.bind(this,stepsKey));initTasks.onabort=this._onAbortInitialization.bind(this);initTasks.oncomplete=this._onCompleteInitialization.bind(this,onLoaded);elementIDs.forEach(function(name){dom[Utils.camelCase(name)]=document.getElementById(name);if(!dom[Utils.camelCase(name)]){console.error('Cache DOM elements: couldnt cache: '+name);}},this);initTasks.next();var mediaEvents=this._mediaEvents=['abort','canplay','canplaythrough','durationchange','emptied','ended','error','interruptbegin','interruptend','loadeddata','loadedmetadata','loadstart','mozaudioavailable','pause','play','playing','stalled','suspend','waiting'];this._debugEventHandler={handleEvent:function(evt){var errCodes={'1':'MEDIA_ERR_ABORTED','2':'MEDIA_ERR_NETWORK','3':'MEDIA_ERR_DECODE','4':'MEDIA_ERR_SRC_NOT_SUPPORTED'};console.log('TUTORIAL: media-event: '+evt.type);if(evt.type=='error'){var errtype=errCodes[evt.target.error.code]||'unknown';console.log('TUTORIAL: media-event, '+errtype+' error');}}};mediaEvents.forEach(name=>{dom.tutorialStepVideo.addEventListener(name,this._debugEventHandler);});},start:function(onReady){var sequence;var initInProgress=false;if(this._initialization){sequence=this._initialization;initInProgress=true;}else{this._initialization=sequence=new TutorialUtils.Sequence();sequence.onabort=this._onAbortInitialization.bind(this);sequence.oncomplete=this._onCompleteInitialization.bind(this);}
sequence.push(function setInitialStep(){console.log('TUTORIAL: setInitialStep');return this._setStep();}.bind(this));sequence.push(function showTutorialAndFinishInit(){dom.tutorial.classList.add('show');console.log('TUTORIAL: dispatching tutorialinitialized');window.dispatchEvent(new CustomEvent('tutorialinitialized'));});if(typeof onReady==='function'){sequence.push(onReady);}
if(!initInProgress){sequence.next();}},_initWithConfig:function(stepsKey){stepsKey=stepsKey||'default';this._stepsKey=stepsKey;this._stepsConfig=this.config[stepsKey]||this.config['default'];dom.forwardTutorial.addEventListener('click',this);dom.backTutorial.addEventListener('click',this);this._currentStep=1;},_onAbortInitialization:function(){this._initialization=null;},_onCompleteInitialization:function(onReady){this._initialization=null;this._initialized=true;if(typeof onReady==='function'){onReady();}},_setStep:function(value){value=(typeof value==='number')?value:this._currentStep;var stepIndex=value-1;if(stepIndex>=this._stepsConfig.steps.length){return Promise.resolve().then(function(){Tutorial.done();});}
var stepData=this._stepsConfig.steps[stepIndex];if(!stepData){return Promise.reject('No data for step: '+value);}
dom.tutorial.dataset.step=this._currentStep;document.l10n.setAttributes(dom.tutorialStepTitle,stepData.l10nKey);var imgElement=dom.tutorialStepImage,videoElement=dom.tutorialStepVideo;var stepPromise;if(stepData.video){stepPromise=TutorialUtils.getBestAssetForDirection(stepData.video).then((bestSrc)=>{return TutorialUtils.loadAndPlayMedia(videoElement,bestSrc);});videoElement.hidden=false;imgElement.hidden=true;}else{imgElement.hidden=false;stepPromise=TutorialUtils.loadMedia(imgElement,stepData.image);imgElement.hidden=false;videoElement.hidden=true;}
return stepPromise;},handleEvent:function(evt){if(evt.type==='click'){switch(evt.target){case dom.forwardTutorial:this.next(evt);break;case dom.backTutorial:this.back(evt);break;}}},next:function(){return this._setStep(++this._currentStep);},back:function(){return this._setStep(--this._currentStep);},done:function(){var isUpgrade=this._stepsKey&&this._stepsKey!=='default';FinishScreen.init(isUpgrade);dom.tutorial.classList.remove('show');dom.tutorialStepVideo.removeAttribute('src');dom.tutorialStepImage.removeAttribute('src');},loadConfig:function(){if(!this._configPromise){currentLayout=ScreenLayout.getCurrentLayout()==='tiny'?'tiny':'large';var configUrl='/config/'+currentLayout+'.json';this._configPromise=LazyLoader.getJSON(configUrl).then(function(json){Tutorial.config=json;return Tutorial.config;},function(){return new Error('Tutorial config failed to load from: '+configUrl);});}
return this._configPromise;},reset:function(){var resetPromise=Promise.resolve();if(dom.tutorialStepVideo){this._mediaEvents.forEach(name=>{dom.tutorialStepVideo.removeEventListener(name,this._debugEventHandler);});dom.tutorialStepVideo.hidden=true;if(dom.tutorialStepVideo.src){resetPromise=new Promise((resolve,reject)=>{dom.tutorialStepVideo.addEventListener('emptied',()=>{resolve();});dom.tutorialStepVideo.removeAttribute('src');dom.tutorialStepVideo.load();});}}
if(this._initialization){this._initialization.abort();this._initialization=null;}
this._configPromise=null;this._currentStep=1;this._stepsConfig=this.config=null;if(this._initialized){dom.tutorial.classList.remove('show');this._initialized=false;}
document.getElementById('tutorial').classList.remove('show');return resetPromise;}};exports.Tutorial=Tutorial;})(this);

View file

@ -0,0 +1,8 @@
;(function(exports){'use strict';var TutorialUtils={loadMedia:function(mediaElement,src){console.log('loadMedia, got mediaElement: ',mediaElement);var isVideo=(mediaElement.nodeName==='VIDEO');console.log('TutorialUtils.loadMedia, isVideo: ',isVideo,mediaElement.nodeName);return new Promise(function(resolve,reject){function onMediaLoadOrError(evt){console.log('TutorialUtils.loadMedia, onMediaLoadOrError for '+'evt.type: '+(evt&&evt.type));evt.target.removeEventListener('error',onMediaLoadOrError);if(isVideo){evt.target.removeEventListener('canplay',onMediaLoadOrError);evt.target.removeEventListener('abort',onMediaLoadOrError);}else{evt.target.removeEventListener('load',onMediaLoadOrError);}
if(evt.type==='error'){console.error('Failed to load tutorial media: '+src);}else if(evt.type==='abort'){console.error('Loading of tutorial media aborted: '+src);}
resolve(evt);}
function onVideoUnloaded(evt){console.log('TutorialUtils.loadMedia, onVideoUnloaded for evt.type: '+
(evt&&evt.type));mediaElement.removeEventListener('emptied',onVideoUnloaded);mediaElement.addEventListener('canplay',onMediaLoadOrError);mediaElement.addEventListener('abort',onMediaLoadOrError);mediaElement.addEventListener('error',onMediaLoadOrError);console.log('TutorialUtils.loadMedia, onVideoUnloaded, '+'assigning src: '+src);mediaElement.src=src;mediaElement.load();}
if(isVideo){if(mediaElement.src){console.log('TutorialUtils.loadMedia, removing src attribute');mediaElement.removeAttribute('src');mediaElement.addEventListener('emptied',onVideoUnloaded,false);console.log('TutorialUtils.loadMedia, calling load');mediaElement.load();}else{console.log('TutorialUtils.loadMedia, no src, '+'just calling onVideoUnloaded');onVideoUnloaded();}}else{console.log('TutorialUtils.loadMedia, not a video, '+'listen for load/error only');mediaElement.addEventListener('load',onMediaLoadOrError,false);mediaElement.addEventListener('error',onMediaLoadOrError,false);mediaElement.src=src;}});},loadAndPlayMedia:function(mediaElement,src){return this.loadMedia(mediaElement,src).then((evt)=>{if(evt.type!=='error'&&mediaElement.nodeName==='VIDEO'){mediaElement.play();}});},fileExists:function(src){return new Promise((resolve)=>{window.fetch(src,{method:'HEAD'}).then((response)=>{resolve(response.ok);}).catch(()=>{resolve(false);});});},getBestAssetForDirection:function(src){var dir=document.dir||'ltr';var re=/(-rtl|ltr)?\.(png|gif|jpg|webm|mp4|m4v|ogg|ogv)$/;var directionSrc=src.replace(re,'-'+dir+'.$2');return this.fileExists(directionSrc).then((result)=>{return result?directionSrc:src;}).catch((e)=>{console.log('Exception from getBestAssetForDirection: ',e);});},Sequence:function(){var sequence=Array.slice(arguments);var aborted=false;sequence.abort=function(){aborted=true;this.length=0;if(typeof this.onabort==='function'){this.onabort();}};sequence.complete=function(result){if(!aborted&&typeof this.oncomplete==='function'){this.oncomplete(result);}};sequence.fail=function(reason){this.complete(reason);};sequence.next=function(previousTaskResult){var result,exception;if(aborted){return;}
var task=this.shift();if(task){try{result=task.apply(null,arguments);}catch(e){exception=e;}
if(exception){this.fail(exception);}else if(result&&typeof result.then==='function'){result.then(this.next.bind(this),this.fail.bind(this));}else{this.next(result);}}else{this.complete(previousTaskResult);}};return sequence;}};exports.TutorialUtils=TutorialUtils;})(window);

View file

@ -0,0 +1,11 @@
;'use strict';var UIManager={domSelectors:['container','splash-screen','activation-screen','finish-screen','update-screen','nav-bar','main-title','unlock-sim-screen','unlock-sim-header','unlock-sim-action','pincode-screen','pin-label','pin-retries-left','pin-input','back-sim-button','pin-error','skip-pin-button','unlock-sim-button','pukcode-screen','puk-label','puk-retries-left','puk-input','puk-info','puk-error','newpin-input','newpin-error','confirm-newpin-input','confirm-newpin-error','xckcode-screen','xck-label','xck-retries-left','xck-input','xck-error','sim-info-screen','sim-info-back','sim-info-forward','sim-info-1','sim-info-2','sim-number-1','sim-number-2','sim-carrier-1','sim-carrier-2','sim-import','sim-import-button','no-sim','sd-import-button','no-memorycard','fxa-create-account','fxa-intro','networks','wifi-refresh-button','wifi-join-button','join-hidden-button','hidden-wifi-authentication','hidden-wifi-ssid','hidden-wifi-security','hidden-wifi-password','hidden-wifi-password-box','hidden-wifi-identity','hidden-wifi-identity-box','hidden-wifi-show-password','date-configuration','time-configuration','date-configuration-label','time-configuration-label','time-form','data-connection-switch','geolocation-switch','lets-go-button','update-lets-go-button','skip-tutorial-button','update-skip-tutorial-button','metrics-basic','metrics-enhanced','metrics-none','offline-error-dialog','newsletter-form','newsletter-input','newsletter-success-screen','offline-newsletter-error-dialog','invalid-email-error-dialog'],dataConnectionChangedByUsr:false,timeZoneNeedsConfirmation:true,DARK_THEME:'#242d33',LIGHT_THEME:'#eeeeee',init:function ui_init(){this.domSelectors.forEach(function createElementRef(name){this[toCamelCase(name)]=document.getElementById(name);}.bind(this));this._settingsObserveHandler={'geolocation.enabled':{defaultValue:this.geolocationSwitch.checked,callback:function(value){var isEnabled=!!value;if(this.geolocationSwitch.checked!==isEnabled){this.geolocationSwitch.checked=isEnabled;}}.bind(this)}};for(var name in this._settingsObserveHandler){SettingsListener.observe(name,this._settingsObserveHandler[name].defaultValue,this._settingsObserveHandler[name].callback);}
var currentDate=new Date();this.timeConfigurationLabel.textContent=currentDate.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',second:'numeric'});this.dateConfigurationLabel.textContent=currentDate.toLocaleString(navigator.languages,{year:'numeric',month:'numeric',day:'numeric'});this.simImportButton.addEventListener('click',this);this.sdImportButton.addEventListener('click',this);this.skipPinButton.addEventListener('click',this);this.backSimButton.addEventListener('click',this);this.unlockSimButton.addEventListener('click',this);this.unlockSimAction.addEventListener('action',this);this.simInfoBack.addEventListener('click',this);this.simInfoForward.addEventListener('click',this);this.dataConnectionSwitch.addEventListener('change',this);this.wifiRefreshButton.addEventListener('click',this);this.wifiJoinButton.addEventListener('click',this);this.networks.addEventListener('click',this);this.joinHiddenButton.addEventListener('click',this);this.hiddenWifiSecurity.addEventListener('change',this);this.wifiJoinButton.disabled=true;var checkHiddenWifiJoin=function(){this.wifiJoinButton.disabled=this.hiddenWifiSsid.value===''||!WifiHelper.isValidInput(this.hiddenWifiSecurity.value,this.hiddenWifiPassword.value,this.hiddenWifiIdentity.value);}.bind(this);this.hiddenWifiSsid.addEventListener('keyup',checkHiddenWifiJoin);this.hiddenWifiIdentity.addEventListener('keyup',checkHiddenWifiJoin);this.hiddenWifiPassword.addEventListener('keyup',checkHiddenWifiJoin);this.hiddenWifiSecurity.addEventListener('change',checkHiddenWifiJoin);this.hiddenWifiShowPassword.onchange=function togglePasswordVisibility(){UIManager.hiddenWifiPassword.type=this.checked?'text':'password';};this.timeConfiguration.addEventListener('input',this);this.dateConfiguration.addEventListener('input',this);this.geolocationSwitch.addEventListener('change',this);this.fxaCreateAccount.addEventListener('click',this);this.timeForm.addEventListener('submit',function(event){event.preventDefault();});this.newsletterInput.addEventListener('focus',function(){window.addEventListener('resize',function resize(){window.removeEventListener('resize',resize);setTimeout(function(){var page=document.getElementById('browser_privacy');UIManager.scrollToElement(page,UIManager.newsletterInput);},30);});});this.offlineNewsletterErrorDialog.querySelector('button').addEventListener('click',function offlineDialogClick(){this.offlineNewsletterErrorDialog.classList.remove('visible');}.bind(this));this.invalidEmailErrorDialog.querySelector('button').addEventListener('click',function invalidEmailDialogClick(){this.invalidEmailErrorDialog.classList.remove('visible');}.bind(this));var skipTutorialAction=function(){WifiManager.finish();if(ScreenLayout.getCurrentLayout()==='tiny'){window.close();}else{FinishScreen.init();}};var startTutorialAction=function(evt){WifiManager.finish();Tutorial.start(function onTutorialLoaded(){UIManager.activationScreen.classList.remove('show');UIManager.updateScreen.classList.remove('show');UIManager.finishScreen.classList.remove('show');});};this.skipTutorialButton.addEventListener('click',skipTutorialAction);this.updateSkipTutorialButton.addEventListener('click',skipTutorialAction);this.letsGoButton.addEventListener('click',startTutorialAction);this.updateLetsGoButton.addEventListener('click',startTutorialAction);this.metricsBasic.addEventListener('change',this);this.metricsEnhanced.addEventListener('change',this);this.metricsNone.addEventListener('change',this);var button=this.offlineErrorDialog.querySelector('button');button.addEventListener('click',this.onOfflineDialogButtonClick.bind(this));['confirmdialogshowing','loadingoverlayshowing','tutorialinitialized'].forEach(function(event){window.addEventListener(event,this.hideActivationScreenFromScreenReader.bind(this));},this);['confirmdialoghiding','loadingoverlayhiding'].forEach(function(event){window.addEventListener(event,this.showActivationScreenToScreenReader.bind(this));},this);this.checkInitialFxAStatus();},scrollToElement:function ui_scrollToElement(container,element){container.scrollTop=element.offsetTop;},sendNewsletter:function ui_sendNewsletter(callback){var self=this;var emailValue=self.newsletterInput.value;if(emailValue===''){return callback(true);}else{utils.overlay.show('email-loading','spinner');if(self.newsletterInput.checkValidity()){if(window.navigator.onLine){Basket.send(emailValue,function emailSent(err,data){if(err){if(err.code&&err.code===Basket.errors.INVALID_EMAIL){ConfirmDialog.show('invalid-email-dialog-title','invalid-email-dialog-text',{title:'cancel',callback:function ok(){ConfirmDialog.hide();}});utils.overlay.hide();return callback(false);}else{Basket.store(emailValue);}}
utils.overlay.hide();return callback(true);});}else{Basket.store(emailValue,function stored(errorStoring){utils.overlay.hide();return callback(!errorStoring);});}}else{utils.overlay.hide();ConfirmDialog.show('invalid-email-dialog-title','invalid-email-dialog-text',{title:'cancel',callback:function ok(){ConfirmDialog.hide();}});return callback(false);}}},initTZ:function ui_initTZ(){var self=this;var tzRegion=document.getElementById('tz-region');var tzCity=document.getElementById('tz-city');return new Promise(function(resolve){var onchange=self.setTimeZone.bind(self);var onload=function(){self.setTimeZone.apply(self,arguments);resolve();};tzSelect(tzRegion,tzCity,onchange,onload);});},handleEvent:function ui_handleEvent(event){switch(event.target.id){case'skip-pin-button':SimManager.skip();break;case'back-sim-button':case'sim-info-back':SimManager.back();break;case'unlock-sim-button':SimManager.unlock();break;case'unlock-sim-action':SimManager.simUnlockBack();break;case'sim-info-forward':SimManager.finish();break;case'sim-import-button':window.setTimeout(SimManager.importContacts,0);break;case'sd-import-button':window.setTimeout(SdManager.importContacts,0);break;case'data-connection-switch':this.dataConnectionChangedByUsr=true;var status=event.target.checked;DataMobile.toggle(status);break;case'wifi-refresh-button':WifiManager.scan(WifiUI.renderNetworks);break;case'wifi-join-button':if(window.location.hash==='#hidden-wifi-authentication'){WifiUI.joinHiddenNetwork();}else{WifiUI.joinNetwork();}
break;case'join-hidden-button':WifiUI.addHiddenNetwork();break;case'hidden-wifi-security':var securityType=event.target.selectedIndex?event.target.value:'';WifiUI.handleHiddenWifiSecurity(securityType);break;case'time-configuration':this.setTime();break;case'date-configuration':this.setDate();break;case'geolocation-switch':this.updateSetting(event.target.name,event.target.checked);break;case'metrics-enhanced':this.updateSetting('hud.hide',(event.target.value==='Enhanced'));this.updateSetting('devtools.overlay',(event.target.value==='Enhanced'));case'metrics-basic':case'metrics-none':this.updateSetting('metrics.selectedMetrics.level',event.target.value);break;case'fxa-create-account':this.createFirefoxAccount();break;default:if(event.target.parentNode.id==='networks-list'){WifiUI.chooseNetwork(event);}
break;}},updateSetting:function ui_updateSetting(name,value){if(!name){return;}
var cset={};cset[name]=value;return SettingsListener.getSettingsLock().set(cset);},setForwardButtonLabel:function ui_setForwardButtonLabel(label){var nextButton=document.getElementById('forward');nextButton.setAttribute('data-l10n-id',label);},checkInitialFxAStatus:function ui_checkInitialFxAStatus(){this.skipFxA=true;FxAccountsIACHelper.getAccount((account)=>{this.skipFxA=false;this.onFxALogin(account);},()=>{FxAccountsIACHelper.logout(()=>{this.skipFxA=false;});});},createFirefoxAccount:function ui_createFirefoxAccount(){FxAccountsIACHelper.openFlow(UIManager.onFxAFlowDone,UIManager.onFxAError);},onFxAFlowDone:function ui_onFxAFlowDone(){FxAccountsIACHelper.getAccount((account)=>{if(!account){return;}
UIManager.onFxALogin(account);UIManager.setForwardButtonLabel('navbar-next');},UIManager.onFxAError);},onFxALogin:function ui_onFxALogin(account){if(!account){return;}
UIManager.newsletterInput.value=account.email;UIManager.fxaIntro.innerHTML='';document.l10n.setAttributes(UIManager.fxaIntro,account.verified?'fxa-signed-in':'fxa-email-sent',{email:account.email});UIManager.fxaCreateAccount.disabled=true;},onFxAError:function ui_onFxAError(response){console.error('Create FxA Error: '+JSON.stringify(response));UIManager.newsletterInput.value='';document.l10n.setAttributes(UIManager.fxaIntro,'fxa-upsell');UIManager.fxaCreateAccount.disabled=false;UIManager.setForwardButtonLabel('skip');},displayOfflineDialog:function ui_displayOfflineDialog(href,title){var dialog=this.offlineErrorDialog;document.l10n.setAttributes(dialog.querySelector('small'),'offline-dialog-text',{url:href});dialog.classList.add('visible');this.hideActivationScreenFromScreenReader();},onOfflineDialogButtonClick:function ui_onOfflineDialogButtonClick(e){this.offlineErrorDialog.classList.remove('visible');this.showActivationScreenToScreenReader();},hideActivationScreenFromScreenReader:function ui_hideActivationScreenFromScreenReader(){this.activationScreen.setAttribute('aria-hidden',true);},showActivationScreenToScreenReader:function ui_showActivationScreenToScreenReader(){this.activationScreen.setAttribute('aria-hidden',false);},setDate:function ui_sd(){if(!!this.lock){return;}
var now=new Date();var currentDate=this.dateConfiguration.value;var currentTime=now.toLocaleFormat('%H:%M');var timeToSet=new Date(currentDate+'T'+currentTime);TimeManager.set(timeToSet);this.dateConfigurationLabel.textContent=timeToSet.toLocaleString(navigator.languages,{year:'numeric',month:'numeric',day:'numeric'});},setTime:function ui_st(){if(!!this.lock){return;}
var timeLabel=document.getElementById('time-configuration-label');var now=new Date();var currentTime=document.getElementById('time-configuration').value;if(currentTime.indexOf(':')===1){currentTime='0'+currentTime;}
var currentDate=now.toLocaleFormat('%Y-%m-%d');var timeToSet=new Date(currentDate+'T'+currentTime);TimeManager.set(timeToSet);timeLabel.textContent=timeToSet.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',second:'numeric'});},setTimeZone:function ui_stz(timezone,needsConfirmation){this.timeZoneNeedsConfirmation=!!needsConfirmation;var utcOffset=timezone.utcOffset;document.getElementById('time_zone_overlay').className='UTC'+utcOffset.replace(/[+:]/g,'');var timezoneTitle=document.getElementById('time-zone-title');document.l10n.setAttributes(timezoneTitle,'timezoneTitle',{utcOffset:utcOffset,region:timezone.region,city:timezone.city});document.getElementById('tz-region-label').textContent=timezone.region;document.getElementById('tz-city-label').textContent=timezone.city;var now=new Date();var timeLabel=document.getElementById('time-configuration-label');timeLabel.textContent=now.toLocaleString(navigator.languages,{hour12:navigator.mozHour12,hour:'numeric',minute:'numeric',second:'numeric'});},updateDataConnectionStatus:function ui_udcs(status){this.dataConnectionSwitch.checked=status;},changeStatusBarColor:function ui_csbc(color){var themeMeta=document.head.querySelector('meta[name="theme-color"]');themeMeta.setAttribute('content',color);}};function toCamelCase(str){return str.replace(/\-(.)/g,function replacer(str,p1){return p1.toUpperCase();});}

View file

@ -0,0 +1 @@
;(function(exports){'use strict';var rdashes=/-(.)/g;var Utils={camelCase:function ut_camelCase(str){return str.replace(rdashes,function(str,p1){return p1.toUpperCase();});}};exports.Utils=Utils;}(this));

View file

@ -0,0 +1,20 @@
;(function(exports){'use strict';const WIFI_STATUS={connecting:'connecting',associated:'associated',connected:'connected',connectingfailed:'connectingfailed',disconnected:'disconnected'};var WifiManager={STATUS:Object.freeze(WIFI_STATUS),init:function wn_init(){this.api=WifiHelper.getWifiManager();this.changeStatus();if(navigator.mozSettings){var lock=window.navigator.mozSettings.createLock();this.enable(lock);this.enableDebugging(lock);}
this.gCurrentNetwork=this.api?this.api.connection.network:null;if(this.gCurrentNetwork!==null){this.api.forget(this.gCurrentNetwork);this.gCurrentNetwork=null;}},getNetworks:function wn_getNetworks(callback){this.networks?callback(this.networks):this.scan(callback);},scan:function wn_scan(callback){if(this._scanning){return;}
this._scanning=true;utils.overlay.show('scanningNetworks','spinner');var SCAN_TIMEOUT=10000;var self=this;self.onScan=callback;var req=this.api?this.api.getNetworks():null;if(!req){setTimeout(function(){self._scanning=false;callback();});return;}
var handleRequest=function handleRequest(){self._scanning=false;clearTimeout(self.scanTimeout);self.scanTimeout=null;self.onScan(self.networks);self.onScan=null;};req.onsuccess=function onScanSuccess(){self.networks=req.result;handleRequest();};req.onerror=function onScanError(){console.error('Error reading networks: '+req.error.name);self.networks=[];handleRequest();};if(!self.scanTimeout){self.scanTimeout=setTimeout(function(){self._scanning=false;console.warn('Timeout while reading networks');self.onScan();},SCAN_TIMEOUT);}},enable:function wn_enable(lock){lock.set({'wifi.enabled':true});},enableDebugging:function wn_enableDebugging(lock){this._prevDebuggingValue=false;var req=lock.get('wifi.debugging.enabled');req.onsuccess=function wn_getDebuggingSuccess(){this._prevDebuggingValue=req.result['wifi.debugging.enabled'];};lock.set({'wifi.debugging.enabled':true});},finish:function wn_finish(){if(!this._prevDebuggingValue&&navigator.mozSettings){var resetLock=window.navigator.mozSettings.createLock();resetLock.set({'wifi.debugging.enabled':false});}},getNetwork:function wm_gn(ssid){var list=this.networks;for(var i=0;i<list.length;i++){if(list[i].ssid===ssid){return list[i];}}
return null;},connect:function wn_connect(ssid,password,user){var network=this.getNetwork(ssid);if(!network){console.error('Network not found');return;}
this.ssid=ssid;WifiHelper.setPassword(network,password,user,'PEAP');this.gCurrentNetwork=network;this.api.associate(network);},changeStatus:function wn_cs(callback){var self=this;if(WifiManager.api){WifiManager.api.onstatuschange=function(event){if(event.status===WifiManager.STATUS.disconnected&&self.onScan){self.scan(self.onScan);}else{WifiUI.updateNetworkStatus(event.network.ssid,event.status);}};}}};var WifiUI={joinNetwork:function wui_jn(){var password=document.getElementById('wifi_password').value;var user=document.getElementById('wifi_user').value;var ssid=document.getElementById('wifi_ssid').value;WifiUI.connect(ssid,password,user);window.history.back();},joinHiddenNetwork:function wui_jhn(){var password=UIManager.hiddenWifiPassword.value;var user=UIManager.hiddenWifiIdentity.value;var ssid=UIManager.hiddenWifiSsid.value;var security=UIManager.hiddenWifiSecurity.value;var network;if(ssid.length){if(!Array.isArray(WifiManager.networks)){WifiManager.networks=[];}
network=new window.MozWifiNetwork({ssid:ssid,capabilities:[],security:[security],relSignalStrength:0,hidden:true});WifiManager.networks.push(network);this.renderNetworks(WifiManager.networks);WifiUI.connect(ssid,password,user);}
window.history.back();},_selectNetworkItem:function(ssid,isSelected=true){var elem=document.getElementById(ssid);if(!elem){return;}
if(isSelected){elem.setAttribute('data-wifi-selected',true);}else{var icon=elem.querySelector('aside');elem.removeAttribute('data-wifi-selected');elem.classList.remove('connected');icon.classList.remove('connecting');icon.classList.remove('connected');var security=elem.dataset.security;var securityLevelDOM=elem.querySelector('p[data-security-level]');securityLevelDOM.setAttribute('data-l10n-id',security?security:'securityOpen');}},connect:function wui_connect(ssid,password,user){var newWifi=document.getElementById(ssid);Array.from(document.querySelectorAll('li[data-wifi-selected]')).forEach((networkSelected)=>{this._selectNetworkItem(networkSelected,networkSelected===newWifi);});WifiManager.connect(ssid,password,user);},chooseNetwork:function wui_cn(event){var ssid=event.target.dataset.ssid;var selectedNetwork=WifiManager.getNetwork(ssid);if(!selectedNetwork){console.error('Network not found');return;}
if(WifiHelper.isOpen(selectedNetwork)){WifiUI.connect(ssid);return;}
UIManager.activationScreen.classList.add('no-options');UIManager.mainTitle.textContent=ssid;var ssidHeader=document.getElementById('wifi_ssid');var userInput=document.getElementById('wifi_user');var passwordInput=document.getElementById('wifi_password');var showPassword=document.querySelector('gaia-checkbox[name=show_password]');var joinButton=UIManager.wifiJoinButton;joinButton.disabled=true;passwordInput.addEventListener('input',function validatePassword(){joinButton.disabled=!WifiHelper.isValidInput(WifiHelper.getKeyManagement(selectedNetwork),passwordInput.value,userInput.value);});passwordInput.type='password';passwordInput.value='';showPassword.checked=false;showPassword.addEventListener('change',e=>{passwordInput.type=e.target.checked?'text':'password';});passwordInput.value='';ssidHeader.value=ssid;UIManager.navBar.classList.add('secondary-menu');if(WifiHelper.isEap(selectedNetwork)){userInput.parentNode.classList.remove('hidden');}else{userInput.parentNode.classList.add('hidden');}
window.location.hash='#configure_network';},addHiddenNetwork:function wui_addHiddenNetwork(){UIManager.activationScreen.classList.add('no-options');UIManager.mainTitle.setAttribute('data-l10n-id','authentication');UIManager.navBar.classList.add('secondary-menu');UIManager.hiddenWifiSsid.value='';UIManager.hiddenWifiPassword.value='';UIManager.hiddenWifiIdentity.value='';UIManager.wifiJoinButton.disabled=true;window.location.hash='#hidden-wifi-authentication';},handleHiddenWifiSecurity:function wui_handleSecurity(securityType){if(securityType===''){UIManager.hiddenWifiPasswordBox.classList.add('hidden');}else{UIManager.hiddenWifiPasswordBox.classList.remove('hidden');}
if(securityType.indexOf('EAP')!==-1){UIManager.hiddenWifiIdentityBox.classList.remove('hidden');}else{UIManager.hiddenWifiIdentityBox.classList.add('hidden');}},renderNetworks:function wui_rn(networks){var networksDOM=document.getElementById('networks');networksDOM.innerHTML='';var networksList;if(!networks||networks.length===0){var noResult='<div id="no-result-container">'+' <div id="no-result-message">'+' <p data-l10n-id="noWifiFound3"></p>'+' </div>'+'</div>';networksDOM.innerHTML=noResult;}else{networksList=document.createElement('ul');networksList.id='networks-list';networksList.setAttribute('role','listbox');networksList.setAttribute('data-l10n-id','networksList');var networksShown=[];networks.sort(function(a,b){return b.relSignalStrength-a.relSignalStrength;});for(var i=0,max=networks.length;i<max;i++){var network=networks[i];if(networksShown.indexOf(network.ssid)===-1){var li=document.createElement('li');var icon=document.createElement('aside');var ssidp=document.createElement('p');ssidp.setAttribute('dir','auto');var small=document.createElement('p');small.dataset.securityLevel=true;icon.classList.add('pack-end');icon.classList.add('wifi-icon');var level=Math.min(Math.floor(network.relSignalStrength/20),4);icon.classList.add('level-'+level);document.l10n.setAttributes(icon,'wifiLevel',{level:level});icon.setAttribute('role','presentation');ssidp.textContent=network.ssid;li.dataset.ssid=network.ssid;var keys=WifiHelper.getSecurity(network);li.dataset.security=keys;if(!WifiHelper.isOpen(network)){small.textContent=keys.join(', ');icon.classList.add('secured');}else{small.setAttribute('data-l10n-id','securityOpen');}
icon.classList.add('wifi-signal');var connectionStatus=WifiHelper.getNetworkStatus(network)||WifiManager.STATUS.disconnected;li.dataset.status=connectionStatus;if(connectionStatus===WifiManager.STATUS.connected){small.setAttribute('data-l10n-id','shortStatus-connected');small.removeAttribute('aria-label');icon.classList.add('connected');li.classList.add('connected');li.dataset.wifiSelected=true;}
networksShown.push(network.ssid);li.setAttribute('id',network.ssid);li.setAttribute('role','option');li.setAttribute('aria-live',true);li.setAttribute('aria-relevant','text');li.appendChild(ssidp);li.appendChild(small);li.appendChild(icon);if(WifiHelper.isConnected(network)){networksList.insertBefore(li,networksList.firstChild);}else{networksList.appendChild(li);}}}
networksList.dataset.type='list';networksDOM.appendChild(networksList);}
utils.overlay.hide();},updateNetworkStatus:function wui_uns(ssid,status){var element=document.getElementById(ssid);if(!element){return;}
if(status===WifiManager.STATUS.connecting&&ssid!==WifiManager.ssid){return;}
element.dataset.status=status;if(status!==WifiManager.STATUS.disconnected){element.querySelector('p[data-security-level]').setAttribute('data-l10n-id','shortStatus-'+status);}else{var security=element.dataset.security||'Open';element.querySelector('p[data-security-level]').setAttribute('data-l10n-id','security'+security);element.classList.remove('connected');}
var icon=element.querySelector('aside');switch(status){case WifiManager.STATUS.connecting:case WifiManager.STATUS.associated:icon.classList.add('connecting');break;case WifiManager.STATUS.connected:icon.classList.remove('connecting');var networksList=document.getElementById('networks-list');icon.classList.add('connected');element.classList.add('connected');networksList.removeChild(element);networksList.insertBefore(element,networksList.firstChild);break;default:icon.classList.remove('connecting');icon.classList.remove('connected');break;}}};exports.WifiManager=WifiManager;exports.WifiUI=WifiUI;})(window);