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,51 @@
'use strict';
var fs = require('fs'),
profile = require('../index'),
remove = require('remove');
var PROFILE_DIR = __dirname + '/profile';
if (fs.existsSync(PROFILE_DIR))
remove.removeSync(PROFILE_DIR);
fs.mkdirSync(PROFILE_DIR);
fs.mkdirSync(PROFILE_DIR + '/webapps');
// launch about:config in firefox for more pref names.
var options = {
profile: PROFILE_DIR,
prefs: {
// turn on dump so it will output to stdout
'browser.dom.window.dump.enabled': true,
// bump up max workers
'dom.workers.maxPerDomain': 100
},
settings: {
'lockscreen.enabled': true
},
apps: {
'my-new-app.com': __dirname + '/../test/fixtures/test-app-a',
'other-app.com': __dirname + '/../test/fixtures/test-app-b'
}
};
// this will create a temp dir for a profile that will be
// removed when the process closes... keep: true can be passed
// to turn off the default behaviour
profile.create(options, function(err, instance) {
console.log('user.js');
console.log(fs.readFileSync(instance.path + '/user.js', 'utf8').trim());
console.log('\n----\n');
console.log('settings.json');
console.log(fs.readFileSync(instance.path + '/settings.json', 'utf8').trim());
console.log('\n see profile at: ', instance.path);
});

View file

@ -0,0 +1,81 @@
'use strict';
// we obvious always need to create a profile =p
var Profile = require('./lib/profile'),
profileOption = require('./lib/options/profile');
/**
* Profile generation is made up of calling out to many smaller
* modules.. This primary module handles the glue and ordering
* of how the smaller modules are invoked.
*/
/**
* Object to module mappings. Individual modules may consume one or more options
* but are only loaded when their primary option is invoked.
*/
var OPTIONS = {
'apps': './lib/options/apps',
'prefs': './lib/options/prefs',
'settings': './lib/options/settings',
'extracts': './lib/options/extracts'
};
/**
* Creates a profile for use with a gecko product.
*
* Master copy of options is kept in the README.md.
*
* @param {Object} options (see docs README.md or individual option files).
* @param {Function} callback [Error err, Profile profile].
*/
function create(options, callback) {
options = options || {};
// always create a profile first.
profileOption(options, function(err, path) {
if (err) return callback(err);
// create the object representing the profile.
var instance = new Profile(path);
// next step is to build the chain of actions
var pending;
var actions = [];
for (var key in options) {
var module = OPTIONS[key];
if (module) {
actions.push(require(module));
}
}
pending = actions.length;
// abort async if we don't have any other steps
if (pending === 0) {
return process.nextTick(callback.bind(null, null, instance));
}
var lastErr = null;
// executed when each action ends.
function next(err) {
// XXX: allow options to set properties on the profile object?
// we don't fail on error but record the most recent one and pass it up.
lastErr = err || lastErr;
if (--pending === 0) {
callback(lastErr, instance);
}
}
var action;
while ((action = actions.shift())) {
// every option function accepts a profile, the options and a callback
action(path, options, next);
}
});
}
module.exports.create = create;
module.exports.Profile = Profile;

View file

@ -0,0 +1,76 @@
'use strict';
var fs = require('fs'),
tmpdir = require('./tmpdir');
var Profiles = {
/**
* Attempts to find a gaia profile from a directory and then copies it to a
* new directory.
*
* @param {String} path to runtime (/Applications/B2G.App).
* @param {Function} callback [Error err, String path].
*/
gaia: function(path, callback) {
var gaiaProfile = require('./gaiaprofile');
gaiaProfile(path, function(err, basePath) {
if (err) return callback(err);
this.baseProfile(basePath, callback);
}.bind(this));
},
/**
* Creates a new profile by copying an existing one.
*
* @param {String} path to copy profile from.
* @param {Function} callback [Error err, String path].
*/
baseProfile: function(path, callback) {
var traverseDir = require('traverse-directory');
this.tmp(function(err, target) {
var traverse = traverseDir(path, target);
traverse.file(function(source, target, next) {
next(traverseDir.copyfile, source, target);
});
traverse.directory(function(source, target, next) {
var leaf = source.replace(path, '');
// the / here is really important otherwise we will end up symlinking
// the entire webapps directory is not what we want.
if (leaf.indexOf('webapps/') !== -1) {
next(traverseDir.symlinkdir, source, target);
return;
}
next(traverseDir.copydir, source, target);
});
traverse.run(function() {
if (err) return callback(err);
callback(null, target);
});
});
},
/**
* Verifies profile exists and returns it or an error.
*
* @param {Function} callback [Error err, String path].
*/
profile: function(path, callback) {
fs.exists(path, function(pathExists) {
if (pathExists) return callback(null, path);
callback(new Error('invalid profile path: "' + path + '" is not found.'));
});
},
/**
* Creates a tmpdir for profile to reside in.
*
* @param {Function} callback [Error err, dir].
*/
tmp: tmpdir
};
module.exports = Profiles;

View file

