Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1675)

Unified Diff: chrome/app/chrome_watcher_command_line_win.h

Issue 1538923004: [win] Change Chrome Watcher configuration API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added unittests. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..c33e1437578392b5e3de547d368f1f3818cda62c 100644
--- a/chrome/app/chrome_watcher_command_line_win.h
+++ b/chrome/app/chrome_watcher_command_line_win.h
@@ -7,12 +7,99 @@
#include <windows.h>
+#include "base/command_line.h"
+#include "base/files/file_path.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 this
+ // 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.
+ 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;
grt (UTC plus 2) 2015/12/21 20:19:07 #include <vector>
chrisha 2015/12/21 23:25:30 Done.
+
+ protected:
+ // Exposed for unittesting.
+
+ // Duplicate the provided |handle|, making it inheritable, and storing it in
+ // the provided |scoped_handle|. Also updated inherited_handles_.
+ 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 ChromeWatcherCommandLineInterpreter {
+ public:
+ ChromeWatcherCommandLineInterpreter();
+
+ // Causes the process to explode if any inherited handles weren't collected
+ // via GetHandle.
+ ~ChromeWatcherCommandLineInterpreter();
+
+ // 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 true on success, false otherwise.
+ bool InterpretCommandLine(const base::CommandLine& command_line);
grt (UTC plus 2) 2015/12/21 20:19:07 wdyt of: class ChromeWatcherCommandLine { public:
chrisha 2015/12/21 23:25:30 Done.
+
+ // Retrieves a handle that has been inherited from a parent process. This can
+ // only be called once handle, and it is expected that all inherited handles
+ // are taken by the child process. Any handles left in this object will cause
+ // a terminal error at the time of object destruction.
+ bool TakeOnInitializedEventHandle(
grt (UTC plus 2) 2015/12/21 20:19:07 can these return the ScopedHandle (which appears t
chrisha 2015/12/21 23:25:30 Yup, they sure can. Done.
+ base::win::ScopedHandle* on_initialized_event_handle);
+ bool TakeParentProcessHandle(base::win::ScopedHandle* parent_process_handle);
+
+ // Returns the ID of the main thread in the parent process. Only valid after
+ // a successful call to InterpretCommandLine.
+ DWORD main_thread_id() const { return main_thread_id_; }
+
+ private:
+ // Passes a handle from |internal_handle| to |external_handle|. Returns true
+ // on success, false if |internal_handle| was invalid.
+ bool TakeHandle(base::win::ScopedHandle* internal_handle,
+ base::win::ScopedHandle* external_handle);
+
+ 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(ChromeWatcherCommandLineInterpreter);
+};
// Generates a CommandLine that will launch |chrome_exe| in Chrome Watcher mode
// to observe |parent_process|, whose main thread is identified by

Powered by Google App Engine
This is Rietveld 408576698