Chromium Code Reviews| Index: components/browser_watcher/window_hang_monitor_win.cc |
| diff --git a/components/browser_watcher/window_hang_monitor_win.cc b/components/browser_watcher/window_hang_monitor_win.cc |
| index 964a6f76f4620a56aa2d2d4a557d1bec65b63ec5..c5a60b05c31dc8220508251efa80f2786712f8d7 100644 |
| --- a/components/browser_watcher/window_hang_monitor_win.cc |
| +++ b/components/browser_watcher/window_hang_monitor_win.cc |
| @@ -13,13 +13,29 @@ namespace browser_watcher { |
| namespace { |
| -HWND FindNamedWindowForProcess(const base::string16 name, base::ProcessId pid) { |
| - HWND candidate = base::win::MessageWindow::FindWindow(name); |
| - if (candidate) { |
| +// Returns the class name for the |window|. |
| +base::string16 GetWindowClassName(HWND window) { |
| + const int kClassNameLength = MAX_PATH; |
| + wchar_t class_name[kClassNameLength]; |
| + int nb_copied = ::GetClassName(window, class_name, kClassNameLength); |
| + if (nb_copied) { |
| + return base::string16(class_name); |
| + } |
| + return base::string16(); |
| +} |
| + |
| +// Returns the Chrome message window handle for the specified |pid| or nullptr |
| +// if not found. |
| +HWND FindChromeMessageWindow(base::ProcessId pid) { |
|
Sigurður Ásgeirsson
2016/01/11 19:42:59
now that I think about it, I'm not sure this is "g
Patrick Monette
2016/01/20 17:21:35
So I'm now also check that the name of the window
|
| + HWND candidate = ::FindWindowEx(HWND_MESSAGE, nullptr, nullptr, nullptr); |
| + while (candidate) { |
| DWORD actual_process_id = 0; |
| ::GetWindowThreadProcessId(candidate, &actual_process_id); |
| - if (actual_process_id == pid) |
| + if (GetWindowClassName(candidate) == L"Chrome_MessageWindow" && |
|
Sigurður Ásgeirsson
2016/01/11 19:42:59
doesn't matter a whole lot, but you can avoid a bu
Patrick Monette
2016/01/20 17:21:35
Done.
|
| + actual_process_id == pid) { |
| return candidate; |
| + } |
| + candidate = ::GetNextWindow(candidate, GW_HWNDNEXT); |
| } |
| return nullptr; |
| } |
| @@ -45,9 +61,7 @@ WindowHangMonitor::~WindowHangMonitor() { |
| } |
| } |
| -void WindowHangMonitor::Initialize(base::Process process, |
| - const base::string16& window_name) { |
| - window_name_ = window_name; |
| +void WindowHangMonitor::Initialize(base::Process process) { |
| window_process_ = process.Pass(); |
| timer_.SetTaskRunner(base::MessageLoop::current()->task_runner()); |
| @@ -69,7 +83,7 @@ void WindowHangMonitor::PollForWindow() { |
| return; |
| } |
| - HWND hwnd = FindNamedWindowForProcess(window_name_, window_process_.Pid()); |
| + HWND hwnd = FindChromeMessageWindow(window_process_.Pid()); |
| if (hwnd) { |
| // Sends a ping and schedules a timeout task. Upon receiving a ping response |
| // further pings will be scheduled ad infinitum. Will signal any failure now |
| @@ -129,8 +143,7 @@ void WindowHangMonitor::OnHangTimeout(HWND hwnd) { |
| outstanding_ping_->monitor = NULL; |
| outstanding_ping_ = NULL; |
| - if (hwnd != |
| - FindNamedWindowForProcess(window_name_, window_process_.Pid())) { |
| + if (hwnd != FindChromeMessageWindow(window_process_.Pid())) { |
| // The window vanished. |
| callback_.Run(WINDOW_VANISHED); |
| } else { |
| @@ -155,7 +168,7 @@ void WindowHangMonitor::OnRetryTimeout() { |
| // process. |
| // 2. The window handle might have been re-assigned to a different process |
| // at any point after we found it. |
| - HWND hwnd = FindNamedWindowForProcess(window_name_, window_process_.Pid()); |
| + HWND hwnd = FindChromeMessageWindow(window_process_.Pid()); |
| if (hwnd) |
| SendPing(hwnd); |
| else |