blob: 13eefc8dbcf8dc869133e3b4695ba226a6d61421 [file] [log] [blame]
/**
* @license
* Copyright 2022 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {PluginApi} from '../../../api/plugin';
import {StylePluginApi} from '../../../api/styles';
import {ReportingService} from '../../../services/gr-reporting/gr-reporting';
function getOrCreatePluginStyleEl(): HTMLStyleElement {
const el =
document.head.querySelector<HTMLStyleElement>('style#plugin-style');
if (el) return el;
const styleEl = document.createElement('style');
styleEl.setAttribute('id', 'plugin-style');
// Append at the end so that they override the default light and dark theme
// styles.
document.head.appendChild(styleEl);
return styleEl;
}
export class GrPluginStyleApi implements StylePluginApi {
constructor(
private readonly reporting: ReportingService,
private readonly plugin: PluginApi
) {
this.reporting.trackApi(this.plugin, 'style', 'constructor');
}
insertCSSRule(rule: string): void {
this.reporting.trackApi(this.plugin, 'style', 'insertCSSRule');
const styleEl = getOrCreatePluginStyleEl();
try {
styleEl.sheet?.insertRule(rule);
} catch (error) {
console.error(
`Failed to insert CSS rule for plugin ${this.plugin.getPluginName()}: ${error}`
);
}
}
}