@ -0,0 +1,32 @@
'use strict';
var fsPath = require('path'),
fs = require('fs');
/**
* Detects the gaia profile inside of a runtime directory.
*
* @param {String} path of runtime.
* @return {String} location of base profile.
*/
function gaiaProfile (basePath, callback) {
var foundPath = false;
var pending = 2;
function next(path, exists) {
if (exists) {
foundPath = true;
callback(null, path);
}
if (--pending === 0 && !foundPath) {
callback(new Error('could not find path to gaia profile'));
}
}
var linux = fsPath.join(basePath, 'gaia', 'profile');
fs.exists(linux, next.bind(null, linux));
var macos = fsPath.join(basePath, 'Contents', 'Resources', 'gaia', 'profile');
fs.exists(macos, next.bind(null, macos));
}
module.exports = gaiaProfile;

View file

@ -0,0 +1,25 @@
'use strict';
var installApps = require('packaged-webapp').installApps;
function apps(profile, options, callback) {
// abort if no apps are given
if (
// no options
!options ||
// no apps
!options.apps ||
// empty app object
(Object.keys(options.apps).length === 0)
) {
return process.nextTick(callback.bind(null, null, profile));
}
var list = [];
for (var origin in options.apps) {
list.push({ origin: origin, source: options.apps[origin] });
}
installApps(profile, list, callback);
}
module.exports = apps;

View file

@ -0,0 +1,29 @@
'use strict';
var fse = require('fs-extra');
/**
* Recursively copy a directory of prebuilt files into a profile. Used for
* overwriting files in a clean profile for tests.
*
* Options:
* - (Object) extract: Directory to copy into profile.
*
* @param {String} profile path to profile.
* @param {Object} options for directory.
* @param {Function} callback fires after successfully copying.
*/
function copyExtract(profile, options, callback) {
// we userPrefs was used in the past
var extractsDir = options.extracts;
// don't do anything unless there is a directory to copy
if (!extractsDir) {
return process.nextTick(callback.bind(null, null, profile));
}
fse.copy(extractsDir, profile, function(err) {
if (err) return callback(err);
return callback(null, profile);
});
}
module.exports = copyExtract;

View file

@ -0,0 +1,32 @@
'use strict';
var fs = require('fs'),
fsPath = require('path'),
pref = require('../pref');
var USER_PREF = 'user.js';
/**
* Appends prefs to the given profile.
*
* Options:
* - (Object) prefs: key/value pairs.
*
* @param {String} profile path to profile.
* @param {Object} options for prefs.
* @param {Function} callback fires after successfully saving.
*/
function appendPrefs(profile, options, callback) {
// we userPrefs was used in the past
var prefsConfig = options.prefs || options.userPrefs;
// don't do anything unless there are some new prefs
if (!prefsConfig || Object.keys(prefsConfig).length === 0) {
return process.nextTick(callback.bind(null, null, profile));
}
var filename = fsPath.join(profile, USER_PREF);
fs.appendFile(filename, '\n' + pref(prefsConfig), function(err) {
if (err) return callback(err);
callback(null, profile);
});
}
module.exports = appendPrefs;

View file

@ -0,0 +1,85 @@
'use strict';
/** handles mutation of settings.json */
var SETTINGS = 'settings.json';
var PERMISSIONS_DB = 'permissions.sqlite';
var fs = require('fs'),
fsPath = require('path');
/**
* Updates the settings.json file of a given profile
*
* @param {String} profile path.
* @param {Options} options with .settings.
* @param {Function} callback [Error err, profile].
*/
function settings(profile, options, callback) {
if (!options || !options.settings) {
return process.nextTick(callback.bind(null, null, profile));
}
// location of settings.json
var settingsPath = fsPath.join(profile, SETTINGS);
// location of permissions
var permissionsPath = fsPath.join(profile, PERMISSIONS_DB);
function readSettings() {
fs.readFile(settingsPath, 'utf8', function(err, content) {
var json;
try {
json = JSON.parse(content);
} catch (e) {
return callback(e);
}
writeSettings(json);
});
}
function writeSettings(original) {
// copy new settings over
var newSettings = options.settings;
for (var name in newSettings) {
original[name] = newSettings[name];
}
var pending = 2;
function next(err) {
if (err) {
callback && callback(err);
callback = null;
}
if (--pending === 0)
callback(null, profile);
}
fs.exists(permissionsPath, function(itDoes) {
if (!itDoes)
return next();
fs.unlink(permissionsPath, next);
});
// and finally write the file back out
fs.writeFile(
settingsPath,
// slows it down a but but makes it readable!
JSON.stringify(original, null, 2),
next
);
}
// check if file exists
fs.exists(settingsPath, function(fileExists) {
if (fileExists) {
// when file exists read it then write
readSettings();
} else {
// otherwise simply write
writeSettings({});
}
});
}
module.exports = settings;

View file

