540d88f809
* chore: bump chromium in DEPS to 126.0.6468.2 * chore: bump chromium in DEPS to 126.0.6478.4 * chore: bump chromium in DEPS to 126.0.6478.9 * chore: bump chromium in DEPS to 126.0.6478.8 * 5492605: Migrate TODOs referencing old crbug IDs to the new issue tracker IDs | https://chromium-review.googlesource.com/c/chromium/src/+/5492605 (cherry picked from commit 01bbc6b9609954e6f5e8ed2d7c5864e6f2a7929b) * 5513277: Move subresource-filter-ruleset to GCS | https://chromium-review.googlesource.com/c/chromium/src/+/5513277 (cherry picked from commit 284bbbdf86d640cfbe27831524a7cefa1f0ec344) * 5512656: Remove CustomizeChromeSupportsChromeRefresh2023 | https://chromium-review.googlesource.com/c/chromium/src/+/5512656 (cherry picked from commit 41acddd97e2f4f79dba13a3916c1af46d47fa6f5) * 5516009: Accept mouse events in inactive window for Top Chrome WebUIs | https://chromium-review.googlesource.com/c/chromium/src/+/5516009 (cherry picked from commit ffc88b3b2a7bee830a1e78b64afb6dfe6aff7347) * 5376861: Change references to RWHVB in RWHIER and RenderWidgetTargeter to RWHVI. | https://chromium-review.googlesource.com/c/chromium/src/+/5376861 (cherry picked from commit 5a48cf6952f0c3fde8a4d2b717ac5b2d50d13671) * 5490530: Use partition_alloc PA_BUILDFLAG(...) outside PA. #cleanup | https://chromium-review.googlesource.com/c/chromium/src/+/5490530 (cherry picked from commit 8deba32e729d3ded310be6645a27a78458046d69) * 5296870: network: Allow trusted loaders to learn the sent request cookies. | https://chromium-review.googlesource.com/c/chromium/src/+/5296870 (cherry picked from commit 7aef2f0ad890bb778fa8843bd262daf6909c5f52) * 5453438: Delegate delegated ink trails to RWHI from RWHIER. | https://chromium-review.googlesource.com/c/chromium/src/+/5453438 (cherry picked from commit 368eb3924a3b9b58430c7340b930254a3db6f1a3) * chore: update patches (cherry picked from commit 9d6dac074b0f173e43d8e587edbe7de1565de3d6) * chore: update patches (cherry picked from commit fb4134d68204ea85a095d496b31216905f801878) * update patches (cherry picked from commit 6f6fff5b0b08c4cccdbc98950f8cbb399caf6340) * only disable enterprise_cloud_content_analysis (cherry picked from commit 5426d227ee5f4ce60ed3f1c863fe506ee706e78b) * 5403888: [api] support v8::Data in v8::TracedReference and v8::EmbedderGraph https://chromium-review.googlesource.com/c/v8/v8/+/5403888 (cherry picked from commit 2030447cf5bbce26b73e2e9b054dee38438f9fdd) * chore: update patches * chore: fixup patch * 5465511: [api] Mark v8::ObjectTemplate::SetAccessor(..) for deprecation https://chromium-review.googlesource.com/c/v8/v8/+/5465511 * 5513528: Move service_provider_config files to components/enterprise/connectors/ https://chromium-review.googlesource.com/c/chromium/src/+/5513528 * chore: bump chromium in DEPS to 126.0.6478.17 * chore: bump chromium in DEPS to 126.0.6478.26 * chore: update patches * build: use Sha256Sum in script/sysroots.json Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5506275 (cherry picked from commit fccef2b6ba8769da9d8b1bd81fda5cc61b2086e0) * fixup! build: use Sha256Sum in script/sysroots.json `sync` succeeds now (cherry picked from commit e71852729fbf3575d1bc37774deadddfebdeefb4) * chore: cherry-pick Node.js patch for V8 API removal fix Node.js PR: https://github.com/nodejs/node/pull/52996 V8 API Removal CL: https://chromium-review.googlesource.com/c/v8/v8/+/5539888 See the patch description for more details. (cherry picked from commit ef0c441dbaa97478828ad481a39d0c2c93748729) * chore: revert v8 deprecation See patch message for more details. https://chromium-review.googlesource.com/c/v8/v8/+/5526611 (cherry picked from commit 6f03785eadea8d8629970c24393f0900fc3fa4af) * chore: revert v8 removal https://chromium-review.googlesource.com/c/v8/v8/+/5497515 See patch message for more details. (cherry picked from commit 4fd7f5bbb603b0461482fee027de7bfdbf02ceac) * 5522321: [devtools] Support saving base64 encoded files via host bindings https://chromium-review.googlesource.com/c/chromium/src/+/5522321 (cherry picked from commit 4b5f43d7838062834de6d634033fe10af2f9d01a) * fixup! 5465511: [api] Mark v8::ObjectTemplate::SetAccessor(..) for deprecation https://chromium-review.googlesource.com/c/v8/v8/+/5465511 (cherry picked from commit 368005f2b2f9195bcffb5325041e3ff1041a3830) * 5514687: Reland "Add a secret handshake to the base::Feature constructor" https://chromium-review.googlesource.com/c/chromium/src/+/5514687 (cherry picked from commit 142c6e16b10496b3fffddc9924001fb94096852e) * 5512176: Remove OnEnvironmentEstimationComplete() https://chromium-review.googlesource.com/c/chromium/src/+/5512176 (cherry picked from commit 1e20ffb24ef6d0b0aeec8c314393cb77631ab279) * 5539888: [api] Remove several APIs deprecated in version 12.6 https://chromium-review.googlesource.com/c/v8/v8/+/5539888 This commit essentially only removes the `only_terminate_in_safe_scope` isolate creation parameter. This undoes some work that was originally done in #35766. (cherry picked from commit ceb6182b199e2471c64700203bf42b73052a38c6) * 5492183: Extensions: CodeHealth: Give enums some class https://chromium-review.googlesource.com/c/chromium/src/+/5492183 (cherry picked from commit a11b8e637cdc0868b6152dd5b0ed3b582f446aa7) * 5483406: [PEPC] Make PEPC permission subscription take into account device status https://chromium-review.googlesource.com/c/chromium/src/+/5483406 (cherry picked from commit fc93c876b481a988a6c1d5eb69d97035dc5ad64a) * 5463431: iwa: Only create IsolatedWebAppURLLoaderFactory for subresources in IWAs https://chromium-review.googlesource.com/c/chromium/src/+/5463431 (cherry picked from commit fbfe3c998c8251f28b76c2703a3212b5b0175a84) * 5502081: Migrate OnDisplayRemoved to OnDisplaysRemoved https://chromium-review.googlesource.com/c/chromium/src/+/5502081 (cherry picked from commit ccf9a5137efdf2ca18d9ee9851388338c26d036e) * 5376861: Change references to RWHVB in RWHIER and RenderWidgetTargeter to RWHVI. https://chromium-review.googlesource.com/c/chromium/src/+/5376861 (cherry picked from commit fd3e6ce148b3c5ab27e234d28b9405933ba32b14) * fixup! 5530163: [media] Use VideoFrame::Plane typed enum instead of nameless enum https://chromium-review.googlesource.com/c/chromium/src/+/5530163 (cherry picked from commit 9a900e734a8c08e534317ca4d7411bfadd9087f5) * 5530163: [media] Use VideoFrame::Plane typed enum instead of nameless enum https://chromium-review.googlesource.com/c/chromium/src/+/5530163 (cherry picked from commit fd94de9736125c3121aed99f50f2702fc430ba26) * 5466238: PDF Viewer: add metrics to record if PDF is opened with a11y https://chromium-review.googlesource.com/c/chromium/src/+/5466238 (cherry picked from commit 2abb5d1737083241b6b6a4c05d5982693e956a22) * 5513740: Reland "[Extensions] Restructure extensions::ProcessMap" https://chromium-review.googlesource.com/c/chromium/src/+/5513740 (cherry picked from commit 11905a9840f1e8dce21cfdda1a23f328e8ff6a6a) * 5498236: Make browser_tests force full async initialization for OSCrypt Async https://chromium-review.googlesource.com/c/chromium/src/+/5498236 (cherry picked from commit e00faacb58545c37cfbf8a38a0cbe4ccb9f9df06) * fixup: only disable enterprise_cloud_content_analysis The original commita5480accc2
, was due to this CL 5527572: Move Connectors prefs files to components/enterprise/connectors/ | https://chromium-review.googlesource.com/c/chromium/src/+/5527572 (cherry picked from commit b0e2a7eab6c0decf982f913a892d5dfdb2501084) * chore: update patches * fixup: 5539888: [api] Remove several APIs deprecated in version 12.6 (cherry picked from commit ae65fea668baad44cac7073cbe0a64bca36bccac) * views: use CalculatePreferredSize(SizeBounds) in '/chrome/browser/ui/views/[frame, infobars, /test]'. https://chromium-review.googlesource.com/c/chromium/src/+/5493169 Needed because of 5504212: views: remove CalculatePreferredSize() | https://chromium-review.googlesource.com/c/chromium/src/+/5504212 * fixup: views: use CalculatePreferredSize(SizeBounds) * 5499157: Enable kBlockMidiByDefault by default https://chromium-review.googlesource.com/c/chromium/src/+/5499157 * 5518756: Reland^2: [heap] Add shared trusted spaces | https://chromium-review.googlesource.com/c/v8/v8/+/5518756ececfe7aea
* chore: bump chromium in DEPS to 126.0.6478.36 * chore: update patches * chore: add currently-unused should_include_device_status arg to GetPermissionStatusForCurrentDocument() Xref: https://chromium-review.googlesource.com/c/chromium/src/+/5545382 (cherry picked from commit bc35c93efd2d3301e33116d2dd09abaf8eddbf70) --------- Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Keeley Hammond <khammond@slack-corp.com> Co-authored-by: VerteDinde <vertedinde@electronjs.org> Co-authored-by: Jeremy Rose <nornagon@nornagon.net> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: clavin <clavin@electronjs.org> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
344 lines
15 KiB
Diff
344 lines
15 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Raymond Zhao <raymondzhao@microsoft.com>
|
|
Date: Tue, 7 Sep 2021 14:54:25 -0700
|
|
Subject: feat: Add data parameter to ProcessSingleton
|
|
|
|
This patch adds an additional_data parameter to the constructor of
|
|
ProcessSingleton, so that the second instance can send additional
|
|
data over to the first instance while requesting the ProcessSingleton
|
|
lock.
|
|
|
|
On the Electron side, we then expose an extra parameter to the
|
|
app.requestSingleInstanceLock API so that users can pass in a JSON
|
|
object for the second instance to send to the first instance.
|
|
|
|
diff --git a/chrome/browser/process_singleton.h b/chrome/browser/process_singleton.h
|
|
index 31f5b160e4cd755cfb56a62b04261ee1bee80277..8dbc5ac458481d2f805f90101069f02adcfe4090 100644
|
|
--- a/chrome/browser/process_singleton.h
|
|
+++ b/chrome/browser/process_singleton.h
|
|
@@ -18,6 +18,7 @@
|
|
#include "base/functional/callback.h"
|
|
#include "base/memory/ref_counted.h"
|
|
#include "base/process/process.h"
|
|
+#include "base/containers/span.h"
|
|
#include "ui/gfx/native_widget_types.h"
|
|
|
|
#if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
|
|
@@ -100,21 +101,24 @@ class ProcessSingleton {
|
|
// should handle it (i.e., because the current process is shutting down).
|
|
using NotificationCallback =
|
|
base::RepeatingCallback<bool(base::CommandLine command_line,
|
|
- const base::FilePath& current_directory)>;
|
|
+ const base::FilePath& current_directory,
|
|
+ const std::vector<uint8_t> additional_data)>;
|
|
|
|
#if BUILDFLAG(IS_WIN)
|
|
ProcessSingleton(const std::string& program_name,
|
|
const base::FilePath& user_data_dir,
|
|
+ const base::span<const uint8_t> additional_data,
|
|
bool is_sandboxed,
|
|
const NotificationCallback& notification_callback);
|
|
#else
|
|
ProcessSingleton(const base::FilePath& user_data_dir,
|
|
+ const base::span<const uint8_t> additional_data,
|
|
const NotificationCallback& notification_callback);
|
|
+#endif
|
|
|
|
ProcessSingleton(const ProcessSingleton&) = delete;
|
|
ProcessSingleton& operator=(const ProcessSingleton&) = delete;
|
|
|
|
-#endif
|
|
~ProcessSingleton();
|
|
|
|
// Notify another process, if available. Otherwise sets ourselves as the
|
|
@@ -178,7 +182,10 @@ class ProcessSingleton {
|
|
#endif
|
|
|
|
private:
|
|
+ // A callback to run when the first instance receives data from the second.
|
|
NotificationCallback notification_callback_; // Handler for notifications.
|
|
+ // Custom data to pass to the other instance during notify.
|
|
+ base::span<const uint8_t> additional_data_;
|
|
|
|
#if BUILDFLAG(IS_WIN)
|
|
bool EscapeVirtualization(const base::FilePath& user_data_dir);
|
|
diff --git a/chrome/browser/process_singleton_posix.cc b/chrome/browser/process_singleton_posix.cc
|
|
index 32b086c726abc3b825216548149ff164c8c1faf7..d029c4a3e46e8bee9206d677a03b93e0485d4b74 100644
|
|
--- a/chrome/browser/process_singleton_posix.cc
|
|
+++ b/chrome/browser/process_singleton_posix.cc
|
|
@@ -610,6 +610,7 @@ class ProcessSingleton::LinuxWatcher
|
|
// |reader| is for sending back ACK message.
|
|
void HandleMessage(const std::string& current_dir,
|
|
const std::vector<std::string>& argv,
|
|
+ const std::vector<uint8_t> additional_data,
|
|
SocketReader* reader);
|
|
|
|
// Called when the ProcessSingleton that owns this class is about to be
|
|
@@ -669,13 +670,17 @@ void ProcessSingleton::LinuxWatcher::StartListening(int socket) {
|
|
}
|
|
|
|
void ProcessSingleton::LinuxWatcher::HandleMessage(
|
|
- const std::string& current_dir, const std::vector<std::string>& argv,
|
|
+ const std::string& current_dir,
|
|
+ const std::vector<std::string>& argv,
|
|
+ const std::vector<uint8_t> additional_data,
|
|
SocketReader* reader) {
|
|
DCHECK(ui_task_runner_->BelongsToCurrentThread());
|
|
DCHECK(reader);
|
|
|
|
if (parent_ && parent_->notification_callback_.Run(
|
|
- base::CommandLine(argv), base::FilePath(current_dir))) {
|
|
+ base::CommandLine(argv),
|
|
+ base::FilePath(current_dir),
|
|
+ std::move(additional_data))) {
|
|
// Send back "ACK" message to prevent the client process from starting up.
|
|
reader->FinishWithACK(kACKToken, std::size(kACKToken) - 1);
|
|
} else {
|
|
@@ -723,7 +728,8 @@ void ProcessSingleton::LinuxWatcher::SocketReader::
|
|
}
|
|
}
|
|
|
|
- // Validate the message. The shortest message is kStartToken\0x\0x
|
|
+ // Validate the message. The shortest message kStartToken\0\00
|
|
+ // The shortest message with additional data is kStartToken\0\00\00\0.
|
|
const size_t kMinMessageLength = std::size(kStartToken) + 4;
|
|
if (bytes_read_ < kMinMessageLength) {
|
|
buf_[bytes_read_] = 0;
|
|
@@ -753,10 +759,28 @@ void ProcessSingleton::LinuxWatcher::SocketReader::
|
|
tokens.erase(tokens.begin());
|
|
tokens.erase(tokens.begin());
|
|
|
|
+ size_t num_args;
|
|
+ base::StringToSizeT(tokens[0], &num_args);
|
|
+ std::vector<std::string> command_line(tokens.begin() + 1, tokens.begin() + 1 + num_args);
|
|
+
|
|
+ std::vector<uint8_t> additional_data;
|
|
+ if (tokens.size() >= 3 + num_args) {
|
|
+ size_t additional_data_size;
|
|
+ base::StringToSizeT(tokens[1 + num_args], &additional_data_size);
|
|
+ std::string remaining_args = base::JoinString(
|
|
+ base::make_span(tokens.begin() + 2 + num_args, tokens.end()),
|
|
+ std::string(1, kTokenDelimiter));
|
|
+ const uint8_t* additional_data_bits =
|
|
+ reinterpret_cast<const uint8_t*>(remaining_args.c_str());
|
|
+ additional_data = std::vector<uint8_t>(
|
|
+ additional_data_bits, additional_data_bits + additional_data_size);
|
|
+ }
|
|
+
|
|
// Return to the UI thread to handle opening a new browser tab.
|
|
ui_task_runner_->PostTask(
|
|
FROM_HERE, base::BindOnce(&ProcessSingleton::LinuxWatcher::HandleMessage,
|
|
- parent_, current_dir, tokens, this));
|
|
+ parent_, current_dir, command_line,
|
|
+ std::move(additional_data), this));
|
|
fd_watch_controller_.reset();
|
|
|
|
// LinuxWatcher::HandleMessage() is in charge of destroying this SocketReader
|
|
@@ -785,8 +809,10 @@ void ProcessSingleton::LinuxWatcher::SocketReader::FinishWithACK(
|
|
//
|
|
ProcessSingleton::ProcessSingleton(
|
|
const base::FilePath& user_data_dir,
|
|
+ const base::span<const uint8_t> additional_data,
|
|
const NotificationCallback& notification_callback)
|
|
: notification_callback_(notification_callback),
|
|
+ additional_data_(additional_data),
|
|
current_pid_(base::GetCurrentProcId()) {
|
|
socket_path_ = user_data_dir.Append(chrome::kSingletonSocketFilename);
|
|
lock_path_ = user_data_dir.Append(chrome::kSingletonLockFilename);
|
|
@@ -907,7 +933,8 @@ ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcessWithTimeout(
|
|
sizeof(socket_timeout));
|
|
|
|
// Found another process, prepare our command line
|
|
- // format is "START\0<current dir>\0<argv[0]>\0...\0<argv[n]>".
|
|
+ // format is "START\0<current-dir>\0<n-args>\0<argv[0]>\0...\0<argv[n]>
|
|
+ // \0<additional-data-length>\0<additional-data>".
|
|
std::string to_send(kStartToken);
|
|
to_send.push_back(kTokenDelimiter);
|
|
|
|
@@ -917,11 +944,21 @@ ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcessWithTimeout(
|
|
to_send.append(current_dir.value());
|
|
|
|
const std::vector<std::string>& argv = cmd_line.argv();
|
|
+ to_send.push_back(kTokenDelimiter);
|
|
+ to_send.append(base::NumberToString(argv.size()));
|
|
for (auto it = argv.begin(); it != argv.end(); ++it) {
|
|
to_send.push_back(kTokenDelimiter);
|
|
to_send.append(*it);
|
|
}
|
|
|
|
+ size_t data_to_send_size = additional_data_.size_bytes();
|
|
+ if (data_to_send_size) {
|
|
+ to_send.push_back(kTokenDelimiter);
|
|
+ to_send.append(base::NumberToString(data_to_send_size));
|
|
+ to_send.push_back(kTokenDelimiter);
|
|
+ to_send.append(reinterpret_cast<const char*>(additional_data_.data()), data_to_send_size);
|
|
+ }
|
|
+
|
|
// Send the message
|
|
if (!WriteToSocket(socket.fd(), to_send.data(), to_send.length())) {
|
|
// Try to kill the other process, because it might have been dead.
|
|
diff --git a/chrome/browser/process_singleton_win.cc b/chrome/browser/process_singleton_win.cc
|
|
index a0ef81d42bd9a58786b00a1601625e6822bc26f6..27da17eed8fcd69b32dd1f409f6a2efd46a40d88 100644
|
|
--- a/chrome/browser/process_singleton_win.cc
|
|
+++ b/chrome/browser/process_singleton_win.cc
|
|
@@ -81,10 +81,12 @@ BOOL CALLBACK BrowserWindowEnumeration(HWND window, LPARAM param) {
|
|
|
|
bool ParseCommandLine(const COPYDATASTRUCT* cds,
|
|
base::CommandLine* parsed_command_line,
|
|
- base::FilePath* current_directory) {
|
|
+ base::FilePath* current_directory,
|
|
+ std::vector<uint8_t>* parsed_additional_data) {
|
|
// We should have enough room for the shortest command (min_message_size)
|
|
// and also be a multiple of wchar_t bytes. The shortest command
|
|
- // possible is L"START\0\0" (empty current directory and command line).
|
|
+ // possible is L"START\0\0" (empty command line, current directory,
|
|
+ // and additional data).
|
|
static const int min_message_size = 7;
|
|
if (cds->cbData < min_message_size * sizeof(wchar_t) ||
|
|
cds->cbData % sizeof(wchar_t) != 0) {
|
|
@@ -134,6 +136,37 @@ bool ParseCommandLine(const COPYDATASTRUCT* cds,
|
|
const std::wstring cmd_line =
|
|
msg.substr(second_null + 1, third_null - second_null);
|
|
*parsed_command_line = base::CommandLine::FromString(cmd_line);
|
|
+
|
|
+ const std::wstring::size_type fourth_null =
|
|
+ msg.find_first_of(L'\0', third_null + 1);
|
|
+ if (fourth_null == std::wstring::npos ||
|
|
+ fourth_null == msg.length()) {
|
|
+ // No additional data was provided.
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ // Get length of the additional data.
|
|
+ const std::wstring additional_data_length_string =
|
|
+ msg.substr(third_null + 1, fourth_null - third_null);
|
|
+ size_t additional_data_length;
|
|
+ base::StringToSizeT(additional_data_length_string, &additional_data_length);
|
|
+
|
|
+ const std::wstring::size_type fifth_null =
|
|
+ msg.find_first_of(L'\0', fourth_null + 1);
|
|
+ if (fifth_null == std::wstring::npos ||
|
|
+ fifth_null == msg.length()) {
|
|
+ LOG(WARNING) << "Invalid format for start command, we need a string in 6 "
|
|
+ "parts separated by NULLs";
|
|
+ }
|
|
+
|
|
+ // Get the actual additional data.
|
|
+ const std::wstring additional_data =
|
|
+ msg.substr(fourth_null + 1, fifth_null - fourth_null);
|
|
+ const uint8_t* additional_data_bytes =
|
|
+ reinterpret_cast<const uint8_t*>(additional_data.c_str());
|
|
+ *parsed_additional_data = std::vector<uint8_t>(additional_data_bytes,
|
|
+ additional_data_bytes + additional_data_length);
|
|
+
|
|
return true;
|
|
}
|
|
return false;
|
|
@@ -155,13 +188,14 @@ bool ProcessLaunchNotification(
|
|
|
|
base::CommandLine parsed_command_line(base::CommandLine::NO_PROGRAM);
|
|
base::FilePath current_directory;
|
|
- if (!ParseCommandLine(cds, &parsed_command_line, ¤t_directory)) {
|
|
+ std::vector<uint8_t> additional_data;
|
|
+ if (!ParseCommandLine(cds, &parsed_command_line, ¤t_directory, &additional_data)) {
|
|
*result = TRUE;
|
|
return true;
|
|
}
|
|
|
|
- *result = notification_callback.Run(parsed_command_line, current_directory) ?
|
|
- TRUE : FALSE;
|
|
+ *result = notification_callback.Run(parsed_command_line,
|
|
+ current_directory, std::move(additional_data)) ? TRUE : FALSE;
|
|
return true;
|
|
}
|
|
|
|
@@ -265,9 +299,11 @@ bool ProcessSingleton::EscapeVirtualization(
|
|
ProcessSingleton::ProcessSingleton(
|
|
const std::string& program_name,
|
|
const base::FilePath& user_data_dir,
|
|
+ const base::span<const uint8_t> additional_data,
|
|
bool is_app_sandboxed,
|
|
const NotificationCallback& notification_callback)
|
|
: notification_callback_(notification_callback),
|
|
+ additional_data_(additional_data),
|
|
program_name_(program_name),
|
|
is_app_sandboxed_(is_app_sandboxed),
|
|
is_virtualized_(false),
|
|
@@ -294,7 +330,7 @@ ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcess() {
|
|
return PROCESS_NONE;
|
|
}
|
|
|
|
- switch (chrome::AttemptToNotifyRunningChrome(remote_window_)) {
|
|
+ switch (chrome::AttemptToNotifyRunningChrome(remote_window_, additional_data_)) {
|
|
case chrome::NOTIFY_SUCCESS:
|
|
return PROCESS_NOTIFIED;
|
|
case chrome::NOTIFY_FAILED:
|
|
diff --git a/chrome/browser/win/chrome_process_finder.cc b/chrome/browser/win/chrome_process_finder.cc
|
|
index f572b9db19cc1341cf0493d7486bb484121e7384..5b053e160d4653cd6de7eabc37e3b4a264a6c2c7 100644
|
|
--- a/chrome/browser/win/chrome_process_finder.cc
|
|
+++ b/chrome/browser/win/chrome_process_finder.cc
|
|
@@ -41,7 +41,9 @@ HWND FindRunningChromeWindow(const base::FilePath& user_data_dir) {
|
|
return base::win::MessageWindow::FindWindow(user_data_dir.value());
|
|
}
|
|
|
|
-NotifyChromeResult AttemptToNotifyRunningChrome(HWND remote_window) {
|
|
+NotifyChromeResult AttemptToNotifyRunningChrome(
|
|
+ HWND remote_window,
|
|
+ const base::span<const uint8_t> additional_data) {
|
|
TRACE_EVENT0("startup", "AttemptToNotifyRunningChrome");
|
|
|
|
DCHECK(remote_window);
|
|
@@ -70,12 +72,29 @@ NotifyChromeResult AttemptToNotifyRunningChrome(HWND remote_window) {
|
|
new_command_line.AppendSwitchNative(switches::kSourceShortcut, si.lpTitle);
|
|
|
|
// Send the command line to the remote chrome window.
|
|
- // Format is "START\0<<<current directory>>>\0<<<commandline>>>".
|
|
+ // Format is
|
|
+ // "START\0<current-directory>\0<command-line>\0<additional-data-length>\0<additional-data>".
|
|
std::wstring to_send = base::StrCat(
|
|
{std::wstring_view{L"START\0", 6}, cur_dir.value(),
|
|
std::wstring_view{L"\0", 1}, new_command_line.GetCommandLineString(),
|
|
std::wstring_view{L"\0", 1}});
|
|
|
|
+ size_t additional_data_size = additional_data.size_bytes();
|
|
+ if (additional_data_size) {
|
|
+ // Send over the size, because the reinterpret cast to wchar_t could
|
|
+ // add padding.
|
|
+ to_send.append(base::UTF8ToWide(base::NumberToString(additional_data_size)));
|
|
+ to_send.append(L"\0", 1); // Null separator.
|
|
+
|
|
+ size_t padded_size = additional_data_size / sizeof(wchar_t);
|
|
+ if (additional_data_size % sizeof(wchar_t) != 0) {
|
|
+ padded_size++;
|
|
+ }
|
|
+ to_send.append(reinterpret_cast<const wchar_t*>(additional_data.data()),
|
|
+ padded_size);
|
|
+ to_send.append(L"\0", 1); // Null separator.
|
|
+ }
|
|
+
|
|
// Allow the current running browser window to make itself the foreground
|
|
// window (otherwise it will just flash in the taskbar).
|
|
::AllowSetForegroundWindow(process_id);
|
|
diff --git a/chrome/browser/win/chrome_process_finder.h b/chrome/browser/win/chrome_process_finder.h
|
|
index ddea93de709db5967a353bb73d433737c6aac40c..43c6896923032ffa16a0df4efd48a42f869c15d7 100644
|
|
--- a/chrome/browser/win/chrome_process_finder.h
|
|
+++ b/chrome/browser/win/chrome_process_finder.h
|
|
@@ -7,6 +7,7 @@
|
|
|
|
#include <windows.h>
|
|
|
|
+#include "base/containers/span.h"
|
|
#include "base/time/time.h"
|
|
|
|
namespace base {
|
|
@@ -27,7 +28,9 @@ HWND FindRunningChromeWindow(const base::FilePath& user_data_dir);
|
|
// Attempts to send the current command line to an already running instance of
|
|
// Chrome via a WM_COPYDATA message.
|
|
// Returns true if a running Chrome is found and successfully notified.
|
|
-NotifyChromeResult AttemptToNotifyRunningChrome(HWND remote_window);
|
|
+NotifyChromeResult AttemptToNotifyRunningChrome(
|
|
+ HWND remote_window,
|
|
+ const base::span<const uint8_t> additional_data);
|
|
|
|
// Changes the notification timeout to |new_timeout|, returns the old timeout.
|
|
base::TimeDelta SetNotificationTimeoutForTesting(base::TimeDelta new_timeout);
|