// Copyright (c) 2015 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. #include "components/browser_watcher/endsession_watcher_window_win.h" #include "base/logging.h" #include "base/profiler/scoped_tracker.h" #include "base/win/wrapped_window_proc.h" namespace browser_watcher { namespace { const wchar_t kWindowClassName[] = L"Chrome_BrowserWatcherWindow"; } // namespace EndSessionWatcherWindow::EndSessionWatcherWindow( const EndSessionMessageCallback& on_end_session_message) : on_end_session_message_(on_end_session_message) { WNDCLASSEX window_class = {0}; base::win::InitializeWindowClass( kWindowClassName, &base::win::WrappedWindowProc, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, &window_class); instance_ = window_class.hInstance; ATOM clazz = ::RegisterClassEx(&window_class); DCHECK(clazz); // TODO(siggi): will a message window do here? window_ = ::CreateWindow(kWindowClassName, 0, 0, 0, 0, 0, 0, 0, 0, instance_, 0); ::SetWindowLongPtr(window_, GWLP_USERDATA, reinterpret_cast(this)); DCHECK_EQ(::GetWindowLongPtr(window_, GWLP_USERDATA), reinterpret_cast(this)); } EndSessionWatcherWindow::~EndSessionWatcherWindow() { if (window_) { ::DestroyWindow(window_); ::UnregisterClass(kWindowClassName, instance_); } } LRESULT EndSessionWatcherWindow::OnEndSessionMessage(UINT message, WPARAM wparam, LPARAM lparam) { on_end_session_message_.Run(message, lparam); return 0; } LRESULT CALLBACK EndSessionWatcherWindow::WndProcThunk(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { // TODO(vadimt): Remove ScopedTracker below once crbug.com/440919 is fixed. tracked_objects::ScopedTracker tracking_profile( FROM_HERE_WITH_EXPLICIT_FUNCTION( "440919 EndSessionWatcherWindow::WndProcThunk")); EndSessionWatcherWindow* msg_wnd = reinterpret_cast( ::GetWindowLongPtr(hwnd, GWLP_USERDATA)); if (msg_wnd) return msg_wnd->WndProc(hwnd, message, wparam, lparam); return ::DefWindowProc(hwnd, message, wparam, lparam); } LRESULT EndSessionWatcherWindow::WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch (message) { case WM_ENDSESSION: case WM_QUERYENDSESSION: return OnEndSessionMessage(message, wparam, lparam); default: break; } return ::DefWindowProc(hwnd, message, wparam, lparam); } } // namespace browser_watcher