Index: base/win/wrapped_window_proc_unittest.cc |
=================================================================== |
--- base/win/wrapped_window_proc_unittest.cc (revision 0) |
+++ base/win/wrapped_window_proc_unittest.cc (revision 0) |
@@ -0,0 +1,79 @@ |
+// Copyright (c) 2011 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 "base/win/wrapped_window_proc.h" |
+#include "base/message_loop.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+DWORD kExceptionCode = 12345; |
+WPARAM kCrashMsg = 98765; |
+ |
+// A trivial WindowProc that generates an exception. |
+LRESULT CALLBACK TestWindowProc(HWND hwnd, UINT message, |
+ WPARAM wparam, LPARAM lparam) { |
+ if (message == kCrashMsg) |
+ RaiseException(kExceptionCode, 0, 0, NULL); |
+ return DefWindowProc(hwnd, message, wparam, lparam); |
+} |
+ |
+// This class implements an exception filter that can be queried about a past |
+// exception. |
+class TestWrappedExceptionFiter { |
+ public: |
+ TestWrappedExceptionFiter() : called_(false) { |
+ EXPECT_FALSE(s_filter_); |
+ s_filter_ = this; |
+ } |
+ |
+ ~TestWrappedExceptionFiter() { |
+ EXPECT_EQ(s_filter_, this); |
+ s_filter_ = NULL; |
+ } |
+ |
+ bool called() { |
+ return called_; |
+ } |
+ |
+ // The actual exception filter just records the exception. |
+ static int Filter(EXCEPTION_POINTERS* info) { |
+ EXPECT_FALSE(s_filter_->called_); |
+ if (info->ExceptionRecord->ExceptionCode == kExceptionCode) |
+ s_filter_->called_ = true; |
+ return EXCEPTION_EXECUTE_HANDLER; |
+ } |
+ |
+ private: |
+ bool called_; |
+ static TestWrappedExceptionFiter* s_filter_; |
+}; |
+TestWrappedExceptionFiter* TestWrappedExceptionFiter::s_filter_ = NULL; |
+ |
+} // namespace. |
+ |
+TEST(WrappedWindowProc, CatchesExceptions) { |
+ HINSTANCE hinst = GetModuleHandle(NULL); |
+ std::wstring class_name(L"TestClass"); |
+ |
+ WNDCLASS wc = {0}; |
+ wc.lpfnWndProc = base::win::WrappedWindowProc<TestWindowProc>; |
+ wc.hInstance = hinst; |
+ wc.lpszClassName = class_name.c_str(); |
+ RegisterClass(&wc); |
+ |
+ HWND window = CreateWindow(class_name.c_str(), 0, 0, 0, 0, 0, 0, HWND_MESSAGE, |
+ 0, hinst, 0); |
+ ASSERT_TRUE(window); |
+ |
+ // Before generating the exception we make sure that the filter will see it. |
+ TestWrappedExceptionFiter wrapper; |
+ base::win::WinProcExceptionFilter old_filter = |
+ base::win::SetWinProcExceptionFilter(TestWrappedExceptionFiter::Filter); |
+ |
+ SendMessage(window, kCrashMsg, 0, 0); |
+ EXPECT_TRUE(wrapper.called()); |
+ |
+ base::win::SetWinProcExceptionFilter(old_filter); |
+} |
Property changes on: base\win\wrapped_window_proc_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |