From 6a0bbb90d2203eba6adb8f04d316492a3caa25b3 Mon Sep 17 00:00:00 2001 From: Nikkuss Date: Sun, 28 Sep 2025 11:37:05 +0400 Subject: [PATCH] helium-browser: init --- flake.lock | 6 +- flake.nix | 4 +- pkgs/by-name/he/helium-browser/depot_tools.py | 122 +++ .../he/helium-browser/fix-scripts.patch | 18 + .../he/helium-browser/helium-patcher.nix | 57 ++ pkgs/by-name/he/helium-browser/info.json | 799 ++++++++++++++++++ pkgs/by-name/he/helium-browser/package.nix | 136 +++ .../he/helium-browser/ungoogled-flags.toml | 18 + pkgs/by-name/he/helium-browser/unwrapped.nix | 174 ++++ pkgs/by-name/he/helium-browser/update.mjs | 283 +++++++ 10 files changed, 1612 insertions(+), 5 deletions(-) create mode 100644 pkgs/by-name/he/helium-browser/depot_tools.py create mode 100644 pkgs/by-name/he/helium-browser/fix-scripts.patch create mode 100644 pkgs/by-name/he/helium-browser/helium-patcher.nix create mode 100644 pkgs/by-name/he/helium-browser/info.json create mode 100644 pkgs/by-name/he/helium-browser/package.nix create mode 100644 pkgs/by-name/he/helium-browser/ungoogled-flags.toml create mode 100644 pkgs/by-name/he/helium-browser/unwrapped.nix create mode 100644 pkgs/by-name/he/helium-browser/update.mjs diff --git a/flake.lock b/flake.lock index 7e9d064..70159ec 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1753694789, - "narHash": "sha256-cKgvtz6fKuK1Xr5LQW/zOUiAC0oSQoA9nOISB0pJZqM=", + "lastModified": 1758690382, + "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dc9637876d0dcc8c9e5e22986b857632effeb727", + "rev": "e643668fd71b949c53f8626614b21ff71a07379d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index ec378e2..17ffeaf 100644 --- a/flake.nix +++ b/flake.nix @@ -11,11 +11,11 @@ self, nixpkgs, flake-utils, - }: + }@inputs: { overlays.default = - final: prev: (import "${nixpkgs}/pkgs/top-level/by-name-overlay.nix" ./pkgs/by-name) final prev; + final: prev: ((import "${nixpkgs}/pkgs/top-level/by-name-overlay.nix" ./pkgs/by-name) final prev); } // flake-utils.lib.eachSystem diff --git a/pkgs/by-name/he/helium-browser/depot_tools.py b/pkgs/by-name/he/helium-browser/depot_tools.py new file mode 100644 index 0000000..ab8007a --- /dev/null +++ b/pkgs/by-name/he/helium-browser/depot_tools.py @@ -0,0 +1,122 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i python -p python3 +""" +This is a heavily simplified variant of electron's update.py +for use in ./update.mjs and should not be called manually. + +It resolves chromium's DEPS file recursively when called with +a working depot_tools checkout and a ref to fetch and prints +the result as JSON to stdout. +""" +import base64 +import json +from typing import Optional +from urllib.request import urlopen + +import sys + +if len(sys.argv) != 3: + print("""This internal script has been called with the wrong amount of parameters. +This script is not supposed to be called manually. +Refer to ./update.mjs instead.""") + exit(1) + +_, depot_tools_checkout, chromium_version = sys.argv + +sys.path.append(depot_tools_checkout) +import gclient_eval +import gclient_utils + + +class Repo: + fetcher: str + args: dict + + def __init__(self) -> None: + self.deps: dict = {} + self.hash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + + def get_deps(self, repo_vars: dict, path: str) -> None: + print( + "evaluating " + json.dumps(self, default=vars, sort_keys=True), + file=sys.stderr, + ) + + deps_file = self.get_file("DEPS") + evaluated = gclient_eval.Parse(deps_file, vars_override=repo_vars, filename="DEPS") + + repo_vars = dict(evaluated.get("vars", {})) | repo_vars + + prefix = f"{path}/" if evaluated.get("use_relative_paths", False) else "" + + self.deps = { + prefix + dep_name: repo_from_dep(dep) + for dep_name, dep in evaluated.get("deps", {}).items() + if ( + gclient_eval.EvaluateCondition(dep["condition"], repo_vars) + if "condition" in dep + else True + ) + and repo_from_dep(dep) != None + } + + for key in evaluated.get("recursedeps", []): + dep_path = prefix + key + if dep_path in self.deps and dep_path != "src/third_party/squirrel.mac": + self.deps[dep_path].get_deps(repo_vars, dep_path) + + def flatten_repr(self) -> dict: + return {"fetcher": self.fetcher, "hash": self.hash, **self.args} + + def flatten(self, path: str) -> dict: + out = {path: self.flatten_repr()} + for dep_path, dep in self.deps.items(): + out |= dep.flatten(dep_path) + return out + + def get_file(self, filepath: str) -> str: + raise NotImplementedError + + +class GitilesRepo(Repo): + def __init__(self, url: str, rev: str) -> None: + super().__init__() + self.fetcher = "fetchFromGitiles" + self.args = { + "url": url, + "rev": rev, + } + + def get_file(self, filepath: str) -> str: + return base64.b64decode( + urlopen( + f"{self.args['url']}/+/{self.args['rev']}/{filepath}?format=TEXT" + ).read() + ).decode("utf-8") + + +def repo_from_dep(dep: dict) -> Optional[Repo]: + if "url" in dep: + url, rev = gclient_utils.SplitUrlRevision(dep["url"]) + return GitilesRepo(url, rev) + else: + # Not a git dependency; skip + return None + + + +chromium = GitilesRepo("https://chromium.googlesource.com/chromium/src.git", chromium_version) +chromium.get_deps( + { + **{ + f"checkout_{platform}": platform == "linux" or platform == "x64" or platform == "arm64" or platform == "arm" + for platform in ["ios", "chromeos", "android", "mac", "win", "linux"] + }, + **{ + f"checkout_{arch}": True + for arch in ["x64", "arm64", "arm", "x86", "mips", "mips64", "ppc", "riscv64"] + }, + }, + "", +) +print(json.dumps(chromium.flatten("src"))) diff --git a/pkgs/by-name/he/helium-browser/fix-scripts.patch b/pkgs/by-name/he/helium-browser/fix-scripts.patch new file mode 100644 index 0000000..7fa09f9 --- /dev/null +++ b/pkgs/by-name/he/helium-browser/fix-scripts.patch @@ -0,0 +1,18 @@ +diff --git a/utils/generate_resources.py b/utils/generate_resources.py +index f14d3c03..9fcc1df3 100644 +--- a/utils/generate_resources.py ++++ b/utils/generate_resources.py +@@ -1,3 +1,4 @@ ++#!/usr/bin/env python3 + # Copyright 2025 The Helium Authors + # You can use, redistribute, and/or modify this source code under + # the terms of the GPL-3.0 license that can be found in the LICENSE file. +diff --git a/utils/replace_resources.py b/utils/replace_resources.py +index 935ab525..d30bfa8f 100644 +--- a/utils/replace_resources.py ++++ b/utils/replace_resources.py +@@ -1,3 +1,4 @@ ++#!/usr/bin/env python3 + # Copyright 2025 The Helium Authors + # You can use, redistribute, and/or modify this source code under + # the terms of the GPL-3.0 license that can be found in the LICENSE file. diff --git a/pkgs/by-name/he/helium-browser/helium-patcher.nix b/pkgs/by-name/he/helium-browser/helium-patcher.nix new file mode 100644 index 0000000..9c8fb35 --- /dev/null +++ b/pkgs/by-name/he/helium-browser/helium-patcher.nix @@ -0,0 +1,57 @@ +{ + stdenv, + fetchFromGitHub, + python3Packages, + makeWrapper, + patch, +}: + +{ + rev, + hash, +}: + +stdenv.mkDerivation { + pname = "helium-patcher"; + + version = rev; + + src = fetchFromGitHub { + owner = "imputnet"; + repo = "helium"; + inherit rev hash; + }; + + dontBuild = true; + + patches = [ ./fix-scripts.patch ]; + + buildInputs = [ + + (python3Packages.python.withPackages ( + pythonPackages: with pythonPackages; [ + pillow + ] + )) + + patch + ]; + + nativeBuildInputs = [ + makeWrapper + ]; + + postPatch = '' + sed -i '/chromium-widevine/d' patches/series + ''; + + installPhase = '' + mkdir $out + cp -R * $out/ + wrapProgram $out/utils/patches.py --add-flags "apply" --prefix PATH : "${patch}/bin" + chmod +x $out/utils/name_substitution.py + chmod +x $out/utils/helium_version.py + chmod +x $out/utils/generate_resources.py + chmod +x $out/utils/replace_resources.py + ''; +} diff --git a/pkgs/by-name/he/helium-browser/info.json b/pkgs/by-name/he/helium-browser/info.json new file mode 100644 index 0000000..20d1992 --- /dev/null +++ b/pkgs/by-name/he/helium-browser/info.json @@ -0,0 +1,799 @@ +{ + "ungoogled-chromium": { + "version": "140.0.7339.213", + "deps": { + "depot_tools": { + "rev": "7d1e2bdb9168718566caba63a170a67cdab2356b", + "hash": "sha256-ZOzKQpo7Z/h1eeWQj20ghDq7pFZ9nch8lt60aoK/g2k=" + }, + "gn": { + "version": "0-unstable-2025-07-29", + "rev": "3a4f5cea73eca32e9586e8145f97b04cbd4a1aee", + "hash": "sha256-Z7bTto8BHnJzjvmKmcVAZ0/BrXimcAETV6YGKNTorQw=" + }, + "ungoogled-patches": { + "rev": "0.4.13", + "hash": "sha256-zSnS/t4hLyIxkSyiW6ZnclawYXC53e57yZB4kUQNW+M=" + }, + "npmHash": "sha256-R2gOpfPOUAmnsnUTIvzDPHuHNzL/b2fwlyyfTrywEcI=" + }, + "DEPS": { + "src": { + "url": "https://chromium.googlesource.com/chromium/src.git", + "rev": "e2e6becc9eb74f73aa250b790c4e42ea9da82089", + "hash": "sha256-De34ATbpdYMRuhroHT0n+D/ZdClZJyRgA5GPzsvh70Y=", + "recompress": true + }, + "src/third_party/clang-format/script": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git", + "rev": "37f6e68a107df43b7d7e044fd36a13cbae3413f2", + "hash": "sha256-d9uweklBffiuCWEb03ti1eFLnMac2qRtvggzXY1n/RU=" + }, + "src/third_party/compiler-rt/src": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/compiler-rt.git", + "rev": "dc425afb37a69b60c8c02fef815af29e91b61773", + "hash": "sha256-TANkUmIqP+MirWFmegENuJEFK+Ve/o0A0azuxTzeAo8=" + }, + "src/third_party/libc++/src": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git", + "rev": "adbb4a5210ae2a8a4e27fa6199221156c02a9b1a", + "hash": "sha256-34+xTZqWpm+1aks2b4nPD3WRJTkTxNj6ZjTuMveiQ+M=" + }, + "src/third_party/libc++abi/src": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git", + "rev": "a6c815c69d55ec59d020abde636754d120b402ad", + "hash": "sha256-wO64dyP1O3mCBh/iiRkSzaWMkiDkb7B98Avd4SpnY70=" + }, + "src/third_party/libunwind/src": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git", + "rev": "84c5262b57147e9934c0a8f2302d989b44ec7093", + "hash": "sha256-GmLreEtoyHMXr6mZgZ7NS1ZaS9leB9eMbISeN7qmfqw=" + }, + "src/third_party/llvm-libc/src": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libc.git", + "rev": "6adc0aa946a413c124758a3a0ac12e5a536c7dd3", + "hash": "sha256-C5ZmMzhGdRAd9tpad8hnqM6RoXsunKSuYUoUQdsYclI=" + }, + "src/chrome/test/data/perf/canvas_bench": { + "url": "https://chromium.googlesource.com/chromium/canvas_bench.git", + "rev": "a7b40ea5ae0239517d78845a5fc9b12976bfc732", + "hash": "sha256-svOuyBGKloBLM11xLlWCDsB4PpRjdKTBdW2UEW4JQjM=" + }, + "src/chrome/test/data/perf/frame_rate/content": { + "url": "https://chromium.googlesource.com/chromium/frame_rate/content.git", + "rev": "c10272c88463efeef6bb19c9ec07c42bc8fe22b9", + "hash": "sha256-t4kcuvH0rkPBkcdiMsoNQaRwU09eU+oSvyHDiAHrKXo=" + }, + "src/chrome/test/data/xr/webvr_info": { + "url": "https://chromium.googlesource.com/external/github.com/toji/webvr.info.git", + "rev": "c58ae99b9ff9e2aa4c524633519570bf33536248", + "hash": "sha256-BsAPwc4oEWri0TlqhyxqFNqKdfgVSrB0vQyISmYY4eg=" + }, + "src/docs/website": { + "url": "https://chromium.googlesource.com/website.git", + "rev": "a89f6810f6a5b0e11e4ec00387e9f97e8f6c23ae", + "hash": "sha256-LH4TlXPBULUamqTDitDEXiB37705BzEAqX1Lan87eoM=" + }, + "src/media/cdm/api": { + "url": "https://chromium.googlesource.com/chromium/cdm.git", + "rev": "a4cbc4325e6de42ead733f2af43c08292d0e65a8", + "hash": "sha256-voZaq/OiP5/QSSZmBx1ifriBc6HQ9+m4pUz0o9+O9x8=" + }, + "src/net/third_party/quiche/src": { + "url": "https://quiche.googlesource.com/quiche.git", + "rev": "42832178b3b6ae20f0d1c9634c040c528614f45f", + "hash": "sha256-ImjvS826eyo82TIDw6M/7h3lrwbCwxQ+oKJr8RaqDTc=" + }, + "src/testing/libfuzzer/fuzzers/wasm_corpus": { + "url": "https://chromium.googlesource.com/v8/fuzzer_wasm_corpus.git", + "rev": "1df5e50a45db9518a56ebb42cb020a94a090258b", + "hash": "sha256-gItDOfNqm1tHlmelz3l2GGdiKi9adu1EpPP6U7+8EQY=" + }, + "src/third_party/angle": { + "url": "https://chromium.googlesource.com/angle/angle.git", + "rev": "a8c8a6febe630c6239a5e207530e9fac651ae373", + "hash": "sha256-GxWTdzSf7/9WIqrECdAEkibXve/ZpKpxJcNS+KnfNc0=" + }, + "src/third_party/angle/third_party/glmark2/src": { + "url": "https://chromium.googlesource.com/external/github.com/glmark2/glmark2", + "rev": "6edcf02205fd1e8979dc3f3964257a81959b80c8", + "hash": "sha256-VebUALLFKwEa4+oE+jF8mBSzhJd6aflphPmcK1Em8bw=" + }, + "src/third_party/angle/third_party/rapidjson/src": { + "url": "https://chromium.googlesource.com/external/github.com/Tencent/rapidjson", + "rev": "781a4e667d84aeedbeb8184b7b62425ea66ec59f", + "hash": "sha256-btUl1a/B0sXwf/+hyvCvVJjWqIkXfVYCpHm3TeBuOxk=" + }, + "src/third_party/angle/third_party/VK-GL-CTS/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS", + "rev": "ad59a18f2ce08e60c9f4ab0aaf9b62679ab8c626", + "hash": "sha256-42ShMIXq9CnOlmwXcUvupPpQSNggdlXEkR3mdthsGzg=" + }, + "src/third_party/anonymous_tokens/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/anonymous-tokens.git", + "rev": "50b2ee441f1c3bad73ab7430c41fd1ea5a7a06a6", + "hash": "sha256-NiqQy4CEK8qWb2khi4zTSb3fAf3n9LvBsmceSeyQ+Q0=" + }, + "src/third_party/readability/src": { + "url": "https://chromium.googlesource.com/external/github.com/mozilla/readability.git", + "rev": "04fd32f72b448c12b02ba6c40928b67e510bac49", + "hash": "sha256-yUf4UTwcJ7H0tuN+e6c92F4UUSXjmTNOIKqNZA4+zAo=" + }, + "src/third_party/content_analysis_sdk/src": { + "url": "https://chromium.googlesource.com/external/github.com/chromium/content_analysis_sdk.git", + "rev": "9a408736204513e0e95dd2ab3c08de0d95963efc", + "hash": "sha256-f5Jmk1MiGjaRdLun+v/GKVl8Yv9hOZMTQUSxgiJalcY=" + }, + "src/third_party/dav1d/libdav1d": { + "url": "https://chromium.googlesource.com/external/github.com/videolan/dav1d.git", + "rev": "716164239ad6e6b11c5dcdaa3fb540309d499833", + "hash": "sha256-2J4M6EkfVtPLUpRWwzXdLkvJio4gskC0ihZnM5H3qYc=" + }, + "src/third_party/dawn": { + "url": "https://dawn.googlesource.com/dawn.git", + "rev": "67be7fddacc4f4bcb21d0cf7bf8bb18752d8fb08", + "hash": "sha256-ulw+gDGpUn8uWuNedlfQADwnSYYbPWpHN5Q+pJbwKGc=" + }, + "src/third_party/dawn/third_party/glfw": { + "url": "https://chromium.googlesource.com/external/github.com/glfw/glfw", + "rev": "b35641f4a3c62aa86a0b3c983d163bc0fe36026d", + "hash": "sha256-E1zXIDiw87badrLOZTvV+Wh9NZHu51nb70ZK9vlAlqE=" + }, + "src/third_party/dawn/third_party/dxc": { + "url": "https://chromium.googlesource.com/external/github.com/microsoft/DirectXShaderCompiler", + "rev": "50764bac3d4048144e9ada5f5a742c82cc97cc9a", + "hash": "sha256-rs5cw/kpRq0Bcr2ov5kKsupwqkIQDvuvUMbZbAdOmGI=" + }, + "src/third_party/dawn/third_party/dxheaders": { + "url": "https://chromium.googlesource.com/external/github.com/microsoft/DirectX-Headers", + "rev": "980971e835876dc0cde415e8f9bc646e64667bf7", + "hash": "sha256-0Miw1Cy/jmOo7bLFBOHuTRDV04cSeyvUEyPkpVsX9DA=" + }, + "src/third_party/dawn/third_party/khronos/OpenGL-Registry": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry", + "rev": "5bae8738b23d06968e7c3a41308568120943ae77", + "hash": "sha256-K3PcRIiD3AmnbiSm5TwaLs4Gu9hxaN8Y91WMKK8pOXE=" + }, + "src/third_party/dawn/third_party/khronos/EGL-Registry": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/EGL-Registry", + "rev": "7dea2ed79187cd13f76183c4b9100159b9e3e071", + "hash": "sha256-Z6DwLfgQ1wsJXz0KKJyVieOatnDmx3cs0qJ6IEgSq1A=" + }, + "src/third_party/dawn/third_party/webgpu-cts": { + "url": "https://chromium.googlesource.com/external/github.com/gpuweb/cts", + "rev": "5b477670f53e5fefcf4bd829a2952013ef9d1953", + "hash": "sha256-os0yeQb6snDvUjYghrIYAy9nUi1j8Y2YoTfsiQ7SlpA=" + }, + "src/third_party/dawn/third_party/webgpu-headers/src": { + "url": "https://chromium.googlesource.com/external/github.com/webgpu-native/webgpu-headers", + "rev": "c8b371dd2ff8a2b028fdc0206af5958521181ba8", + "hash": "sha256-rHDN4ln5kTMzabW427Xktl93E+8EVhWa2i8n4Mh2BgQ=" + }, + "src/third_party/highway/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/highway.git", + "rev": "00fe003dac355b979f36157f9407c7c46448958e", + "hash": "sha256-IS7m1wBwpPBUNhx2GttY1fzvmLIeAp3o2gXfrFpRdvY=" + }, + "src/third_party/google_benchmark/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/benchmark.git", + "rev": "761305ec3b33abf30e08d50eb829e19a802581cc", + "hash": "sha256-cH8s1gP6kCcojAAfTt5iQCVqiAaSooNk4BdaILujM3w=" + }, + "src/third_party/boringssl/src": { + "url": "https://boringssl.googlesource.com/boringssl.git", + "rev": "0a0009998fa180695f3e2071805dc03c9a5f3124", + "hash": "sha256-hYUbfUo00gHqYKac0vOpmBHtb5/FBsgXL+UQtrHxGaM=" + }, + "src/third_party/breakpad/breakpad": { + "url": "https://chromium.googlesource.com/breakpad/breakpad.git", + "rev": "ff252ff6faf5e3a52dc4955aab0d84831697dc94", + "hash": "sha256-8OfbSe+ly/5FFYk8NubAV39ACMr5S4wbLBVdiQHWeok=" + }, + "src/third_party/cast_core/public/src": { + "url": "https://chromium.googlesource.com/cast_core/public", + "rev": "f5ee589bdaea60418f670fa176be15ccb9a34942", + "hash": "sha256-yQxm1GMMne80bLl1P7OAN3bJLz1qRNAvou2/5MKp2ig=" + }, + "src/third_party/catapult": { + "url": "https://chromium.googlesource.com/catapult.git", + "rev": "0fd1415f0cf3219ba097d37336141897fab7c5e9", + "hash": "sha256-khxdFV6fxbTazz195MlxktLlihXytpNYCykLrI8nftM=" + }, + "src/third_party/ced/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git", + "rev": "ba412eaaacd3186085babcd901679a48863c7dd5", + "hash": "sha256-ySG74Rj2i2c/PltEgHVEDq+N8yd9gZmxNktc56zIUiY=" + }, + "src/third_party/cld_3/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/cld_3.git", + "rev": "b48dc46512566f5a2d41118c8c1116c4f96dc661", + "hash": "sha256-C3MOMBUy9jgkT9BAi/Fgm2UH4cxRuwSBEcRl3hzM2Ss=" + }, + "src/third_party/colorama/src": { + "url": "https://chromium.googlesource.com/external/colorama.git", + "rev": "3de9f013df4b470069d03d250224062e8cf15c49", + "hash": "sha256-6ZTdPYSHdQOLYMSnE+Tp7PgsVTs3U2awGu9Qb4Rg/tk=" + }, + "src/third_party/cpu_features/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/cpu_features.git", + "rev": "936b9ab5515dead115606559502e3864958f7f6e", + "hash": "sha256-E8LoVzhe+TAmARWZTSuINlsVhzpUJMxPPCGe/dHZcyA=" + }, + "src/third_party/cpuinfo/src": { + "url": "https://chromium.googlesource.com/external/github.com/pytorch/cpuinfo.git", + "rev": "33ed0be77d7767d0e2010e2c3cf972ef36c7c307", + "hash": "sha256-0rZzbZkOo6DAt1YnH4rtx0FvmCuYH8M6X3DNJ0gURpU=" + }, + "src/third_party/crc32c/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/crc32c.git", + "rev": "d3d60ac6e0f16780bcfcc825385e1d338801a558", + "hash": "sha256-KBraGaO5LmmPP+p8RuDogGldbTWdNDK+WzF4Q09keuE=" + }, + "src/third_party/cros_system_api": { + "url": "https://chromium.googlesource.com/chromiumos/platform2/system_api.git", + "rev": "07b9fafa3fff468afa2960789d2b28444c38db3e", + "hash": "sha256-JpimNp8PmsROMiQLy8H39n8l+KDwaivZiIOgSjLF3U4=" + }, + "src/third_party/crossbench": { + "url": "https://chromium.googlesource.com/crossbench.git", + "rev": "69b7e2bb8e1d8d92d4efbb92bcddba3af2716577", + "hash": "sha256-1cyXu5fSHWLWt3qdafWQu1WyeZ+fT/be7seiv/MDPdQ=" + }, + "src/third_party/crossbench-web-tests": { + "url": "https://chromium.googlesource.com/chromium/web-tests.git", + "rev": "3c76c8201f0732fe9781742229ab8ac43bf90cbf", + "hash": "sha256-yJmi1IpUiKhdoHAXyazkpm+Ezuc4Hp8pOIBntG5hN+U=" + }, + "src/third_party/depot_tools": { + "url": "https://chromium.googlesource.com/chromium/tools/depot_tools.git", + "rev": "7d1e2bdb9168718566caba63a170a67cdab2356b", + "hash": "sha256-ZOzKQpo7Z/h1eeWQj20ghDq7pFZ9nch8lt60aoK/g2k=" + }, + "src/third_party/devtools-frontend/src": { + "url": "https://chromium.googlesource.com/devtools/devtools-frontend", + "rev": "725edaaf06b966e670194d0376d50be0c25deb13", + "hash": "sha256-7YwrN+MizCnfcwDHWsYkZaTbN2qmCHcixX6KHhCPrXs=" + }, + "src/third_party/dom_distiller_js/dist": { + "url": "https://chromium.googlesource.com/chromium/dom-distiller/dist.git", + "rev": "199de96b345ada7c6e7e6ba3d2fa7a6911b8767d", + "hash": "sha256-yuEBD2XQlV3FGI/i7lTmJbCqzeBiuG1Qow8wvsppGJw=" + }, + "src/third_party/dragonbox/src": { + "url": "https://chromium.googlesource.com/external/github.com/jk-jeon/dragonbox.git", + "rev": "6c7c925b571d54486b9ffae8d9d18a822801cbda", + "hash": "sha256-AOniXMPgwKpkJqivRd+GazEnhdw53FzhxKqG+GdU+cc=" + }, + "src/third_party/eigen3/src": { + "url": "https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git", + "rev": "81044ec13df7608d0d9d86aff2ef9805fc69bed1", + "hash": "sha256-W0uonGzjDaN2RbY2U+Kl1a5/nrEZ9T9W426f+a7NUzY=" + }, + "src/third_party/farmhash/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/farmhash.git", + "rev": "816a4ae622e964763ca0862d9dbd19324a1eaf45", + "hash": "sha256-5n58VEUxa/K//jAfZqG4cXyfxrp50ogWDNYcgiXVHdc=" + }, + "src/third_party/fast_float/src": { + "url": "https://chromium.googlesource.com/external/github.com/fastfloat/fast_float.git", + "rev": "cb1d42aaa1e14b09e1452cfdef373d051b8c02a4", + "hash": "sha256-CG5je117WYyemTe5PTqznDP0bvY5TeXn8Vu1Xh5yUzQ=" + }, + "src/third_party/ffmpeg": { + "url": "https://chromium.googlesource.com/chromium/third_party/ffmpeg.git", + "rev": "d2d06b12c22d27af58114e779270521074ff1f85", + "hash": "sha256-c5w8CuyE1J0g79lrNq1stdqc1JaAkMbtscdcywmAEMY=" + }, + "src/third_party/flac": { + "url": "https://chromium.googlesource.com/chromium/deps/flac.git", + "rev": "689da3a7ed50af7448c3f1961d1791c7c1d9c85c", + "hash": "sha256-gvTFPNOlBfozptaH7lTb9iD/09AmpdT3kCl9ClszjEs=" + }, + "src/third_party/flatbuffers/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/flatbuffers.git", + "rev": "8db59321d9f02cdffa30126654059c7d02f70c32", + "hash": "sha256-tbc45o0MbMvK5XqRUJt5Eg8BU6+TJqlmwFgQhHq6wRM=" + }, + "src/third_party/fontconfig/src": { + "url": "https://chromium.googlesource.com/external/fontconfig.git", + "rev": "86b48ec01ece451d5270d0c5181a43151e45a042", + "hash": "sha256-6HLV0U/MA1XprKJ70TKvwUBdkGQPwgqP4Oj5dINsKp0=" + }, + "src/third_party/fp16/src": { + "url": "https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git", + "rev": "0a92994d729ff76a58f692d3028ca1b64b145d91", + "hash": "sha256-m2d9bqZoGWzuUPGkd29MsrdscnJRtuIkLIMp3fMmtRY=" + }, + "src/third_party/gemmlowp/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/gemmlowp.git", + "rev": "13d57703abca3005d97b19df1f2db731607a7dc2", + "hash": "sha256-O5wD8wxgis0qYMaY+xZ21GBDVQFphMRvInCOswS6inA=" + }, + "src/third_party/freetype/src": { + "url": "https://chromium.googlesource.com/chromium/src/third_party/freetype2.git", + "rev": "27c1cb10a52420515ce66729dfca897be21691b8", + "hash": "sha256-2ialoA/hqlTwnbBkBlgz5CT2nzpUVXVMtEOxSxifiXQ=" + }, + "src/third_party/fxdiv/src": { + "url": "https://chromium.googlesource.com/external/github.com/Maratyszcza/FXdiv.git", + "rev": "63058eff77e11aa15bf531df5dd34395ec3017c8", + "hash": "sha256-LjX5kivfHbqCIA5pF9qUvswG1gjOFo3CMpX0VR+Cn38=" + }, + "src/third_party/harfbuzz-ng/src": { + "url": "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git", + "rev": "9f83bbbe64654b45ba5bb06927ff36c2e7588495", + "hash": "sha256-lNnCtgIegUy4DLhYaGZXcEaFw83KWAHoKpz69AEsWp4=" + }, + "src/third_party/ink/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/ink.git", + "rev": "4e6081ad7052f97df7d77e1d87cea2d70c18a47b", + "hash": "sha256-SVwZWhM63iN2ajTMldgug0mfJV1rdvxTZwj/zyLe4WA=" + }, + "src/third_party/ink_stroke_modeler/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/ink-stroke-modeler.git", + "rev": "fe79520c9ad7d2d445d26d3c59fda6fc54eb4d5c", + "hash": "sha256-4iXoBgCCbWCqGbpchiAYQhKBK9rO1Xb6wP98iMd06cY=" + }, + "src/third_party/instrumented_libs": { + "url": "https://chromium.googlesource.com/chromium/third_party/instrumented_libraries.git", + "rev": "69015643b3f68dbd438c010439c59adc52cac808", + "hash": "sha256-8kokdsnn5jD9KgM/6g0NuITBbKkGXWEM4BMr1nCrfdU=" + }, + "src/third_party/emoji-segmenter/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git", + "rev": "955936be8b391e00835257059607d7c5b72ce744", + "hash": "sha256-KdQdKBBipEBRT8UmNGao6yCB4m2CU8/SrMVvcXlb5qE=" + }, + "src/third_party/ots/src": { + "url": "https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git", + "rev": "46bea9879127d0ff1c6601b078e2ce98e83fcd33", + "hash": "sha256-kiUXrXsaGOzPkKh0dVmU1I13WHt0Stzj7QLMqHN9FbU=" + }, + "src/third_party/libgav1/src": { + "url": "https://chromium.googlesource.com/codecs/libgav1.git", + "rev": "c05bf9be660cf170d7c26bd06bb42b3322180e58", + "hash": "sha256-BgTfWmbcMvJB1KewJpRcMtbOd2FVuJ+fi1zAXBXfkrg=" + }, + "src/third_party/googletest/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/googletest.git", + "rev": "373af2e3df71599b87a40ce0e37164523849166b", + "hash": "sha256-07pEo2gj3n/IOipqz7UpZkBOywZt7FkfZFCnVyp3xYw=" + }, + "src/third_party/hunspell_dictionaries": { + "url": "https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git", + "rev": "41cdffd71c9948f63c7ad36e1fb0ff519aa7a37e", + "hash": "sha256-67mvpJRFFa9eMfyqFMURlbxOaTJBICnk+gl0b0mEHl8=" + }, + "src/third_party/icu": { + "url": "https://chromium.googlesource.com/chromium/deps/icu.git", + "rev": "1b2e3e8a421efae36141a7b932b41e315b089af8", + "hash": "sha256-k3z31DhDPoqjcZdUL4vjyUMVpUiNk44+7rCMTDVPH8Q=" + }, + "src/third_party/jsoncpp/source": { + "url": "https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git", + "rev": "42e892d96e47b1f6e29844cc705e148ec4856448", + "hash": "sha256-bSLNcoYBz3QCt5VuTR056V9mU2PmBuYBa0W6hFg2m8Q=" + }, + "src/third_party/leveldatabase/src": { + "url": "https://chromium.googlesource.com/external/leveldb.git", + "rev": "4ee78d7ea98330f7d7599c42576ca99e3c6ff9c5", + "hash": "sha256-ANtMVRZmW6iOjDVn2y15ak2fTagFTTaz1Se6flUHL8w=" + }, + "src/third_party/libFuzzer/src": { + "url": "https://chromium.googlesource.com/external/github.com/llvm/llvm-project/compiler-rt/lib/fuzzer.git", + "rev": "bea408a6e01f0f7e6c82a43121fe3af4506c932e", + "hash": "sha256-TDi1OvYClJKmEDikanKVTmy8uxUXJ95nuVKo5u+uFPM=" + }, + "src/third_party/fuzztest/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/fuzztest.git", + "rev": "7bab06ff5fbbf8b8cce05a8661369dc2e11cde66", + "hash": "sha256-uWPhInzuidI4smFRjRF95aaVNTsehKd/1y4uRzr12mk=" + }, + "src/third_party/domato/src": { + "url": "https://chromium.googlesource.com/external/github.com/googleprojectzero/domato.git", + "rev": "053714bccbda79cf76dac3fee48ab2b27f21925e", + "hash": "sha256-fYxoA0fxKe9U23j+Jp0MWj4m7RfsRpM0XjF6/yOhX1I=" + }, + "src/third_party/libaddressinput/src": { + "url": "https://chromium.googlesource.com/external/libaddressinput.git", + "rev": "2610f7b1043d6784ada41392fc9392d1ea09ea07", + "hash": "sha256-6h4/DQUBoBtuGfbaTL5Te1Z+24qjTaBuIydcTV18j80=" + }, + "src/third_party/libaom/source/libaom": { + "url": "https://aomedia.googlesource.com/aom.git", + "rev": "e91b7aa26d6d0979bba2bee5e1c27a7a695e0226", + "hash": "sha256-cER77Q9cM5rh+oeh1LDyKDZyQK5VbtE/ANNTN2cYzMo=" + }, + "src/third_party/crabbyavif/src": { + "url": "https://chromium.googlesource.com/external/github.com/webmproject/CrabbyAvif.git", + "rev": "644c9d84c123ac811a611760a9adc807e3eb5be5", + "hash": "sha256-snogXm3EMmDJoL2ikoaxeODYfmTaVEsAb5cMcRU7uC4=" + }, + "src/third_party/nearby/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/nearby-connections.git", + "rev": "a8889d12a27ef7006d1a47dfefc272e0815f5c41", + "hash": "sha256-pFcusmbij3OsSAmaKhuI8/bo3AlfP7DuTo/W/6mAZs8=" + }, + "src/third_party/securemessage/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/securemessage.git", + "rev": "fa07beb12babc3b25e0c5b1f38c16aa8cb6b8f84", + "hash": "sha256-GS4ccnuiqxMs/LVYAtvSlVAYFp4a5GoZsxcriTX3k78=" + }, + "src/third_party/jetstream/main": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/JetStream.git", + "rev": "fe1f348226d4b7c3447e606577960a606cc058e4", + "hash": "sha256-kznek87yenGR9Ft3D06LGDOy7+VPRhSUFru340mvES4=" + }, + "src/third_party/jetstream/v2.2": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/JetStream.git", + "rev": "2145cedef4ca2777b792cb0059d3400ee2a6153c", + "hash": "sha256-zucA2tqNOsvjhwYQKZ5bFUC73ZF/Fu7KpBflSelvixw=" + }, + "src/third_party/speedometer/main": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git", + "rev": "87f9ed88c8f8abe3a3bb19b9ec5ea49623d803ad", + "hash": "sha256-eIrkM7UxuaZox3A8pqEgvgpQCkcBO3zJWFwK45fgWm0=" + }, + "src/third_party/speedometer/v3.1": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git", + "rev": "1386415be8fef2f6b6bbdbe1828872471c5d802a", + "hash": "sha256-G89mrrgRaANT1vqzhKPQKemHbz56YwR+oku7rlRoCHw=" + }, + "src/third_party/speedometer/v3.0": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git", + "rev": "8d67f28d0281ac4330f283495b7f48286654ad7d", + "hash": "sha256-qMQ4naX+4uUu3vtzzinjkhxX9/dNoTwj6vWCu4FdQmU=" + }, + "src/third_party/speedometer/v2.1": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git", + "rev": "8bf7946e39e47c875c00767177197aea5727e84a", + "hash": "sha256-0z5tZlz32fYh9I1ALqfLm2WWO8HiRBwt0hcmgKQhaeM=" + }, + "src/third_party/speedometer/v2.0": { + "url": "https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git", + "rev": "732af0dfe867f8815e662ac637357e55f285dbbb", + "hash": "sha256-p7WUS8gZUaS+LOm7pNmRkwgxjx+V8R6yy7bbaEHaIs4=" + }, + "src/third_party/ukey2/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/ukey2.git", + "rev": "0275885d8e6038c39b8a8ca55e75d1d4d1727f47", + "hash": "sha256-aaLs6ZS+CdBlCJ6ZhsmdAPFxiBIij6oufsDcNeRSV1E=" + }, + "src/third_party/cros-components/src": { + "url": "https://chromium.googlesource.com/external/google3/cros_components.git", + "rev": "7ccdbf60606671c2c057628125908fbfef9bd0c8", + "hash": "sha256-g7LzBd2V21AaLdSdCw65WGYvKfrbtpRXsYc+3ILdiKs=" + }, + "src/third_party/libdrm/src": { + "url": "https://chromium.googlesource.com/chromiumos/third_party/libdrm.git", + "rev": "ad78bb591d02162d3b90890aa4d0a238b2a37cde", + "hash": "sha256-woSYEDUfcEBpYOYnli13wLMt754A7KnUbmTEcFQdFGw=" + }, + "src/third_party/expat/src": { + "url": "https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git", + "rev": "69d6c054c1bd5258c2a13405a7f5628c72c177c2", + "hash": "sha256-qe8O7otL6YcDDBx2DS/+c5mWIS8Rf8RQXVtLFMIAeyk=" + }, + "src/third_party/libipp/libipp": { + "url": "https://chromium.googlesource.com/chromiumos/platform2/libipp.git", + "rev": "2209bb84a8e122dab7c02fe66cc61a7b42873d7f", + "hash": "sha256-gxU92lHLd6uxO8T3QWhZIK0hGy97cki705DV0VimCPY=" + }, + "src/third_party/libjpeg_turbo": { + "url": "https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git", + "rev": "e14cbfaa85529d47f9f55b0f104a579c1061f9ad", + "hash": "sha256-Ig+tmprZDvlf/M72/DTar2pbxat9ZElgSqdXdoM0lPs=" + }, + "src/third_party/liblouis/src": { + "url": "https://chromium.googlesource.com/external/liblouis-github.git", + "rev": "9700847afb92cb35969bdfcbbfbbb74b9c7b3376", + "hash": "sha256-EI/uaHXe0NlqdEw764q0SjerThYEVLRogUlmrsZwXnY=" + }, + "src/third_party/libphonenumber/dist": { + "url": "https://chromium.googlesource.com/external/libphonenumber.git", + "rev": "9d46308f313f2bf8dbce1dfd4f364633ca869ca7", + "hash": "sha256-ZbuDrZEUVp/ekjUP8WO/FsjAomRjeDBptT4nQZvTVi4=" + }, + "src/third_party/libprotobuf-mutator/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git", + "rev": "7bf98f78a30b067e22420ff699348f084f802e12", + "hash": "sha256-EaEC6R7SzqLw4QjEcWXFXhZc84lNBp6RSa9izjGnWKE=" + }, + "src/third_party/libsrtp": { + "url": "https://chromium.googlesource.com/chromium/deps/libsrtp.git", + "rev": "a52756acb1c5e133089c798736dd171567df11f5", + "hash": "sha256-bkG1+ss+1a2rCHGwZjhvf5UaNVbPPZJt9HZSIPBKGwM=" + }, + "src/third_party/libsync/src": { + "url": "https://chromium.googlesource.com/aosp/platform/system/core/libsync.git", + "rev": "f4f4387b6bf2387efbcfd1453af4892e8982faf6", + "hash": "sha256-Mkl6C1LxF3RYLwYbxiSfoQPt8QKFwQWj/Ati2sNJ32E=" + }, + "src/third_party/libva-fake-driver/src": { + "url": "https://chromium.googlesource.com/chromiumos/platform/libva-fake-driver.git", + "rev": "a9bcab9cd6b15d4e3634ca44d5e5f7652c612194", + "hash": "sha256-em/8rNqwv6szlxyji7mnYr3nObSW/x3OzEEnkiLuqpI=" + }, + "src/third_party/libvpx/source/libvpx": { + "url": "https://chromium.googlesource.com/webm/libvpx.git", + "rev": "a985e5e847a2fe69bef3e547cf25088132194e39", + "hash": "sha256-BbXiBbnGwdsbZCZIpurfTzYvDUCysdt+ocRh6xvuUI8=" + }, + "src/third_party/libwebm/source": { + "url": "https://chromium.googlesource.com/webm/libwebm.git", + "rev": "f2a982d748b80586ae53b89a2e6ebbc305848b8c", + "hash": "sha256-SxDGt7nPVkSxwRF/lMmcch1h+C2Dyh6GZUXoZjnXWb4=" + }, + "src/third_party/libwebp/src": { + "url": "https://chromium.googlesource.com/webm/libwebp.git", + "rev": "4fa21912338357f89e4fd51cf2368325b59e9bd9", + "hash": "sha256-eaGWMpF6ENrKxGxqXccQ0P1G0X+nQI0EoL0Y0R2VVZ0=" + }, + "src/third_party/libyuv": { + "url": "https://chromium.googlesource.com/libyuv/libyuv.git", + "rev": "cdd3bae84818e78466fec1ce954eead8f403d10c", + "hash": "sha256-ievGlutmOuuEEhWS82vMqxwqXCq8PF3508N0MCMPQus=" + }, + "src/third_party/lss": { + "url": "https://chromium.googlesource.com/linux-syscall-support.git", + "rev": "ed31caa60f20a4f6569883b2d752ef7522de51e0", + "hash": "sha256-rhp4EcZYdgSfu9cqn+zxxGx6v2IW8uX8V+iA0UfZhFY=" + }, + "src/third_party/material_color_utilities/src": { + "url": "https://chromium.googlesource.com/external/github.com/material-foundation/material-color-utilities.git", + "rev": "13434b50dcb64a482cc91191f8cf6151d90f5465", + "hash": "sha256-Y85XU+z9W6tvmDNHJ/dXQnUKXvvDkO3nH/kUJRLqbc4=" + }, + "src/third_party/minigbm/src": { + "url": "https://chromium.googlesource.com/chromiumos/platform/minigbm.git", + "rev": "3018207f4d89395cc271278fb9a6558b660885f5", + "hash": "sha256-9HwvjTETerbQ7YKXH9kUB2eWa8PxGWMAJfx1jAluhrs=" + }, + "src/third_party/nasm": { + "url": "https://chromium.googlesource.com/chromium/deps/nasm.git", + "rev": "e2c93c34982b286b27ce8b56dd7159e0b90869a2", + "hash": "sha256-TxzAcp+CoKnnM0lCGjm+L3h6M30vYHjM07vW6zUe/vY=" + }, + "src/third_party/neon_2_sse/src": { + "url": "https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git", + "rev": "eb8b80b28f956275e291ea04a7beb5ed8289e872", + "hash": "sha256-AkDAHOPO5NdXXk0hETS5D67mzw0RVXwPDDKqM0XXo5g=" + }, + "src/third_party/openh264/src": { + "url": "https://chromium.googlesource.com/external/github.com/cisco/openh264", + "rev": "652bdb7719f30b52b08e506645a7322ff1b2cc6f", + "hash": "sha256-tf0lnxATCkoq+xRti6gK6J47HwioAYWnpEsLGSA5Xdg=" + }, + "src/third_party/openscreen/src": { + "url": "https://chromium.googlesource.com/openscreen", + "rev": "f51be2dd676c855bc588a439f002bc941b87db6b", + "hash": "sha256-7AmfZjugPKty0lpinOR/Q22M7F34p57tl+gs6s2BJhY=" + }, + "src/third_party/openscreen/src/buildtools": { + "url": "https://chromium.googlesource.com/chromium/src/buildtools", + "rev": "077a66f30fcf281b066fafb6dfc60818c238efb6", + "hash": "sha256-WnbgaCzZ/BJli6M60kP9e4mVPFDx0yu3eCac5wmQ7iM=" + }, + "src/third_party/openscreen/src/third_party/tinycbor/src": { + "url": "https://chromium.googlesource.com/external/github.com/intel/tinycbor.git", + "rev": "d393c16f3eb30d0c47e6f9d92db62272f0ec4dc7", + "hash": "sha256-fMKBFUSKmODQyg4hKIa1hwnEKIV6WBbY1Gb8DOSnaHA=" + }, + "src/third_party/pdfium": { + "url": "https://pdfium.googlesource.com/pdfium.git", + "rev": "1afaa1a380fcd06cec420f3e5b6ec1d2ccb920dc", + "hash": "sha256-kx2jF4kHeGECdf6WzcRKTmwhvmoKl+rIVQ2Ep8Y9rs8=" + }, + "src/third_party/perfetto": { + "url": "https://chromium.googlesource.com/external/github.com/google/perfetto.git", + "rev": "4ab725613a8ee64e9acd7930eceb8995e24df562", + "hash": "sha256-V16Fm389yRNn0b13n70828c8xTdwxoQ6GW8iKLyy0qE=" + }, + "src/third_party/protobuf-javascript/src": { + "url": "https://chromium.googlesource.com/external/github.com/protocolbuffers/protobuf-javascript", + "rev": "28bf5df73ef2f345a936d9cc95d64ba8ed426a53", + "hash": "sha256-c/aC+LZQtedL5oouUXw2eTF6xD7LN3J3C0q3D0wl+W0=" + }, + "src/third_party/pthreadpool/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/pthreadpool.git", + "rev": "149f0a86f5ad215e9f0441684385ce09f345dbe4", + "hash": "sha256-3/FnJ2FL6fQSlymqJS/UoXTB4ZiW9d7xpvK3Ur8Ynp4=" + }, + "src/third_party/pyelftools": { + "url": "https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git", + "rev": "19b3e610c86fcadb837d252c794cb5e8008826ae", + "hash": "sha256-I/7p3IEvfP/gkes4kx18PvWwhAKilQKb67GXoW4zFB4=" + }, + "src/third_party/quic_trace/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/quic-trace.git", + "rev": "ed3deb8a056b260c59f2fd42af6dfa3db48a8cad", + "hash": "sha256-vbXqddDgwqetU0bDYn3qo7OBqT5eG926/MbA1hKkCT0=" + }, + "src/third_party/pywebsocket3/src": { + "url": "https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git", + "rev": "50602a14f1b6da17e0b619833a13addc6ea78bc2", + "hash": "sha256-WEqqu2/7fLqcf/2/IcD7/FewRSZ6jTgVlVBvnihthYQ=" + }, + "src/third_party/re2/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/re2.git", + "rev": "8451125897dd7816a5c118925e8e42309d598ecc", + "hash": "sha256-vjh4HI4JKCMAf5SZeqstb0M01w8ssaTwwrLAUsrFkkQ=" + }, + "src/third_party/ruy/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/ruy.git", + "rev": "9940fbf1e0c0863907e77e0600b99bb3e2bc2b9f", + "hash": "sha256-fV0El2ZgjxLqstKVN35SL72+diHNK0FkBmG5UwVZFrk=" + }, + "src/third_party/search_engines_data/resources": { + "url": "https://chromium.googlesource.com/external/search_engines_data.git", + "rev": "5c5db51f8c13cb42379d8b333890971f1a1a1797", + "hash": "sha256-Z4ykCZkUVatvkH3ytIdGOp0zEYLKIqr8fta0MnovZKw=" + }, + "src/third_party/skia": { + "url": "https://skia.googlesource.com/skia.git", + "rev": "f3ff281f2330f2948888a9cc0ba921bbdc107da8", + "hash": "sha256-88ezOArtEdPJZACmgyjJ2Jf5biSlyoDYMJBZ7wwPt7Q=" + }, + "src/third_party/smhasher/src": { + "url": "https://chromium.googlesource.com/external/smhasher.git", + "rev": "0ff96f7835817a27d0487325b6c16033e2992eb5", + "hash": "sha256-OgZQwkQcVgRMf62ROGuY+3zQhBoWuUSP4naTmSKdq8s=" + }, + "src/third_party/snappy/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/snappy.git", + "rev": "32ded457c0b1fe78ceb8397632c416568d6714a0", + "hash": "sha256-jUwnjbaqXz7fgI2TPRK7SlUPQUVzcpjp4ZlFbEzwA+o=" + }, + "src/third_party/sqlite/src": { + "url": "https://chromium.googlesource.com/chromium/deps/sqlite.git", + "rev": "cc08c79629643fdd5b592f1391e738815f5577b6", + "hash": "sha256-1Q2+NyCJb0GIMC30YNbVqVYHnP62tmKqBRfr9Xw5Z4A=" + }, + "src/third_party/swiftshader": { + "url": "https://swiftshader.googlesource.com/SwiftShader.git", + "rev": "fdb6700ecb04103b658d2e4623d6bc663ba80ea8", + "hash": "sha256-jJT0hF1k5a6na+9aH1yHuUo6go/PzgKibP/k60m6+xM=" + }, + "src/third_party/text-fragments-polyfill/src": { + "url": "https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git", + "rev": "c036420683f672d685e27415de0a5f5e85bdc23f", + "hash": "sha256-4rW2u1cQAF4iPWHAt1FvVXIpz2pmI901rEPks/w/iFA=" + }, + "src/third_party/tflite/src": { + "url": "https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git", + "rev": "fe38b1b8c23d86ed93c13ef367b19496e398462d", + "hash": "sha256-51tpID94hoxm0I2Mf3WFQBf5MsuzIzlkS9lOto/8tC4=" + }, + "src/third_party/vulkan-deps": { + "url": "https://chromium.googlesource.com/vulkan-deps", + "rev": "c466059b72815c7fbce8bb3ab4832407aabc5dc5", + "hash": "sha256-MEMOJBBMBeA0kBlU5ZhkPbfRpn1PSL1950IsU1rWaJ8=" + }, + "src/third_party/glslang/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang", + "rev": "38f6708b6b6f213010c51ffa8f577a7751e12ce7", + "hash": "sha256-HeH7j7IsjeP2vFPhX9cKzZ2O54eIGSCoSnPT4pumA00=" + }, + "src/third_party/spirv-cross/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross", + "rev": "b8fcf307f1f347089e3c46eb4451d27f32ebc8d3", + "hash": "sha256-H43M9DXfEuyKuvo6rjb5k0KEbYOSFodbPJh8ZKY4PQg=" + }, + "src/third_party/spirv-headers/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers", + "rev": "97e96f9e9defeb4bba3cfbd034dec516671dd7a3", + "hash": "sha256-/OT6//yu8VmQMXs3DSgwEx2lMDTPlUuXJDjboNdLjrI=" + }, + "src/third_party/spirv-tools/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools", + "rev": "3aeaaa088d37b86cff036eee1a9bf452abad7d9d", + "hash": "sha256-bkoD3/4o/CjNBAp49vnRq4ZtY7TNgYkVPI5gESM8CUI=" + }, + "src/third_party/vulkan-headers/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers", + "rev": "a01329f307fa6067da824de9f587f292d761680b", + "hash": "sha256-LCRK6UzqvcRoa3sr6nsfkDf3aILXj8zjb48lirsLTIw=" + }, + "src/third_party/vulkan-loader/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader", + "rev": "f2389e27734347c1d9f40e03be53f69f969976b1", + "hash": "sha256-NIBn5HkAKzNaSruw742QBWPgCkrxQdmITvTASagYlKM=" + }, + "src/third_party/vulkan-tools/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools", + "rev": "f766b30b2de3ffe2cf6b656d943720882617ec58", + "hash": "sha256-9sF9syF7d28J5yzGsIHUcJ1QB2JmJZpAVqDt92ZZOY4=" + }, + "src/third_party/vulkan-utility-libraries/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries", + "rev": "b0a40d2e50310e9f84327061290a390a061125a3", + "hash": "sha256-bj9YCZfIFeaQ9TVpyyztRs3LOIaJkKpkGKbU5g9hEzg=" + }, + "src/third_party/vulkan-validation-layers/src": { + "url": "https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers", + "rev": "6b1b8e3d259241a68c0944ca0a7bb5320d086191", + "hash": "sha256-Do+6/v8Ysp1Wnnmdi5I+UKHpBcEG4xMeRROCWgLmJbY=" + }, + "src/third_party/vulkan_memory_allocator": { + "url": "https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git", + "rev": "cb0597213b0fcb999caa9ed08c2f88dc45eb7d50", + "hash": "sha256-yBCs3zfqs/60htsZAOscjcyKhVbAWE6znweuXcs1oKo=" + }, + "src/third_party/wayland/src": { + "url": "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git", + "rev": "a156431ea66fe67d69c9fbba8a8ad34dabbab81c", + "hash": "sha256-oK0Z8xO2ILuySGZS0m37ZF0MOyle2l8AXb0/6wai0/w=" + }, + "src/third_party/wayland-protocols/src": { + "url": "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git", + "rev": "efbc060534be948b63e1f395d69b583eebba3235", + "hash": "sha256-tdpEK7soY0aKSk6VD4nulH7ORubX8RfjXYmNAd/cWKY=" + }, + "src/third_party/wayland-protocols/kde": { + "url": "https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git", + "rev": "0b07950714b3a36c9b9f71fc025fc7783e82926e", + "hash": "sha256-Dmcp/2ms/k7NxPPmPkp0YNfM9z2Es1ZO0uX10bc7N2Y=" + }, + "src/third_party/wayland-protocols/gtk": { + "url": "https://chromium.googlesource.com/external/github.com/GNOME/gtk.git", + "rev": "40ebed3a03aef096addc0af09fec4ec529d882a0", + "hash": "sha256-75XNnLkF5Lt1LMRGT+T61k0/mLa3kkynfN+QWvZ0LiQ=" + }, + "src/third_party/webdriver/pylib": { + "url": "https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git", + "rev": "1e954903022e9386b9acf452c24f4458dd4c4fc1", + "hash": "sha256-k5qx4xyO83jPtHaMh6aMigMJ3hsytFdFQOcZLmwPEYo=" + }, + "src/third_party/webgl/src": { + "url": "https://chromium.googlesource.com/external/khronosgroup/webgl.git", + "rev": "c01b768bce4a143e152c1870b6ba99ea6267d2b0", + "hash": "sha256-mSketnpcDtz3NnhPkXMpMpq8MWcFiSviJbK6h06fcnw=" + }, + "src/third_party/webgpu-cts/src": { + "url": "https://chromium.googlesource.com/external/github.com/gpuweb/cts.git", + "rev": "07f4412e935c988d60fad2e373287d6450bcd231", + "hash": "sha256-yb7NqciuvXi7crCqpN+7hgJ+JXfDF9x48gkYI2uSTtA=" + }, + "src/third_party/webpagereplay": { + "url": "https://chromium.googlesource.com/webpagereplay.git", + "rev": "eebd5c62cb5c6a5afbb36eccdcc3b3e01f28adc9", + "hash": "sha256-WXiWUVTX4JBuavc3qxPpWeM2qZsyMr64iqF/fu9fzRI=" + }, + "src/third_party/webrtc": { + "url": "https://webrtc.googlesource.com/src.git", + "rev": "36ea4535a500ac137dbf1f577ce40dc1aaa774ef", + "hash": "sha256-/3V/V0IrhOKcMAgs/C1qraqq+1pfopW8HKvGRmqLE0Q=" + }, + "src/third_party/wuffs/src": { + "url": "https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git", + "rev": "e3f919ccfe3ef542cfc983a82146070258fb57f8", + "hash": "sha256-373d2F/STcgCHEq+PO+SCHrKVOo6uO1rqqwRN5eeBCw=" + }, + "src/third_party/weston/src": { + "url": "https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git", + "rev": "bdba2f9adaca673fd58339d8140bc04727ee279d", + "hash": "sha256-o49a3sp+D9FycxeB+uMcKouVvlKWoWpfws7FLEGJ/V8=" + }, + "src/third_party/xdg-utils": { + "url": "https://chromium.googlesource.com/chromium/deps/xdg-utils.git", + "rev": "cb54d9db2e535ee4ef13cc91b65a1e2741a94a44", + "hash": "sha256-WuQ9uDq+QD17Y20ACFGres4nbkeOiTE2y+tY1avAT5U=" + }, + "src/third_party/xnnpack/src": { + "url": "https://chromium.googlesource.com/external/github.com/google/XNNPACK.git", + "rev": "ae40b1a2d93d5c516bc7657c6c3eea1470f917ae", + "hash": "sha256-w+8aCRTlBWQcDh4EvAF87eiLmQWsIsxD9adPTnuA12E=" + }, + "src/third_party/zstd/src": { + "url": "https://chromium.googlesource.com/external/github.com/facebook/zstd.git", + "rev": "f9938c217da17ec3e9dcd2a2d99c5cf39536aeb9", + "hash": "sha256-emmJF7XLq5CxXFd0KUrtUtw1YGOHDSiz39vtgVoEPd0=" + }, + "src/v8": { + "url": "https://chromium.googlesource.com/v8/v8.git", + "rev": "b7ed978e41b4bac7802b206404d0e2f3d09f31ac", + "hash": "sha256-/XuTD8ENQutrbBt5sJYHuG/87q00J2fACSBBkeEHTYs=" + } + } + } +} diff --git a/pkgs/by-name/he/helium-browser/package.nix b/pkgs/by-name/he/helium-browser/package.nix new file mode 100644 index 0000000..5d41422 --- /dev/null +++ b/pkgs/by-name/he/helium-browser/package.nix @@ -0,0 +1,136 @@ +{ + stdenv, + lib, + makeWrapper, + ed, + gsettings-desktop-schemas, + gtk3, + gtk4, + adwaita-icon-theme, + libva, + pipewire, + wayland, + glib, + libkrb5, + xdg-utils, + coreutils, + gnugrep, + callPackage, +}: +let + upstream-info = (lib.importJSON ./info.json)."ungoogled-chromium"; + unwrapped = callPackage ./unwrapped.nix { inherit helium-patcher-unwrapped stdenv upstream-info; }; + helium-patcher-unwrapped = callPackage ./helium-patcher.nix { }; + sandboxExecutableName = unwrapped.passthru.sandboxExecutableName; +in +stdenv.mkDerivation { + pname = "helium-browser"; + inherit (unwrapped) version; + + nativeBuildInputs = [ + makeWrapper + ed + ]; + + buildInputs = [ + # needed for GSETTINGS_SCHEMAS_PATH + gsettings-desktop-schemas + glib + gtk3 + gtk4 + + # needed for XDG_ICON_DIRS + adwaita-icon-theme + + # Needed for kerberos at runtime + libkrb5 + ]; + + outputs = [ + "out" + "sandbox" + ]; + + buildCommand = + let + browserBinary = "${unwrapped}/libexec/chromium/chromium"; + libPath = lib.makeLibraryPath [ + libva + pipewire + wayland + gtk3 + gtk4 + libkrb5 + ]; + + in + '' + mkdir -p "$out/bin" + + makeWrapper "${browserBinary}" "$out/bin/chromium" \ + --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \ + + ed -v -s "$out/bin/chromium" << EOF + 2i + + if [ -x "/run/wrappers/bin/${sandboxExecutableName}" ] + then + export CHROME_DEVEL_SANDBOX="/run/wrappers/bin/${sandboxExecutableName}" + else + export CHROME_DEVEL_SANDBOX="$sandbox/bin/${sandboxExecutableName}" + fi + + # Make generated desktop shortcuts have a valid executable name. + export CHROME_WRAPPER='chromium' + + '' + + lib.optionalString (libPath != "") '' + # To avoid loading .so files from cwd, LD_LIBRARY_PATH here must not + # contain an empty section before or after a colon. + export LD_LIBRARY_PATH="\$LD_LIBRARY_PATH\''${LD_LIBRARY_PATH:+:}${libPath}" + '' + + '' + + # libredirect causes chromium to deadlock on startup + export LD_PRELOAD="\$(echo -n "\$LD_PRELOAD" | ${coreutils}/bin/tr ':' '\n' | ${gnugrep}/bin/grep -v /lib/libredirect\\\\.so$ | ${coreutils}/bin/tr '\n' ':')" + + export XDG_DATA_DIRS=$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH\''${XDG_DATA_DIRS:+:}\$XDG_DATA_DIRS + + '' + + lib.optionalString (!xdg-utils.meta.broken) '' + # Mainly for xdg-open but also other xdg-* tools (this is only a fallback; \$PATH is suffixed so that other implementations can be used): + export PATH="\$PATH\''${PATH:+:}${xdg-utils}/bin" + '' + + '' + + . + w + EOF + + ln -sv "${unwrapped.sandbox}" "$sandbox" + + ln -s "$out/bin/chromium" "$out/bin/chromium-browser" + + mkdir -p "$out/share" + for f in '${unwrapped}'/share/*; do # hello emacs */ + ln -s -t "$out/share/" "$f" + done + ''; + + inherit (unwrapped) packageName; + meta = unwrapped.meta; + passthru = { + inherit (unwrapped) upstream-info; + browser = unwrapped; + inherit sandboxExecutableName; + # TODO: enable and fix this script when bothered + # updateScript = replaceVarsWith { + # src = ./update.mjs; + # replacements = { + # inherit nixpkgs; + # }; + # dir = "bin"; + # isExecutable = true; + # }; + }; +} diff --git a/pkgs/by-name/he/helium-browser/ungoogled-flags.toml b/pkgs/by-name/he/helium-browser/ungoogled-flags.toml new file mode 100644 index 0000000..59f19c8 --- /dev/null +++ b/pkgs/by-name/he/helium-browser/ungoogled-flags.toml @@ -0,0 +1,18 @@ +build_with_tflite_lib=false +chrome_pgo_phase=0 +clang_use_chrome_plugins=false +disable_fieldtrial_testing_config=true +enable_hangout_services_extension=false +enable_mdns=false +enable_remoting=false +enable_reporting=false +enable_service_discovery=false +enable_widevine=true +exclude_unwind_tables=true +google_api_key="" +google_default_client_id="" +google_default_client_secret="" +safe_browsing_mode=0 +treat_warnings_as_errors=false +use_official_google_api_keys=false +use_unofficial_version_number=false diff --git a/pkgs/by-name/he/helium-browser/unwrapped.nix b/pkgs/by-name/he/helium-browser/unwrapped.nix new file mode 100644 index 0000000..a9bd6ee --- /dev/null +++ b/pkgs/by-name/he/helium-browser/unwrapped.nix @@ -0,0 +1,174 @@ +{ + stdenv, + upstream-info, + chromium, + fetchurl, + go-crx3, + overrideCC, + pkgsBuildBuild, + lib, + helium-patcher-unwrapped, + fetchzip, +}: +( + (chromium.passthru.mkDerivation.override (old: { + inherit stdenv; + ungoogled = true; + ungoogled-chromium = helium-patcher-unwrapped; + inherit upstream-info; + })) + ( + base: + let + helium = helium-patcher-unwrapped { + inherit (upstream-info.deps.ungoogled-patches) rev hash; + }; + buildPlatformLlvmStdenv = + let + llvmPackages = pkgsBuildBuild.rustc.llvmPackages; + in + overrideCC llvmPackages.stdenv ( + llvmPackages.stdenv.cc.override { + inherit (llvmPackages) bintools; + } + ); + + ublock_src = + let + version = "1.66.4"; + in + fetchurl { + url = "https://github.com/imputnet/ublock-origin-crx/releases/download/${version}/uBlock0_${version}.crx"; + hash = "sha256-CMPHVEpSeKA1ZJX3Ia5gccIr+4KDFs6OF+IgO0Zhq74="; + + recursiveHash = true; + downloadToTemp = true; + nativeBuildInputs = [ + go-crx3 + ]; + postFetch = '' + mv "$downloadedFile" "$TMPDIR/uBlock0_${version}.crx" + crx3 unpack "$TMPDIR/uBlock0_${version}.crx" + mv "uBlock0_${version}" "$out" + ''; + }; + helium-onboarding = + let + version = "202509241653"; + in + fetchzip { + url = "https://github.com/imputnet/helium-onboarding/releases/download/${version}/helium-onboarding-${version}.tar.gz"; + hash = "sha256-AeGc6psN4nzbjSG/UF1GNiZ7ZhcgA5GwBrGTg2Rt3Ns="; + stripRoot = false; + }; + search-engine-data = fetchzip { + url = "https://gist.githubusercontent.com/wukko/2a591364dda346e10219e4adabd568b1/raw/e75ae3c4a1ce940ef7627916a48bc40882d24d40/nonfree-search-engines-data.tar.gz"; + hash = "sha256-G83WwfoNmzI0ib9SRfjoDEoULnwgOTMQurlr1fKIpoo="; + stripRoot = false; + }; + + in + rec { + inherit stdenv; + pname = "helium-browser-unwrapped"; + depsBuildBuild = lib.filter ( + d: d != buildPlatformLlvmStdenv && d != buildPlatformLlvmStdenv.cc + ) base.depsBuildBuild; + + postUnpack = '' + cp -r ${helium-onboarding}/ src/components/helium_onboarding + chmod +rw -R src/components/helium_onboarding + cp -r ${ublock_src}/ src/third_party/ublock + chmod +rw -R src/third_party/ublock + cp -r ${search-engine-data}/. src/third_party/search_engines_data/resources_internal + chmod +rw -R src/third_party/search_engines_data/resources_internal + # chmod +x src/components/helium_onboarding/node_modules/@esbuild/linux-x64/bin/esbuild + ''; + postPatch = base.postPatch + '' + "${helium}/utils/name_substitution.py" --sub -t . + "${helium}/utils/helium_version.py" --tree "${helium}" --chromium-tree . + cp --no-preserve=mode,ownership -r "${helium}/resources" "$TMPDIR/helium-resources" + "${helium}/utils/generate_resources.py" "${helium}/resources/generate_resources.txt" "$TMPDIR/helium-resources" + "${helium}/utils/replace_resources.py" "${helium}/resources/helium_resources.txt" "$TMPDIR/helium-resources" . + ''; + # stdenv = ccacheStdenv; + name = "helium-browser"; + packageName = "helium"; + buildTargets = [ + "run_mksnapshot_default" + "chrome_sandbox" + "chrome" + ]; + + outputs = [ + "out" + "sandbox" + ]; + + sandboxExecutableName = "__chromium-suid-sandbox"; + + installPhase = '' + mkdir -p "$libExecPath" + cp -v "$buildPath/"*.so "$buildPath/"*.pak "$buildPath/"*.bin "$libExecPath/" + cp -v "$buildPath/libvulkan.so.1" "$libExecPath/" + cp -v "$buildPath/vk_swiftshader_icd.json" "$libExecPath/" + cp -v "$buildPath/icudtl.dat" "$libExecPath/" + cp -vLR "$buildPath/locales" "$buildPath/resources" "$libExecPath/" + cp -v "$buildPath/chrome_crashpad_handler" "$libExecPath/" + cp -v "$buildPath/chrome" "$libExecPath/$packageName" + + # Swiftshader + # See https://stackoverflow.com/a/4264351/263061 for the find invocation. + if [ -n "$(find "$buildPath/swiftshader/" -maxdepth 1 -name '*.so' -print -quit)" ]; then + echo "Swiftshader files found; installing" + mkdir -p "$libExecPath/swiftshader" + cp -v "$buildPath/swiftshader/"*.so "$libExecPath/swiftshader/" + else + echo "Swiftshader files not found" + fi + + mkdir -p "$sandbox/bin" + cp -v "$buildPath/chrome_sandbox" "$sandbox/bin/${sandboxExecutableName}" + + mkdir -vp "$out/share/man/man1" + cp -v "$buildPath/chrome.1" "$out/share/man/man1/$packageName.1" + + for icon_file in chrome/app/theme/chromium/product_logo_*[0-9].png; do + num_and_suffix="''${icon_file##*logo_}" + icon_size="''${num_and_suffix%.*}" + expr "$icon_size" : "^[0-9][0-9]*$" || continue + logo_output_prefix="$out/share/icons/hicolor" + logo_output_path="$logo_output_prefix/''${icon_size}x''${icon_size}/apps" + mkdir -vp "$logo_output_path" + cp -v "$icon_file" "$logo_output_path/$packageName.png" + done + + # Install Desktop Entry + install -D chrome/installer/linux/common/desktop.template \ + $out/share/applications/chromium-browser.desktop + + substituteInPlace $out/share/applications/chromium-browser.desktop \ + --replace "@@MENUNAME@@" "Chromium" \ + --replace "@@PACKAGE@@" "chromium" \ + --replace "Exec=/usr/bin/@@USR_BIN_SYMLINK_NAME@@" "Exec=chromium" + + # Append more mime types to the end + sed -i '/^MimeType=/ s,$,x-scheme-handler/webcal;x-scheme-handler/mailto;x-scheme-handler/about;x-scheme-handler/unknown,' \ + $out/share/applications/chromium-browser.desktop + + # See https://github.com/NixOS/nixpkgs/issues/12433 + sed -i \ + -e '/\[Desktop Entry\]/a\' \ + -e 'StartupWMClass=chromium-browser' \ + $out/share/applications/chromium-browser.desktop + ''; + + passthru = { + inherit sandboxExecutableName; + }; + + requiredSystemFeatures = [ "big-parallel" ]; + + } + ) +) diff --git a/pkgs/by-name/he/helium-browser/update.mjs b/pkgs/by-name/he/helium-browser/update.mjs new file mode 100644 index 0000000..614f73e --- /dev/null +++ b/pkgs/by-name/he/helium-browser/update.mjs @@ -0,0 +1,283 @@ +#! /usr/bin/env nix-shell +/* +#! nix-shell -i zx -p zx +*/ + +console.log(process.cwd()) +const nixpkgs = "@nixpkgs@" + +const dummy_hash = 'sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=' + +const lockfile_file = './info.json' +const lockfile_initial = fs.readJsonSync(lockfile_file) +function flush_to_file() { + fs.writeJsonSync(lockfile_file, lockfile, { spaces: 2 }) +} +const flush_to_file_proxy = { + get(obj, prop) { + const value = obj[prop] + return typeof value == 'object' ? new Proxy(value, flush_to_file_proxy) : value + }, + + set(obj, prop, value) { + obj[prop] = value + flush_to_file() + return true + }, +} +const lockfile = new Proxy(structuredClone(lockfile_initial), flush_to_file_proxy) +const ungoogled_rev = argv['ungoogled-chromium-rev'] + +for (const attr_path of Object.keys(lockfile)) { + const ungoogled = attr_path === 'ungoogled-chromium' + + if (!argv[attr_path] && !(ungoogled && ungoogled_rev)) { + console.log(`[${attr_path}] Skipping ${attr_path}. Pass --${attr_path} as argument to update.`) + continue + } + + const version_nixpkgs = !ungoogled ? lockfile[attr_path].version : lockfile[attr_path].deps['ungoogled-patches'].rev + const version_upstream = !ungoogled ? await get_latest_chromium_release('linux') : + ungoogled_rev ?? await get_latest_ungoogled_release() + + console.log(`[${attr_path}] ${chalk.red(version_nixpkgs)} (nixpkgs)`) + console.log(`[${attr_path}] ${chalk.green(version_upstream)} (upstream)`) + + if (ungoogled_rev || version_greater_than(version_upstream, version_nixpkgs)) { + console.log(`[${attr_path}] ${chalk.green(version_upstream)} from upstream is newer than our ${chalk.red(version_nixpkgs)}...`) + + let ungoogled_patches = ungoogled ? await fetch_ungoogled(version_upstream) : undefined + + // For ungoogled-chromium we need to remove the patch revision (e.g. 130.0.6723.116-1 -> 130.0.6723.116) + // by just using the chromium_version.txt content from the patches checkout (to also work with commit revs). + const version_chromium = ungoogled_patches?.chromium_version ?? version_upstream + + const chromium_rev = await chromium_resolve_tag_to_rev(version_chromium) + + lockfile[attr_path] = { + version: version_chromium, + chromedriver: !ungoogled ? await fetch_chromedriver_binaries(await get_latest_chromium_release('mac')) : undefined, + deps: { + depot_tools: {}, + gn: await fetch_gn(chromium_rev, lockfile_initial[attr_path].deps.gn), + 'ungoogled-patches': !ungoogled ? undefined : { + rev: ungoogled_patches.rev, + hash: ungoogled_patches.hash, + }, + npmHash: dummy_hash, + }, + DEPS: {}, + } + + const depot_tools = await fetch_depot_tools(chromium_rev, lockfile_initial[attr_path].deps.depot_tools) + lockfile[attr_path].deps.depot_tools = { + rev: depot_tools.rev, + hash: depot_tools.hash, + } + + // DEPS update loop + lockfile[attr_path].DEPS = await resolve_DEPS(depot_tools.out, chromium_rev) + for (const [path, value] of Object.entries(lockfile[attr_path].DEPS)) { + delete value.fetcher + delete value.postFetch + + if (value.url === 'https://chromium.googlesource.com/chromium/src.git') { + value.recompress = true + } + + const cache_hit = (() => { + for (const attr_path in lockfile_initial) { + const cache = lockfile_initial[attr_path].DEPS[path] + const hits_cache = + cache !== undefined && + value.url === cache.url && + value.rev === cache.rev && + value.recompress === cache.recompress && + cache.hash !== undefined && + cache.hash !== '' && + cache.hash !== dummy_hash + + if (hits_cache) { + cache.attr_path = attr_path + return cache; + } + } + })(); + + if (cache_hit) { + console.log(`[${chalk.green(path)}] Reusing hash from previous info.json for ${cache_hit.url}@${cache_hit.rev} from ${cache_hit.attr_path}`) + value.hash = cache_hit.hash + continue + } + + console.log(`[${chalk.red(path)}] FOD prefetching ${value.url}@${value.rev}...`) + // value.hash = await prefetch_FOD('-A', `${attr_path}.browser.passthru.chromiumDeps."${path}"`) + value.hash = await prefetch_flake_FOD(`.#default.browser.passthru.chromiumDeps."${path}"`) + console.log(`[${chalk.green(path)}] FOD prefetching successful`) + } + + // lockfile[attr_path].deps.npmHash = await prefetch_FOD('-A', `${attr_path}.browser.passthru.npmDeps`) + lockfile[attr_path].deps.npmHash = await prefetch_flake_FOD(`.#default.browser.passthru.npmDeps`) + + console.log(chalk.green(`[${attr_path}] Done updating ${attr_path} from ${version_nixpkgs} to ${version_upstream}!`)) + } +} + + +async function fetch_gn(chromium_rev, gn_previous) { + const DEPS_file = await get_gitiles_file('https://chromium.googlesource.com/chromium/src', chromium_rev, 'DEPS') + const { rev } = /^\s+'gn_version': 'git_revision:(?.+)',$/m.exec(DEPS_file).groups + + const cache_hit = rev === gn_previous.rev; + if (cache_hit) { + return gn_previous + } + + const commit_date = await get_gitiles_commit_date('https://gn.googlesource.com/gn', rev) + const version = `0-unstable-${commit_date}` + + const expr = [`(import ${nixpkgs} {}).gn.override { version = "${version}"; rev = "${rev}"; hash = ""; }`] + const derivation = await $`nix-instantiate --expr ${expr}` + + return { + version, + rev, + hash: await prefetch_FOD(derivation), + } +} + + +async function get_gitiles_commit_date(base_url, rev) { + const url = `${base_url}/+/${rev}?format=json` + const response = await (await fetch(url)).text() + const json = JSON.parse(response.replace(`)]}'\n`, '')) + + const date = new Date(json.committer.time) + return date.toISOString().split("T")[0] +} + + +async function fetch_chromedriver_binaries(version) { + // https://developer.chrome.com/docs/chromedriver/downloads/version-selection + const prefetch = async (url) => { + const expr = [`(import ${nixpkgs} {}).fetchzip { url = "${url}"; hash = ""; }`] + const derivation = await $`nix-instantiate --expr ${expr}` + return await prefetch_FOD(derivation) + } + + // if the URL ever changes, the URLs in the chromedriver derivations need updating as well! + const url = (platform) => `https://storage.googleapis.com/chrome-for-testing-public/${version}/${platform}/chromedriver-${platform}.zip` + return { + version, + hash_darwin: await prefetch(url('mac-x64')), + hash_darwin_aarch64: await prefetch(url('mac-arm64')), + } +} + + +async function chromium_resolve_tag_to_rev(tag) { + const url = `https://chromium.googlesource.com/chromium/src/+/refs/tags/${tag}?format=json` + const response = await (await fetch(url)).text() + const json = JSON.parse(response.replace(`)]}'\n`, '')) + return json.commit +} + + +async function resolve_DEPS(depot_tools_checkout, chromium_rev) { + const { stdout } = await $`./depot_tools.py ${depot_tools_checkout} ${chromium_rev}` + const deps = JSON.parse(stdout) + return Object.fromEntries(Object.entries(deps).map(([k, { url, rev, hash }]) => [k, { url, rev, hash }])) +} + + +async function get_latest_chromium_release(platform) { + const url = `https://versionhistory.googleapis.com/v1/chrome/platforms/${platform}/channels/stable/versions/all/releases?` + new URLSearchParams({ + order_by: 'version desc', + filter: 'endtime=none,fraction>=0.5' + }) + + const response = await (await fetch(url)).json() + return response.releases[0].version +} + + +async function get_latest_ungoogled_release() { + const ungoogled_tags = await (await fetch('https://api.github.com/repos/imputnet/helium/tags')).json() + const chromium_releases = await (await fetch('https://versionhistory.googleapis.com/v1/chrome/platforms/linux/channels/stable/versions/all/releases')).json() + const chromium_release_map = chromium_releases.releases.map((x) => x.version) + return "0.4.13" // TODO: figure out how to actually properly do this stuff +} + + +async function fetch_ungoogled(rev) { + const expr = (hash) => [`(import ${nixpkgs} {}).fetchFromGitHub { owner = "imputnet"; repo = "helium"; rev = "${rev}"; hash = "${hash}"; }`] + const hash = await prefetch_FOD('--expr', expr('')) + + const checkout = await $`nix-build --expr ${expr(hash)}` + const checkout_path = checkout.stdout.trim() + + await fs.copy(path.join(checkout_path, 'flags.gn'), './ungoogled-flags.toml') + + const chromium_version = (await fs.readFile(path.join(checkout_path, 'chromium_version.txt'))).toString().trim() + + console.log(`[ungoogled-chromium] ${chalk.green(rev)} patch revision resolves to chromium version ${chalk.green(chromium_version)}`) + + return { + rev, + hash, + chromium_version, + } +} + + +function version_greater_than(greater, than) { + return greater.localeCompare(than, undefined, { numeric: true, sensitivity: 'base' }) === 1 +} + + +async function get_gitiles_file(repo, rev, path) { + const base64 = await (await fetch(`${repo}/+/${rev}/${path}?format=TEXT`)).text() + return Buffer.from(base64, 'base64').toString('utf-8') +} + + +async function fetch_depot_tools(chromium_rev, depot_tools_previous) { + const depot_tools_rev = await get_gitiles_file('https://chromium.googlesource.com/chromium/src', chromium_rev, 'third_party/depot_tools') + const hash = depot_tools_rev === depot_tools_previous.rev ? depot_tools_previous.hash : '' + return await prefetch_gitiles('https://chromium.googlesource.com/chromium/tools/depot_tools', depot_tools_rev, hash) +} + + +async function prefetch_gitiles(url, rev, hash = '') { + const expr = () => [`(import ${nixpkgs} {}).fetchFromGitiles { url = "${url}"; rev = "${rev}"; hash = "${hash}"; }`] + + if (hash === '') { + hash = await prefetch_FOD('--expr', expr()) + } + + const { stdout } = await $`nix-build --expr ${expr()}` + return { + url, + rev, + hash, + out: stdout.trim(), + } +} + + +async function prefetch_FOD(...args) { + const { stderr } = await $`nix-build ${args}`.nothrow() + const hash = /\s+got:\s+(?.+)$/m.exec(stderr)?.groups?.hash + if (hash == undefined) { + throw new Error(chalk.red('Expected to find hash in nix-build stderr output:') + stderr) + } + return hash +} +async function prefetch_flake_FOD(...args) { + const { stderr } = await $`nix build ${args}`.nothrow() + const hash = /\s+got:\s+(?.+)$/m.exec(stderr)?.groups?.hash + if (hash == undefined) { + throw new Error(chalk.red('Expected to find hash in nix build stderr output:') + stderr) + } + return hash +}