Remove a bunch of stuff we don't need in process_singleton_win
This commit is contained in:
		
					parent
					
						
							
								1b3363c811
							
						
					
				
			
			
				commit
				
					
						c46579b1ac
					
				
			
		
					 1 changed files with 15 additions and 131 deletions
				
			
		|  | @ -33,8 +33,6 @@ namespace { | |||
| 
 | ||||
| const char kLockfile[] = "lockfile"; | ||||
| 
 | ||||
| const int kMetroChromeActivationTimeoutMs = 3000; | ||||
| 
 | ||||
| // A helper class that acquires the given |mutex| while the AutoLockMutex is in
 | ||||
| // scope.
 | ||||
| class AutoLockMutex { | ||||
|  | @ -166,66 +164,14 @@ bool ProcessLaunchNotification( | |||
|   return true; | ||||
| } | ||||
| 
 | ||||
| // Returns true if Chrome needs to be relaunched into Windows 8 immersive mode.
 | ||||
| // Following conditions apply:-
 | ||||
| // 1. Windows 8 or greater.
 | ||||
| // 2. Not in Windows 8 immersive mode.
 | ||||
| // 3. Chrome is default browser.
 | ||||
| // 4. Process integrity level is not high.
 | ||||
| // 5. The profile data directory is the default directory.
 | ||||
| // 6. Last used mode was immersive/machine is a tablet.
 | ||||
| // TODO(ananta)
 | ||||
| // Move this function to a common place as the Windows 8 delegate_execute
 | ||||
| // handler can possibly use this.
 | ||||
| bool ShouldLaunchInWindows8ImmersiveMode(const base::FilePath& user_data_dir) { | ||||
|   // Returning false from this function doesn't mean we don't launch immersive
 | ||||
|   // mode in Aura. This function is specifically called in case when we need
 | ||||
|   // to relaunch desktop launched chrome into immersive mode through 'relaunch'
 | ||||
|   // menu. In case of Aura, we will use delegate_execute to do the relaunch.
 | ||||
| bool TerminateAppWithError() { | ||||
|   // TODO: This is called when the secondary process can't ping the primary
 | ||||
|   // process. Need to find out what to do here.
 | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| bool DisplayShouldKillMessageBox() { | ||||
|   return chrome::ShowMessageBox( | ||||
|              NULL, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME), | ||||
|              l10n_util::GetStringUTF16(IDS_BROWSER_HUNGBROWSER_MESSAGE), | ||||
|              chrome::MESSAGE_BOX_TYPE_QUESTION) != | ||||
|          chrome::MESSAGE_BOX_RESULT_NO; | ||||
| } | ||||
| 
 | ||||
| }  // namespace
 | ||||
| 
 | ||||
| // Microsoft's Softricity virtualization breaks the sandbox processes.
 | ||||
| // So, if we detect the Softricity DLL we use WMI Win32_Process.Create to
 | ||||
| // break out of the virtualization environment.
 | ||||
| // http://code.google.com/p/chromium/issues/detail?id=43650
 | ||||
| bool ProcessSingleton::EscapeVirtualization( | ||||
|     const base::FilePath& user_data_dir) { | ||||
|   if (::GetModuleHandle(L"sftldr_wow64.dll") || | ||||
|       ::GetModuleHandle(L"sftldr.dll")) { | ||||
|     int process_id; | ||||
|     if (!installer::WMIProcess::Launch(::GetCommandLineW(), &process_id)) | ||||
|       return false; | ||||
|     is_virtualized_ = true; | ||||
|     // The new window was spawned from WMI, and won't be in the foreground.
 | ||||
|     // So, first we sleep while the new chrome.exe instance starts (because
 | ||||
|     // WaitForInputIdle doesn't work here). Then we poll for up to two more
 | ||||
|     // seconds and make the window foreground if we find it (or we give up).
 | ||||
|     HWND hwnd = 0; | ||||
|     ::Sleep(90); | ||||
|     for (int tries = 200; tries; --tries) { | ||||
|       hwnd = chrome::FindRunningChromeWindow(user_data_dir); | ||||
|       if (hwnd) { | ||||
|         ::SetForegroundWindow(hwnd); | ||||
|         break; | ||||
|       } | ||||
|       ::Sleep(10); | ||||
|     } | ||||
|     return true; | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| ProcessSingleton::ProcessSingleton( | ||||
|     const base::FilePath& user_data_dir, | ||||
|     const NotificationCallback& notification_callback) | ||||
|  | @ -234,7 +180,7 @@ ProcessSingleton::ProcessSingleton( | |||
|       lock_file_(INVALID_HANDLE_VALUE), | ||||
|       user_data_dir_(user_data_dir), | ||||
|       should_kill_remote_process_callback_( | ||||
|           base::Bind(&DisplayShouldKillMessageBox)) { | ||||
|           base::Bind(&TerminateAppWithError)) { | ||||
| } | ||||
| 
 | ||||
| ProcessSingleton::~ProcessSingleton() { | ||||
|  | @ -252,13 +198,13 @@ ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcess() { | |||
|     return PROCESS_NONE; | ||||
|   } | ||||
| 
 | ||||
|   switch (chrome::AttemptToNotifyRunningChrome(remote_window_, false)) { | ||||
|     case chrome::NOTIFY_SUCCESS: | ||||
|   switch (atom::AttemptToNotifyRunningAtom(remote_window_, false)) { | ||||
|     case atom::NOTIFY_SUCCESS: | ||||
|       return PROCESS_NOTIFIED; | ||||
|     case chrome::NOTIFY_FAILED: | ||||
|     case atom::NOTIFY_FAILED: | ||||
|       remote_window_ = NULL; | ||||
|       return PROCESS_NONE; | ||||
|     case chrome::NOTIFY_WINDOW_HUNG: | ||||
|     case atom::NOTIFY_WINDOW_HUNG: | ||||
|       // Fall through and potentially terminate the hung browser.
 | ||||
|       break; | ||||
|   } | ||||
|  | @ -297,8 +243,9 @@ ProcessSingleton::NotifyOtherProcessOrCreate() { | |||
|     if (result == PROCESS_NONE) | ||||
|       result = PROFILE_IN_USE; | ||||
|   } else { | ||||
|     g_browser_process->platform_part()->PlatformSpecificCommandLineProcessing( | ||||
|         *base::CommandLine::ForCurrentProcess()); | ||||
|     // TODO: Figure out how to implement this
 | ||||
|     //g_browser_process->platform_part()->PlatformSpecificCommandLineProcessing(
 | ||||
|     //    *base::CommandLine::ForCurrentProcess());
 | ||||
|   } | ||||
|   return result; | ||||
| } | ||||
|  | @ -307,12 +254,10 @@ ProcessSingleton::NotifyOtherProcessOrCreate() { | |||
| // isn't one, create a message window with its title set to the profile
 | ||||
| // directory path.
 | ||||
| bool ProcessSingleton::Create() { | ||||
|   static const wchar_t kMutexName[] = L"Local\\ChromeProcessSingletonStartup!"; | ||||
|   static const wchar_t kMetroActivationEventName[] = | ||||
|       L"Local\\ChromeProcessSingletonStartupMetroActivation!"; | ||||
|   static const wchar_t kMutexName[] = L"Local\\AtomProcessSingletonStartup!"; | ||||
| 
 | ||||
|   remote_window_ = chrome::FindRunningChromeWindow(user_data_dir_); | ||||
|   if (!remote_window_ && !EscapeVirtualization(user_data_dir_)) { | ||||
|   remote_window_ = atom::FindRunningAtomWindow(user_data_dir_); | ||||
|   if (!remote_window_) { | ||||
|     // Make sure we will be the one and only process creating the window.
 | ||||
|     // We use a named Mutex since we are protecting against multi-process
 | ||||
|     // access. As documented, it's clearer to NOT request ownership on creation
 | ||||
|  | @ -330,59 +275,7 @@ bool ProcessSingleton::Create() { | |||
|     // window at this time, but we must still check if someone created it
 | ||||
|     // between the time where we looked for it above and the time the mutex
 | ||||
|     // was given to us.
 | ||||
|     remote_window_ = chrome::FindRunningChromeWindow(user_data_dir_); | ||||
| 
 | ||||
| 
 | ||||
|     // In Win8+, a new Chrome process launched in Desktop mode may need to be
 | ||||
|     // transmuted into Metro Chrome (see ShouldLaunchInWindows8ImmersiveMode for
 | ||||
|     // heuristics). To accomplish this, the current Chrome activates Metro
 | ||||
|     // Chrome, releases the startup mutex, and waits for metro Chrome to take
 | ||||
|     // the singleton. From that point onward, the command line for this Chrome
 | ||||
|     // process will be sent to Metro Chrome by the usual channels.
 | ||||
|     if (!remote_window_ && base::win::GetVersion() >= base::win::VERSION_WIN8 && | ||||
|         !base::win::IsMetroProcess()) { | ||||
|       // |metro_activation_event| is created right before activating a Metro
 | ||||
|       // Chrome (note that there can only be one Metro Chrome process; by OS
 | ||||
|       // design); all following Desktop processes will then wait for this event
 | ||||
|       // to be signaled by Metro Chrome which will do so as soon as it grabs
 | ||||
|       // this singleton (should any of the waiting processes timeout waiting for
 | ||||
|       // the signal they will try to grab the singleton for themselves which
 | ||||
|       // will result in a forced Desktop Chrome launch in the worst case).
 | ||||
|       base::win::ScopedHandle metro_activation_event( | ||||
|           ::OpenEvent(SYNCHRONIZE, FALSE, kMetroActivationEventName)); | ||||
|       if (!metro_activation_event.IsValid() && | ||||
|           ShouldLaunchInWindows8ImmersiveMode(user_data_dir_)) { | ||||
|         // No Metro activation is under way, but the desire is to launch in
 | ||||
|         // Metro mode: activate and rendez-vous with the activated process.
 | ||||
|         metro_activation_event.Set( | ||||
|             ::CreateEvent(NULL, TRUE, FALSE, kMetroActivationEventName)); | ||||
|         if (!chrome::ActivateMetroChrome()) { | ||||
|           // Failed to launch immersive Chrome, default to launching on Desktop.
 | ||||
|           LOG(ERROR) << "Failed to launch immersive chrome"; | ||||
|           metro_activation_event.Close(); | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       if (metro_activation_event.IsValid()) { | ||||
|         // Release |only_me| (to let Metro Chrome grab this singleton) and wait
 | ||||
|         // until the event is signaled (i.e. Metro Chrome was successfully
 | ||||
|         // activated). Ignore timeout waiting for |metro_activation_event|.
 | ||||
|         { | ||||
|           AutoUnlockMutex auto_unlock_only_me(only_me.Get()); | ||||
| 
 | ||||
|           DWORD result = ::WaitForSingleObject(metro_activation_event.Get(), | ||||
|                                                kMetroChromeActivationTimeoutMs); | ||||
|           DPCHECK(result == WAIT_OBJECT_0 || result == WAIT_TIMEOUT) | ||||
|               << "Result = " << result; | ||||
|         } | ||||
| 
 | ||||
|         // Check if this singleton was successfully grabbed by another process
 | ||||
|         // (hopefully Metro Chrome). Failing to do so, this process will grab
 | ||||
|         // the singleton and launch in Desktop mode.
 | ||||
|         remote_window_ = chrome::FindRunningChromeWindow(user_data_dir_); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     remote_window_ = atom::FindRunningAtomWindow(user_data_dir_); | ||||
|     if (!remote_window_) { | ||||
|       // We have to make sure there is no Chrome instance running on another
 | ||||
|       // machine that uses the same profile.
 | ||||
|  | @ -409,15 +302,6 @@ bool ProcessSingleton::Create() { | |||
|             user_data_dir_.value()); | ||||
|         CHECK(result && window_.hwnd()); | ||||
|       } | ||||
| 
 | ||||
|       if (base::win::GetVersion() >= base::win::VERSION_WIN8) { | ||||
|         // Make sure no one is still waiting on Metro activation whether it
 | ||||
|         // succeeded (i.e., this is the Metro process) or failed.
 | ||||
|         base::win::ScopedHandle metro_activation_event( | ||||
|             ::OpenEvent(EVENT_MODIFY_STATE, FALSE, kMetroActivationEventName)); | ||||
|         if (metro_activation_event.IsValid()) | ||||
|           ::SetEvent(metro_activation_event.Get()); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Paul Betts
				Paul Betts