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,99 @@
/* global MockNavigatorDatastore, MockDatastore, Promise */
'use strict';
require('/shared/test/unit/mocks/mock_navigator_datastore.js');
require('/shared/js/utilities.js');
requireApp('search/test/unit/mock_search.js');
requireApp('search/js/providers/provider.js');
requireApp('search/js/providers/grid_provider.js');
// Required files for the grid and a mozapp result
require('/shared/js/l10n.js');
require('/shared/elements/gaia_grid/js/grid_icon_renderer.js');
require('/shared/elements/gaia_grid/js/grid_layout.js');
require('/shared/elements/gaia_grid/js/grid_view.js');
require('/shared/elements/gaia_grid/script.js');
require('/shared/elements/gaia_grid/js/items/grid_item.js');
require('/shared/elements/gaia_grid/js/items/bookmark.js');
require('/shared/js/sync_datastore.js');
suite('search/providers/providers', function() {
var subject;
var realDatastore;
var promiseDone = Promise.resolve({ operation: 'done' });
var ICON = 'https://mozorg.cdn.mozilla.net/media/img/favicon.ico';
suiteSetup(function() {
realDatastore = navigator.getDataStores;
navigator.getDataStores = MockNavigatorDatastore.getDataStores;
MockNavigatorDatastore._records = {};
MockDatastore.sync = function() {
var cursor = {
next: function() {
cursor.next = () => promiseDone;
return Promise.resolve({
operation: 'add',
data: {
url: 'http://mozilla.org',
name: 'Homepage',
icon: ICON
}
});
}
};
return cursor;
};
});
suiteTeardown(function() {
navigator.getDataStores = realDatastore;
});
setup(function(done) {
requireApp('search/js/providers/bookmarks.js', function() {
subject = window.Bookmarks;
subject.grid = document.createElement('gaia-grid');
promiseDone.then(function() {
subject.init().then(done);
});
});
});
suite('search', function() {
test('renders data url', function(done) {
subject.search('mozilla').then((results) => {
assert.equal(results[0].data.detail.url, 'http://mozilla.org');
assert.equal(results[0].data.detail.name, 'Homepage');
assert.equal(results[0].data.detail.id, 'http://mozilla.org');
assert.equal(results[0].data.detail.icon, ICON);
done();
});
});
test('search name', function(done) {
subject.search('homepage').then((results) => {
assert.equal(results[0].data.detail.name, 'Homepage');
done();
});
});
});
suite('get', function() {
test('ok', function() {
var bookmark = subject.get('http://mozilla.org');
assert.equal(bookmark.data.detail.url, 'http://mozilla.org');
assert.equal(bookmark.data.detail.name, 'Homepage');
assert.equal(bookmark.data.detail.id, 'http://mozilla.org');
assert.equal(bookmark.data.detail.icon, ICON);
});
test('fail', function() {
var bookmark = subject.get('http://catanddog.org');
assert.isNull(bookmark);
});
});
});

View file

@ -0,0 +1,94 @@
'use strict';
/* global MocksHelper, MockMozContacts, MockContactsList, MockMozActivity,
Search */
require('/shared/test/unit/mocks/mock_moz_activity.js');
require('/shared/js/url_helper.js');
requireApp('search/test/unit/mock_search.js');
requireApp('search/js/providers/provider.js');
require('/shared/test/unit/mocks/mock_mozContacts.js');
require('/apps/communications/contacts/test/unit/mock_contacts_list.js');
var mocksForMarketplaceProvider = new MocksHelper([
'MozActivity'
]).init();
suite('search/providers/contacts', function() {
mocksForMarketplaceProvider.attachTestHelpers();
var fakeElement, stubById, subject;
suiteSetup(function() {
navigator.mozContacts = MockMozContacts;
sinon.stub(navigator.mozContacts, 'find', function() {
return {
set onsuccess(cb) {
cb(MockContactsList());
},
set onerror(cb) {
},
result: MockContactsList()
};
});
});
setup(function(done) {
fakeElement = document.createElement('div');
fakeElement.style.cssText = 'height: 100px; display: block;';
stubById = this.sinon.stub(document, 'getElementById')
.returns(fakeElement.cloneNode(true));
requireApp('search/js/providers/contacts.js', function() {
subject = Search.providers.Contacts;
subject.init();
done();
});
});
teardown(function() {
stubById.restore();
});
suite('click', function() {
test('launches the web activity', function() {
var searchCloseStub = this.sinon.stub(Search, 'close');
subject.click({
target: {
dataset: {
contactId: 'mozilla'
}
}
});
var activityInfo = MockMozActivity.calls[0];
assert.equal(activityInfo.name, 'open');
assert.equal(activityInfo.data.params.id, 'mozilla');
assert.ok(searchCloseStub.calledOnce);
});
});
suite('search', function() {
setup(function() {
this.sinon.stub(URL, 'createObjectURL');
});
test('clears results', function() {
var stub = this.sinon.stub(subject, 'clear');
subject.search(null, function() {});
assert.ok(stub.calledOnce);
});
test('contact is rendered', function(done) {
subject.search('stub content').then((results) => {
Search.collect(subject, results);
var contact = subject.container.querySelector('.result');
assert.equal(contact.querySelector('.title').innerHTML, 'Pepito A');
assert.equal(contact.getAttribute('aria-label'), 'Pepito A');
assert.equal(contact.getAttribute('role'), 'link');
assert.equal(contact.querySelector('.icon img').getAttribute('role'),
'presentation');
done();
});
});
});
});

