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

137
gaia/shared/js/basket_client.js Executable file
View file

@ -0,0 +1,137 @@
/* global Promise */
/* exported Basket */
'use strict';
// Simple Javascript client for Mozilla Basket newsletters
var Basket = {
DATASTORE_NAME: 'Basket_Newsletter',
basketUrl: 'https://basket.mozilla.org/news/subscribe/',
newsletterId: 'firefox-os',
callback: null,
xhr: null,
// https://github.com/mozilla/basket-client/blob/master/basket/errors.py
errors: {
NETWORK_FAILURE: 1,
INVALID_EMAIL: 2,
UNKNOWN_EMAIL: 3,
UNKNOWN_TOKEN: 4,
USAGE_ERROR: 5,
EMAIL_PROVIDER_AUTH_FAILURE: 6,
AUTH_ERROR: 7,
SSL_REQUIRED: 8,
INVALID_NEWSLETTER: 9,
INVALID_LANGUAGE: 10,
EMAIL_NOT_CHANGED: 11,
CHANGE_REQUEST_NOT_FOUND: 12,
UNKNOWN_ERROR: 99
},
responseHandler: function b_responseHandler() {
if (this.xhr.readyState === 4) {
if (this.xhr.status === 200) {
if (typeof this.callback === 'function') {
this.callback(null, JSON.parse(this.xhr.responseText));
}
} else {
if (typeof this.callback === 'function') {
if (this.xhr.responseText) {
this.callback(JSON.parse(this.xhr.responseText));
} else {
this.callback('Unknown error');
}
}
}
}
},
timeoutHandler: function b_timeoutHandler() {
this.callback('Timeout');
},
/**
* Send data to Mozilla Basket.
*
* @param {String} [email] email we want to add to the newsletter.
*
* @param {Function} [callback] first argument is error, second
* is result of operation or null
* in the error case.
*/
send: function b_send(email, callback) {
var self = this;
var params = 'email=' + encodeURIComponent(email) +
'&newsletters=' + self.newsletterId;
self.callback = callback;
self.xhr = new XMLHttpRequest({mozSystem: true});
self.xhr.onreadystatechange = self.responseHandler.bind(self);
self.xhr.open('POST', self.basketUrl, true);
self.xhr.setRequestHeader('Content-type',
'application/x-www-form-urlencoded');
self.xhr.setRequestHeader('Connection', 'close');
self.xhr.timeout = 5000; // 5 seconds
self.xhr.ontimeout = self.timeoutHandler.bind(self);
self.getLanguage(function do_send(language) {
if (language) {
params += '&lang=' + language;
}
self.xhr.setRequestHeader('Content-length', params.length);
self.xhr.send(params);
});
},
getDataStore: function() {
var self = this;
return new Promise(function (resolve, reject) {
navigator.getDataStores(self.DATASTORE_NAME).then(function(stores) {
// check it's not empty
if (!stores.length) {
reject(new Error('DataStore not loaded'));
} else {
var dataStore = stores[0];
// check ownership of the DS
if (dataStore.owner === 'app://ftu.gaiamobile.org/manifest.webapp') {
resolve(dataStore);
} else {
reject(new Error('Wrong DataStore'));
}
}
});
});
},
store: function b_store(email, callback) {
this.getDataStore().then(function loaded(store) {
// Store the email address
store.add({ 'newsletter_email': email }).then(function(id) {
if (callback) {
callback(false, id);
}
});
}).catch(function error(err) {
console.error('Something went wrong: ' + err);
callback(err);
});
},
getLanguage: function b_getLanguage(callback) {
var settings = window.navigator.mozSettings;
if (!settings || !settings.createLock) {
callback();
return;
}
var s_name = 'language.current';
var req = settings.createLock().get(s_name);
req.onsuccess = function _onsuccess() {
callback(req.result[s_name]);
};
req.onerror = function _onerror() {
console.error('Error getting setting: ' + s_name);
callback();
};
}
};