| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_PROCESS_SINGLETON_H_ | 5 #ifndef CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| 6 #define CHROME_BROWSER_PROCESS_SINGLETON_H_ | 6 #define CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
| 10 | 10 |
| 11 #if defined(OS_WIN) | 11 #if defined(OS_WIN) |
| 12 #include <windows.h> | 12 #include <windows.h> |
| 13 #endif // defined(OS_WIN) | 13 #endif // defined(OS_WIN) |
| 14 | 14 |
| 15 #include <set> | 15 #include <set> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "base/basictypes.h" | 18 #include "base/basictypes.h" |
| 19 #include "base/callback.h" |
| 19 #include "base/command_line.h" | 20 #include "base/command_line.h" |
| 20 #include "base/file_path.h" | 21 #include "base/file_path.h" |
| 21 #include "base/logging.h" | 22 #include "base/logging.h" |
| 22 #include "base/memory/ref_counted.h" | 23 #include "base/memory/ref_counted.h" |
| 23 #include "base/threading/non_thread_safe.h" | 24 #include "base/threading/non_thread_safe.h" |
| 24 #include "ui/gfx/native_widget_types.h" | 25 #include "ui/gfx/native_widget_types.h" |
| 25 | 26 |
| 26 #if defined(OS_POSIX) | 27 #if defined(OS_POSIX) |
| 27 #include "base/file_path.h" | 28 #include "base/file_path.h" |
| 28 #endif // defined(OS_POSIX) | 29 #endif // defined(OS_POSIX) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 47 | 48 |
| 48 class ProcessSingleton : public base::NonThreadSafe { | 49 class ProcessSingleton : public base::NonThreadSafe { |
| 49 public: | 50 public: |
| 50 enum NotifyResult { | 51 enum NotifyResult { |
| 51 PROCESS_NONE, | 52 PROCESS_NONE, |
| 52 PROCESS_NOTIFIED, | 53 PROCESS_NOTIFIED, |
| 53 PROFILE_IN_USE, | 54 PROFILE_IN_USE, |
| 54 LOCK_ERROR, | 55 LOCK_ERROR, |
| 55 }; | 56 }; |
| 56 | 57 |
| 58 // Implement this callback to handle notifications from other processes. The |
| 59 // callback will receive the command line and directory with which the other |
| 60 // Chrome process was launched. Return true if the command line will be |
| 61 // handled within the current browser instance or false if the remote process |
| 62 // should handle it (i.e., because the current process is shutting down). |
| 63 typedef base::Callback< |
| 64 bool(const CommandLine& command_line, const FilePath& current_directory)> |
| 65 NotificationCallback; |
| 66 |
| 57 explicit ProcessSingleton(const FilePath& user_data_dir); | 67 explicit ProcessSingleton(const FilePath& user_data_dir); |
| 58 ~ProcessSingleton(); | 68 ~ProcessSingleton(); |
| 59 | 69 |
| 60 // Notify another process, if available. | 70 // Notify another process, if available. |
| 61 // Returns true if another process was found and notified, false if we | 71 // Returns true if another process was found and notified, false if we |
| 62 // should continue with this process. | 72 // should continue with this process. |
| 63 // Windows code roughly based on Mozilla. | 73 // Windows code roughly based on Mozilla. |
| 64 // | 74 // |
| 65 // TODO(brettw): this will not handle all cases. If two process start up too | 75 // TODO(brettw): this will not handle all cases. If two process start up too |
| 66 // close to each other, the Create() might not yet have happened for the | 76 // close to each other, the Create() might not yet have happened for the |
| 67 // first one, so this function won't find it. | 77 // first one, so this function won't find it. |
| 68 NotifyResult NotifyOtherProcess(); | 78 NotifyResult NotifyOtherProcess(); |
| 69 | 79 |
| 70 // Notify another process, if available. Otherwise sets ourselves as the | 80 // Notify another process, if available. Otherwise sets ourselves as the |
| 71 // singleton instance. Returns PROCESS_NONE if we became the singleton | 81 // singleton instance and stores the provided callback for notification from |
| 82 // future processes. Returns PROCESS_NONE if we became the singleton |
| 72 // instance. | 83 // instance. |
| 73 NotifyResult NotifyOtherProcessOrCreate(); | 84 NotifyResult NotifyOtherProcessOrCreate( |
| 85 const NotificationCallback& notification_callback); |
| 74 | 86 |
| 75 #if defined(OS_LINUX) || defined(OS_OPENBSD) | 87 #if defined(OS_LINUX) || defined(OS_OPENBSD) |
| 76 // Exposed for testing. We use a timeout on Linux, and in tests we want | 88 // Exposed for testing. We use a timeout on Linux, and in tests we want |
| 77 // this timeout to be short. | 89 // this timeout to be short. |
| 78 NotifyResult NotifyOtherProcessWithTimeout(const CommandLine& command_line, | 90 NotifyResult NotifyOtherProcessWithTimeout(const CommandLine& command_line, |
| 79 int timeout_seconds, | 91 int timeout_seconds, |
| 80 bool kill_unresponsive); | 92 bool kill_unresponsive); |
| 81 NotifyResult NotifyOtherProcessWithTimeoutOrCreate( | 93 NotifyResult NotifyOtherProcessWithTimeoutOrCreate( |
| 82 const CommandLine& command_line, | 94 const CommandLine& command_line, |
| 95 const NotificationCallback& notification_callback, |
| 83 int timeout_seconds); | 96 int timeout_seconds); |
| 84 #endif // defined(OS_LINUX) || defined(OS_OPENBSD) | 97 #endif // defined(OS_LINUX) || defined(OS_OPENBSD) |
| 85 | 98 |
| 86 #if defined(OS_WIN) && !defined(USE_AURA) | 99 #if defined(OS_WIN) && !defined(USE_AURA) |
| 87 // Used in specific cases to let us know that there is an existing instance | 100 // Used in specific cases to let us know that there is an existing instance |
| 88 // of Chrome running with this profile. In general, you should not use this | 101 // of Chrome running with this profile. In general, you should not use this |
| 89 // function. Instead consider using NotifyOtherProcessOrCreate(). | 102 // function. Instead consider using NotifyOtherProcessOrCreate(). |
| 90 // For non profile-specific method, use | 103 // For non profile-specific method, use |
| 91 // browser_util::IsBrowserAlreadyRunning(). | 104 // browser_util::IsBrowserAlreadyRunning(). |
| 92 bool FoundOtherProcessWindow() const { | 105 bool FoundOtherProcessWindow() const { |
| 93 return (NULL != remote_window_); | 106 return (NULL != remote_window_); |
| 94 } | 107 } |
| 95 #endif // defined(OS_WIN) | 108 #endif // defined(OS_WIN) |
| 96 | 109 |
| 97 // Sets ourself up as the singleton instance. Returns true on success. If | 110 // Sets ourself up as the singleton instance. Returns true on success. If |
| 98 // false is returned, we are not the singleton instance and the caller must | 111 // false is returned, we are not the singleton instance and the caller must |
| 99 // exit. | 112 // exit. Otherwise, stores the provided callback for notification from |
| 100 bool Create(); | 113 // future processes. |
| 114 bool Create( |
| 115 const NotificationCallback& notification_callback); |
| 101 | 116 |
| 102 // Clear any lock state during shutdown. | 117 // Clear any lock state during shutdown. |
| 103 void Cleanup(); | 118 void Cleanup(); |
| 104 | 119 |
| 105 // Blocks the dispatch of CopyData messages. foreground_window refers | 120 // Blocks the dispatch of CopyData messages. foreground_window refers |
| 106 // to the window that should be set to the foreground if a CopyData message | 121 // to the window that should be set to the foreground if a CopyData message |
| 107 // is received while the ProcessSingleton is locked. | 122 // is received while the ProcessSingleton is locked. |
| 108 void Lock(gfx::NativeWindow foreground_window) { | 123 void Lock(gfx::NativeWindow foreground_window) { |
| 109 DCHECK(CalledOnValidThread()); | 124 DCHECK(CalledOnValidThread()); |
| 110 locked_ = true; | 125 locked_ = true; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 125 DCHECK(CalledOnValidThread()); | 140 DCHECK(CalledOnValidThread()); |
| 126 return locked_; | 141 return locked_; |
| 127 } | 142 } |
| 128 | 143 |
| 129 #if defined(OS_WIN) | 144 #if defined(OS_WIN) |
| 130 LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); | 145 LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); |
| 131 #endif | 146 #endif |
| 132 | 147 |
| 133 private: | 148 private: |
| 134 typedef std::pair<CommandLine::StringVector, FilePath> DelayedStartupMessage; | 149 typedef std::pair<CommandLine::StringVector, FilePath> DelayedStartupMessage; |
| 135 void ProcessCommandLine(const CommandLine& command_line, | |
| 136 const FilePath& current_directory); | |
| 137 | 150 |
| 138 #if !defined(OS_MACOSX) | 151 #if !defined(OS_MACOSX) |
| 139 // Timeout for the current browser process to respond. 20 seconds should be | 152 // Timeout for the current browser process to respond. 20 seconds should be |
| 140 // enough. It's only used in Windows and Linux implementations. | 153 // enough. It's only used in Windows and Linux implementations. |
| 141 static const int kTimeoutInSeconds = 20; | 154 static const int kTimeoutInSeconds = 20; |
| 142 #endif | 155 #endif |
| 143 | 156 |
| 144 bool locked_; | 157 bool locked_; |
| 145 gfx::NativeWindow foreground_window_; | 158 gfx::NativeWindow foreground_window_; |
| 159 NotificationCallback notification_callback_; // Handler for notifications. |
| 146 | 160 |
| 147 #if defined(OS_WIN) | 161 #if defined(OS_WIN) |
| 148 // This ugly behemoth handles startup commands sent from another process. | 162 // This ugly behemoth handles startup commands sent from another process. |
| 149 LRESULT OnCopyData(HWND hwnd, const COPYDATASTRUCT* cds); | 163 LRESULT OnCopyData(HWND hwnd, const COPYDATASTRUCT* cds); |
| 150 | 164 |
| 151 bool EscapeVirtualization(const FilePath& user_data_dir); | 165 bool EscapeVirtualization(const FilePath& user_data_dir); |
| 152 | 166 |
| 153 HWND remote_window_; // The HWND_MESSAGE of another browser. | 167 HWND remote_window_; // The HWND_MESSAGE of another browser. |
| 154 HWND window_; // The HWND_MESSAGE window. | 168 HWND window_; // The HWND_MESSAGE window. |
| 155 bool is_virtualized_; // Stuck inside Microsoft Softricity VM environment. | 169 bool is_virtualized_; // Stuck inside Microsoft Softricity VM environment. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 181 #endif | 195 #endif |
| 182 | 196 |
| 183 // If messages are received in the locked state, the corresponding command | 197 // If messages are received in the locked state, the corresponding command |
| 184 // lines are saved here to be replayed later. | 198 // lines are saved here to be replayed later. |
| 185 std::vector<DelayedStartupMessage> saved_startup_messages_; | 199 std::vector<DelayedStartupMessage> saved_startup_messages_; |
| 186 | 200 |
| 187 DISALLOW_COPY_AND_ASSIGN(ProcessSingleton); | 201 DISALLOW_COPY_AND_ASSIGN(ProcessSingleton); |
| 188 }; | 202 }; |
| 189 | 203 |
| 190 #endif // CHROME_BROWSER_PROCESS_SINGLETON_H_ | 204 #endif // CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| OLD | NEW |