summaryrefslogtreecommitdiff
path: root/devel-docs/roadmap.rst
diff options
context:
space:
mode:
Diffstat (limited to 'devel-docs/roadmap.rst')
-rw-r--r--devel-docs/roadmap.rst188
1 files changed, 188 insertions, 0 deletions
diff --git a/devel-docs/roadmap.rst b/devel-docs/roadmap.rst
new file mode 100644
index 00000000..3f194f14
--- /dev/null
+++ b/devel-docs/roadmap.rst
@@ -0,0 +1,188 @@
+Accessibility infrastructure roadmap
+====================================
+
+Note that this roadmap refers exclusively to **cleanups** and **paying
+technical debt**. It does not yet refer to actually changing the
+accessibility interfaces, or the way accessibility works in general.
+
+High level goals, detailed below
+--------------------------------
+
+- Make at-spi2-core/xml the authoritative version of the a11y
+ interfaces.
+
+- Remove all the hand-written DBus code in at-spi2-core; replace with
+ gdbus as generated from the XML files.
+
+- Add good end-to-end tests, to complement the ones already in
+ at-spi2-atk.
+
+- Remove as much duplication / leftovers from the CORBA days /
+ compatibility hacks as we can.
+
+- Give people the confidence that the accessibility stack works, so
+ it’s their responsibility to make their apps and gnome-shell
+ accessible.
+
+Short term tasks
+----------------
+
+- Merge these repositories into a single one: at-spi2-core, atk,
+ at-spi2-atk. They are tightly coupled, and it will be much easier to
+ test/refactor them if the code is in the same repo. See “`merge the
+ repositories <#merge-the-repositories>`__” below for details.
+
+- Replace manually-written DBus code in at-spi2-core for automatically
+ generated code. See “`DBus update for
+ libatspi <#dbus-update-for-libatspi>`__” below for details.
+
+- `Make the XML interfaces the single source of
+ truth <#make-the-xml-interfaces-the-single-source-of-truth>`__.
+
+Details on big tasks
+====================
+
+Merge the repositories
+----------------------
+
+Merging at-spi2-core, atk, and at-spi2-atk into a single repository will
+make end-to-end testing easier. As of 2022/May/27, at-spi2-atk has a few
+end-to-end tests, which do not manage to exercise all the code in
+libatspi or in atk. Having all the code in the same repository will make
+it easier to refactor and test things. Some reasons to merge:
+
+- at-spi2-atk has the real end-to-end integration tests for
+ at-spi2-core; it tests the part for an accessible application and the
+ accessibility technology together, with the registry daemon in the
+ middle. It would be nice to run these tests automatically when any of
+ at-spi2-core or atk changes.
+
+- Both at-spi2-atk and pyatspi2 have “dummy” implementations of the ATK
+ interfaces to use with their tests. It may be possible to deduplicate
+ that.
+
+- Doing refactoring across all modules will be easier if their tests
+ are in a single place.
+
+- We only have to get the CI working once, instead of three times.
+
+Some cool things in at-spi2-core’s CI that now work for all the
+accessibility middleware:
+
+- CI pipelines run the test suite and generate a code coverage report.
+ This can be used to fine-tune tests, or decide how to refactor things
+ for finer-grained testing.
+
+- Static analysis. Fix broken C code as early as possible.
+
+- Address Sanitizer - runtime analysis; does not fully work yet, but
+ the basics are there.
+
+- Infrastructure to test build configurations for various distro
+ images, e.g. dbus-daemon for openSUSE, versus dbus-broker for Fedora
+ - those have different code paths.
+
+Make the XML interfaces the single source of truth
+--------------------------------------------------
+
+In the past the at-spi2-core/xml files, which define the DBus interfaces
+for accessibility, have gotten out of sync with at-spi2-core’s own C
+code, because it does DBus calls by hand instead of using an
+autogenerated binding - there weren’t any at the time it was written.
+Also they have gotten out of sync with external copies, like GTK.
+Perhaps we can add some bits to GTK’s CI scripts to guarantee that this
+doesn’t happen, or make GTK just reference at-spi2-core/xml directly.
+
+It may not be possible to “disappear” libatspi2 and rely only on an
+autogenerated binding for the XML DBus interfaces everywhere, but that
+should certainly be a goal.
+
+Remove hand-written DBus code
+-----------------------------
+
+My initial goal is to replace it with gdbus from GIO (an auto-generated
+C binding to XML interfaces). I want to experiment with a few strategies
+to make this easier. Right now all the DBus code is interwoven with
+logic from at-spi2-core, so the first thing is to separate them. Then,
+replace the DBus code in one shot for gdbus.
+
+For example, there’s quite a bit of code like this:
+
+.. code:: c
+
+ static void
+ handle_some_method (DBusMessage *message)
+ {
+ foo = demarshal_a_bit ();
+ bar = find_the_accessible ();
+ bar_set_foo (bar, foo);
+
+ baz = demarshal_a_bit ();
+ bar_set_baz (bar, baz);
+
+ while (some_logic_here)
+ {
+ qux = demarshal_something ();
+ blah_blah (qux, bar);
+ }
+
+ /* etc */
+ }
+
+So I would first split it into a part that demarshals everything, and
+then one that does the logic:
+
+.. code:: c
+
+ typedef struct {
+ Accessible accessible;
+ Foo foo;
+ Baz baz;
+ Qux quxes[];
+ } SomeMethodArgs;
+
+ handle_some_method (DBusMessage *message)
+ {
+ SomeMethodArgs args;
+
+ if (demarshal_some_method_args (message, &args) != SUCCESS)
+ {
+ return ERROR;
+ }
+
+ do_the_thing (args.accessible, args.foo, args.baz, args.quxes);
+ }
+
+Once everything is split apart, it’s a lot easier to replace the
+demarshalers with gdbus calls, and the rest of the logic can hopefully
+remain unchanged.
+
+As a side benefit, this may allow testing the logic without having to
+worry about inter-process communication. Test the thing; assume
+communication works.
+
+It may not be possible to separate all such cases so cleanly. However,
+if a certain “sequence” requires intermediate IPC, then that is a good
+indication for a less granular interface to add later: instead of
+querying for an object and then for each of its properties / children /
+etc., maybe send the whole object’s tree in a single call.
+
+(Future goal: this separation of IPC vs. logic may make it easier, to
+port the accessibility middleware to Rust - something I’d really like to
+do.)
+
+End-to-end tests
+----------------
+
+There are already some end-to-end tests in at-spi2-atk/tests. They
+create a mock AT and a mock accessible application, and ensure that what
+they communicate through the accessibility bus matches on both ends.
+
+These tests are good! Let’s add more extensive ones to help test things
+like event throttling, unstable applications, compatibility APIs, etc.
+
+Should we merge pyatspi2 in here?
+---------------------------------
+
+Maybe! It is a compatibility layer, through and through, and maybe we
+can disappear it gradually if we change Orca in lockstep.