Chromium: Difference between revisions

added a new section that describes how to change policies for the chromium browser through the configuration.nix file and also provided external links for further documentation and reference that cannot be provided here
Added section explaining how to use fonts when running Chromium in a container
 
(10 intermediate revisions by 4 users not shown)
Line 1: Line 1:
== Installation ==
<languages/>
=== NixOS ===
<translate>
Add {{nixos:package|chromium}} to {{NixOS Manual|name=systemPackages|anchor=#sec-package-management}}.
== Installation == <!--T:1-->


== Updating browser policies ==
=== NixOS === <!--T:2-->
In Chromium the policy settings, which can be accessed by using {{Ic|chrome://policy}}, allow the user to change a lot of settings that dont exist anywhere else such as


<!--T:3-->
Add <tvar name="chromium_package">{{nixos:package|chromium}}</tvar> to <tvar name="systemPackages">{{NixOS Manual|name=systemPackages|anchor=#sec-package-management}}</tvar>.
== Updating browser policies == <!--T:4-->
<!--T:5-->
In Chromium, policy settings are accessible via <tvar name="chrome_policy_link">{{Ic|chrome://policy}}</tvar>. They allow the user to change enterprise policies affecting things like
<!--T:6-->
* Creating webapps when the browser is installed
* Creating webapps when the browser is installed
* Finding and downloading browser extensions automatically
* Finding and downloading browser extensions automatically
Line 11: Line 19:
* Disable screenshots to be taken with browser extensions
* Disable screenshots to be taken with browser extensions
* Block all downloads from the browser (if you want to do that for some reason)
* Block all downloads from the browser (if you want to do that for some reason)
* and hundreds more settings
* and more!
 
<!--T:7-->
A full list of policies can be found at [<tvar name=1>https://chromeenterprise.google/policies/</tvar> Chrome Enterprise Policy List & Management].
 
=== Natively Supported Policies === <!--T:8-->
 
<!--T:9-->
By default NixOS provides a few policies that can be enabled directly, a simple example is given below to understand how these are implemented
</translate>


=== Natively Supported Policies ===
<syntaxhighlight lang="nixos" line="1"> programs.chromium = {
By default NixOS provides a few policies that can be enabled directly, a simple example is given below to understand how these are implemented<syntaxhighlight lang="nixos" line="1">programs.chromium = {
    enable = true;
        enable = true;
    homepageLocation = "https://www.startpage.com/";
homepageLocation = "https://www.startpage.com/";
    extensions = [
extensions = [
      "eimadpbcbfnmbkopoojfekhnkhdbieeh;https://clients2.google.com/service/update2/crx" # dark reader
"eimadpbcbfnmbkopoojfekhnkhdbieeh;https://clients2.google.com/service/update2/crx" # dark reader
      "aapbdbdomjkkjkaonfhkkikfgjllcleb;https://clients2.google.com/service/update2/crx" # google translate
"aapbdbdomjkkjkaonfhkkikfgjllcleb;https://clients2.google.com/service/update2/crx" # google translate
    ];
];
    extraOpts = {
extraOpts = {
      "WebAppInstallForceList" = [
"WebAppInstallForceList" = [
        {
{
          "custom_name" = "Youtube";
"custom_name" = "Youtube";
          "create_desktop_shortcut" = false;
"create_desktop_shortcut" = false;
          "default_launch_container" = "window";
"default_launch_container" = "window";
          "url" = "https://youtube.com";
"url" = "https://youtube.com";
        }
}
      ];
};
    };
};</syntaxhighlight>
  };</syntaxhighlight>


* {{Ic|homepageLocation}} option allows you to set the site that the homepage will open on
<translate>
* {{Ic|extensions}} allows for the download of extensions directly in the browser through a simple list of the extension ID's that can be obtained from the [https://chromewebstore.google.com/ Chrome Web Store] by opening an extension page and copying the last part of the URL
<!--T:10-->
* <tvar name="homepageLocation">{{Ic|homepageLocation}}</tvar> option allows you to set the site that the homepage will open on
* <tvar name="extensions">{{Ic|extensions}}</tvar> allows for the download of extensions directly in the browser through a simple list of the extension ID's that can be obtained from the [<tvar name="1">https://chromewebstore.google.com/</tvar> Chrome Web Store] by opening an extension page and copying the last part of the URL
** In the example however there is another component, the download source from which the extensions will be downloaded
** In the example however there is another component, the download source from which the extensions will be downloaded
** The URL provided in the list is the link that is used by google for managing, checking and updating extensions
** The URL provided in the list is the link that is used by google for managing, checking and updating extensions
** So the method of just placing the extension ID can work like this: {{Ic|"fnpbehpgglbfnpimkachnpnecjncndgm"}}
** So the method of just placing the extension ID can work like this: <tvar name="ext_id">{{Ic|"fnpbehpgglbfnpimkachnpnecjncndgm"}}</tvar>
** But just in case that method does not automatically function the second method is shown above, where you place {{Ic|;}} and then the URL {{Ic|https //clients2.google.com/service/update2/crx}} to explicitly tell NixOS where to install the extension from
** But just in case that method does not automatically function the second method is shown above, where you place <tvar name="symbol">{{Ic|;}}</tvar> and then the URL <tvar name="url">{{Ic|https //clients2.google.com/service/update2/crx}}</tvar> to explicitly tell NixOS where to install the extension from
* There are many more options that are natively supported and you can learn about them through {{Ic|man configuration.nix}}
* There are many more options that are natively supported and you can learn about them through <tvar name="command">{{Ic|man configuration.nix}}</tvar>
* But as shown above there is also an {{Ic|extraOpts}} option and that is used for policies that are not supported for direct setup, such as the policy to install web-apps
* But as shown above there is also an <tvar name="extraOpts">{{Ic|extraOpts}}</tvar> option and that is used for policies that are not supported for direct setup, such as the policy to install web-apps
 
=== Non-natively Supported Policies === <!--T:11-->


=== Non-natively Supported Policies ===
<!--T:12-->
As stated beforehand, there are hundreds of policies that are in chromium based browsers and not all of them can be supported directly and so the {{Ic|extraOpts}} option allows for the declaration of all the other policies
There are hundreds of policies in Chromium based browsers, and not all have direct methods to set them. The <tvar name="extraOpts">{{Ic|extraOpts}}</tvar> option allows for the declaration of all the other policies.


There is no one place to find all the policies and some places you can find a "list" are given below:
<!--T:13-->
There is no single place to find all Chromium policies, but these are some places to look;


* A good number of commonly used policies are present and explained within {{Ic|man configuration.nix}} under {{Ic|programs.chromium}}
<!--T:14-->
* If you require a more comprehensive list then you can go to {{Ic|chrome://policy}} and click on the checkbox at the top of the page that says "Show policies with no value set", from there you can click on any of the policies to go to the documentation page for that policy to get details on how to use it
* Commonly used policies are present and documented within {{Ic|man configuration.nix}} under {{Ic|programs.chromium}}.
* If you just want to see the list of all policies supported by chromium then you cant really do that, unfortunately google does not provide documentation on every single policy in the chromium browser base and if you wish to see the list of every single policy then you can do so by going directly to the source code and figuring out how a policy works
* You can navigate to <tvar name="chrome_policy_link">{{Ic|chrome://policy}}</tvar> and enable "Show policies with no value set" to see all available keys. Clicking a policy name opens its specific definition and usage details.
* To see the most up-to-date file on all policies you can go [https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/pref_names.h here]
* The most up to date policies for Chromium are available in the [<tvar name="1">https://source.chromium.org/chromium/chromium/src/+/main:chrome/common/pref_names.h</tvar> source code.]


== Accelerated video playback ==  
== Accelerated video playback == <!--T:15-->


Make sure [[Accelerated Video Playback]] is setup on the system properly. Check {{ic|chrome://gpu}} to see if Chromium has enabled hardware acceleration.
<!--T:16-->
Make sure [[<tvar name="1">Special:MyLanguage/Accelerated Video Playback</tvar>|Accelerated Video Playback]] is setup on the system properly. Check <tvar name="chrome_gpu_link">{{ic|chrome://gpu}}</tvar> to see if Chromium has enabled hardware acceleration.
 
<!--T:17-->
If accelerated video playback is not working, check relevant flags at <tvar name="chrome_flags_link">{{ic|chrome://flags}}</tvar>, or enable them using the CLI:
</translate>


If accelerated video playback is not working, check relevant flags at {{ic|chrome://flags}}, or enable them using the cli:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
{
Line 70: Line 96:
</nowiki>}}
</nowiki>}}


In some cases, {{ic|chrome://gpu}} will show Video Decode as enabled, but Video Acceleration Information as blank, with {{ic|chrome://media-internals}} using FFmpeg Video Decoder (software decoding). If this happens, try to enable the following features:
<translate>
<!--T:18-->
In some cases, <tvar name="chrome_gpu_link">{{ic|chrome://gpu}}</tvar> will show Video Decode as enabled, but Video Acceleration Information as blank, with <tvar name="chrome_media_link">{{ic|chrome://media-internals}}</tvar> using the FFmpeg Video Decoder (software decoding). If this happens, try to enable the following features:
</translate>
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
{
Line 87: Line 117:
</nowiki>}}
</nowiki>}}


== Enabling native Wayland support ==
<translate>
== Enabling native Wayland support == <!--T:19-->
 
<!--T:20-->
You can enable native Wayland support in all Chromium based and most Electron apps by setting the `NIXOS_OZONE_WL` environment variable to `1`.


You can turn on native Wayland support in all chrome and most electron apps by setting an environment variable: <code>environment.sessionVariables.NIXOS_OZONE_WL = "1"</code>.
== Enabling DRM (Widevine support) == <!--T:21-->


== Enabling ManifestV2 support ==
<!--T:22-->
To enable manifest v2 support <code>ExtensionManifestV2Availability</code> can be set to <code>2</code>.<ref>https://chromeenterprise.google/policies/#ExtensionManifestV2Availability</ref>{{file|/etc/nixos/configuration.nix|nix|<nowiki>
By default, <tvar name="chromium_package">{{nixos:package|chromium}}</tvar> does not support playing DRM protected media. However, there is a build time flag to include the proprietary Widevine blob from Nixpkgs:
{
</translate>
  programs.chromium = {
    extraOpts = {
"ExtensionManifestV2Availability" = 2;
    };
  };
}
</nowiki>}}


== Enabling DRM (Widevine support) ==
By default, {{nixos:package|chromium}} does not support playing DRM protected media. However, there is a build time flag to include the unfree Widevine blob from nixpkgs:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
{
Line 112: Line 137:
</nowiki>}}
</nowiki>}}


== KeePassXC support in Flatpak ==
<translate>
To enable browser integration between KeePassXC and Chromium-based browsers when running in Flatpak, configure the following filesystem access:<syntaxhighlight lang="toml"># NativeMessagingHost directory (browser-specific)
== KeePassXC support in Flatpak == <!--T:23-->
 
<!--T:24-->
To enable browser integration between KeePassXC and Chromium-based browsers when running in Flatpak, configure the following filesystem access:
</translate>
 
<syntaxhighlight lang="toml"># NativeMessagingHost directory (browser-specific)
# Brave Browser
# Brave Browser
xdg-config/BraveSoftware/Brave-Browser/NativeMessagingHosts:ro
xdg-config/BraveSoftware/Brave-Browser/NativeMessagingHosts:ro
Line 123: Line 154:
# KeePassXC server socket and Nix store
# KeePassXC server socket and Nix store
xdg-run/app/org.keepassxc.KeePassXC/org.keepassxc.KeePassXC.BrowserServer
xdg-run/app/org.keepassxc.KeePassXC/org.keepassxc.KeePassXC.BrowserServer
/nix/store:ro</syntaxhighlight>
/nix/store:ro
</syntaxhighlight>
 
<translate>
== Using libc memory allocator == <!--T:25-->
 
<!--T:26-->
Chromium may not work when an alternative system-wide memory allocator like scudo is used. To use libc on Chromium, the following firejail wrap is required:
</translate>


== Using libc memory allocator ==
<syntaxhighlight lang="nix">
Chromium may not work when an alternative system-wide memory allocator like scudo is used. To use libc on Chromium, the following firejail wrap is required:<syntaxhighlight lang="nix">
programs.firejail = {
programs.firejail = {
   enable = true;
   enable = true;
Line 139: Line 177:
   };
   };
};
};
</syntaxhighlight>
<translate>
== Add support for Brave Browser in Profile Sync daemon == <!--T:27-->
<!--T:28-->
Adding Brave Browser support to Profile Sync daemon can be automated with an overlay.
</translate>
<syntaxhighlight lang="nix">
# /etc/nixos/configuration.nix
{
  nixpkgs = {
    overlays = [
      (final: prev: {
        profile-sync-daemon = prev.profile-sync-daemon.overrideAttrs (oldAttrs: {
          installPhase =
            oldAttrs.installPhase
            + ''
              cp $out/share/psd/{contrib,browsers}/brave
            '';
        });
      })
    ];
  };
  # Enable the Profile Sync daemon service.
  services.psd.enable = true;
}
</syntaxhighlight>
== Getting fonts to work in containers ==
When building a container using {{Nixpkgs Manual|name=dockerTools.streamLayeredImage|anchor=#ssec-pkgs-dockerTools-streamLayeredImage}} or {{Nixpkgs Manual|name=dockerTools.buildLayeredImage|anchor=#ssec-pkgs-dockerTools-buildLayeredImage}}, the image won't include any fonts, and so Chrome won't be able to render any text. To handle this, you must add {{nixos:package|fontconfig}} to the image, along with the fonts you want included.
Adding fonts to your image will only add them at {{ic|/share/fonts}}, but fontconfig expects them at {{ic|/usr/share/fonts}}, so you just link the fonts to that directory:
<syntaxhighlight lang="nix">
{
  dockerTools,
  chromium,
  fontconfig,
  maple-mono,
  bashNonInteractive,
  ...
}:
dockerTools.streamLayeredImage {
  name = "chromium";
  tag = "latest";
  contents = [
    chromium
    fontconfig.out # The default .bin output only contains binaries
   
    # Fontconfig already contains a minimal set of DejaVu fonts, adding extra
    # fonts is optional
    maple-mono.NF
  ];
  # This part is only necessary if you're adding extra fonts
  fakeRootCommands = ''
    #!${bashNonInteractive}
    mkdir -p usr/share
    ln -s /share/fonts usr/share/fonts
  '';
}
</syntaxhighlight>
Chrome will then be able to discover the DejaVu and Maple Mono NF fonts through fontconfig.
If you instead want to use fonts from the {{nixos:package|texlivePackages}} package set, you'll need to symlink the {{ic|/fonts}} directory instead of {{ic|/share/fonts}} as the texlive packages have a different structure:
<syntaxhighlight lang="nix">
{
  dockerTools,
  chromium,
  fontconfig,
  texlivePackages,
  bashNonInteractive,
  ...
}:
dockerTools.streamLayeredImage {
  name = "chromium";
  tag = "latest";
  contents = [
    chromium
    fontconfig.out


    texlivePackages.opensans
  ];
  fakeRootCommands = ''
    #!${bashNonInteractive}
    mkdir -p usr/share
    ln -s /fonts usr/share/fonts
  '';
}
</syntaxhighlight>
</syntaxhighlight>
[[Category:Applications]]
[[Category:Applications]]
[[Category:Web Browser]]
[[Category:Web Browser{{#translation:}}]]