Bug 1960347: Expose document URL via the UIA Value pattern. r=morgan

Differential Revision: https://phabricator.services.mozilla.com/D245531
This commit is contained in:
James Teh
2025-04-16 01:08:01 +00:00
parent 3404f9ef29
commit 60478f204d
2 changed files with 29 additions and 1 deletions

View File

@@ -447,6 +447,29 @@ addUiaTask(
} }
); );
/**
* Test the Value pattern on a document.
*/
addUiaTask(``, async function testValueDoc(browser) {
// A test snippet is a data: URI. The accessibility engine won't return these.
let url = new URL("https://example.net/document-builder.sjs");
url.searchParams.append("html", `<body id=${DEFAULT_CONTENT_DOC_BODY_ID}>`);
let loaded = waitForEvent(
EVENT_DOCUMENT_LOAD_COMPLETE,
DEFAULT_CONTENT_DOC_BODY_ID
);
BrowserTestUtils.startLoadingURIString(browser, url.href);
await loaded;
await definePyVar("doc", `getDocUia()`);
await definePyVar("pattern", `getUiaPattern(doc, "Value")`);
ok(await runPython(`bool(pattern)`), "doc has Value pattern");
is(
await runPython(`pattern.CurrentValue`),
url.href,
"doc has correct Value"
);
});
async function testRangeValueProps(id, ro, val, min, max, small, large) { async function testRangeValueProps(id, ro, val, min, max, small, large) {
await assignPyVarToUiaWithId(id); await assignPyVarToUiaWithId(id);
await definePyVar("pattern", `getUiaPattern(${id}, "RangeValue")`); await definePyVar("pattern", `getUiaPattern(${id}, "RangeValue")`);

View File

@@ -1009,6 +1009,11 @@ uiaRawElmProvider::get_Value(__RPC__deref_out_opt BSTR* aRetVal) {
} }
nsAutoString value; nsAutoString value;
acc->Value(value); acc->Value(value);
if (value.IsEmpty() && acc->IsDoc()) {
// Exposing the URl via the Value pattern doesn't seem to be documented
// anywhere. However, Chromium does it, as does the IA2 -> UIA proxy.
nsAccUtils::DocumentURL(acc, value);
}
*aRetVal = ::SysAllocStringLen(value.get(), value.Length()); *aRetVal = ::SysAllocStringLen(value.get(), value.Length());
if (!*aRetVal) { if (!*aRetVal) {
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
@@ -1391,7 +1396,7 @@ bool uiaRawElmProvider::HasValuePattern() const {
Accessible* acc = Acc(); Accessible* acc = Acc();
MOZ_ASSERT(acc); MOZ_ASSERT(acc);
if (acc->HasNumericValue() || acc->IsCombobox() || acc->IsHTMLLink() || if (acc->HasNumericValue() || acc->IsCombobox() || acc->IsHTMLLink() ||
acc->IsTextField()) { acc->IsTextField() || acc->IsDoc()) {
return true; return true;
} }
const nsRoleMapEntry* roleMapEntry = acc->ARIARoleMap(); const nsRoleMapEntry* roleMapEntry = acc->ARIARoleMap();