Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions packages/react/src/component-tests/IcDialog/IcDialog.cy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import React from "react";
import { mount } from "cypress/react";
import { IcDialog } from "../../components";
import {
NoBackgroundClickDialog,
SimpleDialog,
Expand Down Expand Up @@ -804,3 +805,34 @@ describe("IcDialog visual regression tests in high contrast mode", () => {
});
});
});

describe("IcDialog structured content accessibility", () => {
beforeEach(() => {
cy.injectAxe();
});

it("should keep slotted links navigable instead of flattening dialog content", () => {
mount(
<IcDialog heading="Dialog heading" open>
<p>
Read the <a href="#details">details</a> before continuing.
</p>
</IcDialog>
);

cy.checkHydrated(DIALOG);
cy.get(DIALOG)
.shadow()
.find("dialog")
.should(NOT_HAVE_ATTR, "aria-describedby");
cy.get(DIALOG)
.shadow()
.find("dialog")
.should(HAVE_ATTR, "aria-labelledby", "dialog-label dialog-heading");

cy.get(DIALOG).find('a[href="#details"]').focus();
cy.focused().should(HAVE_ATTR, "href", "#details");

cy.checkA11yWithWait();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,6 @@ export class Dialog {
"disable-width-constraint": !!disableWidthConstraint,
}}
aria-labelledby="dialog-label dialog-heading"
aria-describedby="dialog-alert dialog-content"
ref={(el) => (this.dialogEl = el)}
>
<div tabindex="0" onFocus={this.focusLast} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
exports[`ic-dialog component should render 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog heading" hide-default-controls="true">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -45,7 +45,7 @@ exports[`ic-dialog component should render 1`] = `
exports[`ic-dialog component should render as large size 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-large" heading="Dialog heading" hide-default-controls="true" size="large">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog large">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog large">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -87,7 +87,7 @@ exports[`ic-dialog component should render as large size 1`] = `
exports[`ic-dialog component should render as large size and disableWidthConstraint is set 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-large" disable-width-constraint="true" heading="Dialog heading" hide-default-controls="true" size="large">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog disable-width-constraint large">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog disable-width-constraint large">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -129,7 +129,7 @@ exports[`ic-dialog component should render as large size and disableWidthConstra
exports[`ic-dialog component should render as medium size 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-medium" heading="Dialog heading" hide-default-controls="true" size="medium">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog medium">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog medium">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -171,7 +171,7 @@ exports[`ic-dialog component should render as medium size 1`] = `
exports[`ic-dialog component should render with a label 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog heading" hide-default-controls="true" label="Dialog label">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -215,7 +215,7 @@ exports[`ic-dialog component should render with a label 1`] = `
exports[`ic-dialog component should render with no buttons 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog heading" hide-default-controls="true">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -251,7 +251,7 @@ exports[`ic-dialog component should render with no buttons 1`] = `
exports[`ic-dialog component should render with slotted content 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog heading">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -333,7 +333,7 @@ exports[`ic-dialog component should render with slotted content 1`] = `
exports[`ic-dialog component should render with slotted controls 1`] = `
<ic-dialog class="ic-dialog-size-small" heading="Dialog heading" open="">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -386,7 +386,7 @@ exports[`ic-dialog component should render with slotted controls 1`] = `
exports[`ic-dialog component should render with the close button 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog with close button test">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -446,7 +446,7 @@ exports[`ic-dialog component should render with the close button 1`] = `
exports[`ic-dialog component should render with two default buttons 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog heading">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down Expand Up @@ -506,7 +506,7 @@ exports[`ic-dialog component should render with two default buttons 1`] = `
exports[`ic-dialog component should render without the close button 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small" heading="Dialog hide close button test" hide-close-button="true">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -829,3 +829,24 @@ describe("ic-dialog component", () => {
expect(shouldSkipElementResult).toBe(true);
});
});

describe("ic-dialog aria description", () => {
it("should not flatten structured dialog content into aria-describedby", async () => {
const page = await newSpecPage({
components: [Dialog, Button],
html: `<ic-dialog heading="Dialog heading">
<p>Read the <a href="#details">details</a> before continuing.</p>
</ic-dialog>`,
});

const dialog = page.root?.shadowRoot?.querySelector("dialog");

expect(dialog?.hasAttribute("aria-describedby")).toBe(false);
expect(dialog?.getAttribute("aria-labelledby")).toBe(
"dialog-label dialog-heading"
);
expect(page.root?.querySelector("a")?.getAttribute("href")).toBe(
"#details"
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ exports[`ic-popover-menu should render a menu item and menu group: should render
exports[`ic-popover-menu should render on a dialog 1`] = `
<ic-dialog class="ic-dialog-hidden ic-dialog-size-small">
<template shadowrootmode="open">
<dialog aria-describedby="dialog-alert dialog-content" aria-labelledby="dialog-label dialog-heading" class="dialog small">
<dialog aria-labelledby="dialog-label dialog-heading" class="dialog small">
<div tabindex="0"></div>
<div class="heading-area">
<div class="heading-content">
Expand Down