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,269 @@
/*jshint maxlen:false, sub:true*/
/*global MockGetDeviceStorage, MockCropResizeRotate*/
/*global MocksHelper, LAYOUT_MODE, MediaDB, ImageEditor, Pick*/
'use strict';
require('/shared/test/unit/mocks/mock_lazy_loader.js');
require('/shared/test/unit/mocks/mock_mediadb.js');
require('/shared/test/unit/mocks/mock_crop_resize_rotate.js');
require('/shared/test/unit/mocks/mock_navigator_getdevicestorage.js');
require('/shared/js/media/jpeg-exif.js');
requireApp('/gallery/test/unit/mock_image_editor.js');
requireApp('/gallery/test/unit/mock_spinner.js');
requireApp('/gallery/js/pick.js');
var mocksHelper = new MocksHelper([
'LazyLoader',
'MediaDB',
'ImageEditor',
'Spinner'
]).init();
suite('pick', function() {
mocksHelper.attachTestHelpers();
var real$;
var selectors;
setup(function() {
selectors = {};
});
suiteSetup(function() {
window.cropResizeRotate = sinon.spy(MockCropResizeRotate);
navigator.getDeviceStorage = sinon.spy(MockGetDeviceStorage);
real$ = window.$;
window.$ = function(selector) {
return (selectors[selector] = selectors[selector] || {
addEventListener: sinon.spy()
});
};
window.LAYOUT_MODE = {
pick: 'pick',
crop: 'crop'
};
window.CONFIG_MAX_PICK_PIXEL_SIZE = 800 * 600;
window.setView = sinon.spy();
window.photodb = new MediaDB('pictures');
});
suiteTeardown(function() {
window.$ = real$;
});
suite('start', function() {
var activity = {
source: {
data: {
type: 'image/jpeg'
}
}
};
test('Should call `setView` with `LAYOUT_MODE.pick`', function() {
window.setView.reset();
Pick.start(activity);
assert.ok(window.setView.calledWith(LAYOUT_MODE.pick));
});
test('Should add "action" event listener to #pick-header', function() {
Pick.start(activity);
assert.ok(selectors['pick-header'].addEventListener.calledWith('action'));
});
test('Should add "action" event listener to #crop-top', function() {
Pick.start(activity);
assert.ok(selectors['crop-top'].addEventListener.calledWith('action'));
});
test('Should add "click" event listener to #crop-done-button', function() {
Pick.start(activity);
assert.ok(selectors['crop-done-button'].addEventListener.calledWith('click'));
});
});
suite('select', function() {
var activity = {
source: {
data: {
type: 'image/jpeg'
}
}
};
var fileinfo = {
name: '/foo/bar/baz.jpg',
metadata: {}
};
test('Should show file name in the title bar if `nocrop` flag is set', function() {
activity.source.data.nocrop = true;
Pick.start(activity);
Pick.select(fileinfo);
assert.equal(selectors['crop-header'].textContent, 'baz');
delete activity.source.data.nocrop;
});
test('Should call `setView` with `LAYOUT_MODE.crop`', function() {
window.setView.reset();
Pick.start(activity);
Pick.select(fileinfo);
assert.ok(window.setView.calledWith(LAYOUT_MODE.crop));
});
test('Should disable #crop-done-button', function() {
Pick.start(activity);
Pick.select(fileinfo);
assert.isTrue(selectors['crop-done-button'].disabled);
});
test('Should get file from MediaDB', function() {
window.photodb.getFile.reset();
Pick.start(activity);
Pick.select(fileinfo);
assert.ok(window.photodb.getFile.calledWith(fileinfo.name));
});
test('Should crop/resize/rotate file', function() {
window.cropResizeRotate.reset();
Pick.start(activity);
Pick.select(fileinfo);
assert.ok(window.cropResizeRotate.called);
});
test('Should use external preview file if specified', function() {
navigator.getDeviceStorage.reset();
fileinfo.metadata.preview = {
filename: '/foo/bar/baz_preview.jpg'
};
Pick.start(activity);
Pick.select(fileinfo);
assert.ok(navigator.getDeviceStorage.calledWith('pictures'));
});
});
suite('cancel', function() {
var activity = {
source: {
data: {
type: 'image/jpeg'
}
},
postError: sinon.spy()
};
var fileinfo = {
name: '/foo/bar/baz.jpg',
metadata: {}
};
test('Should post "pick cancelled" error', function() {
activity.postError.reset();
Pick.start(activity);
Pick.select(fileinfo);
Pick.cancel();
assert.ok(activity.postError.calledWith('pick cancelled'));
});
});
suite('restart', function() {
var activity = {
source: {
data: {
type: 'image/jpeg'
}
}
};
var fileinfo = {
name: '/foo/bar/baz.jpg',
metadata: {}
};
test('Should destroy `ImageEditor`', function(done) {
ImageEditor.prototype.destroy.reset();
Pick.start(activity);
Pick.select(fileinfo);
setTimeout(function() {
Pick.restart();
assert.ok(ImageEditor.prototype.destroy.called);
done();
});
});
test('Should call `setView` with `LAYOUT_MODE.pick`', function(done) {
window.setView.reset();
Pick.start(activity);
Pick.select(fileinfo);
setTimeout(function() {
Pick.restart();
assert.ok(window.setView.calledWith(LAYOUT_MODE.pick));
done();
});
});
});
suite('end', function() {
var activity = {
source: {
data: {
type: 'image/jpeg'
}
},
postResult: sinon.spy()
};
var fileinfo = {
name: '/foo/bar/baz.jpg',
metadata: {}
};
test('Should call `getCropRegion` on `ImageEditor`', function() {
ImageEditor.prototype.getCropRegion.reset();
Pick.start(activity);
Pick.select(fileinfo);
Pick.end();
assert.ok(ImageEditor.prototype.getCropRegion.called);
});
test('Should *NOT* call `getCropRegion` on `ImageEditor` if `nocrop` specified',
function() {
ImageEditor.prototype.getCropRegion.reset();
activity.source.data.nocrop = true;
Pick.start(activity);
Pick.select(fileinfo);
Pick.end();
assert.ok(ImageEditor.prototype.getCropRegion.notCalled);
delete activity.source.data.nocrop;
});
test('Should call `postResult`', function() {
activity.postResult.reset();
Pick.start(activity);
Pick.select(fileinfo);
Pick.end();
assert.ok(activity.postResult.called);
});
});
});