Package: firefox-esr
Version: 52.3.0esr-2
Severity: normal
Tags: upstream a11y patch
Owner: [email protected]
User: [email protected]
Usertags: hypra
Forwarded: https://bugzilla.mozilla.org/show_bug.cgi?id=1319273

Hello,

For bug tracking in Debian, here is an upstream bug report. I have
attached the testcase and the patch proposed to upstream.

> Steps to reproduce:
> 
> I have attached a small python script written by Ksamak that mimics a very 
> basic screen magnifier tracking focus location.
> 
> While running it, run firefox, press control-L to access the URL widget, 
> empty it with backspace
> 
> 
> Actual results:
> 
> The python script reports
> 
> position: 0,0 size 0:0
> 
> 
> Expected results:
> 
> It should have reported at least the coordinates of the widget, just like it 
> does when it is not empty.

Samuel

-- Package-specific info:

-- Extensions information
Name: Adblock Plus
Location: ${PROFILE_EXTENSIONS}/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}.xpi
Status: enabled

Name: Application Update Service Helper
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: Calomel SSL Validation
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: Default theme
Location: 
/usr/lib/firefox-esr/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}.xpi
Package: firefox-esr
Status: enabled

Name: En-têtes HTTP en direct
Location: ${PROFILE_EXTENSIONS}/{8f8fe09b-0bd3-4470-bc1b-8cad42b8203a}
Status: enabled

Name: GNU LibreJS
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: user-disabled

Name: It's All Text!
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: Lilo
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: Multi-process staged rollout
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: Pocket
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: SixOrNot
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

Name: Web Compat
Location: ${PROFILE_EXTENSIONS}/[email protected]
Status: enabled

-- Plugins information
Name: GNOME Shell Integration
Location: /usr/lib/mozilla/plugins/libgnome-shell-browser-plugin.so
Package: gnome-shell
Status: enabled

Name: IcedTea-Web Plugin (using IcedTea-Web 1.6.2 (1.6.2-3.1))
Location: /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so
Package: icedtea-8-plugin:amd64
Status: disabled

Name: Shockwave Flash
Location: /usr/lib/gnash/libgnashplugin.so
Package: browser-plugin-gnash
Status: enabled


-- Addons package information
ii  browser-plugin 0.8.11~git20 amd64        GNU Shockwave Flash (SWF) player 
ii  firefox-esr    52.3.0esr-2  amd64        Mozilla Firefox web browser - Ext
ii  gnome-shell    3.22.3-3     amd64        graphical shell for the GNOME des
ii  icedtea-8-plug 1.6.2-3.1    amd64        web browser plugin based on OpenJ

