gnome-shell/tests/shell/fittsy.js
Florian Müllner 3099bfc571 tests: Add fittsy test
Both the dash and top bar items are expected to extend to the
screen edge, to make them easier click targets according to
Fitts' law.

This has the tendency to break fairly regularly, so add a small
test that checks the Fittsiness of the show-apps and activities
buttons to catch regressions.

Related: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7318
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3111>
2024-01-12 20:29:10 +00:00

123 lines
3.7 KiB
JavaScript

/* eslint camelcase: ["error", { properties: "never", allow: ["^script_"] }] */
import Clutter from 'gi://Clutter';
import Shell from 'gi://Shell';
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import {sleep} from 'resource:///org/gnome/shell/ui/scripting.js';
const {Orientation, PickMode, TextDirection} = Clutter;
const EPSILON = 0.1;
function defineScriptEvent(eventName, description) {
Shell.PerfLog.get_default().define_event(
`script.${eventName}`, description, 'i');
}
function scriptEvent(eventName, bool) {
Shell.PerfLog.get_default().event_i(`script.${eventName}`,
Number(bool));
}
function checkFittsiness(eventName, actor, orientation, edge) {
const [x, y] = actor.get_transformed_position();
const pickCoords = orientation === Orientation.HORIZONTAL
? [edge, y + Math.floor(actor.height / 2)]
: [x + Math.floor(actor.width / 2), edge];
const pickedActor = global.stage.get_actor_at_pos(
PickMode.REACTIVE, ...pickCoords);
scriptEvent(eventName, pickedActor === actor);
}
/**
* run:
*/
export async function run() {
defineScriptEvent('fittsyDash', 'Dash extends to screen edge');
defineScriptEvent('fittsyTopBarVert', 'Top bar extends to top screen edge');
defineScriptEvent('fittsyTopBarHorzLTR', 'Top bar extends to left screen edge');
defineScriptEvent('fittsyTopBarHorzRTL', 'Top bar extends to right screen edge');
const {primaryMonitor} = Main.layoutManager;
const topEdge = primaryMonitor.y + EPSILON;
const bottomEdge = primaryMonitor.y + primaryMonitor.height - EPSILON;
const leftEdge = primaryMonitor.x + EPSILON;
const rightEdge = primaryMonitor.x + primaryMonitor.width - EPSILON;
const showApps = Main.overview.dash.showAppsButton;
console.debug('Checking that dash extends to bottom screen edge');
checkFittsiness('fittsyDash',
showApps, Orientation.VERTICAL, bottomEdge);
const activitiesButton = Main.panel.statusArea.activities;
console.debug('Checking that top bar extends to top screen edge');
checkFittsiness('fittsyTopBarVert',
activitiesButton, Orientation.VERTICAL, topEdge);
Main.panel.text_direction = TextDirection.LTR;
await sleep(50);
console.debug('Checking that top bar extends to left screen edge for LTR');
checkFittsiness('fittsyTopBarHorzLTR',
activitiesButton, Orientation.HORIZONTAL, leftEdge);
Main.panel.text_direction = TextDirection.RTL;
await sleep(50);
console.debug('Checking that top bar extends to right screen edge for RTL');
checkFittsiness('fittsyTopBarHorzRTL',
activitiesButton, Orientation.HORIZONTAL, rightEdge);
}
let fittsyDash = false;
let fittsyTopBarVert = false;
let fittsyTopBarHorzLTR = false;
let fittsyTopBarHorzRTL = false;
/**
* @param {number} time
* @param {number} num
*/
export function script_fittsyDash(time, num) {
fittsyDash = num !== 0;
}
/**
* @param {number} time
* @param {number} num
*/
export function script_fittsyTopBarVert(time, num) {
fittsyTopBarVert = num !== 0;
}
/**
* @param {number} time
* @param {number} num
*/
export function script_fittsyTopBarHorzLTR(time, num) {
fittsyTopBarHorzLTR = num !== 0;
}
/**
* @param {number} time
* @param {number} num
*/
export function script_fittsyTopBarHorzRTL(time, num) {
fittsyTopBarHorzRTL = num !== 0;
}
export function finish() {
if (!fittsyDash)
throw new Error('Dash does not extend to screen edge');
if (!fittsyTopBarVert)
throw new Error('Top bar does not extend to top screen edge');
if (!fittsyTopBarHorzLTR)
throw new Error('Top bar does not extend to left screen edge');
if (!fittsyTopBarHorzRTL)
throw new Error('Top bar does not extend to right screen edge');
}