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

719 lines
24 KiB
JavaScript
Executable file

/* exported Settings */
/* global Awesomescreen */
/* global Browser */
/* global BrowserDB */
/* global BrowserDialog */
/* global KeyEvent */
/* global LazyLoader */
/* global SearchUtil */
/* global Toolbar */
/* global UrlHelper */
'use strict';
/**
* Browser app settings panel.
* @namespace Settings
*/
var Settings = {
DEFAULT_HOMEPAGE: 'http://www.mozilla.org',
currentSearchEngine: null,
selectSearchEngine: null,
searchEngineList: null,
focusList: null,
focusPos: 0,
/** Get all DOM elements when inited. */
getAllElements: function settings_getAllElements() {
var toCamelCase = function toCamelCase(str) {
return str.replace(/\-(.)/g, function replacer(str, p1) {
return p1.toUpperCase();
});
};
var elementIDs = [
'settings-list', 'settings-list-area',
'settings-homepage', 'settings-homepage-name',
'settings-search-engine', 'settings-search-engine-name',
'settings-clear-history',
'settings-clear-cookie',
'settings-dialog',
'settings-dialog-homepage',
'settings-dialog-homepage-input',
'settings-dialog-homepage-input-area',
'settings-dialog-homepage-clear',
'settings-dialog-homepage-default',
'settings-dialog-homepage-cancel',
'settings-dialog-homepage-ok',
'settings-dialog-search',
'settings-dialog-search-select',
'settings-dialog-search-select-list',
'settings-dialog-search-cancel',
'settings-dialog-search-ok',
'settings-banner-message'
];
// Loop and add element with camel style name to Modal Dialog attribute.
elementIDs.forEach(function createElementRef(name) {
this[toCamelCase(name)] = document.getElementById(name);
}, this);
},
/**
* Intialise settings panel.
*/
init: function settings_init() {
this.getAllElements();
this.getDefaultHomepage((function(result) {
/* default homepage nothing... */
Browser.debug('default homepage = ' + result);
if(!result) {
console.log('set default homepage...');
this.setDefaultHomepage();
this.setHomepage(this.DEFAULT_HOMEPAGE);
}
}).bind(this));
this.settingsList.addEventListener('mouseup',
this.handleListClick.bind(this));
this.settingsListArea.addEventListener('mouseup',
this.handleListAreaClick.bind(this));
this.settingsDialog.addEventListener('mouseup',
this.handleListAreaClick.bind(this));
this.settingsHomepage.addEventListener('mouseup',
this.handleHomepageClick.bind(this));
this.settingsSearchEngine.addEventListener('mouseup',
this.handleSearchEngineClick.bind(this));
this.settingsClearHistory.addEventListener('mouseup',
this.handleClearHistoryClick.bind(this));
this.settingsClearCookie.addEventListener('mouseup',
this.handleClearCookieClick.bind(this));
this.settingsDialogHomepageInput.addEventListener('submit',
this.handleDialogHomepageInputSubmit.bind(this));
this.settingsDialogHomepageClear.addEventListener('mouseup',
this.handleDialogHomepageClear.bind(this));
this.settingsDialogHomepageDefault.addEventListener('mouseup',
this.handleDialogHomepageDefault.bind(this));
this.settingsDialogHomepageCancel.addEventListener('mouseup',
this.handleDialogHomepageCancel.bind(this));
this.settingsDialogHomepageOk.addEventListener('mouseup',
this.handleDialogHomepageOk.bind(this));
this.settingsDialogSearchCancel.addEventListener('mouseup',
this.handleDialogSearchCancel.bind(this));
this.settingsDialogSearchOk.addEventListener('mouseup',
this.handleDialogSearchOk.bind(this));
this.settingsDialogHomepageInputArea.addEventListener('focus',
this.handleDialogHomepageInputAreaFocus.bind(this));
this.settingsDialogHomepageInputArea.addEventListener('mousedown',
this.handleDialogHomepageInputAreaClick.bind(this));
this.settingsDialogHomepageInputArea.addEventListener('blur',
this.handleDialogHomepageInputBlur.bind(this));
this.settingsDialogHomepageClear.addEventListener('keyup',
this.handleDialogHomepageClear.bind(this));
this.settingsDialogHomepageDefault.addEventListener('keyup',
this.handleDialogHomepageDefault.bind(this));
this.settingsDialogHomepageCancel.addEventListener('keyup',
this.handleDialogHomepageCancel.bind(this));
this.settingsDialogHomepageOk.addEventListener('keyup',
this.handleDialogHomepageOk.bind(this));
this.settingsDialogSearchCancel.addEventListener('keyup',
this.handleDialogSearchCancel.bind(this));
this.settingsDialogSearchOk.addEventListener('keyup',
this.handleDialogSearchOk.bind(this));
//IFDEF_FIREFOX_SYNC
LazyLoader.load('js/sync/settings.js');
//ENDIF_FIREFOX_SYNC
},
getDefaultHomepage: function settings_getDefaultHomepage(cb) {
BrowserDB.db.open((function() {
BrowserDB.getSetting( 'default_homepage', cb );
}).bind(this));
},
setDefaultHomepage: function settings_setDefaultHomepage() {
BrowserDB.db.open((function() {
BrowserDB.updateSetting( this.DEFAULT_HOMEPAGE, 'default_homepage' );
}).bind(this));
},
getHomepage: function settings_getHomepage(cb) {
BrowserDB.db.open((function() {
BrowserDB.getSetting( 'settings_homepage', cb );
}).bind(this));
},
setHomepage: function settings_setHomepage(url) {
BrowserDB.db.open((function() {
BrowserDB.updateSetting( url, 'settings_homepage' );
}).bind(this));
},
/**
* Show settings panel.
*/
show: function settings_show() {
document.body.classList.add('settings-screen');
this.getHomepage((function(result) {
this.settingsHomepageName.textContent = result;
}).bind(this));
this.settingsSearchEngineName.textContent =
SearchUtil.getCurrentEngineName();
this.currentSearchEngine = this.settingsSearchEngineName.textContent;
this.selectSearchEngine = this.currentSearchEngine;
// XXX: Get Firefox Account sign in status and display it
},
/**
* settings list displays a confirmation.
*/
isDisplayed: function settings_isDisplayed() {
return document.body.classList.contains('settings-screen');
},
/**
* Hide settings panel.
*/
hide: function settings_hide() {
// Browser.switchCursorMode( true );
BrowserDialog.cancelDialog();
this.hideDialogHomepage();
this.hideDialogSearch();
document.body.classList.remove('settings-screen');
},
handleListClick: function settings_handleListClick(evt) {
if( evt ) {
evt.stopPropagation();
}
this.hide();
},
handleListAreaClick: function settings_handleListAreaClick(evt) {
if( evt ) {
evt.stopPropagation();
}
},
focusChange: function settings_focusChange(pos) {
var opt = null;
var flg = false;
if( Awesomescreen.pointerImg.style.display == 'none' ) {
Browser.switchCursorMode(true);
Browser.switchCursorMode(false);
flg = true;
}
for( var i = 0 ; i < Settings.focusList.length ; i ++ ) {
if( i == pos ) {
if(Settings.focusList[i].nodeName == 'INPUT') {
if( !Settings.settingsDialogHomepageInput
.classList.contains('exfocus') ) {
Settings.settingsDialogHomepageInput.classList.add('exfocus');
}
} else if(Settings.focusList[i].id == 'settings-dialog-homepage-clear'){
Settings.focusList[i].focus();
if( !Settings.settingsDialogHomepageInput
.classList.contains('exfocus') ) {
Settings.settingsDialogHomepageInput.classList.add('exfocus');
}
if( flg ) {
opt = Awesomescreen.DEFAULT_EXCLEAR;
}
} else {
Settings.focusList[i].focus();
Settings.settingsDialogHomepageInput.classList.remove('exfocus');
}
Awesomescreen.focusImgFunc(Settings.focusList[i], opt);
} else {
Settings.focusList[i].blur();
}
}
},
/**
* Handle homepage click.
*/
handleHomepageClick: function settings_handleHomepageClick() {
if( !this.isDialogHomepageDisplayed() ) {
this.focusList = [];
Browser.switchCursorMode(false);
this.settingsDialog.classList.remove('hidden');
this.settingsDialogHomepage.classList.remove('hidden');
this.settingsDialogHomepageInput.classList.remove('input');
this.settingsDialogHomepageInput.classList.remove('exfocus');
this.settingsDialogHomepageInputArea.value =
this.settingsHomepageName.textContent;
this.settingsDialogHomepageInputArea.tabIndex = '0';
this.settingsDialogHomepageClear.tabIndex = '0';
this.focusList.push(this.settingsDialogHomepageInputArea);
this.focusList.push(this.settingsDialogHomepageClear);
this.focusList.push(this.settingsDialogHomepageDefault);
this.focusList.push(this.settingsDialogHomepageOk);
this.focusList.push(this.settingsDialogHomepageCancel);
this.focusPos = this.focusList.length - 1;
this.focusChange(this.focusPos);
}
},
hideDialogHomepage: function settings_hideDialogHomepage() {
if( this.isDialogHomepageDisplayed() ) {
Awesomescreen.pointerImg.style.display = 'none';
this.settingsDialogHomepageInput.classList.remove('input');
this.settingsDialogHomepageInput.classList.remove('exfocus');
this.settingsDialogHomepage.classList.add('hidden');
this.settingsDialog.classList.add('hidden');
Browser.switchCursorMode(true);
}
},
isDialogHomepageDisplayed: function settings_isDialogHomepageDisplayed() {
return !this.settingsDialogHomepage.classList.contains('hidden');
},
handleDialogHomepageInputSubmit:
function settings_handleDialogHomepageInputSubmit(ev) {
if (ev) {
// Can be canceled
ev.preventDefault();
}
var hasScheme =
UrlHelper.hasScheme(this.settingsDialogHomepageInputArea.value);
// No scheme, prepend basic protocol and return
if (!hasScheme) {
this.settingsDialogHomepageInputArea.value =
'http://' + this.settingsDialogHomepageInputArea.value;
}
this.settingsDialogHomepageInputArea.blur();
},
handleDialogHomepageInputAreaFocus:
function settings_handleDialogHomepageInputAreaFocus(evt) {
if( evt ) {
evt.preventDefault();
}
Settings.settingsDialogHomepageInput.classList.add('input');
Settings.settingsDialogHomepageInput.classList.remove('exfocus');
},
handleDialogHomepageInputAreaClick:
function settings_handleDialogHomepageInputAreaClick(evt) {
Browser.switchCursorMode(true);
Browser.switchCursorMode(false);
Settings.settingsDialogHomepageInput.classList.add('input');
Settings.settingsDialogHomepageInput.classList.remove('exfocus');
Settings.focusPos = 0;
Settings.focusList[Settings.focusPos].focus();
Awesomescreen.pointerImg.style.display = 'none';
},
handleDialogHomepageInputBlur:
function settings_handleDialogHomepageInputBlur(evt) {
if( evt ) {
evt.preventDefault();
}
if( Awesomescreen.pointerImg.style.display == 'none' ) {
Browser.switchCursorMode(true);
Browser.switchCursorMode(false);
}
// Pointer image to the input area(fucusPos=0)
Settings.focusPos = 0;
Settings.settingsDialogHomepageInput.classList.remove('input');
Settings.focusChange(Settings.focusPos);
Awesomescreen.pointerImg.style.display = 'block';
},
handleDialogHomepageClear:
function settings_handleDialogHomepageClear(evt) {
if( evt ) {
evt.preventDefault();
}
if(( evt.type == 'keyup' ) && ( evt.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
if( evt.keyCode != KeyEvent.DOM_VK_RETURN ) {
Awesomescreen.pointerImg.style.display = 'none';
document.activeElement.blur();
document.activeElement.classList.remove('exfocus');
}
document.activeElement.classList.remove('active');
this.settingsDialogHomepageInputArea.value = '';
},
handleDialogHomepageDefault:
function settings_handleDialogHomepageDefault(evt) {
if( evt ) {
evt.preventDefault();
}
if(( evt.type == 'keyup' ) && ( evt.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
if( evt.keyCode != KeyEvent.DOM_VK_RETURN ) {
Awesomescreen.pointerImg.style.display = 'none';
document.activeElement.blur();
document.activeElement.classList.remove('exfocus');
}
document.activeElement.classList.remove('active');
this.getDefaultHomepage((function(result) {
this.settingsDialogHomepageInputArea.value = result;
}).bind(this));
},
handleDialogHomepageCancel:
function settings_handleDialogHomepageCancel(evt) {
if( evt ) {
evt.preventDefault();
}
if(( evt.type == 'keyup' ) && ( evt.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
// animation end event handler
var end_event = (function() {
Settings.settingsDialogHomepageCancel.removeEventListener('transitionend',
end_event, false);
Settings.hideDialogHomepage();
});
// end animantion event
Settings.settingsDialogHomepageCancel.addEventListener('transitionend',
end_event, false);
document.activeElement.classList.remove('active');
},
handleDialogHomepageOk: function settings_handleDialogHomepageOk(evt) {
if( evt ) {
evt.preventDefault();
}
if(( evt.type == 'keyup' ) && ( evt.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
// animation end event handler
var end_event = (function() {
Settings.settingsDialogHomepageOk.removeEventListener('transitionend',
end_event, false);
Settings.hideDialogHomepage();
});
// end animantion event
Settings.settingsDialogHomepageOk.addEventListener('transitionend',
end_event, false);
document.activeElement.classList.remove('active');
this.setHomepage(this.settingsDialogHomepageInputArea.value);
this.settingsHomepageName.textContent =
this.settingsDialogHomepageInputArea.value;
},
/**
* Handle search engine click.
*/
handleSearchEngineClick: function settings_handleSearchEngineClick() {
if( !this.isDialogSearchDisplayed() ) {
this.focusList = [];
Browser.switchCursorMode(false);
this.settingsDialog.classList.remove('hidden');
this.settingsDialogSearch.classList.remove('hidden');
this.selectSearchEngine = this.currentSearchEngine;
this.searchEngineList = SearchUtil.getEngineList();
for(var i in this.searchEngineList) {
var title = document.createElement('div');
title.classList.add('title');
var name = document.createElement('p');
name.classList.add('name');
name.textContent = this.searchEngineList[i].name;
title.appendChild(name);
var check = document.createElement('div');
check.classList.add('check');
var onoff = document.createElement('p');
if( name.textContent == this.currentSearchEngine ) {
name.dataset.display = 'selected';
onoff.classList.add('on');
} else {
name.dataset.display = '';
onoff.classList.add('off');
}
check.appendChild(onoff);
var item = document.createElement('div');
item.classList.add('item');
item.appendChild(title);
item.appendChild(check);
item.tabIndex = '0';
this.settingsDialogSearchSelectList.appendChild(item);
item.addEventListener('mouseup',
this.handleDialogSearchSelected.bind(this));
item.addEventListener('keyup',
this.handleDialogSearchSelected.bind(this));
this.focusList.push(item);
}
this.focusList.push(this.settingsDialogSearchOk);
this.focusList.push(this.settingsDialogSearchCancel);
this.focusPos = this.focusList.length - 1;
this.focusChange(this.focusPos);
}
},
handleClearHistoryClick: function settings_handleClearHistoryClick() {
BrowserDialog.createDialog('clear_history', null);
},
handleClearCookieClick: function settings_handleClearCookieClick() {
BrowserDialog.createDialog('del_cookie', null);
},
clearCookieFailed: function settings_clearCookieFailed() {
// this.settingsBannerMessage.innerHTML =
// 'Failed to clear cookies and stored data';
this.settingsBannerMessage.setAttribute('data-l10n-id', 'LT_FAILED_');
this.showBannerMessage();
},
showBannerMessage: function settings_showBannerMessage() {
if( this.settingsBannerMessage.dataset.display != 'visible' ) {
this.settingsBannerMessage.dataset.display = 'visible';
}
clearTimeout( this.showBannerMessageTimeoutID );
this.showBannerMessageTimeoutID = setTimeout( function() {
Settings.settingsBannerMessage.dataset.display = '';
}, 3000);
},
hideDialogSearch: function settings_hideDialogSearch() {
if( this.isDialogSearchDisplayed() ) {
Awesomescreen.pointerImg.style.display = 'none';
var childs = this.settingsDialogSearchSelectList.childNodes;
var len = childs.length;
for(var i = 0 ; i < len ; i ++) {
this.settingsDialogSearchSelectList.removeChild(childs[0]);
}
this.settingsDialogSearch.classList.add('hidden');
this.settingsDialog.classList.add('hidden');
Browser.switchCursorMode(true);
}
},
isDialogSearchDisplayed: function settings_isDialogSearchDisplayed() {
return !this.settingsDialogSearch.classList.contains('hidden');
},
handleDialogSearchSelected:
function settings_handleDialogSearchSelected(ev) {
if( ev ) {
ev.preventDefault();
}
if(( ev.type == 'keyup' ) && ( ev.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
this.selectSearchEngine = ev.currentTarget.textContent;
var childs = this.settingsDialogSearchSelectList.childNodes;
var len = childs.length;
for(var i = 0 ; i < len ; i ++) {
if(childs[i].textContent == this.selectSearchEngine) {
childs[i].firstChild.firstChild.dataset.display = 'selected';
childs[i].lastChild.lastChild.classList.remove('off');
childs[i].lastChild.lastChild.classList.add('on');
} else {
childs[i].firstChild.firstChild.dataset.display = '';
childs[i].lastChild.lastChild.classList.remove('on');
childs[i].lastChild.lastChild.classList.add('off');
}
}
},
handleDialogSearchCancel: function settings_handleDialogSearchCancel(ev) {
if( ev ) {
ev.preventDefault();
}
if(( ev.type == 'keyup' ) && ( ev.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
// animation end event handler
var end_event = (function() {
Settings.settingsDialogSearchCancel.removeEventListener('transitionend',
end_event, false);
Settings.hideDialogSearch();
});
// end animantion event
Settings.settingsDialogSearchCancel.addEventListener('transitionend',
end_event, false);
document.activeElement.classList.remove('active');
},
handleDialogSearchOk: function settings_handleDialogSearchOk(ev) {
if( ev ) {
ev.preventDefault();
}
if(( ev.type == 'keyup' ) && ( ev.keyCode != KeyEvent.DOM_VK_RETURN )) {
return;
}
// animation end event handler
var end_event = (function() {
Settings.settingsDialogSearchOk.removeEventListener('transitionend',
end_event, false);
Settings.hideDialogSearch();
});
var setSearchEngine = function () {
this.currentSearchEngine = this.selectSearchEngine;
this.settingsSearchEngineName.textContent =
this.currentSearchEngine;
Toolbar.setSearchEngine();
};
// end animantion event
Settings.settingsDialogSearchOk.addEventListener('transitionend',
end_event, false);
if( this.currentSearchEngine != this.selectSearchEngine ) {
for(var i in this.searchEngineList) {
if( this.selectSearchEngine == this.searchEngineList[i].name ) {
SearchUtil.setSearchEngineId(this.searchEngineList[i].id,
setSearchEngine.bind(this));
break;
}
}
}
document.activeElement.classList.remove('active');
},
/**
* Handle Key Event.
*/
handleKeyEvent: function settings_handleKeyEvent(ev) {
if( !Settings.isDisplayed() ) {
return false;
}
// in the input area focus (= display keyboard)
if(document.activeElement.nodeName == 'INPUT') {
return true;
}
switch( ev.keyCode ) {
case KeyEvent.DOM_VK_LEFT :
ev.preventDefault();
if( Settings.isDialogHomepageDisplayed() ) {
if(( Settings.focusPos == 1 ) || ( Settings.focusPos == 4 )) {
Settings.focusPos --;
Settings.focusChange(Settings.focusPos);
}
return true;
}
if( Settings.isDialogSearchDisplayed() ) {
if( Settings.focusPos == Settings.focusList.length - 1 ) {
Settings.focusPos --;
Settings.focusChange(Settings.focusPos);
}
return true;
}
break;
case KeyEvent.DOM_VK_RIGHT :
ev.preventDefault();
if( Settings.isDialogHomepageDisplayed() ) {
if(( Settings.focusPos === 0 ) || ( Settings.focusPos === 3 )) {
Settings.focusPos ++;
Settings.focusChange(Settings.focusPos);
}
return true;
}
if( Settings.isDialogSearchDisplayed() ) {
if( Settings.focusPos == Settings.focusList.length - 2 ) {
Settings.focusPos ++;
Settings.focusChange(Settings.focusPos);
}
return true;
}
break;
case KeyEvent.DOM_VK_UP :
ev.preventDefault();
if( Settings.isDialogHomepageDisplayed() ) {
if(( Settings.focusPos === 2 ) || ( Settings.focusPos === 4 )) {
Settings.focusPos -= 2;
Settings.focusChange(Settings.focusPos);
} else if( Settings.focusPos === 3 ) {
Settings.focusPos --;
Settings.focusChange(Settings.focusPos);
}
return true;
}
if( Settings.isDialogSearchDisplayed() ) {
if( Settings.focusPos > 0 ) {
if( Settings.focusPos >= Settings.focusList.length - 1 ) {
Settings.focusPos = Settings.focusList.length - 3;
} else {
Settings.focusPos --;
}
Settings.focusChange(Settings.focusPos);
}
return true;
}
break;
case KeyEvent.DOM_VK_DOWN :
ev.preventDefault();
if( Settings.isDialogHomepageDisplayed() ) {
if(( Settings.focusPos == 1 ) || ( Settings.focusPos === 2 )) {
Settings.focusPos ++;
Settings.focusChange(Settings.focusPos);
} else if( Settings.focusPos === 0 ) {
Settings.focusPos += 2;
Settings.focusChange(Settings.focusPos);
}
return true;
}
if( Settings.isDialogSearchDisplayed() ) {
if( Settings.focusPos < Settings.focusList.length - 2 ) {
Settings.focusPos ++;
Settings.focusChange(Settings.focusPos);
}
return true;
}
break;
case KeyEvent.DOM_VK_RETURN :
ev.preventDefault();
if( Settings.focusPos === 0 ) {
Settings.focusList[Settings.focusPos].focus();
if( Settings.isDialogHomepageDisplayed() ) {
Awesomescreen.pointerImg.style.display = 'none';
}
}else{
document.activeElement.classList.remove('active');
document.activeElement.classList.add('active');
}
break;
case KeyEvent.DOM_VK_BACK_SPACE :
if( Settings.isDialogHomepageDisplayed() ) {
Settings.hideDialogHomepage();
return true;
}
if( Settings.isDialogSearchDisplayed() ) {
Settings.hideDialogSearch();
return true;
}
Settings.hide();
return true;
default :
return false;
}
return true;
}
};