View file

@ -0,0 +1,156 @@
'use strict';
/* global Search, MockNavigatormozApps, MockNavigatorSettings */
require('/shared/test/unit/mocks/mock_navigator_moz_apps.js');
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
requireApp('search/test/unit/mock_search.js');
requireApp('search/js/providers/provider.js');
requireApp('search/js/providers/grid_provider.js');
suite('search/providers/local_apps', function() {
var realMozApps;
var realMozSettings;
var _apps, _blValue;
suiteSetup(function() {
_apps = [{
manifest: {
entry_points: {
'fakeapp1-1': {
launch_path: '/fakeapp1-1/index.html',
name: 'Mozilla Fake App 1 - 1'
},
'fakeapp1-2': {
launch_path: '/fakeapp1-2/index.html',
name: 'Mozilla Fake App 1 - 2'
}
},
name: 'Mozilla Fake App 1'
},
manifestURL: 'http://fakeapp1/manifest.webapp'
},{
manifest: {
launch_path: '/fakeapp2/index.html',
name: 'Mozilla Fake App 2'
},
manifestURL: 'http://fakeapp2/manifest.webapp'
},{
manifest: {
launch_path: '/fakeapp3/index.html',
name: 'Mooilla Fake App 3',
short_name: 'shorty'
}
},{
manifest: {
launch_path: '/fakeapp4/index.html',
name: 'Blah blah',
locales: {
foobar: {
name: 'localized app'
}
}
}
}];
_blValue = ['/fakeapp1-1/index.html'];
realMozApps = navigator.mozApps;
navigator.mozApps = MockNavigatormozApps;
realMozSettings = navigator.mozSettings;
navigator.mozSettings = MockNavigatorSettings;
navigator.mozApps.mApps = _apps;
navigator.mozSettings.createLock().set({
'app.launch_path.blacklist': _blValue
});
});
suiteTeardown(function() {
navigator.mozApps = realMozApps;
navigator.mozSettings = realMozSettings;
});
suite('Blacklist', function() {
var subject;
setup(function(done) {
requireApp('search/js/providers/local_apps.js', function() {
subject = Search.providers.LocalApps;
done();
});
});
teardown(function() {
MockNavigatormozApps.mTeardown();
});
test('CreateBlacklist returns correct blacklist', function(done) {
subject.createBlacklist().then(() => {
assert.equal(subject.blacklist, _blValue);
done();
});
});
});
suite('Search', function() {
var subject;
setup(function(done) {
requireApp('search/js/providers/local_apps.js', function() {
subject = Search.providers.LocalApps;
subject.apps = _apps;
subject.blacklist = _blValue;
subject.createAppListing();
done();
});
});
teardown(function() {
MockNavigatormozApps.mTeardown();
});
test('Search returns correct applications', function() {
var results = subject.find('moz');
assert.equal(results.length, 2);
});
test('Search returns correct applications', function() {
var results = subject.find('mo');
assert.equal(results.length, 3);
});
test('Search for localized apps', function() {
document.documentElement.lang = 'foobar';
var results = subject.find('localized');
assert.equal(results.length, 1);
});
test('Search returns correct applications', function() {
var results = subject.find('shorty');
assert.equal(results.length, 1);
});
test('hidden role which downloads is not listed', function() {
var resultLength = subject.appListing.length;
var mockApp = {
manifestURL: 'marketplace/langpack',
downloading: true,
manifest: {
role: 'langpack'
}
};
navigator.mozApps.mgmt.oninstall({
application: mockApp
});
mockApp.ondownloadapplied();
assert.equal(resultLength, subject.appListing.length);
});
});
});

View file

