[BreakpointsView] Turn breakpoints into an a11y tree.

This adds tree, treeitem, and group accessible roles for the relevant
parts of the breakpoints view. It also hides some non-relevant HTML
elements from the a11y tools, and uses a proper separator element
(<hr> instead of <div>).

Bug: chromium:137416, chromium:1346231
Change-Id: I8aaacdd08309339ef0245f426a0bf145d5b9165c
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/3948896
Reviewed-by: Kim-Anh Tran <kimanh@chromium.org>
Commit-Queue: Kim-Anh Tran <kimanh@chromium.org>
Auto-Submit: Benedikt Meurer <bmeurer@chromium.org>
diff --git a/front_end/panels/sources/components/BreakpointsView.ts b/front_end/panels/sources/components/BreakpointsView.ts
index bafc346..16dbb89 100644
--- a/front_end/panels/sources/components/BreakpointsView.ts
+++ b/front_end/panels/sources/components/BreakpointsView.ts
@@ -220,7 +220,7 @@
     // clang-format off
     const renderedGroups = this.#breakpointGroups.map(
         group => LitHtml.html`
-          <div class='divider'></div>
+          <hr />
           ${this.#renderBreakpointGroup(group)}
         `);
     const out = LitHtml.html`
@@ -238,7 +238,7 @@
         </label>
       </div>
       ` : LitHtml.nothing}
-    ${renderedGroups}`;
+    <div role=tree>${renderedGroups}</div>`;
     // clang-format on
     LitHtml.render(out, this.#shadow, {host: this});
   }
@@ -333,9 +333,15 @@
     };
     // clang-format off
     return LitHtml.html`
-      <details class=${LitHtml.Directives.classMap(classMap)} data-group='true' ?open=${group.expanded} @toggle=${toggleHandler}>
+      <details class=${LitHtml.Directives.classMap(classMap)}
+               data-group=true
+               role=group
+               aria-label='${group.name}'
+               aria-description='${group.url}'
+               ?open=${group.expanded}
+               @toggle=${toggleHandler}>
         <summary @contextmenu=${contextmenuHandler} >
-          <span class='group-header'>${this.#renderFileIcon()}<span class='group-header-title' title='${group.url}'>${group.name}</span></span>
+          <span class='group-header' aria-hidden=true>${this.#renderFileIcon()}<span class='group-header-title' title='${group.url}'>${group.name}</span></span>
           <span class='group-hover-actions'>
             ${this.#renderRemoveBreakpointButton(group.breakpointItems, i18nString(UIStrings.removeAllBreakpointsInFile))}
             ${this.#renderBreakpointCounter(group)}
@@ -418,7 +424,11 @@
 
     // clang-format off
     return LitHtml.html`
-    <div class=${LitHtml.Directives.classMap(classMap)} aria-label=${breakpointItemDescription}  tabIndex=${breakpointItem.isHit ? 0 : -1} @contextmenu=${contextmenuHandler}>
+    <div class=${LitHtml.Directives.classMap(classMap)}
+         aria-label=${breakpointItemDescription}
+         role=treeitem
+         tabIndex=${breakpointItem.isHit ? 0 : -1}
+         @contextmenu=${contextmenuHandler}>
       <label class='checkbox-label'>
         <span class='type-indicator'></span>
         <input type='checkbox' aria-label=${breakpointItem.location} ?indeterminate=${breakpointItem.status === BreakpointStatus.INDETERMINATE} ?checked=${breakpointItem.status === BreakpointStatus.ENABLED} @change=${(e: Event): void => this.#onCheckboxToggled(e, breakpointItem)}>
diff --git a/front_end/panels/sources/components/breakpointsView.css b/front_end/panels/sources/components/breakpointsView.css
index cc93e8a..ba3170a 100644
--- a/front_end/panels/sources/components/breakpointsView.css
+++ b/front_end/panels/sources/components/breakpointsView.css
@@ -10,10 +10,11 @@
   flex-direction: column;
 }
 
-.divider {
-  height: 1px;
-  width: inherit;
+hr {
+  border: none;
   background-color: var(--color-details-hairline);
+  height: 0.5pt;
+  width: inherit;
 }
 
 .code-snippet {