Chromium Code Reviews| Index: chrome/app/chrome_watcher_command_line_win.cc |
| diff --git a/chrome/app/chrome_watcher_command_line_win.cc b/chrome/app/chrome_watcher_command_line_win.cc |
| index d5318a630248ca58ae01d54aa10051f5696e66c9..923a6b5099f3605305532ee7721312ab0c730656 100644 |
| --- a/chrome/app/chrome_watcher_command_line_win.cc |
| +++ b/chrome/app/chrome_watcher_command_line_win.cc |
| @@ -17,9 +17,9 @@ |
| namespace { |
| +const char kMainThreadIdSwitch[] = "main-thread-id"; |
| const char kOnIninitializedEventHandleSwitch[] = "on-initialized-event-handle"; |
| const char kParentHandleSwitch[] = "parent-handle"; |
| -const char kMainThreadIdSwitch[] = "main-thread-id"; |
| void AppendHandleSwitch(const std::string& switch_name, |
| HANDLE handle, |
| @@ -47,6 +47,87 @@ HANDLE ReadHandleFromSwitch(const base::CommandLine& command_line, |
| } // namespace |
| +ChromeWatcherCommandLineGenerator::ChromeWatcherCommandLineGenerator( |
| + const base::FilePath& chrome_exe) : chrome_exe_(chrome_exe) { |
| +} |
| + |
| +bool ChromeWatcherCommandLineGenerator::SetOnInitializedEventHandle( |
| + HANDLE on_initialized_event_handle) { |
| + return SetHandle(on_initialized_event_handle, &on_initialized_event_handle_); |
| +} |
| + |
| +bool ChromeWatcherCommandLineGenerator::SetParentProcessHandle( |
| + HANDLE parent_process_handle) { |
| + return SetHandle(parent_process_handle, &parent_process_handle_); |
| +} |
| + |
| +// Generates a command-line representing this configuration. |
| +base::CommandLine ChromeWatcherCommandLineGenerator::GenerateCommandLine() { |
| + // TODO(chrisha): Get rid of the following function and move the |
| + // implementation here. |
| + return GenerateChromeWatcherCommandLine( |
| + chrome_exe_, parent_process_handle_.Get(), ::GetCurrentThreadId(), |
| + on_initialized_event_handle_.Get()); |
| +} |
| + |
| +void ChromeWatcherCommandLineGenerator::GetInheritedHandles( |
| + std::vector<HANDLE>* inherited_handles) const { |
| + inherited_handles->push_back(on_initialized_event_handle_.Get()); |
| + inherited_handles->push_back(parent_process_handle_.Get()); |
| +} |
| + |
| +bool ChromeWatcherCommandLineGenerator::SetHandle( |
| + HANDLE handle, base::win::ScopedHandle* scoped_handle) { |
| + // Create a duplicate handle that is inheritable. |
| + HANDLE proc = ::GetCurrentProcess(); |
| + HANDLE new_handle = 0; |
| + if (!::DuplicateHandle(proc, handle, proc, &new_handle, 0, TRUE, |
| + DUPLICATE_SAME_ACCESS)) { |
| + return false; |
| + } |
| + |
| + scoped_handle->Set(new_handle); |
| + return true; |
| +} |
| + |
| +ChromeWatcherCommandLineInterpreter::ChromeWatcherCommandLineInterpreter() |
| + : main_thread_id_(0) { |
| +} |
| + |
| +ChromeWatcherCommandLineInterpreter::~ChromeWatcherCommandLineInterpreter() { |
| + // If any handles were not taken then die violently. |
| + if (on_initialized_event_handle_.Get() || parent_process_handle_.Get()) |
|
grt (UTC plus 2)
2015/12/21 20:19:06
nit: use IsValid() rather than .Get()
chrisha
2015/12/21 23:25:30
Done.
|
| + CHECK(false); |
|
grt (UTC plus 2)
2015/12/21 20:19:06
can you make a death test (https://github.com/goog
chrisha
2015/12/21 23:25:30
Done.
|
| +} |
| + |
| +bool ChromeWatcherCommandLineInterpreter::InterpretCommandLine( |
| + const base::CommandLine& command_line) { |
| + // TODO(chrisha): Get rid of the following function and move the |
| + // implementation here. |
| + return InterpretChromeWatcherCommandLine( |
| + command_line, &parent_process_handle_, &main_thread_id_, |
| + &on_initialized_event_handle_); |
| +} |
| + |
| +bool ChromeWatcherCommandLineInterpreter::TakeOnInitializedEventHandle( |
| + base::win::ScopedHandle* on_initialized_event_handle) { |
| + return TakeHandle(&on_initialized_event_handle_, on_initialized_event_handle); |
|
grt (UTC plus 2)
2015/12/21 20:19:06
can this be:
return std::move(on_initialized_eve
chrisha
2015/12/21 23:25:30
Changed to using move semantics and returning a ra
|
| +} |
| + |
| +bool ChromeWatcherCommandLineInterpreter::TakeParentProcessHandle( |
| + base::win::ScopedHandle* parent_process_handle) { |
| + return TakeHandle(&parent_process_handle_, parent_process_handle); |
| +} |
| + |
| +bool ChromeWatcherCommandLineInterpreter::TakeHandle( |
| + base::win::ScopedHandle* internal_handle, |
| + base::win::ScopedHandle* external_handle) { |
| + if (!internal_handle->Get()) |
| + return false; |
| + external_handle->Set(internal_handle->Take()); |
| + return true; |
| +} |
| + |
| base::CommandLine GenerateChromeWatcherCommandLine( |
| const base::FilePath& chrome_exe, |
| HANDLE parent_process, |