@ -0,0 +1,60 @@
'use strict';
var PREF = 'pref';
/**
* Builds a multi line string of prefs.
*
* @param {Object} prefs key/value pairs.
* @return {String} lines
*/
function prefs(object) {
var result = [];
Object.keys(object).forEach(function(key) {
result.push(pref(key, object[key]));
});
return result.join('\n');
}
/**
* Create a pref string based on a name/value pair.
*
* pref('browser.dom.window.dump.enabled', true);
* // => 'pref("browser.dom.window.dump.enabled", true);'
*
* // can also be given a single object
*
* pref({
* 'key': value
* });
* // => multiple lines
*
* @param {String} name of pref;
* @param {Object|Number|String} value of pref.
* @return {String} version of pref.
*/
function pref(name, value) {
if (!value && typeof name === 'object')
return prefs(name);
var type = typeof value;
var out = PREF + '("' + name + '", ';
switch (type) {
case 'string':
out += '"' + value + '"';
break;
case 'number':
case 'boolean':
out += value;
break;
default:
out += '"' + JSON.stringify(value) + '"';
break;
}
out += ');';
return out;
}
module.exports = pref;

View file

@ -0,0 +1,37 @@
'use strict';
var tmp = require('tmp');
// https://github.com/mozilla-b2g/mozilla-profile-builder/issues/2
process.on('SIGINT', function() {});
/**
* Wrapper around common tmp dir creation functionality.
*
* Options:
* - (Boolean) keep: when true profile will not be removed on process close.
*
* @param {Object} options for tmp dir creation.
* @param {Function} callback for tmp dir creation.
*/
function tmpdir(options, callback) {
if (typeof options === 'function') {
callback = options;
options = null;
}
// configuration for temp directory
// https://github.com/raszi/node-tmp#options
var tmpConfig = {};
if (options && options.keep) {
// keep directory for later
tmpConfig.keep = true;
} else {
// discard directory when process closes.
tmpConfig.unsafeCleanup = true;
tmpConfig.keep = false;
}
tmp.dir(tmpConfig, callback);
}
module.exports = tmpdir;

View file

@ -0,0 +1,15 @@
{
"name": "mozilla-profile-builder",
"version": "0.4.0",
"author": "James Lal [:lightsofapollo]",
"description": "Create profiles for firefox/b2g desktop",
"main": "index.js",
"dependencies" : {
"fs-extra": "~0.8.1",
"packaged-webapp": "~0.1.1",
"remove": "~0.1",
"tmp": "~0.0.21",
"traverse-directory": "~0.1.0"
}
}

View file

