Commit 6a532277 authored by Jason Lin's avatar Jason Lin Committed by Commit Bot

terminalPrivate.openVmshellProcess accepts arg --cwd=terminal_id:<id>

...in which case, the new vmshell will have the CWD the same as the
terminal with the id.

Bug: 1113207
Change-Id: I9cc49c5fde3c58eeebb8707c4190040a15dd2ac6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2532340Reviewed-by: default avatarToni Baržić <tbarzic@chromium.org>
Reviewed-by: default avatarJoel Hockey <joelhockey@chromium.org>
Commit-Queue: Jason Lin <lxj@google.com>
Auto-Submit: Jason Lin <lxj@google.com>
Cr-Commit-Position: refs/heads/master@{#828952}
parent fd20a5cf
......@@ -18,6 +18,7 @@
#include "base/lazy_instance.h"
#include "base/memory/scoped_refptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/system/sys_info.h"
#include "base/values.h"
......@@ -75,7 +76,7 @@ const char kSwitchTargetContainer[] = "target_container";
const char kSwitchStartupId[] = "startup_id";
const char kSwitchCurrentWorkingDir[] = "cwd";
int32_t g_last_active_pid = 0;
const char kCwdTerminalIdPrefix[] = "terminal_id:";
class TerminalTabHelper
: public content::WebContentsUserData<TerminalTabHelper> {
......@@ -169,10 +170,6 @@ void PreferenceChanged(Profile* profile,
}
}
void SetLastActiveTerminal(const std::string& terminal_id) {
// TODO(crbug.com/1113207): disable this until we have a better cwd solution.
}
} // namespace
namespace extensions {
......@@ -323,30 +320,36 @@ void TerminalPrivateOpenTerminalProcessFunction::OnCrostiniRestarted(
void TerminalPrivateOpenTerminalProcessFunction::OpenVmshellProcess(
const std::string& user_id_hash,
base::CommandLine cmdline) {
// If cwd is already set in cmdline, or this is the first terminal, open now.
if (cmdline.HasSwitch(kSwitchCurrentWorkingDir) || !g_last_active_pid) {
const std::string cwd = cmdline.GetSwitchValueASCII(kSwitchCurrentWorkingDir);
if (!base::StartsWith(cwd, kCwdTerminalIdPrefix)) {
return OpenProcess(user_id_hash, std::move(cmdline));
}
// The cwd has this format `terminal_id:<terminal_id>`. We need to convert the
// terminal id to the pid of the shell process inside the container.
int host_pid = chromeos::ProcessProxyRegistry::ConvertToSystemPID(
cwd.substr(sizeof(kCwdTerminalIdPrefix) - 1));
// Lookup container shell pid from cicierone to use for cwd.
crostini::CrostiniManager::GetForProfile(
Profile::FromBrowserContext(browser_context()))
->GetVshSession(
crostini::ContainerId::GetDefault(), g_last_active_pid,
crostini::ContainerId::GetDefault(), host_pid,
base::BindOnce(
&TerminalPrivateOpenTerminalProcessFunction::OnGetVshSession,
this, user_id_hash, std::move(cmdline), g_last_active_pid));
this, user_id_hash, std::move(cmdline), /*terminal_id=*/cwd));
}
void TerminalPrivateOpenTerminalProcessFunction::OnGetVshSession(
const std::string& user_id_hash,
base::CommandLine cmdline,
int32_t vsh_pid,
const std::string& terminal_id,
bool success,
const std::string& failure_reason,
int32_t container_shell_pid) {
if (!success) {
LOG(WARNING) << "Failed to get vsh session for " << vsh_pid << ". "
LOG(WARNING) << "Failed to get vsh session for " << terminal_id << ". "
<< failure_reason;
} else {
cmdline.AppendSwitchASCII(kSwitchCurrentWorkingDir,
......@@ -409,7 +412,6 @@ void TerminalPrivateOpenTerminalProcessFunction::RespondOnUIThread(
Respond(Error("Failed to open process."));
return;
}
SetLastActiveTerminal(terminal_id);
Respond(OneArgument(base::Value(terminal_id)));
TerminalTabHelper::CreateForWebContents(contents);
......@@ -441,7 +443,6 @@ ExtensionFunction::ResponseAction TerminalPrivateSendInputFunction::Run() {
return RespondNow(Error("invalid terminal id"));
}
SetLastActiveTerminal(params->id);
// Registry lives on its own task runner.
chromeos::ProcessProxyRegistry::GetTaskRunner()->PostTask(
......@@ -526,8 +527,6 @@ TerminalPrivateOnTerminalResizeFunction::Run() {
return RespondNow(Error("invalid terminal id"));
}
SetLastActiveTerminal(params->id);
// Registry lives on its own task runner.
chromeos::ProcessProxyRegistry::GetTaskRunner()->PostTask(
FROM_HERE,
......
......@@ -70,7 +70,7 @@ class TerminalPrivateOpenTerminalProcessFunction : public ExtensionFunction {
void OnGetVshSession(const std::string& user_id_hash,
base::CommandLine cmdline,
int32_t vsh_pid,
const std::string& terminal_id,
bool success,
const std::string& failure_reason,
int32_t container_shell_pid);
......
......@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "chromeos/process_proxy/process_proxy_registry.h"
#include "base/strings/string_number_conversions.h"
#include "base/bind.h"
#include "base/command_line.h"
......@@ -74,6 +75,14 @@ ProcessProxyRegistry* ProcessProxyRegistry::Get() {
return g_process_proxy_registry.Pointer();
}
// static
int ProcessProxyRegistry::ConvertToSystemPID(const std::string& id) {
// The `id` is <pid>-<guid>. `base::StringToInt()` will parse until the '-'.
int out;
base::StringToInt(id, &out);
return out;
}
// static
scoped_refptr<base::SequencedTaskRunner> ProcessProxyRegistry::GetTaskRunner() {
static base::LazyThreadPoolSequencedTaskRunner task_runner =
......
......@@ -44,6 +44,9 @@ class CHROMEOS_EXPORT ProcessProxyRegistry {
static ProcessProxyRegistry* Get();
// Converts the id returned by OpenProcess() to the system pid.
static int ConvertToSystemPID(const std::string& id);
// Returns a SequencedTaskRunner where the singleton instance of
// ProcessProxyRegistry lives.
static scoped_refptr<base::SequencedTaskRunner> GetTaskRunner();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment