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 @@ ...@@ -18,6 +18,7 @@
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/system/sys_info.h" #include "base/system/sys_info.h"
#include "base/values.h" #include "base/values.h"
...@@ -75,7 +76,7 @@ const char kSwitchTargetContainer[] = "target_container"; ...@@ -75,7 +76,7 @@ const char kSwitchTargetContainer[] = "target_container";
const char kSwitchStartupId[] = "startup_id"; const char kSwitchStartupId[] = "startup_id";
const char kSwitchCurrentWorkingDir[] = "cwd"; const char kSwitchCurrentWorkingDir[] = "cwd";
int32_t g_last_active_pid = 0; const char kCwdTerminalIdPrefix[] = "terminal_id:";
class TerminalTabHelper class TerminalTabHelper
: public content::WebContentsUserData<TerminalTabHelper> { : public content::WebContentsUserData<TerminalTabHelper> {
...@@ -169,10 +170,6 @@ void PreferenceChanged(Profile* profile, ...@@ -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
namespace extensions { namespace extensions {
...@@ -323,30 +320,36 @@ void TerminalPrivateOpenTerminalProcessFunction::OnCrostiniRestarted( ...@@ -323,30 +320,36 @@ void TerminalPrivateOpenTerminalProcessFunction::OnCrostiniRestarted(
void TerminalPrivateOpenTerminalProcessFunction::OpenVmshellProcess( void TerminalPrivateOpenTerminalProcessFunction::OpenVmshellProcess(
const std::string& user_id_hash, const std::string& user_id_hash,
base::CommandLine cmdline) { base::CommandLine cmdline) {
// If cwd is already set in cmdline, or this is the first terminal, open now. const std::string cwd = cmdline.GetSwitchValueASCII(kSwitchCurrentWorkingDir);
if (cmdline.HasSwitch(kSwitchCurrentWorkingDir) || !g_last_active_pid) {
if (!base::StartsWith(cwd, kCwdTerminalIdPrefix)) {
return OpenProcess(user_id_hash, std::move(cmdline)); 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. // Lookup container shell pid from cicierone to use for cwd.
crostini::CrostiniManager::GetForProfile( crostini::CrostiniManager::GetForProfile(
Profile::FromBrowserContext(browser_context())) Profile::FromBrowserContext(browser_context()))
->GetVshSession( ->GetVshSession(
crostini::ContainerId::GetDefault(), g_last_active_pid, crostini::ContainerId::GetDefault(), host_pid,
base::BindOnce( base::BindOnce(
&TerminalPrivateOpenTerminalProcessFunction::OnGetVshSession, &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( void TerminalPrivateOpenTerminalProcessFunction::OnGetVshSession(
const std::string& user_id_hash, const std::string& user_id_hash,
base::CommandLine cmdline, base::CommandLine cmdline,
int32_t vsh_pid, const std::string& terminal_id,
bool success, bool success,
const std::string& failure_reason, const std::string& failure_reason,
int32_t container_shell_pid) { int32_t container_shell_pid) {
if (!success) { if (!success) {
LOG(WARNING) << "Failed to get vsh session for " << vsh_pid << ". " LOG(WARNING) << "Failed to get vsh session for " << terminal_id << ". "
<< failure_reason; << failure_reason;
} else { } else {
cmdline.AppendSwitchASCII(kSwitchCurrentWorkingDir, cmdline.AppendSwitchASCII(kSwitchCurrentWorkingDir,
...@@ -409,7 +412,6 @@ void TerminalPrivateOpenTerminalProcessFunction::RespondOnUIThread( ...@@ -409,7 +412,6 @@ void TerminalPrivateOpenTerminalProcessFunction::RespondOnUIThread(
Respond(Error("Failed to open process.")); Respond(Error("Failed to open process."));
return; return;
} }
SetLastActiveTerminal(terminal_id);
Respond(OneArgument(base::Value(terminal_id))); Respond(OneArgument(base::Value(terminal_id)));
TerminalTabHelper::CreateForWebContents(contents); TerminalTabHelper::CreateForWebContents(contents);
...@@ -441,7 +443,6 @@ ExtensionFunction::ResponseAction TerminalPrivateSendInputFunction::Run() { ...@@ -441,7 +443,6 @@ ExtensionFunction::ResponseAction TerminalPrivateSendInputFunction::Run() {
return RespondNow(Error("invalid terminal id")); return RespondNow(Error("invalid terminal id"));
} }
SetLastActiveTerminal(params->id);
// Registry lives on its own task runner. // Registry lives on its own task runner.
chromeos::ProcessProxyRegistry::GetTaskRunner()->PostTask( chromeos::ProcessProxyRegistry::GetTaskRunner()->PostTask(
...@@ -526,8 +527,6 @@ TerminalPrivateOnTerminalResizeFunction::Run() { ...@@ -526,8 +527,6 @@ TerminalPrivateOnTerminalResizeFunction::Run() {
return RespondNow(Error("invalid terminal id")); return RespondNow(Error("invalid terminal id"));
} }
SetLastActiveTerminal(params->id);
// Registry lives on its own task runner. // Registry lives on its own task runner.
chromeos::ProcessProxyRegistry::GetTaskRunner()->PostTask( chromeos::ProcessProxyRegistry::GetTaskRunner()->PostTask(
FROM_HERE, FROM_HERE,
......
...@@ -70,7 +70,7 @@ class TerminalPrivateOpenTerminalProcessFunction : public ExtensionFunction { ...@@ -70,7 +70,7 @@ class TerminalPrivateOpenTerminalProcessFunction : public ExtensionFunction {
void OnGetVshSession(const std::string& user_id_hash, void OnGetVshSession(const std::string& user_id_hash,
base::CommandLine cmdline, base::CommandLine cmdline,
int32_t vsh_pid, const std::string& terminal_id,
bool success, bool success,
const std::string& failure_reason, const std::string& failure_reason,
int32_t container_shell_pid); int32_t container_shell_pid);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "chromeos/process_proxy/process_proxy_registry.h" #include "chromeos/process_proxy/process_proxy_registry.h"
#include "base/strings/string_number_conversions.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
...@@ -74,6 +75,14 @@ ProcessProxyRegistry* ProcessProxyRegistry::Get() { ...@@ -74,6 +75,14 @@ ProcessProxyRegistry* ProcessProxyRegistry::Get() {
return g_process_proxy_registry.Pointer(); 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 // static
scoped_refptr<base::SequencedTaskRunner> ProcessProxyRegistry::GetTaskRunner() { scoped_refptr<base::SequencedTaskRunner> ProcessProxyRegistry::GetTaskRunner() {
static base::LazyThreadPoolSequencedTaskRunner task_runner = static base::LazyThreadPoolSequencedTaskRunner task_runner =
......
...@@ -44,6 +44,9 @@ class CHROMEOS_EXPORT ProcessProxyRegistry { ...@@ -44,6 +44,9 @@ class CHROMEOS_EXPORT ProcessProxyRegistry {
static ProcessProxyRegistry* Get(); 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 // Returns a SequencedTaskRunner where the singleton instance of
// ProcessProxyRegistry lives. // ProcessProxyRegistry lives.
static scoped_refptr<base::SequencedTaskRunner> GetTaskRunner(); 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