@ -0,0 +1,109 @@
/* global assert */
'use strict';
suite('createprofile', function() {
var subject = require('../lib/createprofile'),
fs = require('fs'),
fsPath = require('path');
suite('.gaia', function() {
var target = __dirname + '/fixtures/b2g-mac';
var path;
setup(function(done) {
subject.gaia(target, function(err, _path) {
if (err) return done(err);
path = _path;
done();
});
});
test('copied files from profile', function() {
assert.ok(fs.existsSync(path + '/yey.js'));
});
});
suite('.baseProfile', function() {
var target = __dirname + '/fixtures/b2g-profile';
var path;
setup(function(done) {
subject.baseProfile(target, function(err, _path) {
if (err) return done(err);
path = _path;
done();
});
});
test('exists', function(done) {
subject.profile(path, done);
});
test('is a new path', function() {
assert.ok(path !== target);
});
[
'webapps/a.js',
'webapps/webapps.json',
'settings.json'
].forEach(function(file) {
test('copies ' + file, function() {
var targetFile = fsPath.join(target, file);
// verify they are not symlinked
var stat = fs.lstatSync(targetFile);
assert.ok(!stat.isSymbolicLink(), 'is not a symlink');
assert.equal(
fs.readFileSync(targetFile, 'utf8'),
fs.readFileSync(path + '/' + file, 'utf8'),
'file equality'
);
});
});
[
'webapps/app1',
'webapps/app2'
].forEach(function(file) {
test('symlinks ' + file, function() {
var sourceFile = fsPath.join(target, file);
var targetFile = fsPath.join(path, file);
assert.ok(fs.existsSync(targetFile), 'link exists');
assert.equal(sourceFile, fs.readlinkSync(targetFile), 'is symlinked');
});
});
});
test('.tmp', function(done) {
subject.tmp(function(err, profile) {
if (err) return done(err);
assert.ok(fs.existsSync(profile));
done();
});
});
suite('.profile', function() {
test('missing', function(done) {
subject.profile('probably/is/not/here', function(err) {
if (!err) done(new Error('should throw an error'));
assert.ok(/invalid/.test(err.message));
done();
});
});
test('exists', function(done) {
subject.tmp(function(err, path) {
subject.profile(path, function(err, givenPath) {
if (err) return done(err);
assert.equal(path, givenPath);
done();
});
});
});
});
});

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,187 @@
user_pref("browser.manifestURL", "app://system.gaiamobile.org/manifest.webapp");
user_pref("browser.homescreenURL", "app://system.gaiamobile.org/index.html");
user_pref("network.http.max-connections-per-server", 15);
user_pref("ril.debugging.enabled", false);
user_pref("network.dns.localDomains", "gaiamobile.org,bluetooth.gaiamobile.org,browser.gaiamobile.org,calendar.gaiamobile.org,camera.gaiamobile.org,clock.gaiamobile.org,communications.gaiamobile.org,costcontrol.gaiamobile.org,email.gaiamobile.org,fm.gaiamobile.org,gallery.gaiamobile.org,homescreen.gaiamobile.org,keyboard.gaiamobile.org,music.gaiamobile.org,pdfjs.gaiamobile.org,settings.gaiamobile.org,sms.gaiamobile.org,system.gaiamobile.org,video.gaiamobile.org,wallpaper.gaiamobile.org");
pref("geo.gps.supl_server", "supl.izatcloud.net");
pref("geo.gps.supl_port", 22024);
pref("dom.payment.provider.0.name", "firefoxmarket");
pref("dom.payment.provider.0.description", "marketplace.firefox.com");
pref("dom.payment.provider.0.uri", "https://marketplace.firefox.com/mozpay/?req=");
pref("dom.payment.provider.0.type", "mozilla/payments/pay/v1");
pref("dom.payment.provider.0.requestMethod", "GET");
// Send these sites a custom user-agent. Bugs to remove each override after
// evangelism are included.
pref("general.useragent.override.youtube.com", "\(Mobile#(Android; Mobile"); // bug 827636
pref("general.useragent.override.accounts.google.com", "\(Mobile#(Android; Mobile"); // bug 805164
pref("general.useragent.override.maps.google.com", "\(Mobile#(Android; Mobile"); // bug 802981
pref("general.useragent.override.uol.com.br", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826330
pref("general.useragent.override.live.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826332
pref("general.useragent.override.globo.com", "\(Mobile#(Android; Mobile"); // bug 826335
pref("general.useragent.override.yahoo.com", "\(Mobile#(Android; Mobile"); // bug 826338
pref("general.useragent.override.mercadolivre.com.br", "\(Mobile#(Android; Mobile"); // bug 826342
pref("general.useragent.override.ig.com.br", "\(Mobile#(Android; Mobile"); // bug 826343
pref("general.useragent.override.abril.com.br", "\(Mobile#(Android; Mobile"); // bug 826344
pref("general.useragent.override.msn.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826347
pref("general.useragent.override.linkedin.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826348
pref("general.useragent.override.itau.com.br", "\(Mobile#(Android; Mobile"); // bug 826353
pref("general.useragent.override.tumblr.com", "\(Mobile#(Android; Mobile"); // bug 826361
pref("general.useragent.override.4shared.com", "\(Mobile#(Android; Mobile"); // bug 826502
pref("general.useragent.override.orkut.com.br", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826504
pref("general.useragent.override.r7.com", "\(Mobile#(Android; Mobile"); // bug 826510
pref("general.useragent.override.amazon.com", "\(Mobile#(Android; Mobile"); // bug 826512
pref("general.useragent.override.estadao.com.br", "\(Mobile#(Android; Mobile"); // bug 826514
pref("general.useragent.override.letras.mus.br", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826517
pref("general.useragent.override.bb.com.br", "\(Mobile#(Android; Mobile"); // bug 826711
pref("general.useragent.override.orkut.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 826712
pref("general.useragent.override.noticias.uol.com.br", "\(Mobile#(Android; Mobile"); // bug 826715
pref("general.useragent.override.olx.com.br", "\(Mobile#(Android; Mobile"); // bug 826720
pref("general.useragent.override.bancobrasil.com.br", "\(Mobile#(Android; Mobile"); // bug 826736
pref("general.useragent.override.techtudo.com.br", "\(Mobile#(Android; Mobile"); // bug 826845
pref("general.useragent.override.clickjogos.uol.com.br", "\(Mobile#(Android; Mobile"); // bug 826949
pref("general.useragent.override.ebay.com", "\(Mobile#(Android; Mobile");// bug 826958
pref("general.useragent.override.bing.com", "\(Mobile#(Android; Mobile"); // bug 827622
pref("general.useragent.override.tam.com.br", "\(Mobile#(Android; Mobile"); // bug 827623
pref("general.useragent.override.pontofrio.com.br", "\(Mobile#(Android; Mobile"); // bug 827624
pref("general.useragent.override.pagseguro.uol.com.br", "\(Mobile#(Android; Mobile"); // bug 827625
pref("general.useragent.override.magazineluiza.com.br", "\(Mobile#(Android; Mobile"); // bug 827626
pref("general.useragent.override.bol.uol.com.br", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 827627
pref("general.useragent.override.groupon.com.br", "\(Mobile#(Android; Mobile"); // bug 827628
pref("general.useragent.override.vagalume.com.br", "\(Mobile#(Android; Mobile"); // bug 827630
pref("general.useragent.override.climatempo.com.br", "\(Mobile#(Android; Mobile"); // bug 827631
pref("general.useragent.override.tecmundo.com.br", "\(Mobile#(Android; Mobile"); // bug 827632
pref("general.useragent.override.hao123.com", "\(Mobile#(Android; Mobile"); // bug 827633
pref("general.useragent.override.imdb.com", "\(Mobile#(Android; Mobile"); // bug 827634
pref("general.useragent.override.lancenet.com.br", "\(Mobile#(Android; Mobile"); // bug 827576
pref("general.useragent.override.webmotors.com.br", "\(Mobile#(Android; Mobile"); // bug 827573
pref("general.useragent.override.mercadolibre.com.co", "\(Mobile#(Android; Mobile"); // bug 827661
pref("general.useragent.override.elespectador.com", "\(Mobile#(Android; Mobile"); // bug 827664
pref("general.useragent.override.slideshare.net", "\(Mobile#(Android; Mobile"); // bug 827666
pref("general.useragent.override.scribd.com", "\(Mobile#(Android; Mobile"); // bug 827668
pref("general.useragent.override.elpais.com.co", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 827670
pref("general.useragent.override.olx.com.co", "\(Mobile#(Android; Mobile"); // bug 827672
pref("general.useragent.override.avianca.com", "\(Mobile#(Android; Mobile"); // bug 827674
pref("general.useragent.override.marca.com", "\(Mobile#(Android; Mobile"); // bug 827678
pref("general.useragent.override.wp.pl", "\(Mobile#(Android; Mobile"); // bug 828351
pref("general.useragent.override.gazeta.pl", "\(Mobile#(Android; Mobile"); // bug 828354
pref("general.useragent.override.o2.pl", "\(Mobile#(Android; Mobile"); // bug 828356
pref("general.useragent.override.ceneo.pl", "\(Mobile#(Android; Mobile"); // bug 828358
pref("general.useragent.override.sport.pl", "\(Mobile#(Android; Mobile"); // bug 828360
pref("general.useragent.override.tvn24.pl", "\(Mobile#(Android; Mobile"); // bug 828362
pref("general.useragent.override.nk.pl", "\(Mobile#(Android; Mobile"); // bug 828364
pref("general.useragent.override.wyborcza.biz", "\(Mobile#(Android; Mobile"); // bug 828366
pref("general.useragent.override.money.pl", "\(Mobile#(Android; Mobile"); // bug 828369
pref("general.useragent.override.ingbank.pl", "\(Mobile#(Android; Mobile"); // bug 828371
pref("general.useragent.override.tablica.pl", "\(Mobile#(Android; Mobile"); // bug 828374
pref("general.useragent.override.plotek.pl", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 828376
pref("general.useragent.override.wyborcza.pl", "\(Mobile#(Android; Mobile"); // bug 828378
pref("general.useragent.override.deser.pl", "\(Mobile#(Android; Mobile"); // bug 828380
pref("general.useragent.override.as.com", "\(Mobile#(Android; Mobile"); // bug 828383
pref("general.useragent.override.ebay.es", "\(Mobile#(Android; Mobile"); // bug 828386
pref("general.useragent.override.amazon.es", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 828388
pref("general.useragent.override.20minutos.es", "\(Mobile#(Android; Mobile"); // bug 828390
pref("general.useragent.override.infojobs.net", "\(Mobile#(Android; Mobile"); // bug 828392
pref("general.useragent.override.vimeo.com", "\(Mobile#(Android; Mobile"); // bug 828394
pref("general.useragent.override.elconfidencial.com", "\(Mobile#(Android; Mobile"); // bug 828397
pref("general.useragent.override.antena3.com", "\(Mobile#(Android; Mobile"); // bug 828399
pref("general.useragent.override.ingdirect.es", "\(Mobile#(Android; Mobile"); // bug 828401
pref("general.useragent.override.fotocasa.es", "\(Mobile#(Android; Mobile"); // bug 828403
pref("general.useragent.override.orange.es", "\(Mobile#(Android; Mobile"); // bug 828406
pref("general.useragent.override.amazon.co.uk", "\(Mobile#(Android; Mobile"); // bug 828412
pref("general.useragent.override.paginasamarillas.es", "\(Mobile#(Android; Mobile"); // bug 828414
pref("general.useragent.override.loteriasyapuestas.es", "\(Mobile#(Android; Mobile"); // bug 828416
pref("general.useragent.override.bbva.es", "\(Mobile#(Android; Mobile"); // bug 828418
pref("general.useragent.override.booking.com", "\(Mobile#(Android; Mobile"); // bug 828420
pref("general.useragent.override.publico.es", "\(Mobile#(Android; Mobile"); // bug 828422
pref("general.useragent.override.mercadolibre.com.ve", "\(Mobile#(Android; Mobile"); // bug 828425
pref("general.useragent.override.espn.go.com", "\(Mobile#(Android; Mobile"); // bug 828431
pref("general.useragent.override.olx.com.ve", "\(Mobile#(Android; Mobile"); // bug 828433
pref("general.useragent.override.rincondelvago.com", "\(Mobile#(Android; Mobile"); // bug 828435
pref("general.useragent.override.movistar.com.ve", "\(Mobile#(Android; Mobile"); // bug 828439
pref("general.useragent.override.despegar.com.ve", "\(Mobile#(Android; Mobile"); // bug 828443
pref("general.useragent.override.bumeran.com.ve", "\(Mobile#(Android; Mobile"); // bug 828445
pref("general.useragent.override.petardas.com", "\(Mobile#(Android; Mobile"); // bug 828448
pref("general.useragent.override.mail.google.com", "\(Mobile#(Android; Mobile"); // bug 827869
pref("general.useragent.override.enfemenino.com", "\(Mobile#(Android; Mobile"); // bug 843109
pref("general.useragent.override.movil.bankinter.es", "\(Mobile#(Android; Mobile"); // bug 843112
pref("general.useragent.override.einforma.com", "\(Mobile#(Android; Mobile"); // bug 843114
pref("general.useragent.override.wwwhatsnew.com", "\(Mobile#(Android; Mobile"); // bug 843116
pref("general.useragent.override.askthebuilder.com", "\(Mobile#(Android; Mobile"); // bug 843119
pref("general.useragent.override.tor.com", "\(Mobile#(Android; Mobile"); // bug 843121
pref("general.useragent.override.maruccisports.com", "\(Mobile#(Android; Mobile"); // bug 843124
pref("general.useragent.override.es.playstation.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 843126
pref("general.useragent.override.11870.com", "\(Mobile#(Android; Mobile"); // bug 843129
pref("general.useragent.override.iphonejuegosgratis.com", "\(Mobile#(Android; Mobile"); // bug 843200
pref("general.useragent.override.comunio.es", "\(Mobile#(Android; Mobile"); // bug 843132
pref("general.useragent.override.news.google.com", "\(Mobile#(Android; Mobile"); // bug 843134
pref("general.useragent.override.deviantart.com", "\(Mobile#(Android; Mobile"); // bug 843136
pref("general.useragent.override.nytimes.com", "\(Mobile#(Android; Mobile"); // bug 843137
pref("general.useragent.override.consumersearch.com", "\(Mobile#(Android; Mobile"); // bug 843139
pref("general.useragent.override.foodily.com", "\(Mobile#(Android; Mobile"); // bug 843141
pref("general.useragent.override.foxnewsinsider.com", "\(Mobile#(Android; Mobile"); // bug 843143
pref("general.useragent.override.edmunds.com", "\(Mobile#(Android; Mobile"); // bug 843146
pref("general.useragent.override.icanhas.cheezburger.com", "\(Mobile#(Android; Mobile"); // bug 843197
pref("general.useragent.override.arstechnica.com", "\(Mobile#(Android; Mobile"); // bug 843149
pref("general.useragent.override.citibank.com", "\(Mobile#(Android; Mobile"); // bug 843151
pref("general.useragent.override.games.com", "\(Mobile#(Android; Mobile"); // bug 843153
pref("general.useragent.override.nba.com", "\(Mobile#(Android; Mobile"); // bug 843154
pref("general.useragent.override.orbitz.com", "\(Mobile#(Android; Mobile"); // bug 843156
pref("general.useragent.override.starwoodhotels.com", "\(Mobile#(Android; Mobile"); // bug 843158
pref("general.useragent.override.ehow.com", "\(Mobile#(Android; Mobile"); // bug 843160
pref("general.useragent.override.urbanspoon.com", "\(Mobile#(Android; Mobile"); // bug 843162
pref("general.useragent.override.virginatlantic.com", "\(Mobile#(Android; Mobile"); // bug 843165
pref("general.useragent.override.cheaptickets.com", "\(Mobile#(Android; Mobile"); // bug 843168
pref("general.useragent.override.etsy.com", "\(Mobile#(Android; Mobile"); // bug 843170
pref("general.useragent.override.zimbio.com", "\(Mobile#(Android; Mobile"); // bug 843172
pref("general.useragent.override.thinkgeek.com", "\(Mobile#(Android; Mobile"); // bug 843174
pref("general.useragent.override.tylted.com", "\(Mobile#(Android; Mobile"); // bug 843176
pref("general.useragent.override.txt2nite.com", "\(Mobile#(Android; Mobile"); // bug 843178
pref("general.useragent.override.slashgear.com", "\(Mobile#(Android; Mobile"); // bug 843181
pref("general.useragent.override.chevrolet.com", "\(Mobile#(Android; Mobile"); // bug 843186
pref("general.useragent.override.deadline.com", "\(Mobile#(Android; Mobile"); // bug 848854
pref("general.useragent.override.3g.qq.com", "\(Mobile#(Android; Mobile"); // bug 866577
pref("general.useragent.override.aprod.hu", "\\(Mobile#(Android; Mobile"); // bug 878220
pref("general.useragent.override.arukereso.hu", "\\(Mobile#(Android; Mobile"); // bug 878222
pref("general.useragent.override.badoo.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 878224
pref("general.useragent.override.bet365.com", "\\(Mobile#(Android; Mobile"); // bug 878226
pref("general.useragent.override.blikk.hu", "\\(Mobile#(Android; Mobile"); // bug 878228
pref("general.useragent.override.citromail.hu", "\\(Mobile#(Android; Mobile"); // bug 878230
pref("general.useragent.override.hazipatika.com", "\\(Mobile#(Android; Mobile"); // bug 878232
pref("general.useragent.override.hvg.hu", "\\(Mobile#(Android; Mobile"); // bug 878234
pref("general.useragent.override.jofogas.hu", "\\(Mobile#(Android; Mobile"); // bug 878236
pref("general.useragent.override.koponyeg.hu", "\\(Mobile#(Android; Mobile"); // bug 878238
pref("general.useragent.override.kuruc.info", "\\(Mobile#(Android; Mobile"); // bug 878240
pref("general.useragent.override.nemzetisport.hu", "\\(Mobile#(Android; Mobile"); // bug 878242
pref("general.useragent.override.nlcafe.hu", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 878244
pref("general.useragent.override.port.hu", "\\(Mobile#(Android; Mobile"); // bug 878246
pref("general.useragent.override.portfolio.hu", "\\(Mobile#(Android; Mobile"); // bug 878249
pref("general.useragent.override.profession.hu", "\\(Mobile#(Android; Mobile"); // bug 878251
pref("general.useragent.override.vatera.hu", "\\(Mobile#(Android; Mobile"); // bug 878253
pref("general.useragent.override.24sata.hr", "\\(Mobile#(Android; Mobile"); // bug 878255
pref("general.useragent.override.bet365.com", "\\(Mobile#(Android; Mobile"); // bug 878256
pref("general.useragent.override.blackhatteam.com", "\\(Mobile#(Android; Mobile"); // bug 878258
pref("general.useragent.override.cdm.me", "\\(Mobile#(Android; Mobile"); // bug 878260
pref("general.useragent.override.download.com", "\\(Mobile#(Android; Mobile"); // bug 878262
pref("general.useragent.override.haber.ba", "\\(Mobile#(Android; Mobile"); // bug 878264
pref("general.useragent.override.i-dizajn.com", "\\(Mobile#(Android; Mobile"); // bug 878266
pref("general.useragent.override.jutarnji.hr", "\\(Mobile#(Android; Mobile"); // bug 878268
pref("general.useragent.override.kurir-info.rs", "\\(Mobile#(Android; Mobile"); // bug 878271
pref("general.useragent.override.livescore.com", "\\(Mobile#(Android; Mobile"); // bug 878273
pref("general.useragent.override.mondo.rs", "\\(Mobile#(Android; Mobile"); // bug 878275
pref("general.useragent.override.naslovi.net", "\\(Mobile#(Android; Mobile"); // bug 878277
pref("general.useragent.override.softonic.com", "\\(Mobile#(Android; Mobile"); // bug 878284
pref("general.useragent.override.yandex.ru", "\\(Mobile#(Android; Mobile"); // bug 878286
pref("general.useragent.override.ask.com", "\\(Mobile#(Android; Mobile"); // bug 878630
pref("general.useragent.override.banorte.com", "\\(Mobile#(Android; Mobile"); // bug 878632
pref("general.useragent.override.buenastareas.com", "\\(Mobile#(Android; Mobile"); // bug 878634
pref("general.useragent.override.cnn.com", "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"); // bug 878635
pref("general.useragent.override.eluniversal.com.mx", "\\(Mobile#(Android; Mobile"); // bug 878637
pref("general.useragent.override.flickr.com", "\\(Mobile#(Android; Mobile"); // bug 878638
pref("general.useragent.override.hootsuite.com", "\\(Mobile#(Android; Mobile"); // bug 878640
pref("general.useragent.override.mercadolibre.com.mx", "\\(Mobile#(Android; Mobile"); // bug 878642
pref("general.useragent.override.olx.com.mx", "\\(Mobile#(Android; Mobile"); // bug 878645
pref("general.useragent.override.sat.gob.mx", "\\(Mobile#(Android; Mobile"); // bug 878647
pref("general.useragent.override.univision.com", "\\(Mobile#(Android; Mobile"); // bug 878649
pref("general.useragent.override.b92.net", "\\(Mobile#(Android; Mobile"); // bug 878651
pref("general.useragent.override.redstarbelgrade.info", "\\(Mobile#(Android; Mobile"); // bug 878653
pref("general.useragent.override.vesti-online.com", "\\(Mobile#(Android; Mobile"); // bug 878655

View file

@ -0,0 +1 @@
{ foo: true };

View file

@ -0,0 +1,4 @@
{
"name": "webapp a",
"type": "web"
}

View file

@ -0,0 +1,4 @@
{
"name": "webapp b",
"type": "web"
}

View file

@ -0,0 +1,23 @@
/* global assert */
'use strict';
suite('#gaiaProfile', function() {
var subject = require('../lib/gaiaprofile');
var linux = __dirname + '/fixtures/b2g-linux';
var mac = __dirname + '/fixtures/b2g-mac';
test('mac', function(done) {
subject(mac, function(err, path) {
if (err) return done(err);
assert.equal(path, mac + '/Contents/Resources/gaia/profile');
done();
});
});
test('linux', function(done) {
subject(linux, function(err, path) {
if (err) return done(err);
assert.equal(path, linux + '/gaia/profile');
done();
});
});
});

View file

@ -0,0 +1,4 @@
global.assert = require('assert');
global.sinon = require('sinon');
global.sinon.assert.expose(global.assert, { prefix: '' });

View file

@ -0,0 +1,23 @@
/* global assert */
'use strict';
suite('mozprofilebuilder', function() {
var subject = require('../index'),
Profile = require('../lib/profile'),
fs = require('fs');
test('without options', function(done) {
subject.create({}, function(err, profile) {
if (err) return done(err);
assert.ok(profile instanceof Profile, 'is Profile instance');
assert.ok(fs.existsSync(profile.path), 'path exists');
done();
});
});
test('with options', function(done) {
// mostly to make sure things don't explode- this functionality
// should be 100% covered from the unit level and we should cover
// the rest at the integration test level if possible.
subject.create({ settings: {}, prefs: {}, apps: {} }, done);
});
});

View file

@ -0,0 +1,35 @@
/* global assert */
'use strict';
var baseProfile = __dirname + '/../fixtures/b2g-profile',
apps = require('../../lib/options/apps'),
createProfile = require('../../lib/createprofile');
suite('apps', function() {
suite('app installation', function() {
var options = {
apps: {
'testa.com': __dirname + '/../fixtures/test-app-a/',
'testb.com': __dirname + '/../fixtures/test-app-b/'
}
};
var profile;
setup(function(done) {
createProfile.baseProfile(baseProfile, function(err, _profile) {
if (err) return done(err);
profile = _profile;
apps(profile, options, done);
});
});
test('both apps are in primary manifest', function() {
var installedApps = require(profile + '/webapps/webapps.json');
assert.ok(installedApps['testa.com'], 'testa.com');
assert.ok(installedApps['testb.com'], 'testb.com');
});
});
});

View file

@ -0,0 +1,54 @@
/* global assert */
'use strict';
suite('prefs', function() {
var prefs = require('../../lib/options/prefs.js'),
fixtureDir = __dirname + '/../fixtures/',
fixture = fixtureDir + '/user.js',
pref = require('../../lib/pref'),
fs = require('fs');
function removeFixture() {
if (fs.existsSync(fixture)) {
fs.unlinkSync(fixture);
}
}
setup(removeFixture);
teardown(removeFixture);
test('append to new file', function(done) {
var config = { 'foobar': true };
prefs(fixtureDir, { prefs: config }, function(err) {
if (err) return done(err);
assert.equal(
fs.readFileSync(fixture, 'utf8'),
'\n' + pref(config)
);
done();
});
});
test('no prefs', function(done) {
prefs(fixtureDir, {}, function(err, path) {
assert.deepEqual(path, fixtureDir);
done();
});
});
test('append to existing file', function(done) {
var prefix = 'foo';
var config = { 'foobar': true, 'woot': true };
fs.appendFileSync(fixture, prefix);
prefs(fixtureDir, { prefs: config } , function(err) {
if (err) return done(err);
var expected = prefix + '\n' + pref(config);
assert.equal(
fs.readFileSync(fixture, 'utf8'),
expected
);
done();
});
});
});

View file

@ -0,0 +1,50 @@
/* global assert */
'use strict';
suite('settings', function() {
var createProfile = require('../../lib/createprofile'),
settings = require('../../lib/options/settings'),
fs = require('fs'),
baseProfile = __dirname + '/../fixtures/b2g-profile';
suite('intial settings', function() {
var profile;
var originalSettings;
var options;
setup(function(done) {
options = { settings: { myfoo: true } };
originalSettings = require(baseProfile + '/settings.json');
createProfile.baseProfile(baseProfile, function(err, _profile) {
if (err) return done(err);
profile = _profile;
settings(profile, options, done);
});
});
test('new settings', function() {
var settings = require(profile + '/settings.json');
originalSettings.myfoo = true;
assert.deepEqual(
originalSettings,
settings,
'updates setting'
);
});
test('update settings', function(done) {
var perms = 'permissions.sqlite';
options.settings.myfoo = 111;
settings(profile, options, function(err, newProfile) {
if (err) return done(err);
var settings = require(newProfile + '/settings.json');
assert.ok(!fs.existsSync(newProfile + '/' + perms));
assert.equal(settings.myfoo, 111);
done();
});
});
});
});

View file

@ -0,0 +1,47 @@
'use strict';
suite('pref', function() {
var assert = require('assert');
var pref = require('../lib/pref');
var prefFn = 'pref';
test('string', function() {
assert.equal(
pref('foo', 'bar'),
prefFn + '("foo", "bar");'
);
});
test('boolean', function() {
assert.equal(
pref('foo', true),
prefFn + '("foo", true);'
);
});
test('object', function() {
var obj = { a: true };
assert.equal(
pref('foo', obj),
prefFn + '("foo", "' + JSON.stringify(obj) + '");'
);
});
test('array', function() {
var obj = ['foo', 'bar'];
assert.equal(
pref('foo', obj),
prefFn + '("foo", "' + JSON.stringify(obj) + '");'
);
});
test('given a single object', function() {
var expected = '';
expected += pref('foo', true) + '\n';
expected += pref('bar', true);
assert.equal(
pref({ foo: true, bar: true }),
expected
);
});
});