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,75 @@
/**
* UI for Addons panel's functionality.
*
* @module AddonsList
*/
define(function(require) {
'use strict';
var SettingsService = require('modules/settings_service');
var ListView = require('modules/mvvm/list_view');
var AddonItemTemplateFactory = require('panels/addons/addons_template');
var ObservableArray = require('modules/mvvm/observable_array');
function AddonsList(root, manager) {
this._enabled = false;
this._listRoot = root;
this._addonManager = manager;
this._addons = ObservableArray(this._sortByName(
this._addonManager.addons.array));
['insert', 'remove'].forEach(e =>
this._addonManager.addons.addEventListener(e, this._update.bind(this)));
var addonTemplate = AddonItemTemplateFactory(function onClick(addon) {
SettingsService.navigate('addon-details', { addon: addon });
});
this._listView = ListView(this._listRoot, this._addons, addonTemplate);
}
AddonsList.prototype = {
set enabled(value) {
if (value !== this._enabled) {
this._listView.enabled = this._enabled = value;
}
},
_sortByName: function(addons) {
return addons.sort((a, b) => {
return a._app.manifest.name.localeCompare(b._app.manifest.name);
});
},
_update: function() {
return this._filter ?
Promise.all(this._addonManager.addons.array.map(addon =>
this._addonManager.addonAffectsApp(addon, this._filter).then(
affects => affects ? addon : undefined))).then(
addons => this._addons.reset(this._sortByName(
addons.filter(addon => addon)))) :
Promise.resolve(this._addons.reset(this._sortByName(
this._addonManager.addons.array)));
},
setFilter: function(manifestURL) {
if (!manifestURL) {
return Promise.resolve();
}
this._filter = manifestURL;
return this._update();
},
unsetFilter: function() {
if (!this._filter) {
return Promise.resolve();
}
delete this._filter;
return this._update();
}
};
return function ctor_addons_list(root, manager) {
return new AddonsList(root, manager);
};
});

View file

@ -0,0 +1,64 @@
/**
* The template function for generating an UI element for an Addon item.
*
* @module addons/addons_template
*/
define(function(require) {
'use strict';
var ManifestHelper = require('shared/manifest_helper');
const PREFERRED_ICON_SIZE = 30 * (window.devicePixelRatio || 1);
function addonsTemplate(onClick, addon, recycled) {
var manifest = new ManifestHelper(addon.instance.manifest ||
addon.instance.updateManifest);
var container = null;
var link, span, small, icon;
if (recycled) {
container = recycled;
link = container.querySelector('a');
span = container.querySelector('span');
small = container.querySelector('small');
icon = container.querySelector('img');
} else {
container = document.createElement('li');
link = document.createElement('a');
span = document.createElement('span');
small = document.createElement('small');
icon = document.createElement('img');
link.href = '#';
link.classList.add('menu-item');
small.classList.add('menu-item-desc');
link.appendChild(icon);
link.appendChild(span);
link.appendChild(small);
container.appendChild(link);
}
navigator.mozApps.mgmt
.getIcon(addon.instance, PREFERRED_ICON_SIZE).then((blob) => {
icon.src = URL.createObjectURL(blob);
}).catch(() => {
icon.src = '../style/images/default.png';
});
span.textContent = manifest.displayName;
small.setAttribute('data-l10n-id', addon.enabled ? 'enabled' : 'disabled');
addon.observe('enabled', function(enabled) {
small.setAttribute('data-l10n-id', enabled ? 'enabled' : 'disabled');
});
link.onclick = () => {
onClick(addon);
};
return container;
}
return function ctor_addonsTemplate(onClick) {
return addonsTemplate.bind(null, onClick);
};
});

View file

@ -0,0 +1,44 @@
define(function(require) {
'use strict';
var SettingsPanel = require('modules/settings_panel');
var AddonManager = require('modules/addon_manager');
var AddonsList = require('panels/addons/addons_list');
return function ctor_addons_panel() {
var addonsList;
return SettingsPanel({
onInit: function(panel) {
var listElement = panel.querySelector('.addon-list');
var moreLink = panel.querySelector('.get-more-addons');
addonsList = AddonsList(listElement, AddonManager);
moreLink.addEventListener('click', function() {
moreLink.blur();
// The addons list panel will update itself if new addon is installed.
var activity = new window.MozActivity({
name: 'marketplace-category',
data: { slug: 'addons' }
});
// For workaround jshint.
activity.onsuccess = function() {};
});
},
onBeforeShow: function(panel, options) {
if (options && options.manifestURL) {
return addonsList.setFilter(options.manifestURL).then(() =>
addonsList.enabled = true);
} else {
addonsList.enabled = true;
}
},
onBeforeHide: function() {
return addonsList.unsetFilter().then(() =>
addonsList.enabled = false);
}
});
};
});