From 74b17a353a6a8d270a7009adbbf0fd77be62f97c Mon Sep 17 00:00:00 2001 From: Jactry Zeng Date: Tue, 5 Mar 2019 17:49:13 +0800 Subject: [PATCH] riched20: Handle REO_IOB_SELECTION in IRichEditOle::GetObject(). Signed-off-by: Jactry Zeng Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/riched20/richole.c | 10 +++++++ dlls/riched20/tests/richole.c | 55 +++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index 447e7d45996..93003eb281f 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -1391,6 +1391,16 @@ IRichEditOle_fnGetObject(IRichEditOle *me, LONG iob, else reobj = cursor.pRun->member.run.reobj; } + else if (iob == REO_IOB_SELECTION) + { + ME_Cursor *from, *to; + + ME_GetSelection(This->editor, &from, &to); + if (!from->pRun->member.run.reobj) + return E_INVALIDARG; + else + reobj = from->pRun->member.run.reobj; + } else { if (iob > IRichEditOle_GetObjectCount(me)) diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c index 52399047ad5..d9c7fa16700 100644 --- a/dlls/riched20/tests/richole.c +++ b/dlls/riched20/tests/richole.c @@ -3328,6 +3328,61 @@ static void test_InsertObject(void) /* received_reo4 didn't be zeroed in E_INVALIDARG case */ CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo2.polesite, 2); + SendMessageA(hwnd, EM_SETSEL, 0, 1); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 1; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo1.polesite, 1); + + SendMessageA(hwnd, EM_SETSEL, 1, 2); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo3.polesite, 3); + + SendMessageA(hwnd, EM_SETSEL, 2, 3); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo2.polesite, 2); + + SendMessageA(hwnd, EM_SETSEL, 0, 2); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo1.polesite, 1); + + SendMessageA(hwnd, EM_SETSEL, 1, 3); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo3.polesite, 3); + + SendMessageA(hwnd, EM_SETSEL, 2, 0); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo1.polesite, 1); + + SendMessageA(hwnd, EM_SETSEL, 0, 6); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == S_OK, "IRichEditOle_GetObject failed: 0x%08x\n", hr); + CHECK_REOBJECT_STRUCT(received_reo4, NULL, NULL, reo1.polesite, 1); + + SendMessageA(hwnd, EM_SETSEL, 4, 5); + received_reo4.cbStruct = sizeof(received_reo4); + received_reo4.cp = 0; + hr = IRichEditOle_GetObject(reole, REO_IOB_SELECTION, &received_reo4, REO_GETOBJ_ALL_INTERFACES); + ok(hr == E_INVALIDARG, "IRichEditOle_GetObject should fail: 0x%08x\n", hr); + release_interfaces(&hwnd, &reole, &doc, NULL); }