diff options
Diffstat (limited to 'browser/app/pbproxy')
-rw-r--r-- | browser/app/pbproxy/Makefile.in | 2 | ||||
-rw-r--r-- | browser/app/pbproxy/docs/index.rst | 15 | ||||
-rw-r--r-- | browser/app/pbproxy/module.ver | 8 | ||||
-rw-r--r-- | browser/app/pbproxy/moz.build | 29 | ||||
-rw-r--r-- | browser/app/pbproxy/pbproxy.cpp | 94 | ||||
-rw-r--r-- | browser/app/pbproxy/pbproxy.rc | 9 |
6 files changed, 157 insertions, 0 deletions
diff --git a/browser/app/pbproxy/Makefile.in b/browser/app/pbproxy/Makefile.in new file mode 100644 index 0000000000..f58f09bec1 --- /dev/null +++ b/browser/app/pbproxy/Makefile.in @@ -0,0 +1,2 @@ +# To make sure this process doesn't show a taskbar icon +MOZ_WINCONSOLE = 0 diff --git a/browser/app/pbproxy/docs/index.rst b/browser/app/pbproxy/docs/index.rst new file mode 100644 index 0000000000..b7d0b60467 --- /dev/null +++ b/browser/app/pbproxy/docs/index.rst @@ -0,0 +1,15 @@ +====================== +Private Browsing Proxy +====================== + +On Windows, Firefox ships with a small binary that always launches +``firefox.exe`` in Private Browsing mode (``private_browsing.exe``). Its sole +purpose for existing is to allow Private Browsing shortcuts to have their own +Visual Elements. This is most notably seen when pinning a Private Browsing +shortcut to the Start Menu -- Visual Elements are used for the icon there +rather than the shortcut's icon. + +In addition to always passing ``-private-window``, ``private_browsing.exe`` +will forward any other command line arguments given to it to ``firefox.exe``. +It will also forward shortcut information from the Windows ``STARTUPINFOW`` +structure to ensure that Firefox knows how it was started. diff --git a/browser/app/pbproxy/module.ver b/browser/app/pbproxy/module.ver new file mode 100644 index 0000000000..5ef8d2a02a --- /dev/null +++ b/browser/app/pbproxy/module.ver @@ -0,0 +1,8 @@ +WIN32_MODULE_COMPANYNAME=Mozilla Corporation +WIN32_MODULE_COPYRIGHT=©Firefox and Mozilla Developers; available under the MPL 2 license. +WIN32_MODULE_PRODUCTVERSION=@MOZ_APP_WINVERSION@ +WIN32_MODULE_PRODUCTVERSION_STRING=@MOZ_APP_VERSION@ +WIN32_MODULE_TRADEMARKS=Firefox is a Trademark of The Mozilla Foundation. +WIN32_MODULE_DESCRIPTION=@MOZ_APP_DISPLAYNAME@ +WIN32_MODULE_PRODUCTNAME=@MOZ_APP_DISPLAYNAME@ +WIN32_MODULE_NAME=@MOZ_APP_DISPLAYNAME@ diff --git a/browser/app/pbproxy/moz.build b/browser/app/pbproxy/moz.build new file mode 100644 index 0000000000..bf9e0125e0 --- /dev/null +++ b/browser/app/pbproxy/moz.build @@ -0,0 +1,29 @@ +SPHINX_TREES["private-browsing-proxy"] = "docs" + +SOURCES += ["pbproxy.cpp"] + +# For nsNativeAppSupportWin.h icon definitions +LOCAL_INCLUDES += ["/toolkit/xre"] + +if CONFIG["OS_TARGET"] == "WINNT" and CONFIG["CC_TYPE"] in ("gcc", "clang"): + # This allows us to use wmain as the entry point on mingw + LDFLAGS += [ + "-municode", + ] + +RCINCLUDE = "pbproxy.rc" +DEFINES["UNICODE"] = 1 +DEFINES["MOZ_APP_NAME"] = 'L"{}"'.format(CONFIG["MOZ_APP_NAME"]) +Program("private_browsing") + +OS_LIBS += ["shlwapi", "user32"] + +DEFINES["PBMODE_ICO"] = '"{}/{}/pbmode.ico"'.format( + TOPSRCDIR, + CONFIG["MOZ_BRANDING_DIRECTORY"], +) + +DisableStlWrapping() + +with Files("**"): + BUG_COMPONENT = ("Firefox", "Shell Integration") diff --git a/browser/app/pbproxy/pbproxy.cpp b/browser/app/pbproxy/pbproxy.cpp new file mode 100644 index 0000000000..841cd654a1 --- /dev/null +++ b/browser/app/pbproxy/pbproxy.cpp @@ -0,0 +1,94 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <windows.h> +#include <processthreadsapi.h> +#include <winbase.h> +#include <winuser.h> +#include <shlwapi.h> +#include <string> + +// Max command line length, per CreateProcessW docs +#define MAX_CMD_LENGTH 32767 +#define EXTRA_ERR_MSG_LENGTH 39 +#define ERR_GET_OUR_PATH L"844fa30e-0860-11ed-898b-373276936058" +#define ERR_GET_APP_DIR L"811237de-0904-11ed-8745-c7c269742323" +#define ERR_GET_APP_EXE L"8964fd30-0860-11ed-8374-576505ba4488" +#define ERR_LAUNCHING_APP L"89d2ca2c-0860-11ed-883c-bf345b8391bc" + +void raiseError(DWORD err, std::wstring uuid) { + LPWSTR winerr; + if (err && ::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, err, 0, (LPWSTR)&winerr, 0, nullptr)) { + std::wstring errmsg(winerr); + errmsg += L"\n\n" + uuid; + ::MessageBoxW(nullptr, errmsg.c_str(), MOZ_APP_NAME " private_browsing.exe", + MB_OK | MB_ICONERROR | MB_SETFOREGROUND); + } else { + ::MessageBoxW(nullptr, uuid.c_str(), MOZ_APP_NAME " private_browsing.exe", + MB_OK | MB_ICONERROR | MB_SETFOREGROUND); + } +} + +/* + * A very simple wrapper that always launches Firefox in Private Browsing + * mode. Any arguments given to this program will be forwarded to Firefox, + * as well the information provided by GetStartupInfoW() (the latter is mainly + * done to ensure that Firefox's `launch_method` Telemetry works, which + * depends on shortcut information). + * + * Any errors that happen during this process will pop up a MessageBox + * with a Windows error (if present) and a unique UUID for debugability -- + * but these are very unlikely to be seen in practice. + */ +int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR aCmdLine, int) { + wchar_t app[MAX_PATH]; + DWORD ret = GetModuleFileNameW(nullptr, app, MAX_PATH); + if (!ret || + (ret == MAX_PATH && ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { + ret = ::GetLastError(); + raiseError(ret, ERR_GET_OUR_PATH); + return ret; + } + if (!PathRemoveFileSpecW(app)) { + raiseError(0, ERR_GET_APP_DIR); + return 1; + } + if (!PathAppendW(app, MOZ_APP_NAME L".exe")) { + raiseError(0, ERR_GET_APP_EXE); + return 1; + } + + std::wstring cmdLine(L"\""); + cmdLine += app; + cmdLine += L"\" -private-window"; + if (wcslen(aCmdLine) > 0) { + cmdLine += L" "; + cmdLine += aCmdLine; + } + DWORD creationFlags = CREATE_UNICODE_ENVIRONMENT; + // Mainly used to pass along shortcut information to ensure + // launch_method Telemetry will be accurate. + STARTUPINFOW startupInfo = {0}; + startupInfo.cb = sizeof(STARTUPINFOW); + GetStartupInfoW(&startupInfo); + PROCESS_INFORMATION pi; + + bool rv = + ::CreateProcessW(app, cmdLine.data(), nullptr, nullptr, FALSE, + creationFlags, nullptr, nullptr, &startupInfo, &pi); + + if (!rv) { + ret = ::GetLastError(); + raiseError(ret, ERR_LAUNCHING_APP); + return ret; + } + + ::CloseHandle(pi.hProcess); + ::CloseHandle(pi.hThread); + + return 0; +} diff --git a/browser/app/pbproxy/pbproxy.rc b/browser/app/pbproxy/pbproxy.rc new file mode 100644 index 0000000000..bb7489d03c --- /dev/null +++ b/browser/app/pbproxy/pbproxy.rc @@ -0,0 +1,9 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <windows.h> +#include "nsNativeAppSupportWin.h" + +IDI_APPICON ICON PBMODE_ICO |