OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ | |
6 #define CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ | |
7 | |
8 #include "base/basictypes.h" | |
9 #include "base/files/file_path.h" | |
10 #include "chrome/browser/process_singleton.h" | |
11 #include "chrome/browser/process_singleton_modal_dialog_lock.h" | |
12 #include "chrome/browser/process_singleton_startup_lock.h" | |
13 #include "ui/gfx/native_widget_types.h" | |
14 | |
15 // Composes a basic ProcessSingleton with ProcessSingletonStartupLock and | |
16 // ProcessSingletonModalDialogLock. | |
17 // | |
18 // Notifications from ProcessSingleton will be discarded if a modal dialog is | |
19 // active. Otherwise, until |Unlock()| is called, they will be queued up. | |
20 // Once unlocked, notifications will be passed to the client-supplied | |
21 // NotificationCallback. | |
22 // | |
23 // The client must ensure that SetActiveModalDialog is called appropriately when | |
24 // dialogs are displayed or dismissed during startup. While a dialog is active: | |
25 // 1. Neither this process nor the invoking process will handle the command | |
26 // line. | |
27 // 2. The active dialog is brought to the foreground and/or the taskbar icon | |
28 // flashed (using ::SetForegroundWindow on Windows). | |
29 class ChromeProcessSingleton { | |
30 public: | |
31 ChromeProcessSingleton( | |
32 const base::FilePath& user_data_dir, | |
33 const ProcessSingleton::NotificationCallback& notification_callback); | |
34 | |
35 ChromeProcessSingleton( | |
36 const base::FilePath& user_data_dir, | |
37 const ProcessSingleton::NotificationCallback& notification_callback, | |
38 const ProcessSingletonModalDialogLock::SetForegroundWindowHandler& | |
39 set_foreground_window_handler); | |
40 | |
41 ~ChromeProcessSingleton(); | |
42 | |
43 // Notify another process, if available. Otherwise sets ourselves as the | |
44 // singleton instance. Returns PROCESS_NONE if we became the singleton | |
45 // instance. Callers are guaranteed to either have notified an existing | |
46 // process or have grabbed the singleton (unless the profile is locked by an | |
47 // unreachable process). | |
48 ProcessSingleton::NotifyResult NotifyOtherProcessOrCreate(); | |
49 | |
50 // Clear any lock state during shutdown. | |
51 void Cleanup(); | |
52 | |
53 // Receives a handle to the active modal dialog, or NULL if the active dialog | |
54 // is dismissed. | |
55 void SetActiveModalDialog(gfx::NativeWindow active_dialog); | |
56 | |
57 // Executes previously queued command-line invocations and allows future | |
58 // invocations to be executed immediately. | |
59 void Unlock(); | |
Nico
2013/04/18 18:12:13
"// This only has an effect the first time it's ca
| |
60 | |
61 private: | |
62 // We compose these two locks with the client-supplied notification callback. | |
63 // First |modal_dialog_lock_| will discard any notifications that arrive while | |
64 // a modal dialog is active. Otherwise, it will pass the notification to | |
65 // |startup_lock_|, which will queue notifications until |Unlock()| is called. | |
66 // Notifications passing through both locks are finally delivered to our | |
67 // client. | |
68 ProcessSingletonStartupLock startup_lock_; | |
69 ProcessSingletonModalDialogLock modal_dialog_lock_; | |
70 | |
71 // The basic ProcessSingleton | |
72 ProcessSingleton process_singleton_; | |
73 | |
74 DISALLOW_COPY_AND_ASSIGN(ChromeProcessSingleton); | |
75 }; | |
76 | |
77 #endif // CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ | |
OLD | NEW |