| 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..0162e0527a209447dbdfe50458255028122042b1
|
| --- /dev/null
|
| +++ b/chrome/browser/chrome_process_singleton.h
|
| @@ -0,0 +1,78 @@
|
| +// 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.
|
| + // This only has an effect the first time it is called.
|
| + void Unlock();
|
| +
|
| + 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_
|
|
|