| 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 #include "chrome/browser/process_singleton.h" | 5 #include "chrome/browser/process_singleton.h" |
| 6 | 6 |
| 7 #include <shellapi.h> | 7 #include <shellapi.h> |
| 8 #include <shobjidl.h> | 8 #include <shobjidl.h> |
| 9 | 9 |
| 10 #include "base/base_paths.h" | 10 #include "base/base_paths.h" |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 // data while a new chrome is starting up. | 359 // data while a new chrome is starting up. |
| 360 if (window_) { | 360 if (window_) { |
| 361 ::DestroyWindow(window_); | 361 ::DestroyWindow(window_); |
| 362 ::UnregisterClass(chrome::kMessageWindowClass, | 362 ::UnregisterClass(chrome::kMessageWindowClass, |
| 363 base::GetModuleFromAddress(&ThunkWndProc)); | 363 base::GetModuleFromAddress(&ThunkWndProc)); |
| 364 } | 364 } |
| 365 if (lock_file_ != INVALID_HANDLE_VALUE) | 365 if (lock_file_ != INVALID_HANDLE_VALUE) |
| 366 CloseHandle(lock_file_); | 366 CloseHandle(lock_file_); |
| 367 } | 367 } |
| 368 | 368 |
| 369 ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcessOrCreate( |
| 370 const NotificationCallback& notification_callback) { |
| 371 NotifyResult result = NotifyOtherProcess(); |
| 372 if (result != PROCESS_NONE) |
| 373 return result; |
| 374 return Create(notification_callback) ? PROCESS_NONE : PROFILE_IN_USE; |
| 375 } |
| 376 |
| 377 void ProcessSingleton::Cleanup() { |
| 378 } |
| 379 |
| 369 ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcess() { | 380 ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcess() { |
| 370 if (is_virtualized_) | 381 if (is_virtualized_) |
| 371 return PROCESS_NOTIFIED; // We already spawned the process in this case. | 382 return PROCESS_NOTIFIED; // We already spawned the process in this case. |
| 372 if (lock_file_ == INVALID_HANDLE_VALUE && !remote_window_) { | 383 if (lock_file_ == INVALID_HANDLE_VALUE && !remote_window_) { |
| 373 return LOCK_ERROR; | 384 return LOCK_ERROR; |
| 374 } else if (!remote_window_) { | 385 } else if (!remote_window_) { |
| 375 g_browser_process->PlatformSpecificCommandLineProcessing( | 386 g_browser_process->PlatformSpecificCommandLineProcessing( |
| 376 *CommandLine::ForCurrentProcess()); | 387 *CommandLine::ForCurrentProcess()); |
| 377 return PROCESS_NONE; | 388 return PROCESS_NONE; |
| 378 } | 389 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 // The user denied. Quit silently. | 483 // The user denied. Quit silently. |
| 473 return PROCESS_NOTIFIED; | 484 return PROCESS_NOTIFIED; |
| 474 } | 485 } |
| 475 | 486 |
| 476 // Time to take action. Kill the browser process. | 487 // Time to take action. Kill the browser process. |
| 477 base::KillProcessById(process_id, content::RESULT_CODE_HUNG, true); | 488 base::KillProcessById(process_id, content::RESULT_CODE_HUNG, true); |
| 478 remote_window_ = NULL; | 489 remote_window_ = NULL; |
| 479 return PROCESS_NONE; | 490 return PROCESS_NONE; |
| 480 } | 491 } |
| 481 | 492 |
| 482 ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcessOrCreate( | |
| 483 const NotificationCallback& notification_callback) { | |
| 484 NotifyResult result = NotifyOtherProcess(); | |
| 485 if (result != PROCESS_NONE) | |
| 486 return result; | |
| 487 return Create(notification_callback) ? PROCESS_NONE : PROFILE_IN_USE; | |
| 488 } | |
| 489 | |
| 490 // On Windows, there is no need to call Create() since the message | 493 // On Windows, there is no need to call Create() since the message |
| 491 // window is created in the constructor but to avoid having more | 494 // window is created in the constructor but to avoid having more |
| 492 // platform specific code in browser_main.cc we tolerate calls to | 495 // platform specific code in browser_main.cc we tolerate calls to |
| 493 // Create(). | 496 // Create(). |
| 494 bool ProcessSingleton::Create( | 497 bool ProcessSingleton::Create( |
| 495 const NotificationCallback& notification_callback) { | 498 const NotificationCallback& notification_callback) { |
| 496 DCHECK(!remote_window_); | 499 DCHECK(!remote_window_); |
| 497 DCHECK(notification_callback_.is_null()); | 500 DCHECK(notification_callback_.is_null()); |
| 498 | 501 |
| 499 if (window_ != NULL) | 502 if (window_ != NULL) |
| 500 notification_callback_ = notification_callback; | 503 notification_callback_ = notification_callback; |
| 501 | 504 |
| 502 return window_ != NULL; | 505 return window_ != NULL; |
| 503 } | 506 } |
| 504 | 507 |
| 505 void ProcessSingleton::Cleanup() { | |
| 506 } | |
| 507 | |
| 508 LRESULT ProcessSingleton::OnCopyData(HWND hwnd, const COPYDATASTRUCT* cds) { | 508 LRESULT ProcessSingleton::OnCopyData(HWND hwnd, const COPYDATASTRUCT* cds) { |
| 509 // If locked, it means we are not ready to process this message because | 509 // If locked, it means we are not ready to process this message because |
| 510 // we are probably in a first run critical phase. | 510 // we are probably in a first run critical phase. |
| 511 if (locked_) { | 511 if (locked_) { |
| 512 #if defined(USE_AURA) | 512 #if defined(USE_AURA) |
| 513 NOTIMPLEMENTED(); | 513 NOTIMPLEMENTED(); |
| 514 #else | 514 #else |
| 515 // Attempt to place ourselves in the foreground / flash the task bar. | 515 // Attempt to place ourselves in the foreground / flash the task bar. |
| 516 if (foreground_window_ != NULL && IsWindow(foreground_window_)) { | 516 if (foreground_window_ != NULL && IsWindow(foreground_window_)) { |
| 517 SetForegroundWindow(foreground_window_); | 517 SetForegroundWindow(foreground_window_); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 541 switch (message) { | 541 switch (message) { |
| 542 case WM_COPYDATA: | 542 case WM_COPYDATA: |
| 543 return OnCopyData(reinterpret_cast<HWND>(wparam), | 543 return OnCopyData(reinterpret_cast<HWND>(wparam), |
| 544 reinterpret_cast<COPYDATASTRUCT*>(lparam)); | 544 reinterpret_cast<COPYDATASTRUCT*>(lparam)); |
| 545 default: | 545 default: |
| 546 break; | 546 break; |
| 547 } | 547 } |
| 548 | 548 |
| 549 return ::DefWindowProc(hwnd, message, wparam, lparam); | 549 return ::DefWindowProc(hwnd, message, wparam, lparam); |
| 550 } | 550 } |
| OLD | NEW |