---
# System prepended metadata

title: CommandLine in Chromium
tags: [Chromium-General, elkurin-daily-note]

---

# CommandLine in Chromium

[base::CommndLine](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.h)はChromeやそれに付随するプロセスをlaunchするときなど渡された引数を格納するクラス。  
何ができるのか確認する。


## 概要
含まれているデータは主に2つ
[`argv_`](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.h;l=318;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)は引数の配列。型はStringVector = `std::vector<std::string>`。  
中身はパース前の`--switch=value`みたいな感じで格納されている。  
ここの先頭には[GetProgram](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=281;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)で取れるfile pathが登録されている。

一方[`switches_`](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.h;l=321;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)はパースされた状態のswitchが入っている。  
`switch`と`value`のマップ、`std::map<std::string, StringType, std::less<>>`として保持している。

[CommandLine::ForCurrrentProcess](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=246;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)で現在のプロセスのコマンドを指すシングルトンにアクセスできる。

[AppendArguments](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=464;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)や[InitFromArgv](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=273;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)からargを足すことができる。
[AppendSwitchesAndArguments](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=532;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)→[AppendSwitchNative](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=344;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)と渡されて[`argv_`](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.h;l=318;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)に追加される。  
また`switches_`にkeyとvalueのセットを追加する。  
[IsSwitch](https://source.chromium.org/chromium/chromium/src/+/main:base/command_line.cc;l=81;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)は`kSwitchValueSeperator`である`--`の文字列を確認する。あればswitch_valueを取り出しtrueを返す。そうでない場合はfalseを返す。  
trueならAppendSwitchNativeでparseしたswitch_stringをswitch_valueを渡す。

constructorは以下の通り。
```cpp=
explicit CommandLine(NoProgram no_program);

explicit CommandLine(const FilePath& program);

CommndLine(int argc, const CharType* const* argv);

explicit CommandLine(const StringVector& argv);
```

## 使用例
CommandLineは基本渡されてきた`argv`を入れて作る。  
大きく分けて2つの使い方がある。


### プロセスランチ
通常の使い方でプロセスをLaunchする際に使う。  

具体例を見てみる。  
[LaunchChildGTestProcess](https://source.chromium.org/chromium/chromium/src/+/main:base/test/launcher/test_launcher.cc;l=1175;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)の中で、[GetCommand](https://source.chromium.org/chromium/chromium/src/+/main:content/public/test/test_launcher.cc;l=199;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)で生成した疑似的なコマンドラインを用意し[PrepareCommndLineForGTest](https://source.chromium.org/chromium/chromium/src/+/main:base/test/launcher/test_launcher.cc;l=358;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)から代入している。

同様に[AshCrosapiTestEnv::Initialize](https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.cc;l=52;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)の中でCommandLineを作ってAsh processをLaunchしている。

### テスト用
テスト用ではその引数がなくても、実行時に代入して作ったCommandLineクラスを用意することで、あたかもコマンドが渡されていたかのようにすることができる。  
[ScopedAddFeatureFlags](https://source.chromium.org/chromium/chromium/src/+/main:base/scoped_add_feature_flags.cc;l=15;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)ではその時点でのCommandLineを取り、そのあとスコープ内でだけCommandLineにFeatureFlagを追加できる。

使用例を見てみる。  
[AddFeatureFlagsToCommandLine](https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/chrome_main_delegate.cc;l=458;drc=eef4762779d05708d5dfc7d5fe4ea16288069a35)ではEnableIfNotSetでkEnableVariableRefreshRateを追加しているが、これはFeatureListを作る前に呼ぶことでFeatureListを捏造している。