Bug 1811981 - Add ability to run both x86 and ARM Widevine plugins on Windows ARM. r=jld
This patch adds the ability for Windows on ARM to launch either x86 or ARM Widevine plugins. It also adds the ability for Windows on x86 to refuse ARM binaries in case, for example, a profile is transferred between machines. Overall this should be a non-functional change for users at the time of landing. It does however allow us to ship the ARM Widevine plugin to Windows ARM users to workaround a plugin crash with the x86 Widevine plugin. This only affects Windows 10 users (Windows 11 works fine). Differential Revision: https://phabricator.services.mozilla.com/D167634
This commit is contained in:
@@ -189,6 +189,12 @@ class BaseProcessLauncher {
|
||||
|
||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BaseProcessLauncher);
|
||||
|
||||
#ifdef ALLOW_GECKO_CHILD_PROCESS_ARCH
|
||||
void SetLaunchArchitecture(uint32_t aLaunchArch) {
|
||||
mLaunchArch = aLaunchArch;
|
||||
}
|
||||
#endif
|
||||
|
||||
RefPtr<ProcessLaunchPromise> Launch(GeckoChildProcessHost*);
|
||||
|
||||
protected:
|
||||
@@ -217,6 +223,9 @@ class BaseProcessLauncher {
|
||||
nsCOMPtr<nsISerialEventTarget> mLaunchThread;
|
||||
GeckoProcessType mProcessType;
|
||||
UniquePtr<base::LaunchOptions> mLaunchOptions;
|
||||
#ifdef ALLOW_GECKO_CHILD_PROCESS_ARCH
|
||||
uint32_t mLaunchArch = base::PROCESS_ARCH_INVALID;
|
||||
#endif
|
||||
std::vector<std::string> mExtraOpts;
|
||||
#ifdef XP_WIN
|
||||
nsString mGroupId;
|
||||
@@ -696,6 +705,9 @@ bool GeckoChildProcessHost::AsyncLaunch(std::vector<std::string> aExtraOpts) {
|
||||
|
||||
RefPtr<BaseProcessLauncher> launcher =
|
||||
new ProcessLauncher(this, std::move(aExtraOpts));
|
||||
#ifdef ALLOW_GECKO_CHILD_PROCESS_ARCH
|
||||
launcher->SetLaunchArchitecture(mLaunchArch);
|
||||
#endif
|
||||
|
||||
// Note: Destroy() waits on mHandlePromise to delete |this|. As such, we want
|
||||
// to be sure that all of our post-launch processing on |this| happens before
|
||||
@@ -1346,15 +1358,15 @@ bool WindowsProcessLauncher::DoSetup() {
|
||||
const bool isGMP = mProcessType == GeckoProcessType_GMPlugin;
|
||||
const bool isWidevine = isGMP && Contains(mExtraOpts, "gmp-widevinecdm");
|
||||
# if defined(_ARM64_)
|
||||
const bool isClearKey = isGMP && Contains(mExtraOpts, "gmp-clearkey");
|
||||
const bool isSandboxBroker =
|
||||
mProcessType == GeckoProcessType_RemoteSandboxBroker;
|
||||
if (isClearKey || isWidevine || isSandboxBroker) {
|
||||
bool useRemoteSandboxBroker = false;
|
||||
if (mLaunchArch & (base::PROCESS_ARCH_I386 | base::PROCESS_ARCH_X86_64)) {
|
||||
// On Windows on ARM64 for ClearKey and Widevine, and for the sandbox
|
||||
// launcher process, we want to run the x86 plugin-container.exe in
|
||||
// the "i686" subdirectory, instead of the aarch64 plugin-container.exe.
|
||||
// So insert "i686" into the exePath.
|
||||
exePath = exePath.DirName().AppendASCII("i686").Append(exePath.BaseName());
|
||||
useRemoteSandboxBroker =
|
||||
mProcessType != GeckoProcessType_RemoteSandboxBroker;
|
||||
}
|
||||
# endif // if defined(_ARM64_)
|
||||
# endif // defined(MOZ_SANDBOX) || defined(_ARM64_)
|
||||
@@ -1384,8 +1396,8 @@ bool WindowsProcessLauncher::DoSetup() {
|
||||
|
||||
# if defined(MOZ_SANDBOX)
|
||||
# if defined(_ARM64_)
|
||||
if (isClearKey || isWidevine)
|
||||
mResults.mSandboxBroker = new RemoteSandboxBroker();
|
||||
if (useRemoteSandboxBroker)
|
||||
mResults.mSandboxBroker = new RemoteSandboxBroker(mLaunchArch);
|
||||
else
|
||||
# endif // if defined(_ARM64_)
|
||||
mResults.mSandboxBroker = new SandboxBroker();
|
||||
|
||||
Reference in New Issue
Block a user