133 lines
3.8 KiB
JavaScript
133 lines
3.8 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
/* exported getNativeInterface, waitForMacEventWithInfo, waitForMacEvent, waitForStateChange,
|
|
NSRange, NSDictionary, stringForRange, AXTextStateChangeTypeEdit,
|
|
AXTextEditTypeDelete, AXTextEditTypeTyping, AXTextStateChangeTypeSelectionMove,
|
|
AXTextStateChangeTypeSelectionExtend, AXTextSelectionDirectionUnknown,
|
|
AXTextSelectionDirectionPrevious, AXTextSelectionDirectionNext,
|
|
AXTextSelectionDirectionDiscontiguous, AXTextSelectionGranularityUnknown,
|
|
AXTextSelectionDirectionBeginning, AXTextSelectionDirectionEnd,
|
|
AXTextSelectionGranularityCharacter, AXTextSelectionGranularityWord,
|
|
AXTextSelectionGranularityLine */
|
|
|
|
// Load the shared-head file first.
|
|
Services.scriptloader.loadSubScript(
|
|
"chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js",
|
|
this
|
|
);
|
|
|
|
// Loading and common.js from accessible/tests/mochitest/ for all tests, as
|
|
// well as promisified-events.js.
|
|
loadScripts(
|
|
{ name: "common.js", dir: MOCHITESTS_DIR },
|
|
{ name: "promisified-events.js", dir: MOCHITESTS_DIR }
|
|
);
|
|
|
|
// AXTextStateChangeType enum values
|
|
const AXTextStateChangeTypeEdit = 1;
|
|
const AXTextStateChangeTypeSelectionMove = 2;
|
|
const AXTextStateChangeTypeSelectionExtend = 3;
|
|
|
|
// AXTextEditType enum values
|
|
const AXTextEditTypeDelete = 1;
|
|
const AXTextEditTypeTyping = 3;
|
|
|
|
// AXTextSelectionDirection enum values
|
|
const AXTextSelectionDirectionUnknown = 0;
|
|
const AXTextSelectionDirectionBeginning = 1;
|
|
const AXTextSelectionDirectionEnd = 2;
|
|
const AXTextSelectionDirectionPrevious = 3;
|
|
const AXTextSelectionDirectionNext = 4;
|
|
const AXTextSelectionDirectionDiscontiguous = 5;
|
|
|
|
// AXTextSelectionGranularity enum values
|
|
const AXTextSelectionGranularityUnknown = 0;
|
|
const AXTextSelectionGranularityCharacter = 1;
|
|
const AXTextSelectionGranularityWord = 2;
|
|
const AXTextSelectionGranularityLine = 3;
|
|
|
|
function getNativeInterface(accDoc, id) {
|
|
return findAccessibleChildByID(accDoc, id).nativeInterface.QueryInterface(
|
|
Ci.nsIAccessibleMacInterface
|
|
);
|
|
}
|
|
|
|
function waitForMacEventWithInfo(notificationType, filter) {
|
|
let filterFunc = (macIface, data) => {
|
|
if (!filter) {
|
|
return true;
|
|
}
|
|
|
|
if (typeof filter == "function") {
|
|
return filter(macIface, data);
|
|
}
|
|
|
|
return macIface.getAttributeValue("AXDOMIdentifier") == filter;
|
|
};
|
|
|
|
return new Promise(resolve => {
|
|
let eventObserver = {
|
|
observe(subject, topic, data) {
|
|
let macEvent = subject.QueryInterface(Ci.nsIAccessibleMacEvent);
|
|
if (
|
|
data === notificationType &&
|
|
filterFunc(macEvent.macIface, macEvent.data)
|
|
) {
|
|
Services.obs.removeObserver(this, "accessible-mac-event");
|
|
resolve(macEvent);
|
|
}
|
|
},
|
|
};
|
|
Services.obs.addObserver(eventObserver, "accessible-mac-event");
|
|
});
|
|
}
|
|
|
|
function waitForMacEvent(notificationType, filter) {
|
|
return waitForMacEventWithInfo(notificationType, filter).then(
|
|
e => e.macIface
|
|
);
|
|
}
|
|
|
|
function NSRange(location, length) {
|
|
return {
|
|
valueType: "NSRange",
|
|
value: [location, length],
|
|
};
|
|
}
|
|
|
|
function NSDictionary(dict) {
|
|
return {
|
|
objectType: "NSDictionary",
|
|
object: dict,
|
|
};
|
|
}
|
|
|
|
function stringForRange(macDoc, range) {
|
|
if (!range) {
|
|
return "";
|
|
}
|
|
|
|
let str = macDoc.getParameterizedAttributeValue(
|
|
"AXStringForTextMarkerRange",
|
|
range
|
|
);
|
|
|
|
let attrStr = macDoc.getParameterizedAttributeValue(
|
|
"AXAttributedStringForTextMarkerRange",
|
|
range
|
|
);
|
|
|
|
// This is a fly-by test to make sure our attributed strings
|
|
// always match our flat strings.
|
|
is(
|
|
attrStr.map(({ string }) => string).join(""),
|
|
str,
|
|
"attributed text matches non-attributed text"
|
|
);
|
|
|
|
return str;
|
|
}
|