-
lock
+
lock
Active URL configuration is locked by enterprise policy (allowOverrides:
false).Gemini API Provisioning
(click)="hideApiKey.set(!hideApiKey())"
[attr.aria-label]="hideApiKey() ? 'Show API key' : 'Hide API key'"
>
-
{{ hideApiKey() ? 'visibility' : 'visibility_off' }}
+
{{
+ hideApiKey() ? 'visibility' : 'visibility_off'
+ }}
@if (settingsForm.controls.apiKey.hasError('required')) {
Gemini API key is required in external environments.
@@ -92,7 +94,7 @@
Developer Authentication Overrides
@if (isLocked()) {
- lock
+ lock
Authentication mode overrides are locked by enterprise policy.
}
diff --git a/shell/src/app/settings/settings-view/settings.spec.ts b/shell/src/app/settings/settings-view/settings.spec.ts
index 935a0c40..d46d8850 100644
--- a/shell/src/app/settings/settings-view/settings.spec.ts
+++ b/shell/src/app/settings/settings-view/settings.spec.ts
@@ -434,4 +434,17 @@ describe('Settings', () => {
expect(locationAssign).toHaveBeenCalledWith(expect.anything(), '/');
});
+
+ it('applies aria-hidden attribute to purely decorative MatIcon elements across settings', async () => {
+ mockStartupResolution.isContextLocked.mockReturnValue(true);
+ mockStartupResolution.isThirdPartyEnvironment.mockReturnValue(true);
+ const {fixture, harness} = await setupComponent();
+ fixture.detectChanges();
+
+ const hiddenAttrs = await harness.getIconsAriaHidden();
+ expect(hiddenAttrs.length).toBe(3);
+ hiddenAttrs.forEach(attr => {
+ expect(attr).toBe('true');
+ });
+ });
});
diff --git a/shell/src/app/settings/settings-view/test/settings.harness.ts b/shell/src/app/settings/settings-view/test/settings.harness.ts
index 1f82199a..4d8c7047 100644
--- a/shell/src/app/settings/settings-view/test/settings.harness.ts
+++ b/shell/src/app/settings/settings-view/test/settings.harness.ts
@@ -168,4 +168,9 @@ export class SettingsHarness extends ComponentHarness {
const chip = await this.getCatalogBadge();
return chip.text();
}
+
+ async getIconsAriaHidden(): Promise<(string | null)[]> {
+ const icons = await this.locatorForAll('mat-icon')();
+ return Promise.all(icons.map(i => i.getAttribute('aria-hidden')));
+ }
}
diff --git a/shell/src/app/shell/composer-shell/composer-shell.ng.html b/shell/src/app/shell/composer-shell/composer-shell.ng.html
index 7e34482a..ad9c59ef 100644
--- a/shell/src/app/shell/composer-shell/composer-shell.ng.html
+++ b/shell/src/app/shell/composer-shell/composer-shell.ng.html
@@ -21,7 +21,7 @@
(click)="sidenav.toggle()"
aria-label="Toggle sidenav"
>
-
menu
+
menu
-
{{ isDarkTheme() ? 'light_mode' : 'dark_mode' }}
+
{{ isDarkTheme() ? 'light_mode' : 'dark_mode' }}
diff --git a/shell/src/app/shell/composer-shell/composer-shell.spec.ts b/shell/src/app/shell/composer-shell/composer-shell.spec.ts
index e0402f7a..2dc3df35 100644
--- a/shell/src/app/shell/composer-shell/composer-shell.spec.ts
+++ b/shell/src/app/shell/composer-shell/composer-shell.spec.ts
@@ -190,4 +190,12 @@ describe('ComposerShell Layout', () => {
await harness.clickThemeToggleButton();
expect(configProviderMock.setThemePreference).toHaveBeenCalledWith('light');
});
+
+ it('applies aria-hidden attribute to purely decorative MatIcon elements across the composer shell', async () => {
+ const hiddenAttrs = await harness.getIconsAriaHidden();
+ expect(hiddenAttrs.length).toBe(2);
+ hiddenAttrs.forEach(attr => {
+ expect(attr).toBe('true');
+ });
+ });
});
diff --git a/shell/src/app/shell/composer-shell/test/composer-shell.harness.ts b/shell/src/app/shell/composer-shell/test/composer-shell.harness.ts
index b415eaef..587cc38e 100644
--- a/shell/src/app/shell/composer-shell/test/composer-shell.harness.ts
+++ b/shell/src/app/shell/composer-shell/test/composer-shell.harness.ts
@@ -58,4 +58,9 @@ export class ComposerShellHarness extends ComponentHarness {
const sidenav = await this.getSidenav();
return sidenav.isOpen();
}
+
+ async getIconsAriaHidden(): Promise<(string | null)[]> {
+ const icons = await this.locatorForAll('mat-icon')();
+ return Promise.all(icons.map(i => i.getAttribute('aria-hidden')));
+ }
}
diff --git a/shell/src/app/shell/composer-workspace/composer-workspace.ng.html b/shell/src/app/shell/composer-workspace/composer-workspace.ng.html
index 6b35a7d7..c1426108 100644
--- a/shell/src/app/shell/composer-workspace/composer-workspace.ng.html
+++ b/shell/src/app/shell/composer-workspace/composer-workspace.ng.html
@@ -46,7 +46,7 @@
matTooltip="Clear all log tabs"
matTooltipPosition="left"
>
-
delete
+
delete
diff --git a/shell/src/app/shell/composer-workspace/composer-workspace.spec.ts b/shell/src/app/shell/composer-workspace/composer-workspace.spec.ts
index d487a540..7717ae9d 100644
--- a/shell/src/app/shell/composer-workspace/composer-workspace.spec.ts
+++ b/shell/src/app/shell/composer-workspace/composer-workspace.spec.ts
@@ -353,4 +353,12 @@ describe('ComposerWorkspace Dashboard', () => {
expect(await newHarness.isDebugSectionCollapsed()).toBe(true);
},
);
+
+ it('applies aria-hidden attribute to purely decorative MatIcon elements across the workspace header controls', async () => {
+ const hiddenAttrs = await harness.getIconsAriaHidden();
+ expect(hiddenAttrs.length).toBe(2);
+ hiddenAttrs.forEach(attr => {
+ expect(attr).toBe('true');
+ });
+ });
});
diff --git a/shell/src/app/shell/composer-workspace/test/composer-workspace.harness.ts b/shell/src/app/shell/composer-workspace/test/composer-workspace.harness.ts
index b44622c0..9ea15e58 100644
--- a/shell/src/app/shell/composer-workspace/test/composer-workspace.harness.ts
+++ b/shell/src/app/shell/composer-workspace/test/composer-workspace.harness.ts
@@ -51,4 +51,9 @@ export class ComposerWorkspaceHarness extends ComponentHarness {
const section = await this.locatorFor('.debug-section')();
return section.hasClass('collapsed');
}
+
+ async getIconsAriaHidden(): Promise<(string | null)[]> {
+ const icons = await this.locatorForAll('.debug-header-controls mat-icon')();
+ return Promise.all(icons.map(i => i.getAttribute('aria-hidden')));
+ }
}