Pohon aksesibilitas penuh di Chrome DevTools

Johan Bay
Johan Bay

Chrome DevTools meluncurkan hierarki aksesibilitas penuh sehingga memudahkan developer mendapatkan ringkasan keseluruhan hierarki. Dalam postingan ini, temukan cara pembuatan pohon ini dan penggunaannya dalam pekerjaan Anda.

Apa yang dimaksud dengan hierarki aksesibilitas?

Teknologi pendukung seperti pembaca layar menggunakan API aksesibilitas Chromium untuk berinteraksi dengan konten web. Model dasar API ini adalah hierarki aksesibilitas: hierarki objek aksesibilitas yang dapat dikueri oleh teknologi pendukung untuk atribut dan properti serta melakukan tindakan. Developer web membentuk dan memanipulasi hierarki aksesibilitas terutama melalui properti DOM seperti atribut ARIA untuk HTML.

Di Chrome DevTools, kami menyediakan panel aksesibilitas untuk membantu developer memahami cara konten mereka ditampilkan ke teknologi pendukung. Konkretnya, bila sebuah node dipilih dalam penampil hierarki DOM, properti dari node aksesibilitas yang sesuai akan ditampilkan dalam panel bersama dengan tampilan ancestor node dan turunan langsungnya.

Panel aksesibilitas Chrome DevTools.

Bagaimana hierarki dibuat?

Sebelum sampai ke tampilan hierarki penuh yang baru ini di DevTools, mari kita bahas secara singkat pohon aksesibilitas secara lebih jelas. Hierarki aksesibilitas adalah turunan dari hierarki DOM. Strukturnya kurang lebih sama, tetapi disederhanakan untuk menghapus node tanpa konten semantik seperti elemen <div> yang murni digunakan untuk gaya visual. Setiap node dalam hierarki memiliki peran seperti Button atau Heading, dan sering kali memiliki nama yang dapat berasal dari atribut ARIA atau berasal dari konten node. Jika kita melihat dokumen HTML:

<html>
<head>
  <title>How old are you?</title>
</head>
<body>
  <label for="age">Age</label>
  <input id="age" type="number" name="age" value="42">
  <div>
    <button>Back</button>
    <button>Next</button>
  </div>
</body>
</html>

Perender di Chromium, yang bernama Blink, memperoleh hierarki aksesibilitas internal kurang lebih seperti berikut.

role='rootWebArea' focusable name='How old are you?'
  role='genericContainer' ignored
    role='genericContainer' ignored
      role='labelText'
        role='staticText' name='Age'
      role='spinButton' editable focusable name='Age' value='42'
        role='genericContainer' editable
          role='staticText' editable name='42'
      role='genericContainer'
        role='button' focusable name='Back'
          role='staticText' name='Back'
        role='button' focusable name='Next'
          role='staticText' name='Next'

Perhatikan, representasi ini berisi beberapa node berlebihan dengan peran genericContainer, yang tampaknya bertentangan dengan pernyataan di atas bahwa hierarki aksesibilitas adalah turunan sederhana dari hierarki DOM. Namun, sebagian besar node ini hanya muncul di hierarki internal dan tidak akan ditampilkan ke teknologi pendukung. Karena DevTools mengumpulkan informasi aksesibilitasnya langsung dari proses perender, ini adalah representasi hierarki yang ditangani DevTools.

Hierarki aksesibilitas lengkap di DevTools

Hierarki aksesibilitas baru yang lengkap disinkronkan dengan hierarki DOM sehingga developer dapat beralih bolak-balik antara kedua hierarki. Kami harap hierarki baru ini akan lebih mudah dijelajahi, berguna, dan lebih mudah digunakan.

Setelah mengetahui cara kerja hierarki aksesibilitas, Anda dapat menggunakan DevTools untuk melihat tampilan hierarki baru. Dokumen HTML berikut dengan judul, judul, dan dua tombol digunakan untuk menampilkan hierarki.

<!DOCTYPE html>
<title>Test</title>
<h1>Heading for example page</h1>
<div>
  <button>Back</button>
  <button>Next</button>
</div>

Tampilan hierarki sebelumnya hanya akan memungkinkan Anda menjelajahi satu node dan ancestor-nya.

Tampilan hierarki sebelumnya di DevTools.

Sekarang, saat Anda mengalihkan hierarki baru, hierarki tersebut akan menggantikan tampilan hierarki DOM dan memungkinkan Anda melihat hierarki aksesibilitas lengkap untuk halaman:

Tampilan hierarki baru di DevTools.

Konstruksi hierarki lambat

Agar pohon berperforma baik bahkan untuk situs yang lebih besar, pohon dibuat secara lambat di frontend saat dieksplorasi. Setelah node diperluas dalam hierarki, turunan untuk node diambil melalui Chrome DevTools Protocol (CDP) dan hierarki akan di-build ulang.

Hierarki aksesibilitas baru yang menampilkan hasil untuk halaman besar.

Live

Tampilan hierarki baru aktif dan diperbarui secara dinamis jika hierarki aksesibilitas berubah di perender. Alat ini terhubung ke mekanisme yang sama yang akan memberi tahu teknologi pendukung tentang perubahan pada hierarki, dan menggunakannya untuk memunculkan peristiwa ke frontend DevTools dengan node yang diperbarui. Dalam praktiknya, backend CDP memproses update pada hierarki, melacak node mana yang telah diminta sebelumnya, dan mengirimkan peristiwa ke frontend DevTools jika salah satu node ini berubah.

