From 68fd6a3f35188669bb392a627857cf8462d57fbd Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Tue, 6 Oct 2020 17:24:19 +0000 Subject: [PATCH] Bug 1669359 - Fix GeckoTextMarker lesser-than operator. r=morgan Differential Revision: https://phabricator.services.mozilla.com/D92511 --- accessible/mac/GeckoTextMarker.mm | 27 +++++++++++++++++++ .../tests/browser/mac/browser_text_basics.js | 22 +++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/accessible/mac/GeckoTextMarker.mm b/accessible/mac/GeckoTextMarker.mm index 727d4f5e19ad..56369de75542 100644 --- a/accessible/mac/GeckoTextMarker.mm +++ b/accessible/mac/GeckoTextMarker.mm @@ -133,6 +133,33 @@ bool GeckoTextMarker::operator<(const GeckoTextMarker& aPoint) const { } } + if (pos1 != 0) { + // If parents1 is a superset of parents2 then mContainer is a + // descendant of aPoint.mContainer. The next element down in parents1 + // is mContainer's ancestor that is the child of aPoint.mContainer. + // We compare its end offset in aPoint.mContainer with aPoint.mOffset. + AccessibleOrProxy child = parents1.ElementAt(pos1 - 1); + MOZ_ASSERT(child.Parent() == aPoint.mContainer); + bool unused; + uint32_t endOffset = child.IsProxy() ? child.AsProxy()->EndOffset(&unused) + : child.AsAccessible()->EndOffset(); + return endOffset < static_cast(aPoint.mOffset); + } + + if (pos2 != 0) { + // If parents2 is a superset of parents1 then aPoint.mContainer is a + // descendant of mContainer. The next element down in parents2 + // is aPoint.mContainer's ancestor that is the child of mContainer. + // We compare its start offset in mContainer with mOffset. + AccessibleOrProxy child = parents2.ElementAt(pos2 - 1); + MOZ_ASSERT(child.Parent() == mContainer); + bool unused; + uint32_t startOffset = child.IsProxy() + ? child.AsProxy()->StartOffset(&unused) + : child.AsAccessible()->StartOffset(); + return static_cast(mOffset) < startOffset; + } + MOZ_ASSERT_UNREACHABLE("Broken tree?!"); return false; } diff --git a/accessible/tests/browser/mac/browser_text_basics.js b/accessible/tests/browser/mac/browser_text_basics.js index f3b44092f8fb..4999b29f6ec0 100644 --- a/accessible/tests/browser/mac/browser_text_basics.js +++ b/accessible/tests/browser/mac/browser_text_basics.js @@ -216,3 +216,25 @@ addAccessibleTask("mac/doc_textmarker_test.html", async (browser, accDoc) => { testMarkerIntegrity(accDoc, expectedMarkerValues); }); + +// Test text marker lesser-than operator +addAccessibleTask( + `

hello goodbye world

`, + async (browser, accDoc) => { + let macDoc = accDoc.nativeInterface.QueryInterface( + Ci.nsIAccessibleMacInterface + ); + + let start = macDoc.getParameterizedAttributeValue( + "AXTextMarkerForIndex", + 1 + ); + let end = macDoc.getParameterizedAttributeValue("AXTextMarkerForIndex", 10); + + let range = macDoc.getParameterizedAttributeValue( + "AXTextMarkerRangeForUnorderedTextMarkers", + [end, start] + ); + is(stringForRange(macDoc, range), "ello good"); + } +);