diff --git a/accessible/tests/browser/windows/uia/browser_simplePatterns.js b/accessible/tests/browser/windows/uia/browser_simplePatterns.js index 39df15c77129..04a7300e4c1d 100644 --- a/accessible/tests/browser/windows/uia/browser_simplePatterns.js +++ b/accessible/tests/browser/windows/uia/browser_simplePatterns.js @@ -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", ``); + 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) { await assignPyVarToUiaWithId(id); await definePyVar("pattern", `getUiaPattern(${id}, "RangeValue")`); diff --git a/accessible/windows/uia/uiaRawElmProvider.cpp b/accessible/windows/uia/uiaRawElmProvider.cpp index 1675dbd7871d..1f3a14b3fcdc 100644 --- a/accessible/windows/uia/uiaRawElmProvider.cpp +++ b/accessible/windows/uia/uiaRawElmProvider.cpp @@ -1009,6 +1009,11 @@ uiaRawElmProvider::get_Value(__RPC__deref_out_opt BSTR* aRetVal) { } nsAutoString 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()); if (!*aRetVal) { return E_OUTOFMEMORY; @@ -1391,7 +1396,7 @@ bool uiaRawElmProvider::HasValuePattern() const { Accessible* acc = Acc(); MOZ_ASSERT(acc); if (acc->HasNumericValue() || acc->IsCombobox() || acc->IsHTMLLink() || - acc->IsTextField()) { + acc->IsTextField() || acc->IsDoc()) { return true; } const nsRoleMapEntry* roleMapEntry = acc->ARIARoleMap();