@ -0,0 +1,108 @@
'use strict';
/* global MocksHelper, Search */
/* global MockNavigatorSettings */
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
require('/shared/test/unit/mocks/mock_moz_activity.js');
require('/shared/test/unit/mocks/mock_l10n.js');
requireApp('search/test/unit/mock_search.js');
requireApp('search/js/providers/provider.js');
requireApp('search/js/providers/grid_provider.js');
// Required files for the grid and a marketplaceapp result
require('/shared/js/l10n.js');
require('/shared/elements/gaia_grid/js/grid_icon_renderer.js');
require('/shared/elements/gaia_grid/js/grid_layout.js');
require('/shared/elements/gaia_grid/js/grid_view.js');
require('/shared/elements/gaia_grid/script.js');
require('/shared/elements/gaia_grid/js/items/grid_item.js');
require('/shared/elements/gaia_grid/js/items/bookmark.js');
require('/shared/elements/gaia_grid/js/items/marketplace_app.js');
var mocksForMarketplaceProvider = new MocksHelper([
'MozActivity'
]).init();
suite('search/providers/marketplace', function() {
mocksForMarketplaceProvider.attachTestHelpers();
var fakeElement, stubById, subject, realMozSettings;
setup(function(done) {
realMozSettings = navigator.mozSettings;
navigator.mozSettings = MockNavigatorSettings;
navigator.mozSettings.createLock().set({
'search.marketplace.url': 'http://localhost?{q}'
});
fakeElement = document.createElement('div');
fakeElement.style.cssText = 'height: 100px; display: block;';
stubById = this.sinon.stub(document, 'getElementById')
.returns(fakeElement.cloneNode(true));
requireApp('search/js/providers/marketplace.js', function() {
subject = Search.providers.Marketplace;
subject.init();
done();
});
});
teardown(function() {
stubById.restore();
});
suite('mock response', function() {
var marketplaceContent = [{
'manifest_url': 'http://fakeapp1.mozilla.org/manifest.webapp',
'name': 'FIRST Marketplace App',
'icon': ''
}, {
'manifest_url': 'http://fakeapp2.mozilla.org/manifest.webapp',
'name': 'SECOND Marketplace App',
'icon': ''
}];
var requests = [];
var xhr;
setup(function() {
xhr = sinon.useFakeXMLHttpRequest();
requests = [];
xhr.onCreate = function(req) {
setTimeout(function() {
requests.push(req);
req.responseText = JSON.stringify(marketplaceContent);
req.status = 200;
req.onload();
});
};
});
teardown(function() {
subject.request = null;
xhr.restore();
});
test('escapes search terms', function(done) {
subject.search('foo#').then(function(results) {
assert.equal(requests[0].url, 'http://localhost?foo%23');
done();
});
});
test('renders all results', function(done) {
subject.search('fake').then(results => {
assert.equal(results.length, 2);
done();
});
// setTimeout to ensure that the search microtask fires.
setTimeout(function() {
var req = requests[0];
req.responseText = JSON.stringify(marketplaceContent);
req.onload();
});
});
});
});

View file

@ -0,0 +1,68 @@
'use strict';
/* global Provider, MocksHelper */
requireApp('search/shared/js/everythingme/eme.js');
requireApp('search/js/providers/provider.js');
require('/shared/test/unit/mocks/mock_icons_helper.js');
var mocks = new MocksHelper([
'IconsHelper'
]).init();
suite('search/providers/provider', function() {
var fakeElement, stubById, subject;
mocks.attachTestHelpers();
setup(function() {
fakeElement = document.createElement('div');
fakeElement.style.cssText = 'height: 100px; display: block;';
stubById = this.sinon.stub(document, 'getElementById')
.returns(fakeElement.cloneNode(true));
subject = new Provider();
});
teardown(function() {
stubById.restore();
});
suite('constructor', function() {
test('everything looks ok', function() {
assert.ok(subject.name);
});
});
suite('init', function() {
test('sets up container', function() {
subject.init();
assert.ok(subject.container);
});
});
suite('render', function() {
test('escapes HTML', function() {
subject.init();
subject.render([{
title: '<hello>',
meta: '<world>',
dataset: {}
}]);
var title = subject.container.querySelector('.title');
assert.equal(title.innerHTML, '&lt;hello&gt;');
var meta = subject.container.querySelector('.meta');
assert.equal(meta.innerHTML, '&lt;world&gt;');
});
});
suite('clear', function() {
test('clears container', function() {
subject.init();
subject.container.innerHTML = 'not empty';
subject.clear();
assert.equal(subject.container.innerHTML, '');
});
});
});

View file

@ -0,0 +1,37 @@
'use strict';
/* global MocksHelper, Search */
requireApp('search/test/unit/mock_search.js');
requireApp('search/js/providers/provider.js');
require('/shared/js/metrics_helper.js');
requireApp('search/test/unit/mock_provider.js');
require('/shared/test/unit/mocks/mock_search_provider.js');
var mocksForSuggestionsProvider = new MocksHelper([
'SearchProvider'
]).init();
suite('search/providers/suggestions', function() {
mocksForSuggestionsProvider.attachTestHelpers();
var subject;
requireApp('search/js/providers/suggestions.js', function(done) {
subject = Search.providers.Suggestions;
subject.init();
done();
});
suite('click', function() {
test('should report to metrics', function() {
var stub = this.sinon.stub(window.MetricsHelper.prototype, 'report');
subject.click({
target: {
dataset: {
suggestions: 'mozilla'
}
}
});
assert.ok(stub.calledWith('websearch', 'testProvider'));
});
});
});