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,536 @@
/* global SignalIcon, MocksHelper, MockService,
MockL10n, MockSIMSlot, MockNavigatorMozMobileConnection */
'use strict';
requireApp('system/shared/test/unit/mocks/mock_service.js');
requireApp('system/js/base_ui.js');
requireApp('system/js/base_icon.js');
requireApp('system/js/signal_icon.js');
requireApp('system/shared/test/unit/mocks/mock_simslot.js');
requireApp(
'system/shared/test/unit/mocks/mock_navigator_moz_mobile_connection.js');
require('/shared/test/unit/mocks/mock_l10n.js');
var mocksForSignalIcon = new MocksHelper([
'Service'
]).init();
suite('system/SignalIcon', function() {
var subject;
var realL10n;
var dataset;
mocksForSignalIcon.attachTestHelpers();
setup(function() {
MockService.mockQueryWith('hasActiveCall', false);
MockService.mockQueryWith('getDataConnectionType', '');
MockService.mockQueryWith('isCDMA', false);
MockService.mockQueryWith('inCall', false);
MockService.mockQueryWith('Radio.settingEnabled', true);
realL10n = navigator.mozL10n;
navigator.mozL10n = MockL10n;
this.sinon.stub(document, 'getElementById', function() {
var ele = document.createElement('div');
this.sinon.stub(ele, 'querySelector')
.returns(document.createElement('div'));
return ele;
}.bind(this));
subject = new SignalIcon(
new MockSIMSlot(MockNavigatorMozMobileConnection, 0), 0);
subject.start();
subject.element = document.createElement('div');
subject.dataText = document.createElement('div');
subject.manager.conn.voice = {
connected: false,
roaming: false
};
subject.manager.conn.data = {
connected: false,
roaming: false
};
dataset = subject.element.dataset;
});
teardown(function() {
navigator.mozL10n = realL10n;
subject.stop();
});
suite('Iconchanged', function() {
suite('data', function() {
test('Should publish iconchanged from connecting to connected',
function() {
subject.update();
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 80
};
this.sinon.stub(subject, 'publish');
subject.update();
assert.isTrue(subject.publish.calledWith('changed'));
});
test('Should publish iconchanged if strength change over 1 level',
function() {
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 60
};
subject.update();
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 100
};
this.sinon.stub(subject, 'publish');
subject.update();
assert.isTrue(subject.publish.calledWith('changed'));
});
test('Should not publish iconchanged if strength change within 1 level',
function() {
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 70
};
subject.update();
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 71
};
this.sinon.stub(subject, 'publish');
subject.update();
assert.isFalse(subject.publish.calledWith('changed'));
});
});
suite('voice', function() {
test('Should publish iconchanged from connecting to connected',
function() {
subject.update();
subject.manager.conn.voice = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 80
};
this.sinon.stub(subject, 'publish');
subject.update();
assert.isTrue(subject.publish.calledWith('changed'));
});
test('Should publish iconchanged if strength change over 1 level',
function() {
subject.manager.conn.voice = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 60
};
subject.update();
subject.manager.conn.voice = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 100
};
this.sinon.stub(subject, 'publish');
subject.update();
assert.isTrue(subject.publish.calledWith('changed'));
});
test('Should not publish iconchanged if strength change within 1 level',
function() {
subject.manager.conn.voice = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 70
};
subject.update();
subject.manager.conn.voice = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 71
};
this.sinon.stub(subject, 'publish');
subject.update();
assert.isFalse(subject.publish.calledWith('changed'));
});
});
});
suite('update', function() {
test('SIM card is absent', function() {
MockService.mockQueryWith('Radio.settingEnabled', true);
this.sinon.stub(subject, 'hide');
this.sinon.stub(subject.manager, 'isAbsent').returns(true);
subject.update();
assert.equal(dataset.inactive, 'true');
assert.isTrue(subject.hide.called);
assert.isUndefined(dataset.level);
assert.isUndefined(dataset.searching);
});
test('SIM card is locked', function() {
MockService.mockQueryWith('Radio.settingEnabled', true);
this.sinon.stub(subject, 'hide');
this.sinon.stub(subject.manager, 'isLocked').returns(true);
subject.update();
assert.isTrue(subject.hide.called);
});
test('Radio is disabled', function() {
MockService.mockQueryWith('Radio.settingEnabled', false);
this.sinon.stub(subject, 'hide');
subject.update();
assert.isTrue(subject.hide.called);
});
test('Voice is connected', function() {
subject.manager.conn.voice = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 80
};
this.sinon.stub(subject, 'show');
subject.update();
assert.isTrue(subject.show.called);
assert.equal(dataset.level, 4);
});
test('Has active call at current sim slot', function() {
subject.manager.conn.voice = {
relSignalStrength: 20
};
MockService.mockQueryWith('hasActiveCall', true);
this.sinon.stub(subject, 'show');
subject.update();
assert.isTrue(subject.show.called);
assert.equal(dataset.level, 1);
assert.isUndefined(dataset.searching);
});
test('Data is connected', function() {
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 80
};
this.sinon.stub(subject, 'show');
subject.update();
assert.isTrue(subject.show.called);
assert.equal(dataset.level, 4);
});
test('Emergency call only', function() {
subject.manager.conn.voice.state = 'searching';
this.sinon.spy(subject, 'updateSignal');
this.sinon.stub(subject, 'show');
subject.update();
assert.isTrue(subject.updateSignal.called);
assert.isTrue(subject.show.called);
assert.equal(dataset.level, -1);
assert.equal(dataset.searching, 'true');
});
});
suite('Update data text', function() {
setup(function() {
MockService.mockQueryWith('Radio.settingEnabled', true);
MockService.mockQueryWith('inCall', false);
MockService.mockQueryWith('isCDMA', false);
subject.manager.conn.data = {
connected: true,
roaming: false,
type: 'evdo',
relSignalStrength: 80
};
});
test('Should hide data text if radio is disabled', function() {
MockService.mockQueryWith('Radio.settingEnabled', false);
subject.updateDataText();
assert.equal(subject.dataText.hidden, true);
});
test('Should hide data text if data is not connected', function() {
subject.manager.conn.data = {
connected: false,
roaming: false,
type: 'evdo',
relSignalStrength: 80
};
subject.updateDataText();
assert.equal(subject.dataText.hidden, true);
});
test('Should circle when data drops from connected', function() {
subject.manager.conn.data = {
connected: true,
roaming: false
};
subject.update();
subject.updateDataText();
assert.isTrue(subject.element.classList.contains('sb-icon-data-circle'));
});
test('update data text', function() {
MockService.mockQueryWith('getDataConnectionType', 'LTE');
this.sinon.stub(subject, 'publish');
subject.updateDataText();
assert.isTrue(subject.publish.calledOnce);
assert.equal(subject.dataText.textContent, 'LTE');
assert.isFalse(subject.element.classList.contains('sb-icon-data-circle'));
assert.equal(subject.dataText.hidden, false);
subject.updateDataText();
assert.isTrue(subject.publish.calledOnce);
});
test('is CDMA and in a call', function() {
MockService.mockQueryWith('getDataConnectionType', 'LTE');
MockService.mockQueryWith('inCall', true);
MockService.mockQueryWith('isCDMA', true);
this.sinon.stub(subject, 'publish');
subject.updateDataText();
assert.isFalse(subject.publish.calledOnce);
assert.equal(subject.dataText.textContent, '');
assert.isFalse(subject.element.classList.contains('sb-icon-data-circle'));
assert.equal(subject.dataText.hidden, false);
MockService.mockQueryWith('inCall', false);
subject.updateDataText();
assert.isTrue(subject.publish.calledOnce);
});
test('No type', function() {
MockService.mockQueryWith('getDataConnectionType', '');
MockService.mockQueryWith('inCall', true);
MockService.mockQueryWith('isCDMA', true);
subject.updateDataText();
assert.equal(subject.dataText.textContent, '');
assert.isTrue(subject.element.classList.contains('sb-icon-data-circle'));
assert.equal(subject.dataText.hidden, false);
});
});
suite('Signal states', function() {
test('no network without sim, not searching', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: null,
emergencyCallsOnly: false,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = null;
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(true);
subject.update();
assert.isUndefined(dataset.level);
assert.isUndefined(dataset.searching);
});
test('no network without sim, searching', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: null,
emergencyCallsOnly: false,
state: 'searching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = null;
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(true);
subject.update();
assert.isUndefined(dataset.level);
assert.isUndefined(dataset.searching);
});
test('no network with sim, sim locked', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: null,
emergencyCallsOnly: false,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = 'pinRequired';
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(false);
sinon.stub(subject.manager, 'isLocked').returns(true);
subject.update();
assert.isFalse(subject.isVisible());
});
test('searching', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: null,
emergencyCallsOnly: false,
state: 'searching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = 'ready';
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(false);
subject.update();
assert.equal(dataset.level, -1);
assert.equal(dataset.searching, 'true');
});
test('emergency calls only, no sim', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: 80,
emergencyCallsOnly: true,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = null;
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(true);
subject.update();
assert.isUndefined(dataset.level);
assert.isUndefined(dataset.searching);
});
test('emergency calls only, with sim', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: 80,
emergencyCallsOnly: true,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = 'pinRequired';
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(false);
sinon.stub(subject.manager, 'isLocked').returns(true);
subject.update();
assert.isFalse(subject.isVisible());
});
test('normal carrier', function() {
subject.manager.conn.voice = {
connected: true,
relSignalStrength: 80,
emergencyCallsOnly: false,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = 'ready';
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(false);
subject.update();
assert.equal(dataset.level, 4);
assert.isUndefined(dataset.searching);
});
test('EVDO connection, show data call signal strength', function() {
subject.manager.conn.voice = {
connected: false,
relSignalStrength: 0,
emergencyCallsOnly: false,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.conn.data = {
connected: true,
relSignalStrength: 80,
type: 'evdo',
emergencyCallsOnly: false,
state: 'notSearching',
roaming: false,
network: {}
};
subject.manager.simCard.cardState = 'ready';
subject.manager.simCard.iccInfo = {};
sinon.stub(subject.manager, 'isAbsent').returns(false);
subject.update();
assert.equal(dataset.level, 4);
});
});
suite('updateSignal', function() {
var connInfo = {
relSignalStrength: 75,
roaming: true,
network: {
shortName: 'name'
}
};
setup(function() {
delete subject.element.dataset;
});
test('should set the data-level attribute', function() {
subject.updateSignal(connInfo);
assert.equal(dataset.level, 4);
});
test('should remove the searching dataset', function() {
dataset.searching = true;
subject.updateSignal(connInfo);
assert.isUndefined(dataset.searching);
});
test('should set l10nId and l10nArgs', function() {
dataset.searching = true;
subject.updateSignal(connInfo);
assert.equal(MockL10n.getAttributes(subject.element).id,
'statusbarSignalRoaming');
assert.deepEqual(MockL10n.getAttributes(subject.element).args, {
level: dataset.level,
operator: connInfo.network && connInfo.network.shortName
});
});
});
});