https://wiki.mozilla.org/api.php?action=feedcontributions&user=Eeejay&feedformat=atomMozillaWiki - User contributions [en]2024-03-28T09:31:57ZUser contributionsMediaWiki 1.27.4https://wiki.mozilla.org/index.php?title=Accessibility/Triage&diff=1237953Accessibility/Triage2021-09-14T18:55:37Z<p>Eeejay: Add link to Firefox triage guide</p>
<hr />
<div>== Search Queries ==<br />
<br />
* [https://mzl.la/3pjFR8R New Untriaged Bugs in Bugzilla]<br />
* [https://mzl.la/35kLz2h Older Untriaged Bugs in Bugzilla]<br />
* [https://github.com/mozilla-mobile/fenix/issues?q=is%3Aopen+is%3Aissue+label%3Aneeds%3Atriage+label%3Ab%3Aa11y+created%3A%3E2020-07-28 Untriaged Fenix Bugs]<br />
* [https://docs.google.com/spreadsheets/d/1VApqSeSg4DEpsszfrhb0wvZLxjLj_kHWcdDVgfAi15c/edit#gid=0 A11y Reviews Tracker] (Internal Mozilla-only Google Sheet)<br />
<br />
== Triaging Firefox and Gecko feature defects ==<br />
<br />
The Firefox Accessibility Team helps to assess accessibility issues across most Firefox and Gecko components. For accessibility issues reported in components not owned by the Firefox Accessibility Team (bugs with the access Keyword) we set a Whiteboard severity flag which communicates the team's assessment of the user impact of the issue. Below find the Whiteboard flags, their descriptions, and some examples of the types of bugs that warrant those flags. <br />
<br />
'''[access-s1]'''<br />
Accessibility of the entire product is broken. Examples include the accessibility engine failing or a critical piece of the browser's functionality like the URLbar not working. These bugs represent catastrophic failures and should be rare. <br />
<br />
'''[access-s2]'''<br />
Feature completely unavailable/inaccessible. Examples include lack of keyboard support for screen reader users, insufficient contrast or missing focus indicators, or missing controls in HCM (due to no background images) that make a feature not discoverable/actionable by users with low vision, UI that disappears or becomes otherwise inaccessible with large zoom factors, etc. These bugs should absolutely block a feature from shipping to our stable release audience. <br />
<br />
'''[access-s3]'''<br />
Feature available but difficult to use. Examples include inconsiderate tab order, missing alt text for non-text content, visually hidden but not accessibility hidden content, inconsistent heading levels, dialogs that should be role=document, difficult to see focus indicators, etc. These bugs should be fixed and may or may not block a feature from shipping to our stable release audience and will be evaluated for blocking status on a case by case basis. <br />
<br />
'''[access-s4]'''<br />
Feature available with minor defects. Examples include … These bugs should be fixed but probably do not block a feature from shipping to our release audience. This is the backlog.<br />
<br />
== Triaging for Disability Access and Disability Access APIs ==<br />
<br />
The Firefox Accessibility Team is also responsible for triaging bugs in the Disability Access and the Disability Access APIs components. As these components are owned by the Firefox Accessibility Engineering Team, we set severity and priority on these bugs directly using the Severity and Priority fields as described in [https://firefox-source-docs.mozilla.org/bug-mgmt/policies/triage-bugzilla.html Firefox's bug handling guide].<br />
<br />
== Triaging Fenix (Firefox for Android) GitHub Issues ==<br />
<br />
The Firefox Accessibility Team is responsible for triaging all Fenix bugs with the b:a11y label. We use P1 to describe completely broken features, P2 to describe difficult to use features, and P3 for general backlog bugs.<br />
<br />
== Triaging and Reviewing Accessibility Reviews ==<br />
<br />
* Add items that come in<br />
* Check for "due" items that need follow up<br />
* Assign Owners</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020/Draft&diff=1234023Accessibility/Mac2020/Draft2021-02-25T22:30:12Z<p>Eeejay: </p>
<hr />
<div>Here is the generated one:<br />
<img src="https://www.plantuml.com/plantuml/proxy?src=https%3A%2F%2Fwiki.mozilla.org%2FAccessibility%2FMac2020%2FDraft%3Faction%3Draw"><br />
<br />
<pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
abstract class Accessible {<br />
-- Non-virtual methods --<br />
<br />
.. Role and generic type methods ..<br />
+ nsRoleMapEntry* ARIARoleMap()<br />
+ bool HasARIARole()<br />
+ bool IsARIARole(nsAtom* aARIARole)<br />
+ bool HasStrongARIARole()<br />
+ bool HasGenericType(AccGenericType aType)<br />
<br />
.. Downcasting and types checking methods ..<br />
+ bool IsDoc()<br />
+ DocAccessible* AsDoc()<br />
+ bool IsHyperText()<br />
+ HyperTextAccessible* AsHyperText()<br />
+ bool IsImage()<br />
{method} ...<br />
<br />
-- Virtual methods or methods that call into virtual methods --<br />
<br />
.. Hierarchy Getters ..<br />
+ {abstract} Accessible* Parent()<br />
+ {abstract} Accessible* ChildAt(uint32_t aIndex)<br />
+ {abstract} Accessible* NextSibling()<br />
+ {abstract} Accessible* PrevSibling()<br />
+ {abstract} uint32_t ChildCount()<br />
+ {abstract} int32_t IndexInParent()<br />
+ bool HasChildren()<br />
+ Accessible* FirstChild()<br />
+ Accessible* LastChild()<br />
<br />
.. Core methods ..<br />
+ {abstract} role Role()<br />
+ {abstract} role ARIARole()<br />
+ {abstract} nsAtom* LandmarkRole()<br />
+ {abstract} uint64_t State()<br />
+ {abstract} uint64_t NativeState()<br />
+ {abstract} ENameValueFlag Name(nsString& aName)<br />
+ {abstract} void Value(nsString& aValue)<br />
+ {abstract} void Help(nsString& aHelp)<br />
+ {abstract} void Description(nsString& aDesc)<br />
+ {abstract} void Attributes(nsTArray<Attribute>* aAttrs)<br />
+ {abstract} nsTArray<Accessible*> RelationByType(RelationType aType)<br />
+ {abstract} void Relations(nsTArray<RelationType>* aTypes,<br />
nsTArray<nsTArray<Accessible*>>* aTargetSets)<br />
+ {abstract} mozilla::a11y::GroupPos GroupPosition()<br />
+ {abstract} void DOMNodeID(nsString& aID)<br />
+ {abstract} void TakeFocus()<br />
+ {abstract} Accessible* FocusedChild()<br />
<br />
.. Selection methods ..<br />
+ {abstract} void SelectedItems(nsTArray<Accessible*>* aSelectedItems)<br />
+ {abstract} uint32_t SelectedItemCount()<br />
+ {abstract} Accessible* GetSelectedItem(uint32_t aIndex)<br />
+ {abstract} bool IsItemSelected(uint32_t aIndex)<br />
+ {abstract} bool AddItemToSelection(uint32_t aIndex)<br />
+ {abstract} bool RemoveItemFromSelection(uint32_t aIndex)<br />
+ {abstract} bool SelectAll()<br />
+ {abstract} bool UnselectAll()<br />
+ {abstract} void SetSelected(bool aSelect)<br />
+ {abstract} bool DoAction(uint8_t aIndex)<br />
+ {abstract} uint8_t ActionCount()<br />
+ {abstract} void ActionDescriptionAt(uint8_t aIndex, nsString& aDescription)<br />
+ {abstract} void ActionNameAt(uint8_t aIndex, nsString& aName)<br />
+ {abstract} KeyBinding AccessKey()<br />
+ {abstract} KeyBinding KeyboardShortcut()<br />
<br />
.. Numeric value methods ..<br />
+ {abstract} double CurValue()<br />
+ {abstract} bool SetCurValue(double aValue)<br />
+ {abstract} double MinValue()<br />
+ {abstract} double MaxValue()<br />
+ {abstract} double Step()<br />
<br />
.. Screen layout methods ..<br />
+ {abstract} Accessible* ChildAtPoint(int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild)<br />
+ {abstract} nsIntRect Bounds()<br />
+ {abstract} nsIntRect BoundsInCSSPixels()<br />
+ {abstract} void ScrollTo(uint32_t aScrollType)<br />
+ {abstract} void ScrollToPoint(uint32_t aScrollType, int32_t aX, int32_t aY)<br />
<br />
.. Doc methods (should be in doc iface?) ..<br />
+ {abstract} void Language(nsString& aLocale)<br />
+ {abstract} void DocType(nsString& aType)<br />
+ {abstract} void Title(nsString& aTitle)<br />
+ {abstract} void URL(nsString& aURL)<br />
+ {abstract} void MimeType(nsString aMime)<br />
+ {abstract} void URLDocTypeMimeType(nsString& aURL, nsString& aDocType, nsString& aMimeType)<br />
<br />
-- Fields --<br />
# uint32_t mType<br />
# uint32_t mGenericTypes<br />
# uint8_t mRoleMapEntryIndex;<br />
}<br />
<br />
class LocalAccessible extends Accessible {<br />
-- Methods --<br />
nsIFrame* GetFrame()<br />
nsIContent* GetContent()<br />
<br />
-- Fields --<br />
# nsCOMPtr<nsIContent> mContent;<br />
# RefPtr<DocAccessible> mDoc;<br />
# LocalAccessible* mParent;<br />
# nsTArray<LocalAccessible*> mChildren;<br />
}<br />
<br />
class RemoteAccessible extends Accessible {<br />
-- Fields --<br />
- nsDataHashtable<nsUint32HashKey, nsString> mStringProps<br />
- nsDataHashtable<nsUint32HashKey, int64_t> mIntProps<br />
- nsDataHashtable<nsUint32HashKey, double> mFloatProps<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020/Draft&diff=1234022Accessibility/Mac2020/Draft2021-02-25T22:26:48Z<p>Eeejay: </p>
<hr />
<div><pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
abstract class Accessible {<br />
-- Non-virtual methods --<br />
<br />
.. Role and generic type methods ..<br />
+ nsRoleMapEntry* ARIARoleMap()<br />
+ bool HasARIARole()<br />
+ bool IsARIARole(nsAtom* aARIARole)<br />
+ bool HasStrongARIARole()<br />
+ bool HasGenericType(AccGenericType aType)<br />
<br />
.. Downcasting and types checking methods ..<br />
+ bool IsDoc()<br />
+ DocAccessible* AsDoc()<br />
+ bool IsHyperText()<br />
+ HyperTextAccessible* AsHyperText()<br />
+ bool IsImage()<br />
{method} ...<br />
<br />
-- Virtual methods or methods that call into virtual methods --<br />
<br />
.. Hierarchy Getters ..<br />
+ {abstract} Accessible* Parent()<br />
+ {abstract} Accessible* ChildAt(uint32_t aIndex)<br />
+ {abstract} Accessible* NextSibling()<br />
+ {abstract} Accessible* PrevSibling()<br />
+ {abstract} uint32_t ChildCount()<br />
+ {abstract} int32_t IndexInParent()<br />
+ bool HasChildren()<br />
+ Accessible* FirstChild()<br />
+ Accessible* LastChild()<br />
<br />
.. Core methods ..<br />
+ {abstract} role Role()<br />
+ {abstract} role ARIARole()<br />
+ {abstract} nsAtom* LandmarkRole()<br />
+ {abstract} uint64_t State()<br />
+ {abstract} uint64_t NativeState()<br />
+ {abstract} ENameValueFlag Name(nsString& aName)<br />
+ {abstract} void Value(nsString& aValue)<br />
+ {abstract} void Help(nsString& aHelp)<br />
+ {abstract} void Description(nsString& aDesc)<br />
+ {abstract} void Attributes(nsTArray<Attribute>* aAttrs)<br />
+ {abstract} nsTArray<Accessible*> RelationByType(RelationType aType)<br />
+ {abstract} void Relations(nsTArray<RelationType>* aTypes,<br />
nsTArray<nsTArray<Accessible*>>* aTargetSets)<br />
+ {abstract} mozilla::a11y::GroupPos GroupPosition()<br />
+ {abstract} void DOMNodeID(nsString& aID)<br />
+ {abstract} void TakeFocus()<br />
+ {abstract} Accessible* FocusedChild()<br />
<br />
.. Selection methods ..<br />
+ {abstract} void SelectedItems(nsTArray<Accessible*>* aSelectedItems)<br />
+ {abstract} uint32_t SelectedItemCount()<br />
+ {abstract} Accessible* GetSelectedItem(uint32_t aIndex)<br />
+ {abstract} bool IsItemSelected(uint32_t aIndex)<br />
+ {abstract} bool AddItemToSelection(uint32_t aIndex)<br />
+ {abstract} bool RemoveItemFromSelection(uint32_t aIndex)<br />
+ {abstract} bool SelectAll()<br />
+ {abstract} bool UnselectAll()<br />
+ {abstract} void SetSelected(bool aSelect)<br />
+ {abstract} bool DoAction(uint8_t aIndex)<br />
+ {abstract} uint8_t ActionCount()<br />
+ {abstract} void ActionDescriptionAt(uint8_t aIndex, nsString& aDescription)<br />
+ {abstract} void ActionNameAt(uint8_t aIndex, nsString& aName)<br />
+ {abstract} KeyBinding AccessKey()<br />
+ {abstract} KeyBinding KeyboardShortcut()<br />
<br />
.. Numeric value methods ..<br />
+ {abstract} double CurValue()<br />
+ {abstract} bool SetCurValue(double aValue)<br />
+ {abstract} double MinValue()<br />
+ {abstract} double MaxValue()<br />
+ {abstract} double Step()<br />
<br />
.. Screen layout methods ..<br />
+ {abstract} Accessible* ChildAtPoint(int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild)<br />
+ {abstract} nsIntRect Bounds()<br />
+ {abstract} nsIntRect BoundsInCSSPixels()<br />
+ {abstract} void ScrollTo(uint32_t aScrollType)<br />
+ {abstract} void ScrollToPoint(uint32_t aScrollType, int32_t aX, int32_t aY)<br />
<br />
.. Doc methods (should be in doc iface?) ..<br />
+ {abstract} void Language(nsString& aLocale)<br />
+ {abstract} void DocType(nsString& aType)<br />
+ {abstract} void Title(nsString& aTitle)<br />
+ {abstract} void URL(nsString& aURL)<br />
+ {abstract} void MimeType(nsString aMime)<br />
+ {abstract} void URLDocTypeMimeType(nsString& aURL, nsString& aDocType, nsString& aMimeType)<br />
<br />
-- Fields --<br />
# uint32_t mType<br />
# uint32_t mGenericTypes<br />
# uint8_t mRoleMapEntryIndex;<br />
}<br />
<br />
class LocalAccessible extends Accessible {<br />
-- Methods --<br />
nsIFrame* GetFrame()<br />
nsIContent* GetContent()<br />
<br />
-- Fields --<br />
# nsCOMPtr<nsIContent> mContent;<br />
# RefPtr<DocAccessible> mDoc;<br />
# LocalAccessible* mParent;<br />
# nsTArray<LocalAccessible*> mChildren;<br />
}<br />
<br />
class RemoteAccessible extends Accessible {<br />
-- Fields --<br />
- nsDataHashtable<nsUint32HashKey, nsString> mStringProps<br />
- nsDataHashtable<nsUint32HashKey, int64_t> mIntProps<br />
- nsDataHashtable<nsUint32HashKey, double> mFloatProps<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020/Draft&diff=1234021Accessibility/Mac2020/Draft2021-02-25T22:23:23Z<p>Eeejay: </p>
<hr />
<div>@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
abstract class Accessible {<br />
-- Non-virtual methods --<br />
<br />
.. Role and generic type methods ..<br />
+ nsRoleMapEntry* ARIARoleMap()<br />
+ bool HasARIARole()<br />
+ bool IsARIARole(nsAtom* aARIARole)<br />
+ bool HasStrongARIARole()<br />
+ bool HasGenericType(AccGenericType aType)<br />
<br />
.. Downcasting and types checking methods ..<br />
+ bool IsDoc()<br />
+ DocAccessible* AsDoc()<br />
+ bool IsHyperText()<br />
+ HyperTextAccessible* AsHyperText()<br />
+ bool IsImage()<br />
{method} ...<br />
<br />
-- Virtual methods or methods that call into virtual methods --<br />
<br />
.. Hierarchy Getters ..<br />
+ {abstract} Accessible* Parent()<br />
+ {abstract} Accessible* ChildAt(uint32_t aIndex)<br />
+ {abstract} Accessible* NextSibling()<br />
+ {abstract} Accessible* PrevSibling()<br />
+ {abstract} uint32_t ChildCount()<br />
+ {abstract} int32_t IndexInParent()<br />
+ bool HasChildren()<br />
+ Accessible* FirstChild()<br />
+ Accessible* LastChild()<br />
<br />
.. Core methods ..<br />
+ {abstract} role Role()<br />
+ {abstract} role ARIARole()<br />
+ {abstract} nsAtom* LandmarkRole()<br />
+ {abstract} uint64_t State()<br />
+ {abstract} uint64_t NativeState()<br />
+ {abstract} ENameValueFlag Name(nsString& aName)<br />
+ {abstract} void Value(nsString& aValue)<br />
+ {abstract} void Help(nsString& aHelp)<br />
+ {abstract} void Description(nsString& aDesc)<br />
+ {abstract} void Attributes(nsTArray<Attribute>* aAttrs)<br />
+ {abstract} nsTArray<Accessible*> RelationByType(RelationType aType)<br />
+ {abstract} void Relations(nsTArray<RelationType>* aTypes,<br />
nsTArray<nsTArray<Accessible*>>* aTargetSets)<br />
+ {abstract} mozilla::a11y::GroupPos GroupPosition()<br />
+ {abstract} void DOMNodeID(nsString& aID)<br />
+ {abstract} void TakeFocus()<br />
+ {abstract} Accessible* FocusedChild()<br />
<br />
.. Selection methods ..<br />
+ {abstract} void SelectedItems(nsTArray<Accessible*>* aSelectedItems)<br />
+ {abstract} uint32_t SelectedItemCount()<br />
+ {abstract} Accessible* GetSelectedItem(uint32_t aIndex)<br />
+ {abstract} bool IsItemSelected(uint32_t aIndex)<br />
+ {abstract} bool AddItemToSelection(uint32_t aIndex)<br />
+ {abstract} bool RemoveItemFromSelection(uint32_t aIndex)<br />
+ {abstract} bool SelectAll()<br />
+ {abstract} bool UnselectAll()<br />
+ {abstract} void SetSelected(bool aSelect)<br />
+ {abstract} bool DoAction(uint8_t aIndex)<br />
+ {abstract} uint8_t ActionCount()<br />
+ {abstract} void ActionDescriptionAt(uint8_t aIndex, nsString& aDescription)<br />
+ {abstract} void ActionNameAt(uint8_t aIndex, nsString& aName)<br />
+ {abstract} KeyBinding AccessKey()<br />
+ {abstract} KeyBinding KeyboardShortcut()<br />
<br />
.. Numeric value methods ..<br />
+ {abstract} double CurValue()<br />
+ {abstract} bool SetCurValue(double aValue)<br />
+ {abstract} double MinValue()<br />
+ {abstract} double MaxValue()<br />
+ {abstract} double Step()<br />
<br />
.. Screen layout methods ..<br />
+ {abstract} Accessible* ChildAtPoint(int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild)<br />
+ {abstract} nsIntRect Bounds()<br />
+ {abstract} nsIntRect BoundsInCSSPixels()<br />
+ {abstract} void ScrollTo(uint32_t aScrollType)<br />
+ {abstract} void ScrollToPoint(uint32_t aScrollType, int32_t aX, int32_t aY)<br />
<br />
.. Doc methods (should be in doc iface?) ..<br />
+ {abstract} void Language(nsString& aLocale)<br />
+ {abstract} void DocType(nsString& aType)<br />
+ {abstract} void Title(nsString& aTitle)<br />
+ {abstract} void URL(nsString& aURL)<br />
+ {abstract} void MimeType(nsString aMime)<br />
+ {abstract} void URLDocTypeMimeType(nsString& aURL, nsString& aDocType, nsString& aMimeType)<br />
<br />
-- Fields --<br />
# uint32_t mType<br />
# uint32_t mGenericTypes<br />
# uint8_t mRoleMapEntryIndex;<br />
}<br />
<br />
class LocalAccessible extends Accessible {<br />
-- Methods --<br />
nsIFrame* GetFrame()<br />
nsIContent* GetContent()<br />
<br />
-- Fields --<br />
# nsCOMPtr<nsIContent> mContent;<br />
# RefPtr<DocAccessible> mDoc;<br />
# LocalAccessible* mParent;<br />
# nsTArray<LocalAccessible*> mChildren;<br />
}<br />
<br />
class RemoteAccessible extends Accessible {<br />
-- Fields --<br />
- nsDataHashtable<nsUint32HashKey, nsString> mStringProps<br />
- nsDataHashtable<nsUint32HashKey, int64_t> mIntProps<br />
- nsDataHashtable<nsUint32HashKey, double> mFloatProps<br />
}<br />
<br />
@enduml</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1233415Accessibility/Mac20202021-01-28T18:41:10Z<p>Eeejay: Bumped releases</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== User Scenarios ==<br />
<br />
Here are the initial, in-scope, and agreed-upon web sites / applications that the engineering and test teams are to make sure have supported and useful VoiceOver experiences (navigation, primary interactions like search and compose, etc.):<br />
<br />
# New York Times<br />
# Gmail<br />
# Google Calendar<br />
# Google Drive<br />
# Google Docs<br />
# Facebook<br />
# Twitter<br />
# YouTube<br />
# Amazon<br />
# GitHub<br />
# Slack<br />
# Wikipedia homepage<br />
# Wikipedia: Starlink<br />
# Google search<br />
# about:newtab<br />
# about:logins<br />
# about:addons<br />
# History, Bookmarks manager<br />
# addons.mozilla.org<br />
# Mozilla.org<br />
<br />
See also: [https://docs.google.com/document/d/13GOsokYGekjWvoi-JFhhtu315L8tlg8wKi-CXgqTB7s/edit#heading=h.xc4ldat9cjr More detail and test instructions for these scenarios] (Mozilla-internal Google Doc link)<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["82 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 83 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In Firefox 83 we will work on Live Regions support, continue progress on text APIs and polish our rotor API.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["83 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 84 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Quality & Performance</li><br />
<li style="margin-left: 1.4rem;">VoiceOver support for tree views</li><br />
</ul><br />
<br />
In this release we focused on quality, performance, and introduced initial support for tree views.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["84 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 85 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Quality & Performance</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In this release we will be focusing on quality, performance, and introduce live regions. This is targeted towards being the consumer preview release for VoiceOver support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["85 Branch"]<br />
}<br />
</bugzilla><br />
<br />
==== Consumer Preview Tasks ====<br />
<br />
By Firefox 85 (complete December 15th, Release on January 26, 2021) we will have completed:<br />
<br />
# ✅ [[Accessibility/Mac2020#User_Scenarios|Scenarios]] (scope) definition<br />
# 🏃♀️ Engineering and Test Engineering run the [[Accessibility/Mac2020#User_Scenarios|Scenarios]] test suite (weekly)<br />
# ✅ Scenarios provided and PI request submitted<br />
# ⏸ "Preview Blocking" bugs filed against full [[Accessibility/Mac2020#User_Scenarios|Scenarios]] test suite<br />
# ⏸ PI bugs filed and Engineering triage (blockers vs. non-blockers)<br />
# ⏸ Blocking bugs fixed<br />
# 🏃♀️ Preview Announcement (Release Notes blurb) drafted and submitted<br />
# 🏃♀️ Hacks/Accessibility blog post drafted and published<br />
# ⏸ Internal Platform-wide Demo and follow-up email for feedback and visibility<br />
<br />
✅ means Completed, Done<br />
🏃♀️ means In Progress, Running<br />
⏸ means Paused, Not Ready, Blocked<br />
<br />
=== Firefox 86 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Quality & Performance</li><br />
<li style="margin-left: 1.4rem;">VoiceOver missing pieces</li><br />
</ul><br />
<br />
In this release we will be focusing on quality, performance, and address feedback from the consumer preview release (see above).<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"target_milestone": ["86 Branch"],<br />
"j_top": "OR",<br />
"f1": "op_sys",<br />
"o1": "equals",<br />
"v1": "macOS",<br />
"f2": "status_whiteboard",<br />
"o2": "substring",<br />
"v2": "mac2020"<br />
<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 87 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Quality & Performance</li><br />
<li style="margin-left: 1.4rem;">VoiceOver missing pieces</li><br />
</ul><br />
<br />
In this release we will be maintaining quality and performance. We will also introduce attributed text.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "87 Branch"],<br />
"resolution": ["---","FIXED"],<br />
"j_top": "OR",<br />
"f1": "op_sys",<br />
"o1": "equals",<br />
"v1": "macOS",<br />
"f2": "status_whiteboard",<br />
"o2": "substring",<br />
"v2": "mac2020"<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1231907Accessibility/Mac20202020-10-29T17:47:16Z<p>Eeejay: made a better query to capture mac2020 bugs outside of op_sys</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["82 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 83 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In Firefox 83 we will work on Live Regions support, continue progress on text APIs and polish our rotor API.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["83 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 84 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Quality & Performance</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In this release we will be focusing on quality, performance, and introduce live regions.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "84 Branch"],<br />
"resolution": ["---","FIXED"],<br />
"j_top": "OR",<br />
"f1": "op_sys",<br />
"o1": "equals",<br />
"v1": "macOS",<br />
"f2": "status_whiteboard",<br />
"o2": "substring",<br />
"v2": "mac2020"<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1231691Accessibility/Mac20202020-10-19T17:39:24Z<p>Eeejay: Added 84 to roadmap</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["82 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 83 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In Firefox 83 we will work on Live Regions support, continue progress on text APIs and polish our rotor API.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["83 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 84 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Quality & Performance</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In this release we will be focusing on quality, performance, and introduce live regions.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "84 Branch"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1230999Accessibility/Mac20202020-09-21T17:50:24Z<p>Eeejay: /* Firefox 83 */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["82 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 83 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In Firefox 83 we will work on Live Regions support, continue progress on text APIs and polish our rotor API.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "83 Branch"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1230998Accessibility/Mac20202020-09-21T17:50:04Z<p>Eeejay: tweaked list style</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["82 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 83 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In Firefox 83 we will work on Live Regions support, continue progress on text APIs and polish our rotor API.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "83 Branch"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1230997Accessibility/Mac20202020-09-21T17:48:50Z<p>Eeejay: Version 83 bump</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["82 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 83 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Live Regions</li><br />
</ul><br />
<br />
In Firefox 83 we will work on Live Regions support, continue progress on text APIs and polish our rotor API.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "83 Branch"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1230381Accessibility/Mac20202020-08-26T17:00:04Z<p>Eeejay: Add Firefox 82</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["81 Branch"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 82 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 82 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "82 Branch"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1229523Accessibility/Mac20202020-07-27T17:36:27Z<p>Eeejay: Added Firefox 81</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 81 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 81 we will continue to implement initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla81"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1228611Accessibility/Mac20202020-06-29T17:44:31Z<p>Eeejay: /* Roadmap */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla80"],<br />
"resolution": ["---","FIXED"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1228607Accessibility/Mac20202020-06-29T17:39:09Z<p>Eeejay: Bumped to nightly 80</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 80 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Rotor Support</li><br />
</ul><br />
<br />
In Firefox 80 we plan to have initial VoiceOver text and rotor support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla80"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1227967Accessibility/Mac20202020-06-08T17:25:56Z<p>Eeejay: /* Backlog */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3", "P2"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1227839Accessibility/Mac20202020-06-02T16:42:29Z<p>Eeejay: </p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Code Modernization and Refactors</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Text Support</li><br />
</ul><br />
<br />
In Firefox 79 we plan to finish the refactor we started in 78 and start working on VoiceOver text support.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla79"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227634Accessibility/Mac/ContributorGuide2020-05-27T22:04:43Z<p>Eeejay: </p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
In this document we will collect style guidelines and information useful for individuals looking to contribute to our Mac accessibility support. There is also an [[Accessibility/Mac/ArchitectureAndDesign|architecture and design page]] where one can find a technical overview.<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions. The [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/ObjectiveCStyleGuide Wikimedia style guide] is also a good reference for things not covered here or in Google's guide.<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
=== NSObject Literals ===<br />
<br />
Whenever possible, use <code>@</code> literals when creating immutable objects. Be careful not to pass <code>nil</code> values into container objects as this will cause a crash.<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// Do<br />
NSArray* actions = @[@"AXPress", @"AXShowMenu", @"AXScrollToVisible"];<br />
// Don't<br />
NSArray* actions = [NSArray arrayWithObjects:@"AXPress", @"AXShowMenu", @"AXScrollToVisible", nil];<br />
<br />
// Do<br />
NSDictionary* keyValues = @{@"key1" : @"value1", @"key2" : @"value2"};<br />
// Don't<br />
NSDictionary* keyValues = [NSDictionary dictionaryWithObjectsAndKeys:@"key1", @"value1", @"key2", @"value2", nil];<br />
<br />
// Do<br />
NSNumber* isBest = @YES;<br />
// Don't<br />
NSNumber* isBest = [NSNumber numberWithBool:YES];<br />
<br />
// Do<br />
NSNumber* life = @42;<br />
// Don't<br />
NSNumber* life = [NSNumber numberWithInteger:42];<br />
</syntaxhighlight><br />
<br />
=== Naming Conventions ===<br />
<br />
==== Variables ====<br />
<br />
==== Classes and Files ====</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1227576Accessibility/Mac20202020-05-26T18:48:32Z<p>Eeejay: </p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX. Contributors are encouraged to look at our [[Accessibility/Mac/ContributorGuide|contributor guide]], and our [[Accessibility/Mac/ArchitectureAndDesign|architectural overview]].<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 78 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227575Accessibility/Mac/ContributorGuide2020-05-26T18:46:33Z<p>Eeejay: /* Mac Accessibility Contributor's Guide */</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
In this document we will collect style guidelines and information useful for individuals looking to contribute to our Mac accessibility support. There is also an [[Accessibility/Mac/ArchitectureAndDesign|architecture and design page]] where one can find a technical overview.<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions. The [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/ObjectiveCStyleGuide Wikimedia style guide] is also a good reference for things not covered here or in Google's guide.<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
=== NSObject Literals ===<br />
<br />
Whenever possible, use <code>@</code> literals when creating immutable objects. Be careful not to pass <code>nil</code> values into container objects as this will cause a crash.<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// Do<br />
NSArray* actions = @[@"AXPress", @"AXShowMenu", @"AXScrollToVisible"];<br />
// Don't<br />
NSArray* actions = [NSArray arrayWithObjects:@"AXPress", @"AXShowMenu", @"AXScrollToVisible", nil];<br />
<br />
// Do<br />
NSDictionary* keyValues = @{@"key1" : @"value1", @"key2" : @"value2"};<br />
// Don't<br />
NSDictionary* keyValues = [NSDictionary dictionaryWithObjectsAndKeys:@"key1", @"value1", @"key2", @"value2", nil];<br />
<br />
// Do<br />
NSNumber* isBest = @YES;<br />
// Don't<br />
NSNumber* isBest = [NSNumber numberWithBool:YES];<br />
<br />
// Do<br />
NSNumber* life = @42;<br />
// Don't<br />
NSNumber* life = [NSNumber numberWithInteger:42];<br />
</syntaxhighlight></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ArchitectureAndDesign&diff=1227574Accessibility/Mac/ArchitectureAndDesign2020-05-26T18:43:34Z<p>Eeejay: Created page with "= Architecture and Design = UML Class Diagram The goal of this design is to allow us to provide customized interfaces for different accessib..."</p>
<hr />
<div>= Architecture and Design =<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
== Protocols ==<br />
<br />
=== mozAccessible Protocol ===<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
=== MOXAccessible Protocol ===<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
== Classes ==<br />
<br />
=== MOXAccessibleBase ===<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>MOXAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
* Manages the lifecycle of the accessible as it relates to the platform (ie. notify on destroy)<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>MOXColumnAccessible</code>.<br />
<br />
=== MOXAccessible ===<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
=== MOXAccessible subclasses ===<br />
<br />
Subclasses of MOXAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227573Accessibility/Mac/ContributorGuide2020-05-26T18:42:31Z<p>Eeejay: </p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions. The [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/ObjectiveCStyleGuide Wikimedia style guide] is also a good reference for things not covered here or in Google's guide.<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
=== NSObject Literals ===<br />
<br />
Whenever possible, use <code>@</code> literals when creating immutable objects. Be careful not to pass <code>nil</code> values into container objects as this will cause a crash.<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// Do<br />
NSArray* actions = @[@"AXPress", @"AXShowMenu", @"AXScrollToVisible"];<br />
// Don't<br />
NSArray* actions = [NSArray arrayWithObjects:@"AXPress", @"AXShowMenu", @"AXScrollToVisible", nil];<br />
<br />
// Do<br />
NSDictionary* keyValues = @{@"key1" : @"value1", @"key2" : @"value2"};<br />
// Don't<br />
NSDictionary* keyValues = [NSDictionary dictionaryWithObjectsAndKeys:@"key1", @"value1", @"key2", @"value2", nil];<br />
<br />
// Do<br />
NSNumber* isBest = @YES;<br />
// Don't<br />
NSNumber* isBest = [NSNumber numberWithBool:YES];<br />
<br />
// Do<br />
NSNumber* life = @42;<br />
// Don't<br />
NSNumber* life = [NSNumber numberWithInteger:42];<br />
</syntaxhighlight></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227558Accessibility/Mac/ContributorGuide2020-05-26T16:53:44Z<p>Eeejay: /* Architecture and Design */</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions. The [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/ObjectiveCStyleGuide Wikimedia style guide] is also a good reference for things not covered here or in Google's guide.<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
=== NSObject Literals ===<br />
<br />
Whenever possible, use <code>@</code> literals when creating immutable objects. Be careful not to pass <code>nil</code> values into container objects as this will cause a crash.<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// Do<br />
NSArray* actions = @[@"AXPress", @"AXShowMenu", @"AXScrollToVisible"];<br />
// Don't<br />
NSArray* actions = [NSArray arrayWithObjects:@"AXPress", @"AXShowMenu", @"AXScrollToVisible", nil];<br />
<br />
// Do<br />
NSDictionary* keyValues = @{@"key1" : @"value1", @"key2" : @"value2"};<br />
// Don't<br />
NSDictionary* keyValues = [NSDictionary dictionaryWithObjectsAndKeys:@"key1", @"value1", @"key2", @"value2", nil];<br />
<br />
// Do<br />
NSNumber* isBest = @YES;<br />
// Don't<br />
NSNumber* isBest = [NSNumber numberWithBool:YES];<br />
<br />
// Do<br />
NSNumber* life = @42;<br />
// Don't<br />
NSNumber* life = [NSNumber numberWithInteger:42];<br />
</syntaxhighlight><br />
<br />
== Architecture and Design ==<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== MOXAccessible Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== MOXAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>MOXAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
* Manages the lifecycle of the accessible as it relates to the platform (ie. notify on destroy)<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>MOXColumnAccessible</code>.<br />
<br />
==== MOXAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== MOXAccessible subclasses ====<br />
<br />
Subclasses of MOXAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=File:Max_a11y_arch.svg&diff=1227557File:Max a11y arch.svg2020-05-26T16:52:12Z<p>Eeejay: </p>
<hr />
<div><pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
interface mozAccessibleProtocol {<br />
+ {field} (NSArray*)accessibilityAttributeNames<br />
+ {field} (NSArray*)accessibilityActionNames<br />
+ {field} (BOOL)isRoot<br />
+ {field} ...<br />
+ (id)accessibilityAttributeValue:(NSString*)attribute<br />
+ (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute<br />
+ {method} ...<br />
}<br />
note top of mozAccessibleProtocol<br />
Includes methods needed to talk to<br />
platform and widget code.<br />
end note<br />
<br />
interface MOXAccessibleProtocol {<br />
.. Get AXChildren ..<br />
+ {field} (NSArray*)children<br />
.. Get AXParent ..<br />
+ {field} (id)parent<br />
.. Get AXRole ..<br />
+ {field} (NSString*)role<br />
.. Set AXValue ..<br />
+ setValue:(NSNumber*)value<br />
.. Set AXFocused ..<br />
+ setFocused:(NSNumber*)focused<br />
.. Perform AXPress ..<br />
+ {method} performPress<br />
...<br />
}<br />
note top of MOXAccessibleProtocol<br />
A set of optional methods that map<br />
to platform attributes and actions<br />
end note<br />
<br />
abstract class MOXAccessibleBase extends mozAccessibleProtocol {<br />
+ (BOOL)blockSelector:(SEL)selector<br />
+ (BOOL)ignoreWithParent:(MOXAccessible*)parent<br />
+ (BOOL)ignoreChild:(MOXAccessible*)child<br />
...<br />
}<br />
note top of MOXAccessibleBase<br />
Base class that is not Gecko specific.<br />
Implements platform API that maps to internal protocol API.<br />
Responsible for filtering and managing ignored accessibles.<br />
end note<br />
<br />
class MOXAccessible extends MOXAccessibleBase,MOXAccessibleProtocol {<br />
~ {field} (AccessibleOrProxy)geckoAccessible<br />
~ {field} (uint_64)geckoRole<br />
}<br />
note top of MOXAccessibleBase<br />
Base accessible that is associated with a Gecko accessible.<br />
Translates Gecko roles, states and heirarchy to platform APIs.<br />
end note<br />
<br />
skinparam ClassBackgroundColor<< Gecko >> MidnightBlue<br />
skinparam ClassFontColor<< Gecko >> White<br />
skinparam ClassStereotypeFontColor<< Gecko >> White<br />
<br />
class AccessibleOrProxy << Gecko >><br />
<br />
MOXAccessible *- AccessibleOrProxy<br />
<br />
class MOXSummaryAccessible extends MOXAccessible {<br />
+ {field} (NSNumber*)expanded<br />
}<br />
<br />
class MOXColumnContainer extends MOXAccessibleBase,MOXAccessibleProtocol<br />
<br />
class MOXMathSquareRootAccessible extends MOXAccessible {<br />
+ {field} (id)mathRootRadicand<br />
}<br />
<br />
class MOXIncrementableAccessible extends MOXAccessible {<br />
+ {method} performIncrement<br />
+ {method} performDecrement<br />
}<br />
<br />
class MOXSelectableAccessible extends MOXAccessible {<br />
+ {field} (NSArray*)selectedChildren<br />
}<br />
<br />
class MOXSelectableChildAccessible extends MOXAccessible {<br />
+ setSelected:(NSNumber*)selected<br />
}<br />
<br />
class MOXTabGroupAccessible extends MOXSelectableAccessible {<br />
+ {field} (NSArray*)tabs<br />
}<br />
<br />
class MOXListboxAccessible extends MOXSelectableAccessible {<br />
+ {field} (NSSttring*)orientation<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=File:Max_a11y_arch.svg&diff=1227555File:Max a11y arch.svg2020-05-26T16:50:55Z<p>Eeejay: Eeejay uploaded a new version of File:Max a11y arch.svg</p>
<hr />
<div><pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
interface mozAccessibleProtocol {<br />
+ {field} (NSArray*)accessibilityAttributeNames<br />
+ {field} (NSArray*)accessibilityActionNames<br />
+ {field} (BOOL)isRoot<br />
+ {field} ...<br />
+ (id)accessibilityAttributeValue:(NSString*)attribute<br />
+ (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute<br />
+ {method} ...<br />
}<br />
note top of mozAccessibleProtocol<br />
Includes methods needed to talk to<br />
platform and widget code.<br />
end note<br />
<br />
interface mozAccessibleInnerProtocol {<br />
.. Get AXChildren ..<br />
+ {field} (NSArray*)children<br />
.. Get AXParent ..<br />
+ {field} (id)parent<br />
.. Get AXRole ..<br />
+ {field} (NSString*)role<br />
.. Set AXValue ..<br />
+ setValue:(NSNumber*)value<br />
.. Set AXFocused ..<br />
+ setFocused:(NSNumber*)focused<br />
.. Perform AXPress ..<br />
+ {method} performPress<br />
...<br />
}<br />
note top of mozAccessibleInnerProtocol<br />
A set of optional methods that map<br />
to platform attributes and actions<br />
end note<br />
<br />
abstract class mozAccessibleBase extends mozAccessibleProtocol {<br />
+ (BOOL)blockSelector:(SEL)selector<br />
+ (BOOL)ignoreWithParent:(mozAccessible*)parent<br />
+ (BOOL)ignoreChild:(mozAccessible*)child<br />
...<br />
}<br />
note top of mozAccessibleBase<br />
Base class that is not Gecko specific.<br />
Implements platform API that maps to internal protocol API.<br />
Responsible for filtering and managing ignored accessibles.<br />
end note<br />
<br />
class mozAccessible extends mozAccessibleBase,mozAccessibleInnerProtocol {<br />
~ {field} (AccessibleOrProxy)geckoAccessible<br />
~ {field} (uint_64)geckoRole<br />
}<br />
note top of mozAccessibleBase<br />
Base accessible that is associated with a Gecko accessible.<br />
Translates Gecko roles, states and heirarchy to platform APIs.<br />
end note<br />
<br />
skinparam ClassBackgroundColor<< Gecko >> MidnightBlue<br />
skinparam ClassFontColor<< Gecko >> White<br />
skinparam ClassStereotypeFontColor<< Gecko >> White<br />
<br />
class AccessibleOrProxy << Gecko >><br />
<br />
mozAccessible *- AccessibleOrProxy<br />
<br />
class mozSummaryAccessible extends mozAccessible {<br />
+ {field} (NSNumber*)expanded<br />
}<br />
<br />
class mozColumnContainer extends mozAccessibleBase,mozAccessibleInnerProtocol<br />
<br />
class mozMathSquareRootAccessible extends mozAccessible {<br />
+ {field} (id)mathRootRadicand<br />
}<br />
<br />
class mozIncrementableAccessible extends mozAccessible {<br />
+ {method} performIncrement<br />
+ {method} performDecrement<br />
}<br />
<br />
class mozSelectableAccessible extends mozAccessible {<br />
+ {field} (NSArray*)selectedChildren<br />
}<br />
<br />
class mozSelectableChildAccessible extends mozAccessible {<br />
+ setSelected:(NSNumber*)selected<br />
}<br />
<br />
class mozTabGroupAccessible extends mozSelectableAccessible {<br />
+ {field} (NSArray*)tabs<br />
}<br />
<br />
class mozListboxAccessible extends mozSelectableAccessible {<br />
+ {field} (NSSttring*)orientation<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=File:Max_a11y_arch.svg&diff=1227554File:Max a11y arch.svg2020-05-26T16:50:27Z<p>Eeejay: Eeejay uploaded a new version of File:Max a11y arch.svg</p>
<hr />
<div><pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
interface mozAccessibleProtocol {<br />
+ {field} (NSArray*)accessibilityAttributeNames<br />
+ {field} (NSArray*)accessibilityActionNames<br />
+ {field} (BOOL)isRoot<br />
+ {field} ...<br />
+ (id)accessibilityAttributeValue:(NSString*)attribute<br />
+ (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute<br />
+ {method} ...<br />
}<br />
note top of mozAccessibleProtocol<br />
Includes methods needed to talk to<br />
platform and widget code.<br />
end note<br />
<br />
interface mozAccessibleInnerProtocol {<br />
.. Get AXChildren ..<br />
+ {field} (NSArray*)children<br />
.. Get AXParent ..<br />
+ {field} (id)parent<br />
.. Get AXRole ..<br />
+ {field} (NSString*)role<br />
.. Set AXValue ..<br />
+ setValue:(NSNumber*)value<br />
.. Set AXFocused ..<br />
+ setFocused:(NSNumber*)focused<br />
.. Perform AXPress ..<br />
+ {method} performPress<br />
...<br />
}<br />
note top of mozAccessibleInnerProtocol<br />
A set of optional methods that map<br />
to platform attributes and actions<br />
end note<br />
<br />
abstract class mozAccessibleBase extends mozAccessibleProtocol {<br />
+ (BOOL)blockSelector:(SEL)selector<br />
+ (BOOL)ignoreWithParent:(mozAccessible*)parent<br />
+ (BOOL)ignoreChild:(mozAccessible*)child<br />
...<br />
}<br />
note top of mozAccessibleBase<br />
Base class that is not Gecko specific.<br />
Implements platform API that maps to internal protocol API.<br />
Responsible for filtering and managing ignored accessibles.<br />
end note<br />
<br />
class mozAccessible extends mozAccessibleBase,mozAccessibleInnerProtocol {<br />
~ {field} (AccessibleOrProxy)geckoAccessible<br />
~ {field} (uint_64)geckoRole<br />
}<br />
note top of mozAccessibleBase<br />
Base accessible that is associated with a Gecko accessible.<br />
Translates Gecko roles, states and heirarchy to platform APIs.<br />
end note<br />
<br />
skinparam ClassBackgroundColor<< Gecko >> MidnightBlue<br />
skinparam ClassFontColor<< Gecko >> White<br />
skinparam ClassStereotypeFontColor<< Gecko >> White<br />
<br />
class AccessibleOrProxy << Gecko >><br />
<br />
mozAccessible *- AccessibleOrProxy<br />
<br />
class mozSummaryAccessible extends mozAccessible {<br />
+ {field} (NSNumber*)expanded<br />
}<br />
<br />
class mozColumnContainer extends mozAccessibleBase,mozAccessibleInnerProtocol<br />
<br />
class mozMathSquareRootAccessible extends mozAccessible {<br />
+ {field} (id)mathRootRadicand<br />
}<br />
<br />
class mozIncrementableAccessible extends mozAccessible {<br />
+ {method} performIncrement<br />
+ {method} performDecrement<br />
}<br />
<br />
class mozSelectableAccessible extends mozAccessible {<br />
+ {field} (NSArray*)selectedChildren<br />
}<br />
<br />
class mozSelectableChildAccessible extends mozAccessible {<br />
+ setSelected:(NSNumber*)selected<br />
}<br />
<br />
class mozTabGroupAccessible extends mozSelectableAccessible {<br />
+ {field} (NSArray*)tabs<br />
}<br />
<br />
class mozListboxAccessible extends mozSelectableAccessible {<br />
+ {field} (NSSttring*)orientation<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=File:Max_a11y_arch.svg&diff=1227552File:Max a11y arch.svg2020-05-26T16:49:47Z<p>Eeejay: Eeejay uploaded a new version of File:Max a11y arch.svg</p>
<hr />
<div><pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
interface mozAccessibleProtocol {<br />
+ {field} (NSArray*)accessibilityAttributeNames<br />
+ {field} (NSArray*)accessibilityActionNames<br />
+ {field} (BOOL)isRoot<br />
+ {field} ...<br />
+ (id)accessibilityAttributeValue:(NSString*)attribute<br />
+ (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute<br />
+ {method} ...<br />
}<br />
note top of mozAccessibleProtocol<br />
Includes methods needed to talk to<br />
platform and widget code.<br />
end note<br />
<br />
interface mozAccessibleInnerProtocol {<br />
.. Get AXChildren ..<br />
+ {field} (NSArray*)children<br />
.. Get AXParent ..<br />
+ {field} (id)parent<br />
.. Get AXRole ..<br />
+ {field} (NSString*)role<br />
.. Set AXValue ..<br />
+ setValue:(NSNumber*)value<br />
.. Set AXFocused ..<br />
+ setFocused:(NSNumber*)focused<br />
.. Perform AXPress ..<br />
+ {method} performPress<br />
...<br />
}<br />
note top of mozAccessibleInnerProtocol<br />
A set of optional methods that map<br />
to platform attributes and actions<br />
end note<br />
<br />
abstract class mozAccessibleBase extends mozAccessibleProtocol {<br />
+ (BOOL)blockSelector:(SEL)selector<br />
+ (BOOL)ignoreWithParent:(mozAccessible*)parent<br />
+ (BOOL)ignoreChild:(mozAccessible*)child<br />
...<br />
}<br />
note top of mozAccessibleBase<br />
Base class that is not Gecko specific.<br />
Implements platform API that maps to internal protocol API.<br />
Responsible for filtering and managing ignored accessibles.<br />
end note<br />
<br />
class mozAccessible extends mozAccessibleBase,mozAccessibleInnerProtocol {<br />
~ {field} (AccessibleOrProxy)geckoAccessible<br />
~ {field} (uint_64)geckoRole<br />
}<br />
note top of mozAccessibleBase<br />
Base accessible that is associated with a Gecko accessible.<br />
Translates Gecko roles, states and heirarchy to platform APIs.<br />
end note<br />
<br />
skinparam ClassBackgroundColor<< Gecko >> MidnightBlue<br />
skinparam ClassFontColor<< Gecko >> White<br />
skinparam ClassStereotypeFontColor<< Gecko >> White<br />
<br />
class AccessibleOrProxy << Gecko >><br />
<br />
mozAccessible *- AccessibleOrProxy<br />
<br />
class mozSummaryAccessible extends mozAccessible {<br />
+ {field} (NSNumber*)expanded<br />
}<br />
<br />
class mozColumnContainer extends mozAccessibleBase,mozAccessibleInnerProtocol<br />
<br />
class mozMathSquareRootAccessible extends mozAccessible {<br />
+ {field} (id)mathRootRadicand<br />
}<br />
<br />
class mozIncrementableAccessible extends mozAccessible {<br />
+ {method} performIncrement<br />
+ {method} performDecrement<br />
}<br />
<br />
class mozSelectableAccessible extends mozAccessible {<br />
+ {field} (NSArray*)selectedChildren<br />
}<br />
<br />
class mozSelectableChildAccessible extends mozAccessible {<br />
+ setSelected:(NSNumber*)selected<br />
}<br />
<br />
class mozTabGroupAccessible extends mozSelectableAccessible {<br />
+ {field} (NSArray*)tabs<br />
}<br />
<br />
class mozListboxAccessible extends mozSelectableAccessible {<br />
+ {field} (NSSttring*)orientation<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227380Accessibility/Mac/ContributorGuide2020-05-20T04:56:55Z<p>Eeejay: /* mozAccessibleBase */</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions. The [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/ObjectiveCStyleGuide Wikimedia style guide] is also a good reference for things not covered here or in Google's guide.<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
=== NSObject Literals ===<br />
<br />
Whenever possible, use <code>@</code> literals when creating immutable objects. Be careful not to pass <code>nil</code> values into container objects as this will cause a crash.<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// Do<br />
NSArray* actions = @[@"AXPress", @"AXShowMenu", @"AXScrollToVisible"];<br />
// Don't<br />
NSArray* actions = [NSArray arrayWithObjects:@"AXPress", @"AXShowMenu", @"AXScrollToVisible", nil];<br />
<br />
// Do<br />
NSDictionary* keyValues = @{@"key1" : @"value1", @"key2" : @"value2"};<br />
// Don't<br />
NSDictionary* keyValues = [NSDictionary dictionaryWithObjectsAndKeys:@"key1", @"value1", @"key2", @"value2", nil];<br />
<br />
// Do<br />
NSNumber* isBest = @YES;<br />
// Don't<br />
NSNumber* isBest = [NSNumber numberWithBool:YES];<br />
<br />
// Do<br />
NSNumber* life = @42;<br />
// Don't<br />
NSNumber* life = [NSNumber numberWithInteger:42];<br />
</syntaxhighlight><br />
<br />
== Architecture and Design ==<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
* Manages the lifecycle of the accessible as it relates to the platform (ie. notify on destroy)<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227379Accessibility/Mac/ContributorGuide2020-05-20T04:46:14Z<p>Eeejay: /* Mac Accessibility Contributor's Guide */</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions. The [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/iOS/ObjectiveCStyleGuide Wikimedia style guide] is also a good reference for things not covered here or in Google's guide.<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
=== NSObject Literals ===<br />
<br />
Whenever possible, use <code>@</code> literals when creating immutable objects. Be careful not to pass <code>nil</code> values into container objects as this will cause a crash.<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// Do<br />
NSArray* actions = @[@"AXPress", @"AXShowMenu", @"AXScrollToVisible"];<br />
// Don't<br />
NSArray* actions = [NSArray arrayWithObjects:@"AXPress", @"AXShowMenu", @"AXScrollToVisible", nil];<br />
<br />
// Do<br />
NSDictionary* keyValues = @{@"key1" : @"value1", @"key2" : @"value2"};<br />
// Don't<br />
NSDictionary* keyValues = [NSDictionary dictionaryWithObjectsAndKeys:@"key1", @"value1", @"key2", @"value2", nil];<br />
<br />
// Do<br />
NSNumber* isBest = @YES;<br />
// Don't<br />
NSNumber* isBest = [NSNumber numberWithBool:YES];<br />
<br />
// Do<br />
NSNumber* life = @42;<br />
// Don't<br />
NSNumber* life = [NSNumber numberWithInteger:42];<br />
</syntaxhighlight><br />
<br />
== Architecture and Design ==<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227378Accessibility/Mac/ContributorGuide2020-05-20T04:26:05Z<p>Eeejay: /* Code Style */</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on [https://google.github.io/styleguide/objcguide.html Google's Objective C Style Guide], with a few exceptions and additions:<br />
<br />
=== Method Declarations ===<br />
<br />
Objective C is very flexible in its handling of method declarations. These rules should help remove ambiguity.<br />
<br />
==== Always Declare Methods ====<br />
<br />
Objective C does not require instance methods to have a declaration in the <code>@interface</code> block. If a method is defined in the <code>@implementation</code> block, it is accessible to any caller that knows of its signature. All methods should be declared. If they are public, they should be in the <code>@interface</code> block in the header file. If they are private they should be in a private class extension in the <code>mm</code> file.<br />
<br />
For example, a header file might look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello : NSObject<br />
- (NSString*)world;<br />
@end<br />
</syntaxhighlight><br />
<br />
The <code>mm</code> file will look like this:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
@interface Hello()<br />
- (NSNumber*)somethingElseThatIsPrivate;<br />
@end<br />
<br />
<br />
@implementation Hello<br />
- (NSString*)world {<br />
return @"earth";<br />
}<br />
<br />
- (NSNumber*)somethingElseThatIsPrivate {<br />
return @(3);<br />
}<br />
<br />
// BAD! This method has not been declared<br />
- (void)iAmNotDeclared:(NSString*)bah {<br />
NSLog(@"%@", bah);<br />
}<br />
@end<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "final" ====<br />
<br />
A class cannot declare a method as final and prevent subclasses from overriding it. If a method should not be overridden by a subclass put the word "final" in a comment above the declaration. For example:<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bar"<br />
// final<br />
- (NSString*)foo;<br />
</syntaxhighlight><br />
<br />
==== Mark Methods "override" ====<br />
<br />
A subclass does not need to declare an overridden method as such. If a method is overriding a method from a superclass, or is implementing a method from a conformed protocol, put the word "override" in a comment above the declaration. For example:<br />
<br />
<syntaxhighlight lang="Objective-C"><br />
// This method returns the word "bear"<br />
// override<br />
- (NSString*)pooh;<br />
</syntaxhighlight><br />
<br />
== Architecture and Design ==<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227377Accessibility/Mac/ContributorGuide2020-05-20T03:40:13Z<p>Eeejay: /* Architecture and Design */</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on Google's Objective C Style Guide<br />
<br />
== Architecture and Design ==<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227376Accessibility/Mac/ContributorGuide2020-05-20T03:39:45Z<p>Eeejay: </p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on Google's Objective C Style Guide<br />
<br />
== Architecture and Design ==<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227375Accessibility/Mac/ContributorGuide2020-05-20T03:38:55Z<p>Eeejay: changed diagram to thumbnail</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on Google's Objective C Style Guide<br />
<br />
== Architecture and Design ==<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.<br />
<br />
[[File:Max a11y arch.svg|thumb|UML Class Diagram]]</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227372Accessibility/Mac/ContributorGuide2020-05-20T00:09:51Z<p>Eeejay: </p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on Google's Objective C Style Guide<br />
<br />
== Architecture and Design ==<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.<br />
<br />
<br />
[[File:Max a11y arch.svg|frame|UML Class Diagram]]</div>Eeejayhttps://wiki.mozilla.org/index.php?title=File:Max_a11y_arch.svg&diff=1227371File:Max a11y arch.svg2020-05-20T00:04:09Z<p>Eeejay: </p>
<hr />
<div><pre><br />
@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
interface mozAccessibleProtocol {<br />
+ {field} (NSArray*)accessibilityAttributeNames<br />
+ {field} (NSArray*)accessibilityActionNames<br />
+ {field} (BOOL)isRoot<br />
+ {field} ...<br />
+ (id)accessibilityAttributeValue:(NSString*)attribute<br />
+ (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute<br />
+ {method} ...<br />
}<br />
note top of mozAccessibleProtocol<br />
Includes methods needed to talk to<br />
platform and widget code.<br />
end note<br />
<br />
interface mozAccessibleInnerProtocol {<br />
.. Get AXChildren ..<br />
+ {field} (NSArray*)children<br />
.. Get AXParent ..<br />
+ {field} (id)parent<br />
.. Get AXRole ..<br />
+ {field} (NSString*)role<br />
.. Set AXValue ..<br />
+ setValue:(NSNumber*)value<br />
.. Set AXFocused ..<br />
+ setFocused:(NSNumber*)focused<br />
.. Perform AXPress ..<br />
+ {method} performPress<br />
...<br />
}<br />
note top of mozAccessibleInnerProtocol<br />
A set of optional methods that map<br />
to platform attributes and actions<br />
end note<br />
<br />
abstract class mozAccessibleBase extends mozAccessibleProtocol {<br />
+ (BOOL)blockSelector:(SEL)selector<br />
+ (BOOL)ignoreWithParent:(mozAccessible*)parent<br />
+ (BOOL)ignoreChild:(mozAccessible*)child<br />
...<br />
}<br />
note top of mozAccessibleBase<br />
Base class that is not Gecko specific.<br />
Implements platform API that maps to internal protocol API.<br />
Responsible for filtering and managing ignored accessibles.<br />
end note<br />
<br />
class mozAccessible extends mozAccessibleBase,mozAccessibleInnerProtocol {<br />
~ {field} (AccessibleOrProxy)geckoAccessible<br />
~ {field} (uint_64)geckoRole<br />
}<br />
note top of mozAccessibleBase<br />
Base accessible that is associated with a Gecko accessible.<br />
Translates Gecko roles, states and heirarchy to platform APIs.<br />
end note<br />
<br />
skinparam ClassBackgroundColor<< Gecko >> MidnightBlue<br />
skinparam ClassFontColor<< Gecko >> White<br />
skinparam ClassStereotypeFontColor<< Gecko >> White<br />
<br />
class AccessibleOrProxy << Gecko >><br />
<br />
mozAccessible *- AccessibleOrProxy<br />
<br />
class mozSummaryAccessible extends mozAccessible {<br />
+ {field} (NSNumber*)expanded<br />
}<br />
<br />
class mozColumnContainer extends mozAccessibleBase,mozAccessibleInnerProtocol<br />
<br />
class mozMathSquareRootAccessible extends mozAccessible {<br />
+ {field} (id)mathRootRadicand<br />
}<br />
<br />
class mozIncrementableAccessible extends mozAccessible {<br />
+ {method} performIncrement<br />
+ {method} performDecrement<br />
}<br />
<br />
class mozSelectableAccessible extends mozAccessible {<br />
+ {field} (NSArray*)selectedChildren<br />
}<br />
<br />
class mozSelectableChildAccessible extends mozAccessible {<br />
+ setSelected:(NSNumber*)selected<br />
}<br />
<br />
class mozTabGroupAccessible extends mozSelectableAccessible {<br />
+ {field} (NSArray*)tabs<br />
}<br />
<br />
class mozListboxAccessible extends mozSelectableAccessible {<br />
+ {field} (NSSttring*)orientation<br />
}<br />
<br />
@enduml<br />
</pre></div>Eeejayhttps://wiki.mozilla.org/index.php?title=File:Max_a11y_arch.svg&diff=1227370File:Max a11y arch.svg2020-05-20T00:03:22Z<p>Eeejay: @startuml
left to right direction
hide empty members
skinparam shadowing false
interface mozAccessibleProtocol {
+ {field} (NSArray*)accessibilityAttributeNames
+ {field} (NSArray*)accessibilityActionNames
+ {field} (BOOL)isRoot
+ {field} ...
+ (id)a...</p>
<hr />
<div>@startuml<br />
<br />
left to right direction<br />
hide empty members<br />
skinparam shadowing false<br />
<br />
interface mozAccessibleProtocol {<br />
+ {field} (NSArray*)accessibilityAttributeNames<br />
+ {field} (NSArray*)accessibilityActionNames<br />
+ {field} (BOOL)isRoot<br />
+ {field} ...<br />
+ (id)accessibilityAttributeValue:(NSString*)attribute<br />
+ (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute<br />
+ {method} ...<br />
}<br />
note top of mozAccessibleProtocol<br />
Includes methods needed to talk to<br />
platform and widget code.<br />
end note<br />
<br />
interface mozAccessibleInnerProtocol {<br />
.. Get AXChildren ..<br />
+ {field} (NSArray*)children<br />
.. Get AXParent ..<br />
+ {field} (id)parent<br />
.. Get AXRole ..<br />
+ {field} (NSString*)role<br />
.. Set AXValue ..<br />
+ setValue:(NSNumber*)value<br />
.. Set AXFocused ..<br />
+ setFocused:(NSNumber*)focused<br />
.. Perform AXPress ..<br />
+ {method} performPress<br />
...<br />
}<br />
note top of mozAccessibleInnerProtocol<br />
A set of optional methods that map<br />
to platform attributes and actions<br />
end note<br />
<br />
abstract class mozAccessibleBase extends mozAccessibleProtocol {<br />
+ (BOOL)blockSelector:(SEL)selector<br />
+ (BOOL)ignoreWithParent:(mozAccessible*)parent<br />
+ (BOOL)ignoreChild:(mozAccessible*)child<br />
...<br />
}<br />
note top of mozAccessibleBase<br />
Base class that is not Gecko specific.<br />
Implements platform API that maps to internal protocol API.<br />
Responsible for filtering and managing ignored accessibles.<br />
end note<br />
<br />
class mozAccessible extends mozAccessibleBase,mozAccessibleInnerProtocol {<br />
~ {field} (AccessibleOrProxy)geckoAccessible<br />
~ {field} (uint_64)geckoRole<br />
}<br />
note top of mozAccessibleBase<br />
Base accessible that is associated with a Gecko accessible.<br />
Translates Gecko roles, states and heirarchy to platform APIs.<br />
end note<br />
<br />
skinparam ClassBackgroundColor<< Gecko >> MidnightBlue<br />
skinparam ClassFontColor<< Gecko >> White<br />
skinparam ClassStereotypeFontColor<< Gecko >> White<br />
<br />
class AccessibleOrProxy << Gecko >><br />
<br />
mozAccessible *- AccessibleOrProxy<br />
<br />
class mozSummaryAccessible extends mozAccessible {<br />
+ {field} (NSNumber*)expanded<br />
}<br />
<br />
class mozColumnContainer extends mozAccessibleBase,mozAccessibleInnerProtocol<br />
<br />
class mozMathSquareRootAccessible extends mozAccessible {<br />
+ {field} (id)mathRootRadicand<br />
}<br />
<br />
class mozIncrementableAccessible extends mozAccessible {<br />
+ {method} performIncrement<br />
+ {method} performDecrement<br />
}<br />
<br />
class mozSelectableAccessible extends mozAccessible {<br />
+ {field} (NSArray*)selectedChildren<br />
}<br />
<br />
class mozSelectableChildAccessible extends mozAccessible {<br />
+ setSelected:(NSNumber*)selected<br />
}<br />
<br />
class mozTabGroupAccessible extends mozSelectableAccessible {<br />
+ {field} (NSArray*)tabs<br />
}<br />
<br />
class mozListboxAccessible extends mozSelectableAccessible {<br />
+ {field} (NSSttring*)orientation<br />
}<br />
<br />
@enduml</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac/ContributorGuide&diff=1227369Accessibility/Mac/ContributorGuide2020-05-19T23:44:07Z<p>Eeejay: Created page with "= Mac Accessibility Contributor's Guide = == Code Style == Our code style is based on Google's Objective C Style Guide == Architecture and Design == The goal of this desig..."</p>
<hr />
<div>= Mac Accessibility Contributor's Guide =<br />
<br />
== Code Style ==<br />
<br />
Our code style is based on Google's Objective C Style Guide<br />
<br />
== Architecture and Design ==<br />
<br />
The goal of this design is to allow us to provide customized interfaces for different accessibility roles in a concise and readable way that does not compromise on flexibility and possible future OSX API changes.<br />
<br />
=== Protocols ===<br />
<br />
==== mozAccessible Protocol ====<br />
This consists of the API necessary to talk to platform accessibility (<code>accessibilityAttributeValue</code>, etc.) and widget code (<code>representedView</code>, etc.)<br />
<br />
==== mozAccessibleInner Protocol ====<br />
This inner protocol's API is a mapping to Apple's attributes and actions. It allows us to have simple getter and setter methods for each attribute and a method for performing each action. All methods are optional, so an implementing object gets to choose which subset of these methods it supports. This gets reflected in what is returned to platform in <code>accessibilityAttributeNames</code> and friends. An instance can also programatically block a method if it is defined and it will be excluded from the mapping.<br />
<br />
=== Classes ===<br />
<br />
==== mozAccessibleBase ====<br />
<br />
The abstract base class for all our platform accessibles. This class:<br />
* Implements the platform and widget API defined in the <code>mozAccessible</code> protocol. The platform API it implements should be considered "final" (there is no way in Objective C to enforce this).<br />
* Forwards platform methods to the mapped inner protocol's methods.<br />
* Filters ignored accessibles and ensures they are not exposed to the platform.<br />
<br />
A subclass should be able to implement a handful of inner protocol getters and have a well-behaved platform accessible. An example of that is <code>mozColumnAccessible</code>.<br />
<br />
==== mozAccessible ====<br />
<br />
The base class for all accessibles that wrap a Gecko accessible. This class:<br />
* Maps gecko roles to platform roles, subroles, and role descriptions.<br />
* Caches and utilizes gecko states.<br />
* Forwards gecko accessible events to platform notifications.<br />
* Provides parent and children getters via gecko's hierarchy.<br />
* Provides a base set of attributes and actions that most gecko accessibles support.<br />
<br />
==== mozAccessible subclasses ====<br />
<br />
Subclasses of mozAccessible are mainly gecko role-based and typically provide additional attributes that the type uses. For example a mathml subclass might provide mathml related attributes via implemented inner protocol methods (eg. <code>mathRootRadicand</code>). An accessible that backs a slider might implement special actions via the inner protocol, like <code>performIncrement</code>.</div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1226853Accessibility/Mac20202020-05-05T15:54:43Z<p>Eeejay: Bumped it all to 78</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla78"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 79 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225981Accessibility/Mac20202020-04-07T13:30:38Z<p>Eeejay: /* Firefox 77 */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla77"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225957Accessibility/Mac20202020-04-06T18:34:51Z<p>Eeejay: /* VoiceOver Live Regions */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
Live regions allow users to know an important part of the page changed. We support Live regions on all major platforms except OSX.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225956Accessibility/Mac20202020-04-06T18:33:40Z<p>Eeejay: Adjusted bugzilla queries for 76/77</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
TBD<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and are in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and beginning to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
<br />
=== Firefox 77 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 77 we will continue to focus on basic VoiceOver support, refactor and modernize our codebase, and expand our Mac test coverage.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 78 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225566Accessibility/Mac20202020-03-30T16:32:25Z<p>Eeejay: Fixed 76 query</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
TBD<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"],<br />
"target_milestone": ["---", "mozilla76"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P2"],<br />
"target_milestone": ["---"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225464Accessibility/Mac20202020-03-25T18:27:29Z<p>Eeejay: </p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
TBD<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P2"],<br />
"target_milestone": ["---"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225463Accessibility/Mac20202020-03-25T18:20:21Z<p>Eeejay: Added bugzilla query for 77</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
TBD<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P2"]<br />
}<br />
</bugzilla><br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225361Accessibility/Mac20202020-03-23T21:01:40Z<p>Eeejay: /* Plan */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== VoiceOver Live Regions ===<br />
<br />
TBD<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225119Accessibility/Mac20202020-03-15T04:09:15Z<p>Eeejay: /* Firefox 76 */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">Automated Testing</li><br />
<li style="margin-left: 1.4rem;">Code Modernization and Refactors</li><br />
</ul><br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225118Accessibility/Mac20202020-03-15T04:08:28Z<p>Eeejay: /* Firefox 75 */</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
<ul style="display: flex; margin-left: 0;"><br />
<li style="list-style: none;">Basic VoiceOver Support</li><br />
<li style="margin-left: 1.4rem;">VoiceOver Performance</li><br />
<li style="margin-left: 1.4rem;">External Tooling</li><br />
</ul><br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
'''''Basic VoiceOver Support''''' • '''''Automated Testing''''' • '''''Code Modernization and Refactors'''''<br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225117Accessibility/Mac20202020-03-15T03:57:41Z<p>Eeejay: </p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
=== External Tooling ===<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
=== Automated Testing ===<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
=== Code Modernization and Refactors ===<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
=== Basic VoiceOver Support ===<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
=== VoiceOver Text Support ===<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
=== Rotor VoiceOver Support ===<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
=== VoiceOver Performance ===<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
=== IPC Redirection (exploration) ===<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
== Roadmap ==<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
=== Firefox 75 ===<br />
<br />
'''''Basic VoiceOver Support''''' • '''''VoiceOver Performance''''' • '''''External Tooling'''''<br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 76 ===<br />
<br />
'''''Basic VoiceOver Support''''' • '''''Automated Testing''''' • '''''Code Modernization and Refactors'''''<br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
=== Firefox 77 ===<br />
<br />
TBD<br />
<br />
== Backlog ==<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020&diff=1225116Accessibility/Mac20202020-03-15T03:56:03Z<p>Eeejay: Reorganized project to be release based instead of 2 6 month stretches.</p>
<hr />
<div>[[File:MACCESSIBILITY 2020.png|thumb|right|MACCESSIBILITY 2020]]<br />
<br />
This page provides information about our efforts in 2020 to improve Firefox accessibility on OSX.<br />
<br />
== Rationale ==<br />
<br />
OSX is a popular platform among web developers and designers. It is important we provide a means for testing web content accessibility in OSX. Historically, our OSX support has been plagued with performance issues, but we can still provide a good benchmark for developers to test with. After we reach API completeness, we will do a second pass to optimize the experience for VoiceOver users and assure the performance is optimal and comparable to other browsers.<br />
<br />
== Plan ==<br />
<br />
Throught 2020 we plan to improve Firefox VoiceOver support to provide an accessible experience to users, and a dependable testing platform for web developers who see to make their web applications accessible.<br />
<br />
=== Areas of Work ===<br />
<br />
With this work we hope to tackle several areas:<br />
<br />
==== External Tooling ====<br />
<br />
This includes scripts and programs that will give us insight into our current support and browser compliance in general. Examples of such tools include a tree dumper, event logger, VoiceOver automation tool, and VoiceOver benchmarking.<br />
<br />
==== Automated Testing ====<br />
<br />
We should strive to have as much automated test coverage as possible. With the exception of Android we don't currently have any real platform accessibility testing happening in-tree in CI. There is a potential to introduce this in Mac. This will allow us to maintain a our Mac accessibility support as our attention goes elsewhere.<br />
<br />
==== Code Modernization and Refactors ====<br />
<br />
The current Mac code was written for older Mac SDKs and uses deprecated calls. In addition, the Mac platform code was introduced before e10s shipped. There are many places where we should be streamlining our codebase so we can continue to extend our Mac support.<br />
<br />
==== Basic VoiceOver Support ====<br />
<br />
Basic support means anything that is needed for VoiceOver to present web content correctly. This includes role, state, events and actions mappings. Most things in https://a11ysupport.io/ that are supported by Safari fall into this category.<br />
<br />
==== VoiceOver Text Support ====<br />
<br />
This includes text editing, so a user has feedback from insertions, deletions, caret and selection changes. and granular text navigation. In addition this would include read-only text navigation by granularity such as character, word and line.<br />
<br />
==== Rotor VoiceOver Support ====<br />
<br />
VoiceOver has a feature called a "rotor" that opens a list of all similar types of items on a page, like headings, links or form controls. We currently don't support it. We need to find an efficient way to do it so that it will be responsive and quick. This has proven tricky in the past since it requires a full tree traversal on potentially very large documents.<br />
<br />
==== VoiceOver Performance ====<br />
<br />
Historically, Firefox's VoiceOver performance made it unusable to casual users. A simple cursor navigation in a page, which should never be more than a small fraction of a second, could sometimes take up to 30 seconds. This year we have already made progress on this front and our in reach of Safari and Chrome response times. With a benchmarking tool we can find additional hotspots and make the VoiceOver experience even smoother. This may involve some selective caching of certain properties and other tricks.<br />
<br />
==== IPC Redirection (exploration) ====<br />
<br />
If time permits it would be cool to explore the possibility of having accessibility services talk directly to content processes and not use the synchronous IPDL calls that link content to the top level process. This can improve performance and help do away with janky synchronous calls.<br />
<br />
=== Roadmap ===<br />
<br />
Since the task is large and hard to scope we will be breaking down the work for each Firefox release with the hope to tackle a common user story or theme on each iteration. While we work on one release we will formalize plans for the next one.<br />
<br />
==== Firefox 75 ====<br />
<br />
'''''Basic VoiceOver Support''''' • '''''VoiceOver Performance''''' • '''''External Tooling'''''<br />
<br />
In Firefox 75 we focused on building tools for querying Mac accessibility APIs and VoiceOver. This helped us better understand the space and gives us what we need to continue building our Mac support. We also got our feet wet in the Mac codebase and resolved some pressing issues we noticed immediately like focus behavior and labeling. Notably, we uncovered a major performance bug that quickly made us quick.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"target_milestone": ["mozilla75"]<br />
}<br />
</bugzilla><br />
<br />
==== Firefox 76 ====<br />
<br />
'''''Basic VoiceOver Support''''' • '''''Automated Testing''''' • '''''Code Modernization and Refactors'''''<br />
<br />
In Firefox 76 we are focusing on basic VoiceOver support and begining to apply our knowledge of what is needed towards refactors, cleanup, and hopefully a start on automated testing.<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"priority": ["P1"]<br />
}<br />
</bugzilla><br />
<br />
==== Firefox 77 ====<br />
<br />
TBD<br />
<br />
=== Backlog ===<br />
<br />
<bugzilla><br />
{<br />
"product": ["Core"],<br />
"component": ["Disability Access APIs"],<br />
"op_sys": ["macOS"],<br />
"bug_status": ["NEW", "ASSIGNED", "REOPENED", "UNCONFIRMED"],<br />
"priority": ["P3"],<br />
"whiteboard": "[mac2020_"<br />
}<br />
</bugzilla></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020/Draft&diff=1225115Accessibility/Mac2020/Draft2020-03-15T03:41:28Z<p>Eeejay: Blanked the page</p>
<hr />
<div></div>Eeejayhttps://wiki.mozilla.org/index.php?title=Accessibility/Mac2020/Draft&diff=1225114Accessibility/Mac2020/Draft2020-03-15T03:41:09Z<p>Eeejay: Created page with "Test"</p>
<hr />
<div>Test</div>Eeejay