Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
313 lines
11 KiB
JavaScript
Executable file
313 lines
11 KiB
JavaScript
Executable file
'use strict';
|
|
|
|
/**
|
|
* Generate user.js
|
|
*/
|
|
|
|
var utils = require('./utils');
|
|
|
|
// Optional partner provided preference files. They will be added
|
|
// after the ones on the extenedPrefFiles and they will be read
|
|
// from the GAIA_DISTRIBUTION_DIR directory
|
|
var PARTNER_PREF_FILES = ['partner-prefs.js'];
|
|
|
|
var PreferencesBuilder = function() {
|
|
};
|
|
|
|
PreferencesBuilder.prototype.setConfig = function(config) {
|
|
this.config = config;
|
|
this.prefs = {};
|
|
this.userPrefs = {};
|
|
this.gaia = utils.gaia.getInstance(this.config);
|
|
|
|
// Optional files that may be provided to extend the set of default
|
|
// preferences installed for gaia. If the preferences in these files
|
|
// conflict, the result is undefined.
|
|
this.extenedPrefFiles = ['custom-prefs.js', 'gps-prefs.js',
|
|
'payment-prefs.js'];
|
|
|
|
if (config.GAIA_APP_TARGET === 'engineering') {
|
|
this.extenedPrefFiles.push('payment-dev-prefs.js');
|
|
} else if (config.GAIA_APP_TARGET === 'dogfood') {
|
|
this.extenedPrefFiles.push('dogfood-prefs.js');
|
|
}
|
|
|
|
if (config.DEBUG === '1') {
|
|
this.extenedPrefFiles.push('debug-prefs.js');
|
|
}
|
|
};
|
|
|
|
PreferencesBuilder.prototype.execute = function(config) {
|
|
this.setConfig(config);
|
|
this.preparePref();
|
|
this.loadBuildPrefs();
|
|
if (this.gaia.engine === 'xpcshell') {
|
|
let jsPath = utils.getFile(this.config.PROFILE_DIR, 'user.js').path;
|
|
this.writePrefs(jsPath, this.prefs, this.userPrefs);
|
|
} else if (this.gaia.engine === 'b2g') {
|
|
this.setPrefs();
|
|
}
|
|
this.writeDefaultUserJs();
|
|
};
|
|
|
|
PreferencesBuilder.prototype.writeDefaultUserJs = function() {
|
|
if (this.config.BUILD_APP_NAME !== '*') {
|
|
return;
|
|
}
|
|
|
|
// Create a folder to store data for B2G, this folder will copy to b2g output
|
|
// folder.
|
|
let prefDir = utils.getFile(this.config.PROFILE_DIR, 'defaults', 'pref');
|
|
|
|
utils.ensureFolderExists(prefDir);
|
|
let allPrefs = utils.cloneJSON(this.prefs);
|
|
for (let pref in this.userPrefs) {
|
|
allPrefs[pref] = this.userPrefs[pref];
|
|
}
|
|
|
|
this.writePrefs(utils.joinPath(prefDir.path, 'user.js'), allPrefs, {});
|
|
};
|
|
|
|
PreferencesBuilder.prototype.loadBuildPrefs = function() {
|
|
var buildConfigDir = utils.getFile(this.config.GAIA_DIR, 'build', 'config');
|
|
this.loadPrefFile(buildConfigDir, this.extenedPrefFiles);
|
|
|
|
var deviceConfigDir = utils.getFile(this.config.GAIA_DIR, 'build', 'config',
|
|
this.config.GAIA_DEVICE_TYPE);
|
|
this.loadPrefFile(deviceConfigDir, this.extenedPrefFiles);
|
|
|
|
try {
|
|
var distDir = utils.getFile(this.config.GAIA_DISTRIBUTION_DIR);
|
|
this.loadPrefFile(distDir, PARTNER_PREF_FILES);
|
|
} catch (e) {
|
|
// The utils.getFile will throw exception if GAIA_DISTRIBUTION_DIR does not
|
|
// exist. In this case we just don't override preferences by
|
|
// PARTNER_PREF_FILES.
|
|
}
|
|
};
|
|
|
|
PreferencesBuilder.prototype.loadPrefFile = function(srcDir, srcPrefFiles) {
|
|
// Scope object for hosting functions and variables.
|
|
var self = this;
|
|
var scope = {
|
|
user_pref: function(key, value) {
|
|
self.userPrefs[key] = self.customizePrefValue(key, value);
|
|
},
|
|
pref: function fillPref(key, value) {
|
|
self.prefs[key] = self.customizePrefValue(key, value);
|
|
}
|
|
};
|
|
|
|
// Read all files
|
|
srcPrefFiles.forEach(function(filename) {
|
|
var srcFile = utils.getFile(srcDir.path, filename);
|
|
if (srcFile.exists()) {
|
|
utils.scriptLoader.load(srcFile.path, scope, true);
|
|
}
|
|
});
|
|
};
|
|
|
|
PreferencesBuilder.prototype.customizePrefValue = function(key, value) {
|
|
switch(key) {
|
|
case 'devtools.responsiveUI.customWidth':
|
|
// The responsive UI has padding and border at width.
|
|
// width = 320 + 15(horizontal padding) * 2 + 1(vertical border) * 2
|
|
return value + 32;
|
|
case 'devtools.responsiveUI.customHeight':
|
|
// The responsive UI has padding and border at width.
|
|
// height = 480 + 60(top padding) + 1(top border)
|
|
return value + 61;
|
|
}
|
|
return value;
|
|
};
|
|
|
|
PreferencesBuilder.prototype.preparePref = function() {
|
|
this.system = this.config.SYSTEM;
|
|
|
|
this.userPrefs['b2g.system_manifest_url'] = this.system + '/manifest.webapp';
|
|
|
|
this.userPrefs['b2g.neterror.url'] = this.system + '/net_error.html';
|
|
if (this.system.substring(0, 6) == 'app://') { // B2G bug 773884
|
|
this.system += '/index.html';
|
|
}
|
|
|
|
this.userPrefs['b2g.system_startup_url'] = this.system;
|
|
|
|
this.domains = [this.config.GAIA_DOMAIN, 'theme.' + this.config.GAIA_DOMAIN];
|
|
this.config.GAIA_ALLAPPDIRS.split(' ').forEach(function(appdir) {
|
|
this.domains.push(utils.getFile(appdir).leafName + '.' +
|
|
this.config.GAIA_DOMAIN);
|
|
}, this);
|
|
|
|
this.userPrefs['network.http.max-connections-per-server'] = 15;
|
|
this.userPrefs['dom.mozInputMethod.enabled'] = true;
|
|
this.userPrefs['layout.css.scroll-behavior.enabled'] = true;
|
|
this.userPrefs['layout.css.sticky.enabled'] = true;
|
|
this.userPrefs['intl.uidirection.ar-x-psbidi'] = 'rtl';
|
|
|
|
// For https://bugzilla.mozilla.org/show_bug.cgi?id=811605 to let user know
|
|
// what prefs is for ril debugging
|
|
this.userPrefs['ril.debugging.enabled'] = false;
|
|
// Gaia has no vCard/vCalendar for now. Override MMS version to v1.1:
|
|
// TODO: remove this override after having vCard/vCalendar implemented in
|
|
// Gaia.
|
|
// @see bug 885683 - [Messages] MMS doesn't support sending and receiving
|
|
// vCard attachments.
|
|
// @see bug 905548 - [Messages] MMS doesn't support sending and receiving
|
|
// vCalendar attachments.
|
|
this.userPrefs['dom.mms.version'] = 0x11;
|
|
// TODO: Once platform enabled unsafe WPA-EAP, we have to remove this flag
|
|
// here.
|
|
// @see Bug 790056 - Enable WPA Enterprise
|
|
this.userPrefs['b2g.wifi.allow_unsafe_wpa_eap'] = true;
|
|
|
|
if (this.config.LOCAL_DOMAINS === '1') {
|
|
this.setLocalDomainPref();
|
|
}
|
|
if (this.config.DESKTOP === '1') {
|
|
this.setDesktopPref();
|
|
}
|
|
if (this.config.DEBUG === '1') {
|
|
this.setDebugPref();
|
|
}
|
|
if (this.config.DEVICE_DEBUG === '1') {
|
|
this.setDeviceDebugPref();
|
|
}
|
|
// Turn on user timing output to logcat
|
|
if (this.config.PERF_LOGGING === '1') {
|
|
this.userPrefs['dom.performance.enable_user_timing_logging'] = true;
|
|
}
|
|
// Turn off hardware composing
|
|
if (this.config.HARDWARE_COMPOSER === '0') {
|
|
this.userPrefs['layers.composer2d.enabled'] = false;
|
|
}
|
|
|
|
// If this is already equal to the profile directory, no need to
|
|
// write the preference
|
|
if (this.config.COREWEBAPPS_DIR !== this.config.PROFILE_DIR) {
|
|
this.userPrefs['b2g.coreappsdir'] =
|
|
this.config.COREWEBAPPS_DIR;
|
|
}
|
|
};
|
|
|
|
PreferencesBuilder.prototype.setLocalDomainPref = function() {
|
|
this.userPrefs['network.dns.localDomains'] = this.domains.join(',');
|
|
};
|
|
|
|
PreferencesBuilder.prototype.setDesktopPref = function() {
|
|
this.userPrefs['extensions.autoDisableScopes'] = 0;
|
|
this.userPrefs['xpinstall.signatures.required'] = false;
|
|
};
|
|
|
|
PreferencesBuilder.prototype.setDebugPref = function() {
|
|
this.userPrefs['docshell.device_size_is_page_size'] = true;
|
|
this.userPrefs['marionette.defaultPrefs.enabled'] = true;
|
|
|
|
this.userPrefs['nglayout.debug.disable_xul_cache'] = true;
|
|
this.userPrefs['nglayout.debug.disable_xul_fastload'] = true;
|
|
|
|
this.userPrefs['javascript.options.showInConsole'] = true;
|
|
this.userPrefs['browser.dom.window.dump.enabled'] = true;
|
|
this.userPrefs['dom.report_all_js_exceptions'] = true;
|
|
this.userPrefs['dom.w3c_touch_events.enabled'] = 1;
|
|
this.userPrefs['dom.promise.enabled'] = true;
|
|
this.userPrefs['dom.wakelock.enabled'] = true;
|
|
this.userPrefs['image.mozsamplesize.enabled'] = true;
|
|
this.userPrefs['webgl.verbose'] = true;
|
|
|
|
// Turn off unresponsive script dialogs so test-agent can keep running...
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=872141
|
|
this.userPrefs['dom.max_script_run_time'] = 0;
|
|
|
|
// Identity debug messages
|
|
this.userPrefs['toolkit.identity.debug'] = true;
|
|
|
|
// Preferences for httpd
|
|
// (Use JSON.stringify in order to avoid taking care of `\` escaping)
|
|
this.userPrefs['extensions.gaia.dir'] = this.config.GAIA_DIR;
|
|
this.userPrefs['extensions.gaia.domain'] = this.config.GAIA_DOMAIN;
|
|
this.userPrefs['extensions.gaia.port'] =
|
|
parseInt(this.config.GAIA_PORT.replace(/:/g, ''), 10);
|
|
this.userPrefs['extensions.gaia.appdirs'] = this.config.GAIA_APPDIRS;
|
|
this.userPrefs['extensions.gaia.allappdirs'] = this.config.GAIA_ALLAPPDIRS;
|
|
this.userPrefs['extensions.gaia.locales_debug_path'] =
|
|
this.config.GAIA_LOCALES_PATH;
|
|
this.userPrefs['extensions.gaia.official'] = Boolean(this.config.OFFICIAL);
|
|
this.userPrefs['extensions.gaia.locales_file'] = this.config.LOCALES_FILE;
|
|
// Bug 952901: remove getLocaleBasedir() if bug 952900 fixed.
|
|
this.userPrefs['extensions.gaia.locale_basedir'] = utils.getLocaleBasedir(
|
|
this.config.LOCALE_BASEDIR);
|
|
|
|
var suffix = this.config.GAIA_DEV_PIXELS_PER_PX === '1' ?
|
|
'' : '@' + this.config.GAIA_DEV_PIXELS_PER_PX + 'x';
|
|
this.userPrefs['extensions.gaia.device_pixel_suffix'] = suffix;
|
|
this.userPrefs['extensions.autoDisableScopes'] = 0;
|
|
this.userPrefs['xpinstall.signatures.required'] = false;
|
|
|
|
// electrolysis breaks the app:// protocol as registered by httpd.js
|
|
// see Bug 1097912
|
|
this.userPrefs['browser.tabs.remote.autostart'] = false;
|
|
this.userPrefs['browser.tabs.remote.autostart.1'] = false;
|
|
this.userPrefs['browser.tabs.remote.autostart.2'] = false;
|
|
|
|
// Disable dialog asking to set firefox as default OS browser
|
|
this.userPrefs['browser.shell.checkDefaultBrowser'] = false;
|
|
};
|
|
|
|
PreferencesBuilder.prototype.setDeviceDebugPref = function() {
|
|
this.userPrefs['dom.apps.developer_mode'] = true;
|
|
this.userPrefs['network.disable.ipc.security'] = true;
|
|
this.userPrefs['dom.webcomponents.enabled'] = true;
|
|
this.userPrefs['devtools.debugger.prompt-connection'] = false;
|
|
this.userPrefs['devtools.debugger.forbid-certified-apps'] = false;
|
|
// Bug 1001348: This optimization prevents debugger to fetch script sources
|
|
// of certified apps as well as chrome code:
|
|
this.userPrefs['javascript.options.discardSystemSource'] = false;
|
|
this.userPrefs['b2g.adb.timeout'] = 0;
|
|
};
|
|
|
|
PreferencesBuilder.prototype.writePrefs = function(jsPath, prefs, userPrefs) {
|
|
var userJs = utils.getFile(jsPath);
|
|
var content = '';
|
|
var pref;
|
|
// Output pref
|
|
for (pref in prefs) {
|
|
content += 'pref(\'' + pref + '\', ' + JSON.stringify(prefs[pref]) + ');\n';
|
|
}
|
|
// Output user_pref
|
|
for (pref in userPrefs) {
|
|
content += 'user_pref(\'' + pref + '\', ' +
|
|
JSON.stringify(userPrefs[pref]) + ');\n';
|
|
}
|
|
utils.writeContent(userJs, content + '\n');
|
|
};
|
|
|
|
PreferencesBuilder.prototype.setPrefs = function() {
|
|
[this.prefs, this.userPrefs].forEach(function(prefs) {
|
|
for (var pref in prefs) {
|
|
switch(typeof prefs[pref]) {
|
|
case 'string':
|
|
utils.Services.prefs.setCharPref(pref, prefs[pref]);
|
|
break;
|
|
case 'boolean':
|
|
utils.Services.prefs.setBoolPref(pref, prefs[pref]);
|
|
break;
|
|
case 'number':
|
|
utils.Services.prefs.setIntPref(pref, prefs[pref]);
|
|
break;
|
|
default:
|
|
throw new Error('Unsupported pref type: ' + typeof prefs[pref]);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
|
|
exports.execute = function(config) {
|
|
if (config.BUILD_APP_NAME !== '*') {
|
|
return;
|
|
}
|
|
(new PreferencesBuilder()).execute(config);
|
|
};
|
|
|
|
exports.PreferencesBuilder = PreferencesBuilder;
|