Rob Shearman : mshtml: Call IDocHostUIHandler_HideUI and IDocHostUIHandler_ShowUI when changing an UI active window to be in edit mode .

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 25 07:44:12 CDT 2007


Module: wine
Branch: master
Commit: bbb03cf16bc86749f2b9e876204f2485d31e5dc5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bbb03cf16bc86749f2b9e876204f2485d31e5dc5

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Jul 24 17:06:56 2007 -0500

mshtml: Call IDocHostUIHandler_HideUI and IDocHostUIHandler_ShowUI when changing an UI active window to be in edit mode.

Add tests for the behaviour of changing edit mode when a UI window is active.

---

 dlls/mshtml/editor.c         |   29 +++++++++++++++++++++++
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/nsevents.c       |    2 +-
 dlls/mshtml/tests/htmldoc.c  |   53 ++++++++++++++++++++++++++++++++++++++----
 4 files changed, 79 insertions(+), 6 deletions(-)

diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c
index 2a02567..f9005b6 100644
--- a/dlls/mshtml/editor.c
+++ b/dlls/mshtml/editor.c
@@ -34,6 +34,7 @@
 #include "wine/unicode.h"
 
 #include "mshtml_private.h"
+#include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -570,6 +571,34 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event)
     nsIDOMKeyEvent_Release(key_event);
 }
 
