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 // This only has an effect the first time it is called. 60 void Unlock(); 61 62 private: 63 // We compose these two locks with the client-supplied notification callback. 64 // First |modal_dialog_lock_| will discard any notifications that arrive while 65 // a modal dialog is active. Otherwise, it will pass the notification to 66 // |startup_lock_|, which will queue notifications until |Unlock()| is called. 67 // Notifications passing through both locks are finally delivered to our 68 // client. 69 ProcessSingletonStartupLock startup_lock_; 70 ProcessSingletonModalDialogLock modal_dialog_lock_; 71 72 // The basic ProcessSingleton 73 ProcessSingleton process_singleton_; 74 75 DISALLOW_COPY_AND_ASSIGN(ChromeProcessSingleton); 76 }; 77 78 #endif // CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ 79