Index: chrome/browser/chrome_process_singleton.h |
diff --git a/chrome/browser/chrome_process_singleton.h b/chrome/browser/chrome_process_singleton.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c4ca2c90c802525033768317b55bf81193a40779 |
--- /dev/null |
+++ b/chrome/browser/chrome_process_singleton.h |
@@ -0,0 +1,77 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ |
+#define CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ |
+ |
+#include "base/basictypes.h" |
+#include "base/files/file_path.h" |
+#include "chrome/browser/process_singleton.h" |
+#include "chrome/browser/process_singleton_modal_dialog_lock.h" |
+#include "chrome/browser/process_singleton_startup_lock.h" |
+#include "ui/gfx/native_widget_types.h" |
+ |
+// Composes a basic ProcessSingleton with ProcessSingletonStartupLock and |
+// ProcessSingletonModalDialogLock. |
+// |
+// Notifications from ProcessSingleton will be discarded if a modal dialog is |
+// active. Otherwise, until |Unlock()| is called, they will be queued up. |
+// Once unlocked, notifications will be passed to the client-supplied |
+// NotificationCallback. |
+// |
+// The client must ensure that SetActiveModalDialog is called appropriately when |
+// dialogs are displayed or dismissed during startup. While a dialog is active: |
+// 1. Neither this process nor the invoking process will handle the command |
+// line. |
+// 2. The active dialog is brought to the foreground and/or the taskbar icon |
+// flashed (using ::SetForegroundWindow on Windows). |
+class ChromeProcessSingleton { |
+ public: |
+ ChromeProcessSingleton( |
+ const base::FilePath& user_data_dir, |
+ const ProcessSingleton::NotificationCallback& notification_callback); |
+ |
+ ChromeProcessSingleton( |
+ const base::FilePath& user_data_dir, |
+ const ProcessSingleton::NotificationCallback& notification_callback, |
+ const ProcessSingletonModalDialogLock::SetForegroundWindowHandler& |
+ set_foreground_window_handler); |
+ |
+ ~ChromeProcessSingleton(); |
+ |
+ // Notify another process, if available. Otherwise sets ourselves as the |
+ // singleton instance. Returns PROCESS_NONE if we became the singleton |
+ // instance. Callers are guaranteed to either have notified an existing |
+ // process or have grabbed the singleton (unless the profile is locked by an |
+ // unreachable process). |
+ ProcessSingleton::NotifyResult NotifyOtherProcessOrCreate(); |
+ |
+ // Clear any lock state during shutdown. |
+ void Cleanup(); |
+ |
+ // Receives a handle to the active modal dialog, or NULL if the active dialog |
+ // is dismissed. |
+ void SetActiveModalDialog(gfx::NativeWindow active_dialog); |
+ |
+ // Executes previously queued command-line invocations and allows future |
+ // invocations to be executed immediately. |
+ void Unlock(); |
Nico
2013/04/18 18:12:13
"// This only has an effect the first time it's ca
|
+ |
+ private: |
+ // We compose these two locks with the client-supplied notification callback. |
+ // First |modal_dialog_lock_| will discard any notifications that arrive while |
+ // a modal dialog is active. Otherwise, it will pass the notification to |
+ // |startup_lock_|, which will queue notifications until |Unlock()| is called. |
+ // Notifications passing through both locks are finally delivered to our |
+ // client. |
+ ProcessSingletonStartupLock startup_lock_; |
+ ProcessSingletonModalDialogLock modal_dialog_lock_; |
+ |
+ // The basic ProcessSingleton |
+ ProcessSingleton process_singleton_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ChromeProcessSingleton); |
+}; |
+ |
+#endif // CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ |