LCOV - code coverage report
Current view: top level - pkg/lib - cockpit-dark-theme.ts Coverage Total Hit
Test: cockpit Lines: 100.0 % 41 41
Test Date: 2026-07-17 12:03:54

            Line data    Source code
       1              : /*
       2              :  * Copyright (C) 2022 Red Hat, Inc.
       3              :  * SPDX-License-Identifier: LGPL-2.1-or-later
       4              :  */
       5              : 
       6          726 : function debug(...args: unknown[]) {
       7          130 :     if (window.debugging == "all" || window.debugging?.includes("style")) {
       8          130 :         console.debug([`cockpit-dark-theme: ${document.documentElement.id}:`, ...args].join(" "));
       9          130 :     }
      10          726 : }
      11              : 
      12          726 : function changeDarkThemeClass(documentElement: Element, dark_mode: boolean) {
      13          132 :     debug(`Setting cockpit theme to ${dark_mode ? "dark" : "light"}`);
      14              : 
      15          132 :     if (dark_mode) {
      16          132 :         documentElement.classList.add('pf-v6-theme-dark');
      17          132 :     } else {
      18          726 :         documentElement.classList.remove('pf-v6-theme-dark');
      19          726 :     }
      20          726 : }
      21              : 
      22          726 : function _setDarkMode(_style?: string) {
      23          726 :     const style = _style || localStorage.getItem('shell:style') || 'auto';
      24          726 :     let dark_mode;
      25              :     // If a user set's an explicit theme, ignore system changes.
      26          132 :     if ((window.matchMedia?.('(prefers-color-scheme: dark)').matches && style === "auto") || style === "dark") {
      27          132 :         dark_mode = true;
      28          132 :     } else {
      29          726 :         dark_mode = false;
      30          726 :     }
      31          726 :     changeDarkThemeClass(document.documentElement, dark_mode);
      32          726 : }
      33              : 
      34          237 : window.addEventListener("storage", event => {
      35           23 :     if (event.key === "shell:style") {
      36           23 :         debug(`Storage element 'shell:style' changed from  ${event.oldValue} to ${event.newValue}`);
      37              : 
      38           23 :         _setDarkMode();
      39           23 :     }
      40          237 : });
      41              : 
      42              : // When changing the theme from the shell switcher the localstorage change will not fire for the same page (aka shell)
      43              : // so we need to listen for the event on the window object.
      44            1 : window.addEventListener("cockpit-style", event => {
      45            1 :     if (event instanceof CustomEvent) {
      46            1 :         const style = event.detail.style;
      47            1 :         debug(`Event received from shell with 'cockpit-style'  ${style}`);
      48              : 
      49            1 :         _setDarkMode(style);
      50            1 :     }
      51            1 : });
      52              : 
      53            2 : window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
      54            2 :     debug(`Operating system theme preference changed to ${window.matchMedia?.('(prefers-color-scheme: dark)').matches ? "dark" : "light"}`);
      55            2 :     _setDarkMode();
      56            2 : });
      57              : 
      58          726 : _setDarkMode();
        

Generated by: LCOV version 2.0-1