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,295 @@
suite('controllers/activity', function() {
/*jshint maxlen:false*/
'use strict';
suiteSetup(function(done) {
var self = this;
requirejs([
'app',
'controllers/activity',
'lib/setting',
], function(App, ActivityController, Setting) {
self.ActivityController = ActivityController.ActivityController;
self.Setting = Setting;
self.App = App;
done();
});
});
setup(function() {
this.sandbox = sinon.sandbox.create();
this.app = sinon.createStubInstance(this.App);
this.app.win = { location: {} };
this.app.activity = {};
this.app.settings = {
mode: sinon.createStubInstance(this.Setting),
pictureSizes: sinon.createStubInstance(this.Setting),
recorderProfiles: sinon.createStubInstance(this.Setting),
activity: sinon.createStubInstance(this.Setting)
};
// Stub `mozSetMessageHandler`
navigator.mozSetMessageHandler = navigator.mozSetMessageHandler || function() {};
this.sandbox.stub(navigator, 'mozSetMessageHandler');
// Aliases
this.settings = this.app.settings;
this.activity = this.app.activity;
this.controller = new this.ActivityController(this.app);
});
teardown(function() {
this.sandbox.restore();
});
suite('ActivityController#configure()', function() {
test('Should should store the activity type on `app.activity`', function() {
this.controller.getName = sinon.stub().returns('pick');
this.controller.configure();
assert.equal(this.app.activity.pick, true);
});
});
suite('ActivityController#bindEvents()', function() {
setup(function() {
sinon.spy(this.controller, 'setupListener');
});
test('It binds a listener straight away if an activity name was found', function() {
this.controller.name = 'pick';
this.controller.bindEvents();
sinon.assert.calledWith(navigator.mozSetMessageHandler, 'activity');
});
test('It binds a listener straight after critical path if no activity name was found', function() {
this.controller.name = undefined;
this.controller.bindEvents();
sinon.assert.calledWith(this.app.once, 'criticalpathdone');
// Call the callback
this.app.once.withArgs('criticalpathdone').args[0][1]();
sinon.assert.calledWith(navigator.mozSetMessageHandler, 'activity');
});
});
suite('ActivityController#getName()', function() {
test('It returns the name after the #', function() {
this.app.win.location.hash = '#pick';
var name = this.controller.getName();
assert.equal(name, 'pick');
});
test('It returns undefined if no hash fragment is present', function() {
this.app.win.location.hash = '';
var name = this.controller.getName();
assert.equal(name, undefined);
});
});
suite('Activity#confgureMode()', function() {
test('Should get \'picture\' and \'video\' modes for SMS \'pick\' activity', function() {
var activity = {
'source': {
'data': {
'type': ['image/*', 'audio/*', 'video/*'],
'maxFileSizeBytes': 307200
},
'name': 'pick'
}
};
this.controller.configureMode(activity);
var modes = this.settings.mode.filterOptions.args[0][0];
assert.deepEqual(modes, ['picture', 'audio', 'video']);
});
test('Should get \'picture\' and \'video\' modes input[type="file"] \'pick\' activity', function() {
var activity = {
'source': {
'data': {
'type': [],
'nocrop': true
},
'name': 'pick'
}
};
this.controller.configureMode(activity);
var modes = this.settings.mode.filterOptions.args[0][0];
assert.deepEqual(modes, ['picture', 'video']);
});
test('Should get \'picture\' mode for input[type="file"] \'pick\' activity', function() {
var activity = {
'source': {
'data': {
'type': ['image/gif', 'image/jpeg', 'image/pjpeg',
'image/png', 'image/svg+xml', 'image/tiff',
'image/vnd.microsoft.icon'],
'nocrop': true
},
'name': 'pick'
}
};
this.controller.configureMode(activity);
var modes = this.settings.mode.filterOptions.args[0][0];
assert.deepEqual(modes, ['picture']);
});
test('Should be able to cope with String as well as Array', function() {
var activity = {
source: {
data: { type: 'image/jpeg' },
name: 'pick'
}
};
this.controller.configureMode(activity);
var modes = this.settings.mode.filterOptions.args[0][0];
assert.deepEqual(modes, ['picture']);
});
test('Should get [\'picture\', \'video\'] modes for Lockscreen/Gallery \'record\' activity', function() {
var activity = {
source: {
data: { type: 'photos' },
name: 'record'
}
};
this.controller.configureMode(activity);
var modes = this.settings.mode.filterOptions.args[0][0];
assert.deepEqual(modes, ['picture', 'video']);
});
test('Should get [\'video\', \'picture\'] modes for ' +
'Video \'record\' activity', function() {
var activity = {
source: {
data: { type: 'videos' },
name: 'record'
}
};
this.controller.configureMode(activity);
var modes = this.settings.mode.filterOptions.args[0][0];
assert.deepEqual(modes, ['video', 'picture']);
});
});
suite('ActivityController#onMessage()', function() {
setup(function() {
this.activity = {
source: {
name: 'pick',
data: {
type: 'image/jpeg',
maxFileSizeBytes: 100
},
}
};
sinon.spy(this.controller, 'configureMode');
sinon.stub(this.controller, 'getMaxPixelSize').returns('<max-pixel-size>');
this.controller.onMessage(this.activity);
});
test('Should emit app events', function() {
sinon.assert.calledWith(this.app.emit, 'activity');
sinon.assert.calledWith(this.app.emit, 'activity:pick');
});
test('Should configure mode', function() {
sinon.assert.called(this.controller.configureMode);
});
test('Should keep a reference to the activity', function() {
assert.equal(this.controller.activity, this.activity);
});
test('Should pass `data.maxFileSizeBytes`', function() {
var data = this.app.emit.withArgs('activity:pick').args[0][1];
assert.equal(data.maxFileSizeBytes, 100);
});
test('Should pass `data.name`', function() {
var data = this.app.emit.withArgs('activity:pick').args[0][1];
assert.equal(data.name, 'pick');
});
test('Should pass `data.maxPixelSize`', function() {
var data = this.app.emit.withArgs('activity:pick').args[0][1];
assert.equal(data.maxPixelSize, '<max-pixel-size>');
});
test('Should not do anything if name is unrecognised', function() {
this.app.emit.reset();
this.activity.source.name = 'unknown';
this.controller.onMessage(this.activity);
assert.isFalse(this.app.emit.calledWith('activity'));
assert.isFalse(this.app.emit.calledWith('activity:unknown'));
});
});
suite('ActivityController#getMaxPixelSize()', function() {
setup(function() {
this.activity = {
source: {
name: 'pick',
data: {
type: 'image/jpeg',
maxFileSizeBytes: 100,
width: 100,
height: 100
},
}
};
this.settings.activity.get
.withArgs('maxPickPixelSize')
.returns(480000);
this.settings.activity.get
.withArgs('maxPixelSizeScaleFactor')
.returns(2.5);
});
test('Should return pixel estimate of maxFileSizeBytes if supplied', function() {
var result = this.controller.getMaxPixelSize(this.activity);
assert.equal(result, 267);
});
test('Should return a pixel estimate based on width height if supplied', function() {
delete this.activity.source.data.maxFileSizeBytes;
var result = this.controller.getMaxPixelSize(this.activity);
assert.equal(result, 25000);
});
test('Should return `maxPickPixelSize` if neither supplied', function() {
delete this.activity.source.data.maxFileSizeBytes;
delete this.activity.source.data.width;
delete this.activity.source.data.height;
var result = this.controller.getMaxPixelSize(this.activity);
assert.equal(result, this.settings.activity.get('maxPickPixelSize'));
});
test('Should be able to cope with only one dimension being specified', function() {
delete this.activity.source.data.maxFileSizeBytes;
delete this.activity.source.data.height;
var result = this.controller.getMaxPixelSize(this.activity);
assert.equal(result, (1/3 * 100000));
delete this.activity.source.data.width;
this.activity.source.data.height = 100;
result = this.controller.getMaxPixelSize(this.activity);
assert.equal(result, (1/3 * 100000));
});
});
});