From 1b84fbf0cacaa3999979602919c3ee8df7ae9c6d Mon Sep 17 00:00:00 2001 From: aszlig Date: Thu, 20 Nov 2014 16:46:09 +0100 Subject: [PATCH] chromium: Allow env vars for passing plugin paths. Introduces environment variables to set plugin base paths. The schema for these is like NIX_CHROMIUM_PLUGIN_PATH_. Where is the path type we want to change, the supported (full) variable names are: * NIX_CHROMIUM_PLUGIN_PATH_ALL * NIX_CHROMIUM_PLUGIN_PATH_PEPPERFLASH * NIX_CHROMIUM_PLUGIN_PATH_FILEFLASH * NIX_CHROMIUM_PLUGIN_PATH_PDF * NIX_CHROMIUM_PLUGIN_PATH_FILE_EFFECTS * NIX_CHROMIUM_PLUGIN_PATH_NACL * NIX_CHROMIUM_PLUGIN_PATH_PNACL * NIX_CHROMIUM_PLUGIN_PATH_WIDEVINE Whereas NIX_CHROMIUM_PLUGIN_PATH_ALL is the plugin base path for every path which is not set explicitly, so by setting ..._ALL and not setting ..._WIDEVINE, the widevine plugin will be searched in the directory specified using ..._ALL. Right now, the only plugin where this is used is widevine, and it still doesn't properly work yet. Signed-off-by: aszlig --- .../networking/browsers/chromium/default.nix | 1 + .../networking/browsers/chromium/plugins.nix | 10 +- .../browsers/chromium/source/default.nix | 2 +- .../chromium/source/nix_plugin_paths.patch | 99 +++++++++++++++++++ 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 pkgs/applications/networking/browsers/chromium/source/nix_plugin_paths.patch diff --git a/pkgs/applications/networking/browsers/chromium/default.nix b/pkgs/applications/networking/browsers/chromium/default.nix index 14881d11601e..82637095c437 100644 --- a/pkgs/applications/networking/browsers/chromium/default.nix +++ b/pkgs/applications/networking/browsers/chromium/default.nix @@ -74,6 +74,7 @@ in stdenv.mkDerivation { ln -s "${chromium.browser}/share" "$out/share" makeWrapper "${browserBinary}" "$out/bin/chromium" \ --set CHROMIUM_SANDBOX_BINARY_PATH "${sandboxBinary}" \ + --run "export ${chromium.plugins.envVarsEnabled}" \ --add-flags "${chromium.plugins.flagsEnabled}" ln -s "$out/bin/chromium" "$out/bin/chromium-browser" diff --git a/pkgs/applications/networking/browsers/chromium/plugins.nix b/pkgs/applications/networking/browsers/chromium/plugins.nix index 5bd411586320..d4a655a88d9f 100644 --- a/pkgs/applications/networking/browsers/chromium/plugins.nix +++ b/pkgs/applications/networking/browsers/chromium/plugins.nix @@ -88,13 +88,19 @@ let mkdir -p "$widevine/nix-support" echo "--register-pepper-plugins='${wvModule}${wvInfo}'" \ > "$widevine/nix-support/chromium-flags" + echo "NIX_CHROMIUM_PLUGIN_PATH_WIDEVINE=$widevine/lib" \ + > "$widevine/nix-support/chromium-env-vars" ''; - passthru.flagsEnabled = let + passthru = let enabledPlugins = optional enablePepperFlash plugins.flash ++ optional enablePepperPDF plugins.pdf ++ optional enableWideVine plugins.widevine; getFlags = plugin: "$(< ${plugin}/nix-support/chromium-flags)"; - in concatStringsSep " " (map getFlags enabledPlugins); + getEnvVars = plugin: "$(< ${plugin}/nix-support/chromium-env-vars)"; + in { + flagsEnabled = concatStringsSep " " (map getFlags enabledPlugins); + envVarsEnabled = concatStringsSep " " (map getEnvVars enabledPlugins); + }; }; in plugins diff --git a/pkgs/applications/networking/browsers/chromium/source/default.nix b/pkgs/applications/networking/browsers/chromium/source/default.nix index ef442004d7ed..adac4baa29cd 100644 --- a/pkgs/applications/networking/browsers/chromium/source/default.nix +++ b/pkgs/applications/networking/browsers/chromium/source/default.nix @@ -22,7 +22,7 @@ stdenv.mkDerivation { prePatch = "patchShebangs ."; - patches = [ ./sandbox_userns_36.patch ]; + patches = [ ./sandbox_userns_36.patch ./nix_plugin_paths.patch ]; postPatch = '' sed -i -r \ diff --git a/pkgs/applications/networking/browsers/chromium/source/nix_plugin_paths.patch b/pkgs/applications/networking/browsers/chromium/source/nix_plugin_paths.patch new file mode 100644 index 000000000000..0220d0429413 --- /dev/null +++ b/pkgs/applications/networking/browsers/chromium/source/nix_plugin_paths.patch @@ -0,0 +1,99 @@ +diff --git a/chrome/common/chrome_paths.cc b/chrome/common/chrome_paths.cc +index 8a205a6..d5c24e1 100644 +--- a/chrome/common/chrome_paths.cc ++++ b/chrome/common/chrome_paths.cc +@@ -97,21 +97,14 @@ static base::LazyInstance + g_invalid_specified_user_data_dir = LAZY_INSTANCE_INITIALIZER; + + // Gets the path for internal plugins. +-bool GetInternalPluginsDirectory(base::FilePath* result) { +-#if defined(OS_MACOSX) && !defined(OS_IOS) +- // If called from Chrome, get internal plugins from a subdirectory of the +- // framework. +- if (base::mac::AmIBundled()) { +- *result = chrome::GetFrameworkBundlePath(); +- DCHECK(!result->empty()); +- *result = result->Append("Internet Plug-Ins"); +- return true; +- } +- // In tests, just look in the module directory (below). +-#endif +- +- // The rest of the world expects plugins in the module directory. +- return PathService::Get(base::DIR_MODULE, result); ++bool GetInternalPluginsDirectory(base::FilePath* result, ++ const std::string& ident) { ++ std::string full_env = std::string("NIX_CHROMIUM_PLUGIN_PATH_") + ident; ++ const char* value = getenv(full_env.c_str()); ++ if (value == NULL) ++ return PathService::Get(base::DIR_MODULE, result); ++ else ++ *result = base::FilePath(value); + } + + } // namespace +@@ -248,11 +241,11 @@ bool PathProvider(int key, base::FilePath* result) { + create_dir = true; + break; + case chrome::DIR_INTERNAL_PLUGINS: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "ALL")) + return false; + break; + case chrome::DIR_PEPPER_FLASH_PLUGIN: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "PEPPERFLASH")) + return false; + cur = cur.Append(kPepperFlashBaseDirectory); + break; +@@ -285,7 +278,7 @@ bool PathProvider(int key, base::FilePath* result) { + cur = cur.Append(FILE_PATH_LITERAL("script.log")); + break; + case chrome::FILE_FLASH_PLUGIN: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "FILEFLASH")) + return false; + cur = cur.Append(kInternalFlashPluginFileName); + break; +@@ -295,12 +288,12 @@ bool PathProvider(int key, base::FilePath* result) { + cur = cur.Append(chrome::kPepperFlashPluginFilename); + break; + case chrome::FILE_PDF_PLUGIN: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "PDF")) + return false; + cur = cur.Append(kInternalPDFPluginFileName); + break; + case chrome::FILE_EFFECTS_PLUGIN: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "FILE_EFFECTS")) + return false; + cur = cur.Append(kEffectsPluginFileName); + break; +@@ -308,7 +301,7 @@ bool PathProvider(int key, base::FilePath* result) { + // We currently need a path here to look up whether the plugin is disabled + // and what its permissions are. + case chrome::FILE_NACL_PLUGIN: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "NACL")) + return false; + cur = cur.Append(kInternalNaClPluginFileName); + break; +@@ -343,7 +336,7 @@ bool PathProvider(int key, base::FilePath* result) { + cur = cur.DirName(); + } + #else +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "PNACL")) + return false; + #endif + cur = cur.Append(FILE_PATH_LITERAL("pnacl")); +@@ -372,7 +365,7 @@ bool PathProvider(int key, base::FilePath* result) { + // In the component case, this is the source adapter. Otherwise, it is the + // actual Pepper module that gets loaded. + case chrome::FILE_WIDEVINE_CDM_ADAPTER: +- if (!GetInternalPluginsDirectory(&cur)) ++ if (!GetInternalPluginsDirectory(&cur, "WIDEVINE")) + return false; + cur = cur.AppendASCII(kWidevineCdmAdapterFileName); + break;