| Index: chrome/app/chrome_watcher_command_line_win.h
|
| diff --git a/chrome/app/chrome_watcher_command_line_win.h b/chrome/app/chrome_watcher_command_line_win.h
|
| index d4d4a97dba0b3e3ebf80b67c0302ed6e63225504..de66bd221072b65e6f2afd39843dcfedf6ce5dfe 100644
|
| --- a/chrome/app/chrome_watcher_command_line_win.h
|
| +++ b/chrome/app/chrome_watcher_command_line_win.h
|
| @@ -6,13 +6,99 @@
|
| #define CHROME_APP_CHROME_WATCHER_COMMAND_LINE_WIN_H_
|
|
|
| #include <windows.h>
|
| +#include <vector>
|
|
|
| +#include "base/command_line.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "base/win/scoped_handle.h"
|
|
|
| -namespace base {
|
| -class CommandLine;
|
| -class FilePath;
|
| -} // namespace base
|
| +// Class for configuring the Chrome watcher process via the command-line. This
|
| +// accepts configuration from the parent process and generates the required
|
| +// command-line.
|
| +//
|
| +// It provides functionality for the common task of sharing handles from a
|
| +// parent to a child process, automatically duplicating them with the
|
| +// appropriate permissions. These handles are closed when the generator is
|
| +// destroyed so the generator must outlive the process creation.
|
| +class ChromeWatcherCommandLineGenerator {
|
| + public:
|
| + explicit ChromeWatcherCommandLineGenerator(const base::FilePath& chrome_exe);
|
| +
|
| + // Sets a handle to be shared with the child process. This will duplicate the
|
| + // handle with the inherit flag, with this object retaining ownership of the
|
| + // duplicated handle. As such, this object must live at least until after the
|
| + // watcher process has been created. Returns true on success, false on
|
| + // failure. This can fail if the call to DuplicateHandle fails. Each of these
|
| + // may only be called once.
|
| + bool SetOnInitializedEventHandle(HANDLE on_initialized_event_handle);
|
| + bool SetParentProcessHandle(HANDLE parent_process_handle_);
|
| +
|
| + // Generates a command-line representing this configuration. Must be run from
|
| + // the main thread of the parent process. This should only be called after the
|
| + // generator is fully configured.
|
| + base::CommandLine GenerateCommandLine();
|
| +
|
| + // Appends all inherited handles to the provided vector. Does not clear the
|
| + // vector first.
|
| + void GetInheritedHandles(std::vector<HANDLE>* inherited_handles) const;
|
| +
|
| + protected:
|
| + // Exposed for unittesting.
|
| +
|
| + // Duplicate the provided |handle|, making it inheritable, and storing it in
|
| + // the provided |scoped_handle|.
|
| + bool SetHandle(HANDLE handle, base::win::ScopedHandle* scoped_handle);
|
| +
|
| + base::FilePath chrome_exe_;
|
| +
|
| + // Duplicated inheritable handles that are being shared from the parent to the
|
| + // child.
|
| + base::win::ScopedHandle on_initialized_event_handle_;
|
| + base::win::ScopedHandle parent_process_handle_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ChromeWatcherCommandLineGenerator);
|
| +};
|
| +
|
| +// Class for processing a command-line used to start a Chrome Watcher process
|
| +// and exposing the resulting configuration and any shared handles. To be used
|
| +// within the watcher process.
|
| +class ChromeWatcherCommandLine {
|
| + public:
|
| + // Causes the process to explode if any inherited handles weren't taken from
|
| + // this object.
|
| + ~ChromeWatcherCommandLine();
|
| +
|
| + // Parses the provided command-line used to launch a Chrome Watcher process.
|
| + // If this fails any successfully opened handles will be closed prior to
|
| + // return. Returns a ChromeWatcherCommandLine object on success, nullptr
|
| + // otherwise.
|
| + static scoped_ptr<ChromeWatcherCommandLine> InterpretCommandLine(
|
| + const base::CommandLine& command_line);
|
| +
|
| + // Accessors for handles. Any handles not taken from this object at the time
|
| + // of its destruction will cause a terminal error.
|
| + base::win::ScopedHandle TakeOnInitializedEventHandle();
|
| + base::win::ScopedHandle TakeParentProcessHandle();
|
| +
|
| + // Returns the ID of the main thread in the parent process.
|
| + DWORD main_thread_id() const { return main_thread_id_; }
|
| +
|
| + private:
|
| + // Private constructor for use by InterpretCommandLine.
|
| + ChromeWatcherCommandLine(HANDLE on_initialized_event_handle,
|
| + HANDLE parent_process_handle,
|
| + DWORD main_thread_id);
|
| +
|
| + base::win::ScopedHandle on_initialized_event_handle_;
|
| + base::win::ScopedHandle parent_process_handle_;
|
| +
|
| + // The ID of the main thread in the parent process.
|
| + DWORD main_thread_id_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ChromeWatcherCommandLine);
|
| +};
|
|
|
| // Generates a CommandLine that will launch |chrome_exe| in Chrome Watcher mode
|
| // to observe |parent_process|, whose main thread is identified by
|
|
|