Skip to content

Commit

Permalink
Merge pull request #54 from bocoup/voiceover-settings
Browse files Browse the repository at this point in the history
Add support for modifying VoiceOver settings
  • Loading branch information
jugglinmike authored May 22, 2024
2 parents 90643ed + 862c89b commit eb5ed3f
Showing 1 changed file with 64 additions and 31 deletions.
95 changes: 64 additions & 31 deletions src/agent/driver-test-runner.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,38 @@ export class DriverTestRunner {
await this.atDriver.sendKeys(sequence);
}

/**
* @param {import('./at-driver').ATKeySequence} sequence
* @param {string} desiredResponse
*/
async pressKeysToToggleSetting(sequence, desiredResponse) {
// This timeout may be reached as many as two times for every test.
// Delays of over 500ms have been observed during local testing in a
// Windows virtual machine.
const MODE_SWITCH_SPEECH_TIMEOUT = 750;

let unknownCollected = '';
// there are 2 modes, so we will try pressing mode switch up to twice
for (let triesRemain = 2; triesRemain > 0; triesRemain--) {
const speechResponse = await this._collectSpeech(MODE_SWITCH_SPEECH_TIMEOUT, () =>
this.sendKeys(sequence)
);
while (speechResponse.length) {
const lastMessage = speechResponse.shift().trim();
if (lastMessage.toLowerCase() === desiredResponse.toLowerCase()) {
// our mode is correct, we are done
return;
}

if (unknownCollected.length) unknownCollected += '\n';
unknownCollected += lastMessage;
}
}
throw new Error(
`Unable to apply setting. Expected: "${desiredResponse}" Got: "${unknownCollected}"`
);
}

/**
* Used for v2 tests to ensure proper settings.
*
Expand All @@ -75,42 +107,23 @@ export class DriverTestRunner {
async ensureSettings(settings) {
const { atName } = await this.collectedCapabilities;
if (atName == 'NVDA') {
const desiredResponse = { browsemode: 'Browse mode', focusmode: 'Focus mode' }[
settings.toLowerCase()
];
if (!desiredResponse) {
throw new Error(`Unknown command settings for NVDA "${settings}"`);
}

// disable the "beeps" when switching focus/browse mode, forces it to speak the mode after switching
await this.atDriver._send({
method: 'nvda:settings.setSettings',
params: { settings: [{ name: 'virtualBuffers.passThroughAudioIndication', value: false }] },
});

try {
const desiredResponse = { browsemode: 'Browse mode', focusmode: 'Focus mode' }[
settings.toLowerCase()
];
if (!desiredResponse) {
throw new Error(`Unknown command settings for NVDA "${settings}"`);
}
// This timeout may be reached as many as two times for every test.
// Delays of over 500ms have been observed during local testing in a
// Windows virtual machine.
const MODE_SWITCH_SPEECH_TIMEOUT = 750;

let unknownCollected = '';
// there are 2 modes, so we will try pressing mode switch up to twice
for (let triesRemain = 2; triesRemain > 0; triesRemain--) {
const speechResponse = await this._collectSpeech(MODE_SWITCH_SPEECH_TIMEOUT, () =>
this.sendKeys(ATKey.sequence(ATKey.chord(ATKey.key('insert'), ATKey.key('space'))))
);
while (speechResponse.length) {
const lastMessage = speechResponse.shift().trim();
if (lastMessage.toLowerCase() === desiredResponse.toLowerCase()) {
// our mode is correct, we are done
return;
}

if (unknownCollected.length) unknownCollected += '\n';
unknownCollected += lastMessage;
}
}
throw new Error(
`Unable to ensure proper mode. Expected: "${desiredResponse}" Got: "${unknownCollected}"`
await this.pressKeysToToggleSetting(
ATKey.sequence(ATKey.chord(ATKey.key('insert'), ATKey.key('space'))),
desiredResponse
);
} finally {
// turn the "beeps" back on so mode switches won't be spoken (default setting)
Expand All @@ -122,7 +135,27 @@ export class DriverTestRunner {
});
}
} else if (atName == 'VoiceOver') {
if (settings !== 'defaultMode') {
if (settings === 'quickNavOn' || settings === 'arrowQuickKeyNavOn') {
await this.pressKeysToToggleSetting(
ATKey.sequence(ATKey.chord(ATKey.key('left'), ATKey.key('right'))),
'quick nav on'
);
} else if (settings === 'quickNavOff' || settings === 'arrowQuickKeyNavOff') {
await this.pressKeysToToggleSetting(
ATKey.sequence(ATKey.chord(ATKey.key('left'), ATKey.key('right'))),
'quick nav off'
);
} else if (settings === 'singleQuickKeyNavOn') {
await this.pressKeysToToggleSetting(
ATKey.sequence(ATKey.chord(ATKey.key('control'), ATKey.key('option'), ATKey.key('q'))),
'single-key quick nav on'
);
} else if (settings === 'singleQuickKeyNavOff') {
await this.pressKeysToToggleSetting(
ATKey.sequence(ATKey.chord(ATKey.key('control'), ATKey.key('option'), ATKey.key('q'))),
'single-key quick nav off'
);
} else if (settings !== 'defaultMode') {
throw new Error(`Unrecognized setting for VoiceOver: ${settings}`);
}
return;
Expand Down

0 comments on commit eb5ed3f

Please sign in to comment.