-- System Information:
Debian Release: buster/sid
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 
'testing-debug'), (500, 'stable-debug'), (500, 'buildd-unstable'), (500, 
'unstable'), (500, 'stable'), (500, 'oldstable'), (1, 'experimental-debug'), 
(1, 'buildd-experimental'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.13.0 (SMP w/4 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), 
LANGUAGE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages firefox-esr depends on:
ii  debianutils               4.8.2
ii  fontconfig                2.12.3-0.2
ii  libasound2                1.1.3-5
ii  libatk1.0-0               2.24.0-1
ii  libc6                     2.24-17
ii  libcairo-gobject2         1.14.10-1
ii  libcairo2                 1.14.10-1
ii  libdbus-1-3               1.11.16+really1.10.22-1
ii  libdbus-glib-1-2          0.108-2
ii  libevent-2.1-6            2.1.8-stable-4
ii  libffi6                   3.2.1-6
ii  libfontconfig1            2.12.3-0.2
ii  libfreetype6              2.8-0.2
ii  libgcc1                   1:7.2.0-3
ii  libgdk-pixbuf2.0-0        2.36.5-2
ii  libglib2.0-0              2.53.6-1
ii  libgtk-3-0                3.22.19-1
ii  libgtk2.0-0               2.24.31-2
ii  libhunspell-1.6-0         1.6.1-2
ii  libjsoncpp1               1.7.4-3
ii  libnspr4                  2:4.16-1
ii  libnss3                   2:3.32-2
ii  libpango-1.0-0            1.40.11-1
ii  libsqlite3-0              3.20.1-1
ii  libstartup-notification0  0.12-4+b2
ii  libstdc++6                7.2.0-3
ii  libvpx4                   1.6.1-3
ii  libx11-6                  2:1.6.4-3
ii  libx11-xcb1               2:1.6.4-3
ii  libxcb-shm0               1.12-1
ii  libxcb1                   1.12-1
ii  libxcomposite1            1:0.4.4-2
ii  libxdamage1               1:1.1.4-3
ii  libxext6                  2:1.3.3-1+b2
ii  libxfixes3                1:5.0.3-1
ii  libxrender1               1:0.9.10-1
ii  libxt6                    1:1.1.5-1
ii  procps                    2:3.3.12-3
ii  zlib1g                    1:1.2.8.dfsg-5

firefox-esr recommends no packages.

Versions of packages firefox-esr suggests:
ii  fonts-lmodern          2.004.5-3
ii  fonts-stix [otf-stix]  1.1.1-4
ii  libcanberra0           0.30-3
ii  libgssapi-krb5-2       1.15.1-2
pn  mozplugger             <none>

-- no debconf information

-- 
Samuel
<O> Ça peut être une madeleine à sous munitions (avec des composants,
par exemple)
 -+- #runtime -+-
#!/usr/bin/python

import pyatspi
import sys

def magnifyAccessible(event, obj=None, extents=None):
    if event.source and event.source.getRole() == pyatspi.ROLE_TERMINAL: # protection against parasite events from terminals
        return

    if event.type.startswith("object:state-changed") and not event.detail1:
        # This object just became unselected or unfocused, and we're not
        # big on nostalgia.
        return

    obj = obj or event.source

    x, y, width, height = -1,-1,-1,-1
    if event and event.type.startswith("object:text-caret-moved"):
        try:
            text = obj.queryText()
            if text and (text.caretOffset >= 0):
                offset = text.caretOffset
                if offset == text.characterCount:
                    offset -= 1
                if (offset == -1):
                    offset = 0
                [x, y, width, height] = text.getCharacterExtents(offset, 0)
        except:
            pass

        print "position: %i,%i size %i:%s" %(x, y, width, height)

def startTracking():
    pyatspi.Registry.registerEventListener(magnifyAccessible, "object:text-caret-moved")

def stopTracking():
    pyatspi.Registry.deregisterEventListener(magnifyAccessible, "object:text-caret-moved")

def main():
    startTracking()
    pyatspi.Registry.start()
    return 0

if __name__ == "__main__":
    sys.exit(main())

--- a/accessible/generic/HyperTextAccessible.cpp
+++ b/accessible/generic/HyperTextAccessible.cpp
@@ -1250,7 +1250,26 @@ HyperTextAccessible::TextBounds(int32_t
     NS_ERROR("Wrong in offset");
     return nsIntRect();
   }
+  bool stripRight = false, stripLeft = false;
 
+  if (CharacterCount() == 0)
+    // Empty content, use our own bound to at least get x,y coordinates
+    return GetFrame()->GetScreenRect();
+
+  if (startOffset == endOffset) {
+    // Non-empty content, but empty selection
+    if (startOffset == 0) {
+      // At the beginning of text. Get rectangle of the first character and
+      // strip its right part.
+      endOffset = 1;
+      stripRight = true;
+    } else {
+      // Not at the beginning of the text.  Get rectangle of the character on
+      // the left of the empty selection, and strip its left part.
+      startOffset = startOffset - 1;
+      stripLeft = true;
+    }
+  }
 
   int32_t childIdx = GetChildIndexAtOffset(startOffset);
   if (childIdx == -1)
@@ -1282,6 +1301,15 @@ HyperTextAccessible::TextBounds(int32_t
   }
 
   nsAccUtils::ConvertScreenCoordsTo(&bounds.x, &bounds.y, aCoordType, this);
+
+  // Strip for empty selections
+  if (stripLeft) {
+    bounds.x = bounds.x + bounds.width;
+    bounds.width = 0;
+  }
+  if (stripRight) {
+    bounds.width = 0;
+  }
   return bounds;
 }
 

Reply via email to