ole32/tests: Add a test for WM_DRAWCLIPBOARD during OleSetClipboard.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2017-01-02 12:13:28 +01:00
parent d437d61c57
commit 526b19551b
1 changed files with 99 additions and 0 deletions

View File

@ -945,6 +945,104 @@ static void test_set_clipboard(void)
OleUninitialize();
}
static LPDATAOBJECT clip_data;
static HWND next_wnd;
static UINT wm_drawclipboard;
static LRESULT CALLBACK clipboard_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
LRESULT ret;
switch (msg)
{
case WM_DRAWCLIPBOARD:
wm_drawclipboard++;
if (clip_data)
{
/* if this is the WM_DRAWCLIPBOARD of a previous change, the data isn't current yet */
/* this demonstrates an issue in Qt where it will free the data while it's being set */
HRESULT hr = OleIsCurrentClipboard( clip_data );
ok( hr == (wm_drawclipboard > 1) ? S_OK : S_FALSE,
"OleIsCurrentClipboard returned %x\n", hr );
}
break;
case WM_CHANGECBCHAIN:
if (next_wnd == (HWND)wp) next_wnd = (HWND)lp;
else if (next_wnd) SendMessageA( next_wnd, msg, wp, lp );
break;
case WM_USER:
ret = wm_drawclipboard;
wm_drawclipboard = 0;
return ret;
}
return DefWindowProcA(hwnd, msg, wp, lp);
}
static DWORD CALLBACK set_clipboard_thread(void *arg)
{
OpenClipboard( GetDesktopWindow() );
EmptyClipboard();
SetClipboardData( CF_WAVE, 0 );
CloseClipboard();
return 0;
}
/* test that WM_DRAWCLIPBOARD can be delivered for a previous change during OleSetClipboard */
static void test_set_clipboard_DRAWCLIPBOARD(void)
{
LPDATAOBJECT data;
HRESULT hr;
WNDCLASSA cls;
HWND viewer;
int ret;
HANDLE thread;
hr = DataObjectImpl_CreateText("data", &data);
ok(hr == S_OK, "Failed to create data object: 0x%08x\n", hr);
memset(&cls, 0, sizeof(cls));
cls.lpfnWndProc = clipboard_wnd_proc;
cls.hInstance = GetModuleHandleA(NULL);
cls.lpszClassName = "clipboard_test";
RegisterClassA(&cls);
viewer = CreateWindowA("clipboard_test", NULL, 0, 0, 0, 0, 0, NULL, 0, NULL, 0);
ok(viewer != NULL, "CreateWindow failed: %d\n", GetLastError());
next_wnd = SetClipboardViewer( viewer );
ret = SendMessageA( viewer, WM_USER, 0, 0 );
ok( ret == 1, "%u WM_DRAWCLIPBOARD received\n", ret );
hr = OleInitialize(NULL);
ok(hr == S_OK, "OleInitialize failed with error 0x%08x\n", hr);
ret = SendMessageA( viewer, WM_USER, 0, 0 );
ok( !ret, "%u WM_DRAWCLIPBOARD received\n", ret );
thread = CreateThread(NULL, 0, set_clipboard_thread, NULL, 0, NULL);
ok(thread != NULL, "CreateThread failed (%d)\n", GetLastError());
ret = WaitForSingleObject(thread, 5000);
ok(ret == WAIT_OBJECT_0, "WaitForSingleObject returned %x\n", ret);
clip_data = data;
hr = OleSetClipboard(data);
ok(hr == S_OK, "failed to set clipboard to data, hr = 0x%08x\n", hr);
ret = SendMessageA( viewer, WM_USER, 0, 0 );
ok( ret == 2, "%u WM_DRAWCLIPBOARD received\n", ret );
clip_data = NULL;
hr = OleFlushClipboard();
ok(hr == S_OK, "failed to flush clipboard, hr = 0x%08x\n", hr);
ret = IDataObject_Release(data);
ok(ret == 0, "got %d\n", ret);
OleUninitialize();
ChangeClipboardChain( viewer, next_wnd );
DestroyWindow( viewer );
}
static inline ULONG count_refs(IDataObject *d)
{
IDataObject_AddRef(d);
@ -1594,6 +1692,7 @@ START_TEST(clipboard)
{
test_get_clipboard_uninitialized();
test_set_clipboard();
test_set_clipboard_DRAWCLIPBOARD();
test_consumer_refs();
test_flushed_getdata();
test_nonole_clipboard();