mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 20:28:26 +00:00
ole32/tests: Add a test for WM_DRAWCLIPBOARD during OleSetClipboard.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d437d61c57
commit
526b19551b
|
@ -945,6 +945,104 @@ static void test_set_clipboard(void)
|
||||||
OleUninitialize();
|
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)
|
static inline ULONG count_refs(IDataObject *d)
|
||||||
{
|
{
|
||||||
IDataObject_AddRef(d);
|
IDataObject_AddRef(d);
|
||||||
|
@ -1594,6 +1692,7 @@ START_TEST(clipboard)
|
||||||
{
|
{
|
||||||
test_get_clipboard_uninitialized();
|
test_get_clipboard_uninitialized();
|
||||||
test_set_clipboard();
|
test_set_clipboard();
|
||||||
|
test_set_clipboard_DRAWCLIPBOARD();
|
||||||
test_consumer_refs();
|
test_consumer_refs();
|
||||||
test_flushed_getdata();
|
test_flushed_getdata();
|
||||||
test_nonole_clipboard();
|
test_nonole_clipboard();
|
||||||
|
|
Loading…
Reference in a new issue