Cerita tentang banyak pohon

Dalam deskripsi apa itu hierarki aksesibilitas, Anda telah mempelajari cara Blink membuat hierarki aksesibilitas untuk DOM yang sedang dirender, dan DevTools mengambil pohon ini melalui CDP. Meskipun demikian, kami tidak menyertakan beberapa detail dalam deskripsi ini. Pada kenyataannya, ada cukup banyak cara berbeda untuk menggunakan hierarki aksesibilitas di Chromium. Saat mendesain tampilan hierarki baru untuk DevTools, kami telah membuat beberapa pilihan tentang bagian internal aksesibilitas Chromium yang ingin ditampilkan.

Platform

Setiap platform memiliki API aksesibilitas yang berbeda dan meskipun bentuk hierarkinya sama di semua platform, API untuk berinteraksi dengan hierarki berbeda, dan nama atributnya dapat berbeda. DevTools menampilkan hierarki internal Chromium tempat peran dan atribut cenderung cocok dengan yang ditentukan dalam spesifikasi ARIA.

Beberapa frame dan isolasi situs

Karena Chromium tidak hanya menempatkan konten setiap tab dalam proses perender yang berbeda, tetapi juga mengisolasi dokumen lintas situs dalam proses perender yang berbeda, kita harus terhubung ke setiap dokumen turunan di luar proses secara terpisah melalui CDP dan mengambil hierarki aksesibilitasnya. Kemudian, kita menggabungkan sub-pohon ini di frontend untuk memberikan ilusi satu hierarki yang koheren, meskipun sub-pohon tersebut berada dalam proses perender yang berbeda di Chromium.

Node yang diabaikan dan tidak menarik

Kami menyembunyikan beberapa node secara default: node yang diabaikan, dan node dengan peran “generik” tanpa nama. Node ini tidak memiliki makna semantik dan, dalam kasus node yang diabaikan, tidak diekspos ke teknologi pendukung. Kami menyembunyikan node ini untuk menghindari tampilan hierarki yang berantakan. Jika tidak, hierarki aksesibilitas untuk sebagian besar halaman web akan terlihat seperti ini:

Tampilan hierarki baru dengan semua node ditampilkan.

Namun, hal ini pada dasarnya berarti kita perlu membuat hierarki lain selain yang tersedia di backend. Misalnya, kita memiliki simpul A, B, C, dan X yang mana A memiliki turunan X dan B, dan X memiliki turunan C. Jika X adalah node yang diabaikan, kita akan memangkas X dari hierarki dan membuat hierarki dengan C sebagai turunan dari A.

Diagram yang menunjukkan cara memangkas hierarki.

Di frontend, kita membuat hierarki lengkap termasuk node yang diabaikan dan hanya memangkasnya tepat sebelum merender node. Kami melakukannya karena dua alasan:

  • Hal ini mempermudah penanganan pembaruan node dari backend, karena kita memiliki struktur hierarki yang sama di kedua endpoint. Misalnya, jika node B dihapus dalam contoh, kita akan menerima pembaruan untuk node X (karena turunannya telah berubah), tetapi jika kita telah memangkas node tersebut, kita akan kesulitan untuk mengetahui apa yang harus diperbarui.
  • Hal ini memastikan bahwa semua node DOM memiliki node aksesibilitas yang sesuai. Saat hierarki diaktifkan, kita memilih node yang sesuai dengan node yang saat ini dipilih di hierarki DOM. Jadi, untuk contoh sebelumnya, jika pengguna mengalihkan hierarki saat node DOM yang sesuai dengan X dipilih, kita akan memasukkan X di antara node A dan B, lalu memilih X di hierarki. Hal ini memungkinkan pengguna memeriksa node aksesibilitas untuk semua node DOM dan membantu menentukan alasan node diabaikan.

Ide mendatang

Peluncuran hierarki aksesibilitas baru hanyalah permulaan. Kami memiliki beberapa ide untuk project mendatang yang dapat kami buat berdasarkan tampilan baru ini, tetapi kami juga ingin mendengar masukan Anda.

Pemfilteran alternatif

Seperti yang dijelaskan di atas, saat ini kami memfilter node yang dianggap tidak menarik. Kami dapat memberikan cara untuk menonaktifkan perilaku ini dan menampilkan semua node, atau memberikan pemfilteran alternatif seperti Tampilkan node tempat terkenal atau Tampilkan judul.

Menyoroti masalah a11y

Kita dapat menggabungkan analisis "praktik terbaik aksesibilitas" dengan hierarki dan menyoroti masalah aksesibilitas langsung pada node yang melanggar.

Menampilkan tindakan aksesibilitas di DevTools

Hierarki yang saat ini kami tampilkan bersifat satu arah: Hierarki ini memungkinkan kita mendapatkan gambaran tentang informasi yang akan dimasukkan ke teknologi pendukung saat menjelajahi halaman web tertentu. Tindakan aksesibilitas mewakili komunikasi dalam arah lain: Tindakan ini memungkinkan teknologi pendukung untuk bertindak pada UI yang ditampilkan. Kita dapat menampilkan tindakan tersebut di DevTools untuk mengizinkan tindakan seperti “mengklik”, men-scroll, atau mengubah nilai di halaman menggunakan API yang tersedia untuk teknologi pendukung.