+void handle_edit_load(HTMLDocument *This)
+{
+    This->nscontainer->editor_controller = get_editor_controller(This->nscontainer);
+
+    if(This->ui_active) {
+        OLECHAR wszHTMLDocument[30];
+        RECT rcBorderWidths;
+
+        if(This->ip_window)
+            IOleInPlaceUIWindow_SetActiveObject(This->ip_window, NULL, NULL);
+        if(This->hostui)
+            IDocHostUIHandler_HideUI(This->hostui);
+
+        if(This->hostui)
+            IDocHostUIHandler_ShowUI(This->hostui, DOCHOSTUITYPE_AUTHOR, ACTOBJ(This), CMDTARGET(This),
+                This->frame, This->ip_window);
+
+        LoadStringW(hInst, IDS_HTMLDOCUMENT, wszHTMLDocument,
+                    sizeof(wszHTMLDocument)/sizeof(WCHAR));
+
+        if(This->ip_window)
+            IOleInPlaceUIWindow_SetActiveObject(This->ip_window, ACTOBJ(This), wszHTMLDocument);
+
+        memset(&rcBorderWidths, 0, sizeof(rcBorderWidths));
+        IOleInPlaceFrame_SetBorderSpace(This->frame, &rcBorderWidths);
+    }
+}
+
 static void set_ns_fontname(NSContainer *This, const char *fontname)
 {
     nsICommandParams *nsparam = create_nscommand_params();
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index f45f90a..27f9ba7 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -442,6 +442,7 @@ void handle_edit_event(HTMLDocument*,nsIDOMEvent*);
 HRESULT editor_exec_copy(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
 HRESULT editor_exec_cut(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
 HRESULT editor_exec_paste(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
+void handle_edit_load(HTMLDocument *This);
 
 extern DWORD mshtml_tls;
 
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 255716c..f03b731 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -142,7 +142,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
     }
 
     if(This->doc->usermode == EDITMODE)
-        This->editor_controller = get_editor_controller(This);
+        handle_edit_load(This->doc);
 
     task = mshtml_alloc(sizeof(task_t));
 
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index 38d3290..5306d84 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -130,7 +130,7 @@ DEFINE_EXPECT(InPlaceUIWindow_SetActiveObject);
 
 static IUnknown *doc_unk;
 static BOOL expect_LockContainer_fLock;
-static BOOL expect_SetActiveObject_active, expect_InPlaceUIWindow_SetActiveObject_active;
+static BOOL expect_SetActiveObject_active, expect_InPlaceUIWindow_SetActiveObject_active = TRUE;
 static BOOL ipsex;
 static BOOL set_clientsite = FALSE, container_locked = FALSE;
 static BOOL readystate_set_loading = FALSE, load_from_stream;
@@ -1139,6 +1139,7 @@ static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
         ok(pActiveObject == NULL, "pActiveObject=%p, expected NULL\n", pActiveObject);
         ok(pszObjName == NULL, "pszObjName=%p, expected NULL\n", pszObjName);
     }
+    expect_InPlaceUIWindow_SetActiveObject_active = !expect_InPlaceUIWindow_SetActiveObject_active;
     return S_OK;
 }
 
@@ -1778,7 +1779,10 @@ static HRESULT WINAPI DocHostUIHandler_ShowUI(IDocHostUIHandler2 *iface, DWORD d
 {
     CHECK_EXPECT(ShowUI);
 
-    ok(dwID == DOCHOSTUITYPE_BROWSE, "dwID=%d, expected DOCHOSTUITYPE_BROWSE\n", dwID);
+    if (editmode)
+        ok(dwID == DOCHOSTUITYPE_AUTHOR, "dwID=%d, expected DOCHOSTUITYPE_AUTHOR\n", dwID);
+    else
+        ok(dwID == DOCHOSTUITYPE_BROWSE, "dwID=%d, expected DOCHOSTUITYPE_BROWSE\n", dwID);
     ok(pActiveObject != NULL, "pActiveObject = NULL\n");
     ok(pCommandTarget != NULL, "pCommandTarget = NULL\n");
     ok(pFrame == &InPlaceFrame, "pFrame=%p, expected %p\n", pFrame, &InPlaceFrame);
@@ -2862,6 +2866,10 @@ static void test_exec_editmode(IUnknown *unk)
     SET_EXPECT(Invoke_AMBIENT_SILENT);
     SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
     SET_EXPECT(OnChanged_READYSTATE);
+    SET_EXPECT(InPlaceUIWindow_SetActiveObject);
+    SET_EXPECT(HideUI);
+    SET_EXPECT(ShowUI);
+    SET_EXPECT(InPlaceFrame_SetBorderSpace);
     expect_status_text = NULL;
     readystate_set_loading = TRUE;
 
@@ -2875,6 +2883,10 @@ static void test_exec_editmode(IUnknown *unk)
     CHECK_CALLED(Invoke_AMBIENT_SILENT);
     CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
     CHECK_CALLED(OnChanged_READYSTATE);
+    CHECK_CALLED(InPlaceUIWindow_SetActiveObject);
+    CHECK_CALLED(HideUI);
+    CHECK_CALLED(ShowUI);
+    CHECK_CALLED(InPlaceFrame_SetBorderSpace);
 
     test_timer(EXPECT_UPDATEUI|EXPECT_SETTITLE);
 
@@ -3300,7 +3312,6 @@ static HRESULT test_Activate(IUnknown *unk, DWORD flags)
         SET_EXPECT(ShowUI);
         SET_EXPECT(InPlaceUIWindow_SetActiveObject);
         SET_EXPECT(InPlaceFrame_SetBorderSpace);
-        expect_InPlaceUIWindow_SetActiveObject_active = TRUE;
         expect_SetActiveObject_active = TRUE;
         expect_status_text = NULL;
 
@@ -3383,7 +3394,6 @@ static void test_UIDeactivate(void)
     }
 
     expect_SetActiveObject_active = FALSE;
-    expect_InPlaceUIWindow_SetActiveObject_active = FALSE;
     hres = IOleDocumentView_UIActivate(view, FALSE);
     ok(hres == S_OK, "UIActivate failed: %08x\n", hres);
 
@@ -3686,6 +3696,34 @@ static void test_HTMLDocument_StreamLoad(void)
     ok(ref == 0, "ref=%d, expected 0\n", ref);
 }
 
+static void test_edit_uiactivate(IOleObject *oleobj)
+{
+    IOleDocumentView *docview;
+    HRESULT hres;
+
+    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_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);
+}
+
 static void test_editing_mode(void)
 {
     IUnknown *unk;
@@ -3696,6 +3734,7 @@ static void test_editing_mode(void)
     trace("Testing HTMLDocument (edit)...\n");
 
     init_test(LD_DOLOAD);
+    call_UIActivate = CallUIActivate_AfterShow;
 
     hres = create_document(&unk);
     if(FAILED(hres))
@@ -3709,11 +3748,15 @@ static void test_editing_mode(void)
     test_ConnectionPointContainer(unk);
     test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
     test_DoVerb(oleobj);
+    test_edit_uiactivate(oleobj);
+
     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
 
+    test_exec_editmode(unk);
+    test_UIDeactivate();
+    call_UIActivate = CallUIActivate_None;
     IOleObject_Release(oleobj);
 
-    test_exec_editmode(unk);
     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
     test_download(TRUE, FALSE);
     test_timer(EXPECT_UPDATEUI);




More information about the wine-cvs mailing list