mshtml: OleDocumentView_UIActivate should call IOleInPlaceUIWindow_SetActiveObject and IOleInPlaceFrame_SetBorderSpace.
Add a test to show this behaviour. Don't call nsIWebBrowserFocus_Activate when just activating the window. Instead call it when UI-activating the window.
This commit is contained in:
parent
d7c7cbf6b6
commit
92b3cab791
|
@ -122,6 +122,7 @@ struct HTMLDocument {
|
|||
IDocHostUIHandler *hostui;
|
||||
IOleInPlaceSite *ipsite;
|
||||
IOleInPlaceFrame *frame;
|
||||
IOleInPlaceUIWindow *ip_window;
|
||||
|
||||
BSCallback *bscallback;
|
||||
IMoniker *mon;
|
||||
|
|
|
@ -125,10 +125,13 @@ DEFINE_EXPECT(UnlockRequest);
|
|||
DEFINE_EXPECT(OnFocus_TRUE);
|
||||
DEFINE_EXPECT(OnFocus_FALSE);
|
||||
DEFINE_EXPECT(RequestUIActivate);
|
||||
DEFINE_EXPECT(InPlaceFrame_SetBorderSpace);
|
||||
DEFINE_EXPECT(InPlaceUIWindow_SetActiveObject);
|
||||
|
||||
static IUnknown *doc_unk;
|
||||
static BOOL expect_LockContainer_fLock;
|
||||
static BOOL expect_SetActiveObject_active, ipsex;
|
||||
static BOOL expect_SetActiveObject_active, expect_InPlaceUIWindow_SetActiveObject_active;
|
||||
static BOOL ipsex;
|
||||
static BOOL set_clientsite = FALSE, container_locked = FALSE;
|
||||
static BOOL readystate_set_loading = FALSE, load_from_stream;
|
||||
static BOOL editmode = FALSE;
|
||||
|
@ -1115,15 +1118,28 @@ static HRESULT WINAPI InPlaceFrame_RequestBorderSpace(IOleInPlaceFrame *iface,
|
|||
static HRESULT WINAPI InPlaceFrame_SetBorderSpace(IOleInPlaceFrame *iface,
|
||||
LPCBORDERWIDTHS pborderwidths)
|
||||
{
|
||||
ok(0, "unexpected call\n");
|
||||
return E_NOTIMPL;
|
||||
CHECK_EXPECT(InPlaceFrame_SetBorderSpace);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
|
||||
IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName)
|
||||
{
|
||||
ok(0, "unexpected call\n");
|
||||
return E_NOTIMPL;
|
||||
static const WCHAR wszHTML_Document[] =
|
||||
{'H','T','M','L',' ','D','o','c','u','m','e','n','t',0};
|
||||
|
||||
CHECK_EXPECT2(InPlaceUIWindow_SetActiveObject);
|
||||
|
||||
if(expect_InPlaceUIWindow_SetActiveObject_active) {
|
||||
ok(pActiveObject != NULL, "pActiveObject = NULL\n");
|
||||
if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH)
|
||||
ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
|
||||
}
|
||||
else {
|
||||
ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
|
||||
ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
|
||||
|
@ -1468,7 +1484,14 @@ static ULONG WINAPI DocumentSite_Release(IOleDocumentSite *iface)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static BOOL call_UIActivate = TRUE;
|
||||
typedef enum
|
||||
{
|
||||
CallUIActivate_None,
|
||||
CallUIActivate_ActivateMe,
|
||||
CallUIActivate_AfterShow,
|
||||
} CallUIActivate;
|
||||
|
||||
static BOOL call_UIActivate = CallUIActivate_ActivateMe;
|
||||
static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocumentView *pViewToActivate)
|
||||
{
|
||||
IOleDocument *document;
|
||||
|
@ -1512,7 +1535,7 @@ static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocum
|
|||
ok(hwnd == NULL, "hwnd=%p, expeted NULL\n", hwnd);
|
||||
}
|
||||
|
||||
if(call_UIActivate) {
|
||||
if(call_UIActivate == CallUIActivate_ActivateMe) {
|
||||
SET_EXPECT(CanInPlaceActivate);
|
||||
SET_EXPECT(GetWindowContext);
|
||||
SET_EXPECT(GetWindow);
|
||||
|
@ -1572,7 +1595,7 @@ static HRESULT WINAPI DocumentSite_ActivateMe(IOleDocumentSite *iface, IOleDocum
|
|||
hres = IOleDocumentView_SetRect(view, &rect);
|
||||
ok(hres == S_OK, "SetRect failed: %08x\n", hres);
|
||||
|
||||
if(call_UIActivate) {
|
||||
if(call_UIActivate == CallUIActivate_ActivateMe) {
|
||||
hres = IOleDocumentView_Show(view, TRUE);
|
||||
ok(hres == S_OK, "Show failed: %08x\n", hres);
|
||||
}else {
|
||||
|
@ -1685,7 +1708,7 @@ static HRESULT WINAPI OleControlSite_OnFocus(IOleControlSite *iface, BOOL fGotFo
|
|||
if(fGotFocus)
|
||||
CHECK_EXPECT(OnFocus_TRUE);
|
||||
else
|
||||
CHECK_EXPECT(OnFocus_FALSE);
|
||||
CHECK_EXPECT2(OnFocus_FALSE);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -1759,7 +1782,10 @@ static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD d
|
|||
ok(pActiveObject != NULL, "pActiveObject = NULL\n");
|
||||
ok(pCommandTarget != NULL, "pCommandTarget = NULL\n");
|
||||
ok(pFrame == &InPlaceFrame, "pFrame=%p, expected %p\n", pFrame, &InPlaceFrame);
|
||||
ok(pDoc == NULL, "pDoc=%p, expected NULL\n", pDoc);
|
||||
if (expect_InPlaceUIWindow_SetActiveObject_active)
|
||||
ok(pDoc == (IOleInPlaceUIWindow *)&InPlaceUIWindow, "pDoc=%p, expected %p\n", pDoc, &InPlaceUIWindow);
|
||||
else
|
||||
ok(pDoc == NULL, "pDoc=%p, expected NULL\n", pDoc);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -3236,6 +3262,7 @@ static void test_InPlaceDeactivate(IUnknown *unk, BOOL expect_call)
|
|||
static HRESULT test_Activate(IUnknown *unk, DWORD flags)
|
||||
{
|
||||
IOleObject *oleobj = NULL;
|
||||
IOleDocumentView *docview;
|
||||
GUID guid;
|
||||
HRESULT hres;
|
||||
|
||||
|
@ -3264,6 +3291,31 @@ static HRESULT test_Activate(IUnknown *unk, DWORD flags)
|
|||
|
||||
hres = test_DoVerb(oleobj);
|
||||
|
||||
if(call_UIActivate == CallUIActivate_AfterShow) {
|
||||
hres = IOleObject_QueryInterface(oleobj, &IID_IOleDocumentView, (void **)&docview);
|
||||
ok(hres == S_OK, "IOleObject_QueryInterface failed with error 0x%08x\n", hres);
|
||||
|
||||
SET_EXPECT(OnFocus_TRUE);
|
||||
SET_EXPECT(SetActiveObject);
|
||||
SET_EXPECT(ShowUI);
|
||||
SET_EXPECT(InPlaceUIWindow_SetActiveObject);
|
||||
SET_EXPECT(InPlaceFrame_SetBorderSpace);
|
||||
expect_InPlaceUIWindow_SetActiveObject_active = TRUE;
|
||||
expect_SetActiveObject_active = TRUE;
|
||||
expect_status_text = NULL;
|
||||
|
||||
hres = IOleDocumentView_UIActivate(docview, TRUE);
|
||||
ok(hres == S_OK, "IOleDocumentView_UIActivate failed with error 0x%08x\n", hres);
|
||||
|
||||
CHECK_CALLED(OnFocus_TRUE);
|
||||
CHECK_CALLED(SetActiveObject);
|
||||
CHECK_CALLED(ShowUI);
|
||||
CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
|
||||
CHECK_CALLED(InPlaceFrame_SetBorderSpace);
|
||||
|
||||
IOleDocumentView_Release(docview);
|
||||
}
|
||||
|
||||
IOleObject_Release(oleobj);
|
||||
|
||||
test_OnFrameWindowActivate(unk);
|
||||
|
@ -3321,21 +3373,28 @@ static void test_UIDeactivate(void)
|
|||
{
|
||||
HRESULT hres;
|
||||
|
||||
if(call_UIActivate) {
|
||||
if(call_UIActivate == CallUIActivate_AfterShow) {
|
||||
SET_EXPECT(InPlaceUIWindow_SetActiveObject);
|
||||
}
|
||||
if(call_UIActivate != CallUIActivate_None) {
|
||||
SET_EXPECT(SetActiveObject);
|
||||
SET_EXPECT(HideUI);
|
||||
SET_EXPECT(OnUIDeactivate);
|
||||
}
|
||||
|
||||
expect_SetActiveObject_active = FALSE;
|
||||
expect_InPlaceUIWindow_SetActiveObject_active = FALSE;
|
||||
hres = IOleDocumentView_UIActivate(view, FALSE);
|
||||
ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
|
||||
|
||||
if(call_UIActivate) {
|
||||
if(call_UIActivate != CallUIActivate_None) {
|
||||
CHECK_CALLED(SetActiveObject);
|
||||
CHECK_CALLED(HideUI);
|
||||
CHECK_CALLED(OnUIDeactivate);
|
||||
}
|
||||
if(call_UIActivate == CallUIActivate_AfterShow) {
|
||||
CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_Hide(void)
|
||||
|
@ -3431,7 +3490,7 @@ static void init_test(enum load_state_t ls) {
|
|||
hwnd = last_hwnd = NULL;
|
||||
set_clientsite = FALSE;
|
||||
load_from_stream = FALSE;
|
||||
call_UIActivate = FALSE;
|
||||
call_UIActivate = CallUIActivate_None;
|
||||
load_state = ls;
|
||||
editmode = FALSE;
|
||||
stream_read = 0;
|
||||
|
@ -3503,7 +3562,7 @@ static void test_HTMLDocument(enum load_state_t ls)
|
|||
test_Close(unk, FALSE);
|
||||
|
||||
/* Activate HTMLDocument again, this time without UIActivate */
|
||||
call_UIActivate = FALSE;
|
||||
call_UIActivate = CallUIActivate_None;
|
||||
test_Activate(unk, CLIENTSITE_SETNULL);
|
||||
test_Window(unk, TRUE);
|
||||
test_UIDeactivate();
|
||||
|
@ -3514,6 +3573,18 @@ static void test_HTMLDocument(enum load_state_t ls)
|
|||
test_OnAmbientPropertyChange2(unk);
|
||||
test_GetCurMoniker(unk, load_state == LD_NO ? NULL : &Moniker, NULL);
|
||||
|
||||
if(ls != LD_DOLOAD) {
|
||||
/* Activate HTMLDocument again, calling UIActivate after showing the window */
|
||||
call_UIActivate = CallUIActivate_AfterShow;
|
||||
test_Activate(unk, 0);
|
||||
test_Window(unk, TRUE);
|
||||
test_OleCommandTarget(unk);
|
||||
test_UIDeactivate();
|
||||
test_InPlaceDeactivate(unk, TRUE);
|
||||
test_Close(unk, FALSE);
|
||||
call_UIActivate = CallUIActivate_None;
|
||||
}
|
||||
|
||||
if(view)
|
||||
IOleDocumentView_Release(view);
|
||||
view = NULL;
|
||||
|
|
|
@ -93,7 +93,6 @@ static void activate_gecko(NSContainer *This)
|
|||
|
||||
nsIBaseWindow_SetVisibility(This->window, TRUE);
|
||||
nsIBaseWindow_SetEnabled(This->window, TRUE);
|
||||
nsIWebBrowserFocus_Activate(This->focus);
|
||||
}
|
||||
|
||||
void update_doc(HTMLDocument *This, DWORD flags)
|
||||
|
@ -214,6 +213,8 @@ static LRESULT WINAPI serverwnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
|
|||
break;
|
||||
case WM_TIMER:
|
||||
return on_timer(This);
|
||||
case WM_MOUSEACTIVATE:
|
||||
return MA_ACTIVATE;
|
||||
}
|
||||
|
||||
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
||||
|
@ -235,7 +236,6 @@ static void register_serverwnd_class(void)
|
|||
|
||||
static HRESULT activate_window(HTMLDocument *This)
|
||||
{
|
||||
IOleInPlaceUIWindow *pIPWnd;
|
||||
IOleInPlaceFrame *pIPFrame;
|
||||
IOleCommandTarget *cmdtrg;
|
||||
IOleInPlaceSiteEx *ipsiteex;
|
||||
|
@ -253,17 +253,15 @@ static HRESULT activate_window(HTMLDocument *This)
|
|||
return FAILED(hres) ? hres : E_FAIL;
|
||||
}
|
||||
|
||||
hres = IOleInPlaceSite_GetWindowContext(This->ipsite, &pIPFrame, &pIPWnd,
|
||||
hres = IOleInPlaceSite_GetWindowContext(This->ipsite, &pIPFrame, &This->ip_window,
|
||||
&posrect, &cliprect, &frameinfo);
|
||||
if(FAILED(hres)) {
|
||||
WARN("GetWindowContext failed: %08x\n", hres);
|
||||
return hres;
|
||||
}
|
||||
|
||||
if(pIPWnd)
|
||||
IOleInPlaceUIWindow_Release(pIPWnd);
|
||||
TRACE("got window context: %p %p {%d %d %d %d} {%d %d %d %d} {%d %x %p %p %d}\n",
|
||||
pIPFrame, pIPWnd, posrect.left, posrect.top, posrect.right, posrect.bottom,
|
||||
pIPFrame, This->ip_window, posrect.left, posrect.top, posrect.right, posrect.bottom,
|
||||
cliprect.left, cliprect.top, cliprect.right, cliprect.bottom,
|
||||
frameinfo.cb, frameinfo.fMDIApp, frameinfo.hwndFrame, frameinfo.haccel, frameinfo.cAccelEntries);
|
||||
|
||||
|
@ -292,7 +290,6 @@ static HRESULT activate_window(HTMLDocument *This)
|
|||
SetWindowPos(This->hwnd, NULL, 0, 0, 0, 0,
|
||||
SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_SHOWWINDOW);
|
||||
RedrawWindow(This->hwnd, NULL, NULL, RDW_INVALIDATE | RDW_NOERASE | RDW_ALLCHILDREN);
|
||||
SetFocus(This->hwnd);
|
||||
|
||||
/* NOTE:
|
||||
* Windows implementation calls:
|
||||
|
@ -545,6 +542,10 @@ static HRESULT WINAPI OleDocumentView_Show(IOleDocumentView *iface, BOOL fShow)
|
|||
ShowWindow(This->hwnd, SW_SHOW);
|
||||
}else {
|
||||
ShowWindow(This->hwnd, SW_HIDE);
|
||||
if(This->ip_window) {
|
||||
IOleInPlaceUIWindow_Release(This->ip_window);
|
||||
This->ip_window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
|
@ -563,6 +564,9 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f
|
|||
}
|
||||
|
||||
if(fUIActivate) {
|
||||
OLECHAR wszHTMLDocument[30];
|
||||
RECT rcBorderWidths;
|
||||
|
||||
if(This->ui_active)
|
||||
return S_OK;
|
||||
|
||||
|
@ -572,13 +576,17 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f
|
|||
return hres;
|
||||
}
|
||||
|
||||
This->focus = TRUE;
|
||||
nsIWebBrowserFocus_Activate(This->nscontainer->focus);
|
||||
notif_focus(This);
|
||||
|
||||
update_doc(This, UPDATE_UI);
|
||||
|
||||
LoadStringW(hInst, IDS_HTMLDOCUMENT, wszHTMLDocument,
|
||||
sizeof(wszHTMLDocument)/sizeof(WCHAR));
|
||||
|
||||
hres = IOleInPlaceSite_OnUIActivate(This->ipsite);
|
||||
if(SUCCEEDED(hres)) {
|
||||
OLECHAR wszHTMLDocument[30];
|
||||
LoadStringW(hInst, IDS_HTMLDOCUMENT, wszHTMLDocument,
|
||||
sizeof(wszHTMLDocument)/sizeof(WCHAR));
|
||||
IOleInPlaceFrame_SetActiveObject(This->frame, ACTOBJ(This), wszHTMLDocument);
|
||||
}else {
|
||||
FIXME("OnUIActivate failed: %08x\n", hres);
|
||||
|
@ -589,15 +597,23 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f
|
|||
}
|
||||
|
||||
hres = IDocHostUIHandler_ShowUI(This->hostui, 0, ACTOBJ(This), CMDTARGET(This),
|
||||
This->frame, NULL);
|
||||
This->frame, This->ip_window);
|
||||
if(FAILED(hres))
|
||||
IDocHostUIHandler_HideUI(This->hostui);
|
||||
|
||||
if(This->ip_window)
|
||||
IOleInPlaceUIWindow_SetActiveObject(This->ip_window, ACTOBJ(This), wszHTMLDocument);
|
||||
|
||||
memset(&rcBorderWidths, 0, sizeof(rcBorderWidths));
|
||||
IOleInPlaceFrame_SetBorderSpace(This->frame, &rcBorderWidths);
|
||||
|
||||
This->ui_active = TRUE;
|
||||
}else {
|
||||
This->window_active = FALSE;
|
||||
if(This->ui_active) {
|
||||
This->ui_active = FALSE;
|
||||
if(This->ip_window)
|
||||
IOleInPlaceUIWindow_SetActiveObject(This->ip_window, NULL, NULL);
|
||||
if(This->frame)
|
||||
IOleInPlaceFrame_SetActiveObject(This->frame, NULL, NULL);
|
||||
if(This->hostui)
|
||||
|
@ -778,6 +794,7 @@ void HTMLDocument_View_Init(HTMLDocument *This)
|
|||
|
||||
This->ipsite = NULL;
|
||||
This->frame = NULL;
|
||||
This->ip_window = NULL;
|
||||
This->hwnd = NULL;
|
||||
This->tooltips_hwnd = NULL;
|
||||
|
||||
|
|
Loading…
Reference in New Issue