Home | History | Annotate | Download | only in browser
      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