VulpesOS/gaia/apps/system/test/unit/layout_manager_test.js
OverSu b38dea0597 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.
2026-09-30 23:13:03 +02:00

346 lines
12 KiB
JavaScript
Executable file

/* global MocksHelper, LayoutManager, MockService, MockAppWindow,
MockAttentionWindow */
'use strict';
require('/shared/test/unit/mocks/mock_service.js');
requireApp('system/js/layout_manager.js');
require('/test/unit/mock_app_window.js');
require('/test/unit/mock_attention_window.js');
var mocksForLayoutManager = new MocksHelper([
'Service',
'AttentionWindow'
]).init();
suite('system/LayoutManager >', function() {
mocksForLayoutManager.attachTestHelpers();
var layoutManager;
setup(function() {
MockService.mockQueryWith('getTopMostWindow', new MockAppWindow());
this.sinon.stub(MockService.mockQueryWith('getTopMostWindow'),
'isFullScreenLayout').returns(false);
layoutManager = new LayoutManager();
layoutManager.start();
});
suite('handle events', function() {
suite('resize', function() {
var oldMozOrientation;
var stubPublish;
setup(function() {
oldMozOrientation = screen.mozOrientation;
stubPublish = this.sinon.stub(layoutManager, 'publish');
});
teardown(function() {
Object.defineProperty(screen, 'mozOrientation', {
get: function(){
return oldMozOrientation;
}
});
});
var setMozOrientation = function (orientation) {
Object.defineProperty(screen, 'mozOrientation', {
get: function(){
return orientation;
},
configurable: true
});
};
test('Do not publish system-resize if keyboard is showing and' +
'orientation has changed', function() {
layoutManager.keyboardEnabled = true;
layoutManager._lastOrientation = 'portrait-secondary';
setMozOrientation('landscape-secondary');
layoutManager.handleEvent({
type: 'resize'
});
assert.isFalse(stubPublish.calledWith('system-resize'));
assert.isTrue(stubPublish.calledWith('appwindow-orientationchange'));
});
test('Publish system-resize if keyboard is showing and' +
'orientation has not changed', function() {
layoutManager.keyboardEnabled = true;
layoutManager._lastOrientation = 'portrait-secondary';
setMozOrientation('portrait-secondary');
layoutManager.handleEvent({
type: 'resize'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
assert.isTrue(stubPublish.calledWith('appwindow-orientationchange'));
});
test('Publish system-resize if keyboard is not showing', function() {
layoutManager.keyboardEnabled = false;
layoutManager._lastOrientation = 'portrait-secondary';
setMozOrientation('landscape-secondary');
layoutManager.handleEvent({
type: 'resize'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
assert.isTrue(stubPublish.calledWith('appwindow-orientationchange'));
stubPublish.reset();
// this time orientation isn't changed; we send system-resize too.
layoutManager.handleEvent({
type: 'resize'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
assert.isTrue(stubPublish.calledWith('appwindow-orientationchange'));
});
test('_lastOrientation is correctly remembered', function() {
layoutManager.keyboardEnabled = false;
layoutManager._lastOrientation = 'portrait-secondary';
setMozOrientation('landscape-secondary');
layoutManager.handleEvent({
type: 'resize'
});
assert.equal(layoutManager._lastOrientation, 'landscape-secondary');
});
});
test('attentionwindowmanager-deactivated', function() {
var stubPublish = this.sinon.stub(layoutManager, 'publish');
layoutManager.handleEvent({
type: 'attentionwindowmanager-deactivated'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
});
test('keyboardchange', function() {
var stubPublish = this.sinon.stub(layoutManager, 'publish');
layoutManager.handleEvent({
type: 'keyboardchange'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
assert.isTrue(layoutManager.keyboardEnabled);
});
test('keyboardhide (w/ waitUntil() function)', function() {
var stubPublish = this.sinon.stub(layoutManager, 'publish');
var stubWaitUntil = this.sinon.stub();
layoutManager.handleEvent({
type: 'keyboardhide',
detail: {
waitUntil: stubWaitUntil
}
});
assert.isTrue(stubPublish.calledWith('system-resize'));
assert.isFalse(layoutManager.keyboardEnabled);
var evtDetail = stubPublish.firstCall.args[1];
evtDetail.waitUntil({ stub: 'promise' });
assert.isTrue(stubWaitUntil.calledWith({ stub: 'promise' }));
});
test('mozfullscreenchange', function() {
var stubPublish = this.sinon.stub(layoutManager, 'publish');
layoutManager.handleEvent({
type: 'mozfullscreenchange'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
});
test('software-button-enabled', function() {
var stubPublish = this.sinon.stub(layoutManager, 'publish');
layoutManager.handleEvent({
type: 'software-button-enabled'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
});
test('software-button-disabled', function() {
var stubPublish = this.sinon.stub(layoutManager, 'publish');
layoutManager.handleEvent({
type: 'software-button-disabled'
});
assert.isTrue(stubPublish.calledWith('system-resize'));
});
});
suite('height calculation', function() {
var realDPX, stubDPX;
var realIH, stubIH;
var H, W;
setup(function() {
stubDPX = 1;
realDPX = window.devicePixelRatio;
stubIH = 545;
realIH = window.innerHeight;
Object.defineProperty(window, 'devicePixelRatio', {
configurable: true,
get: function() { return stubDPX; }
});
Object.defineProperty(window, 'innerHeight', {
configurable: true,
get: function() { return stubIH; }
});
H = window.innerHeight;
W = window.innerWidth;
});
teardown(function() {
Object.defineProperty(window, 'devicePixelRatio', {
configurable: true,
get: function() { return realDPX; }
});
Object.defineProperty(window, 'innerHeight', {
configurable: true,
get: function() { return realIH; }
});
MockService.mockQueryWith('locked', false);
});
test('should take into account keyboard and home button',
function() {
var _w = document.documentElement.clientWidth;
MockService.mockQueryWith('InputWindowManager.getHeight', 100);
MockService.mockQueryWith('SoftwareButtonManager.height', 50);
layoutManager.keyboardEnabled = true;
assert.equal(layoutManager.height(), H - 100 - 50);
assert.equal(layoutManager.width(), W);
assert.equal(layoutManager.clientWidth, _w);
assert.isTrue(layoutManager.match(W, H - 100 - 50));
});
test('should take into account keyboard and home button with' +
'full screen layout',
function() {
MockService.mockQueryWith('getTopMostWindow', new MockAppWindow());
this.sinon.stub(MockService.mockQueryWith('getTopMostWindow'),
'isFullScreenLayout').returns(true);
var _w = document.documentElement.clientWidth;
MockService.mockQueryWith('InputWindowManager.getHeight', 100);
MockService.mockQueryWith('SoftwareButtonManager.height', 50);
layoutManager.keyboardEnabled = true;
assert.equal(layoutManager.height(), H - 100);
assert.equal(layoutManager.width(), W);
assert.equal(layoutManager.clientWidth, _w);
assert.isTrue(layoutManager.match(W, H - 100));
});
test('should take into account keyboard and home button with' +
'full screen layout',
function() {
MockService.mockQueryWith('getTopMostWindow', new MockAppWindow());
this.sinon.stub(MockService.mockQueryWith('getTopMostWindow'),
'isFullScreenLayout').returns(true);
var _w = document.documentElement.clientWidth;
MockService.mockQueryWith('InputWindowManager.getHeight', 100);
MockService.mockQueryWith('SoftwareButtonManager.height', 50);
layoutManager.keyboardEnabled = true;
assert.equal(layoutManager.height(), H - 100);
assert.equal(layoutManager.width(), W);
assert.equal(layoutManager.clientWidth, _w);
assert.isTrue(layoutManager.match(W, H - 100));
});
test('should take into account keyboard and home button with' +
'full screen layout, but screen is locked',
function() {
MockService.mockQueryWith('locked', true);
MockService.mockQueryWith('getTopMostWindow', new MockAppWindow());
this.sinon.stub(MockService.mockQueryWith('getTopMostWindow'),
'isFullScreenLayout').returns(true);
MockService.mockQueryWith('InputWindowManager.getHeight', 100);
MockService.mockQueryWith('SoftwareButtonManager.height', 50);
layoutManager.keyboardEnabled = true;
// Even though the software home button is enabled and reports a height
// its height should not affect the lockscreen
assert.equal(layoutManager.height(), H - 100);
});
test('should return integral values in device pixels', function() {
stubDPX = 1.5;
assert.equal((layoutManager.height() * stubDPX) % 1, 0);
});
});
suite('dimensions >', () => {
var H, W, _w;
setup(() => {
H = window.innerHeight;
W = window.innerWidth;
_w = document.documentElement.clientWidth;
MockService.mockQueryWith('InputWindowManager.getHeight', 100);
MockService.mockQueryWith('SoftwareButtonManager.height', 50);
MockService.mockQueryWith('SoftwareButtonManager.width', 50);
});
test('height calculation with keyboard enabled', () => {
layoutManager.keyboardEnabled = true;
assert.equal(layoutManager.height(), H - 100 - 50);
assert.isTrue(layoutManager.match(W - 50, H - 100 - 50));
});
test('height calculation with keyboard disabled', () => {
layoutManager.keyboardEnabled = false;
assert.equal(layoutManager.height(), H - 50);
assert.isTrue(layoutManager.match(W - 50, H - 50));
});
test('width calculation', () => {
assert.equal(layoutManager.width(), W - 50);
assert.equal(layoutManager.clientWidth, _w);
});
});
suite('getHeightFor()', function() {
setup(function() {
MockService.mockQueryWith('SoftwareButtonManager.height', 50);
MockService.mockQueryWith('locked', false);
MockService.mockQueryWith('InputWindowManager.getHeight', 100);
layoutManager.keyboardEnabled = true;
});
test('should return the height for regular windows', function() {
assert.equal(layoutManager.height(), layoutManager.getHeightFor({}));
});
test('should return the height for regular windows on lockscreen',
function() {
MockService.mockQueryWith('locked', true);
assert.equal(layoutManager.height(), layoutManager.getHeightFor({}));
});
test('should consider SHB on attention windows and lockscreen', function() {
MockService.mockQueryWith('locked', true);
var attentionWindow = new MockAttentionWindow();
assert.operator(layoutManager.getHeightFor({}), '>',
layoutManager.getHeightFor(attentionWindow));
});
test('should not consider keyboard when ignoreKeyboard', function() {
var attentionWindow = new window.AttentionWindow();
assert.equal(layoutManager.height() + 100,
layoutManager.getHeightFor(attentionWindow, true));
});
test('should not consider keyboard when ignoreKeyboard', function() {
assert.equal(layoutManager.height() + 100,
layoutManager.getHeightFor({}, true));
});
});
});