diff --git a/__generated__/dockview-core-exports.txt b/__generated__/dockview-core-exports.txt index 37337d9969..2929aef082 100644 --- a/__generated__/dockview-core-exports.txt +++ b/__generated__/dockview-core-exports.txt @@ -19,6 +19,7 @@ ContextMenuItemConfig Contraints CreateComponentOptions CreateContextMenuItemComponentOptions +CspNonce DEFAULT_TAB_GROUP_COLORS DefaultDockviewDeserialzier DefaultTab diff --git a/packages/dockview-angular/src/lib/dockview/dockview-angular.component.ts b/packages/dockview-angular/src/lib/dockview/dockview-angular.component.ts index 6dcbdc15de..0599d4b699 100644 --- a/packages/dockview-angular/src/lib/dockview/dockview-angular.component.ts +++ b/packages/dockview-angular/src/lib/dockview/dockview-angular.component.ts @@ -26,6 +26,7 @@ import { PROPERTY_KEYS_DOCKVIEW, DockviewFrameworkOptions, DockviewComponentOptions, + CspNonce, GetTabContextMenuItemsParams, GetTabGroupChipContextMenuItemsParams, BuiltInChipContextMenuItem, @@ -94,6 +95,7 @@ export class DockviewAngularComponent implements OnInit, OnDestroy, OnChanges { @Input() disableFloatingGroups?: boolean; @Input() floatingGroupBounds?: 'boundedWithinViewport'; @Input() popoutUrl?: string; + @Input() nonce?: CspNonce; @Input() debug?: boolean; @Input() locked?: boolean; @Input() disableAutoResizing?: boolean; diff --git a/packages/dockview-core/src/__tests__/dockview/options.spec.ts b/packages/dockview-core/src/__tests__/dockview/options.spec.ts new file mode 100644 index 0000000000..eecb9df159 --- /dev/null +++ b/packages/dockview-core/src/__tests__/dockview/options.spec.ts @@ -0,0 +1,7 @@ +import { PROPERTY_KEYS_DOCKVIEW } from '../../dockview/options'; + +describe('PROPERTY_KEYS_DOCKVIEW', () => { + test('includes nonce so framework wrappers (React, Vue) auto-forward it', () => { + expect(PROPERTY_KEYS_DOCKVIEW).toContain('nonce'); + }); +}); diff --git a/packages/dockview-core/src/__tests__/dom.spec.ts b/packages/dockview-core/src/__tests__/dom.spec.ts index 2ad46a4fe4..030f97cd51 100644 --- a/packages/dockview-core/src/__tests__/dom.spec.ts +++ b/packages/dockview-core/src/__tests__/dom.spec.ts @@ -1,4 +1,5 @@ import { + addStyles, disableIframePointEvents, isInDocument, quasiDefaultPrevented, @@ -80,4 +81,146 @@ describe('dom', () => { expect(el3.style.pointerEvents).toBe('inherit'); expect(el4.style.pointerEvents).toBe(''); }); + + describe('addStyles', () => { + function makeTargetDocument() { + return document.implementation.createHTMLDocument('target'); + } + + function makeStyleSheet(rules: string[], href?: string): CSSStyleSheet { + return { + href, + type: 'text/css', + cssRules: rules.map((cssText) => ({ cssText })), + } as unknown as CSSStyleSheet; + } + + function makeStyleSheetList(sheets: CSSStyleSheet[]): StyleSheetList { + const list: any = { + length: sheets.length, + [Symbol.iterator]: function* () { + for (const s of sheets) yield s; + }, + }; + sheets.forEach((s, i) => (list[i] = s)); + return list as StyleSheetList; + } + + test('applies nonce to every created