Gijs Vermeulen : mshtml: Implement IOleObject::[Get|Set]Extent.

Alexandre Julliard julliard at winehq.org
Tue Mar 23 15:07:40 CDT 2021


Module: wine
Branch: oldstable
Commit: 128c37da5099198a51e7aa05602b18896bac79f6
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=128c37da5099198a51e7aa05602b18896bac79f6

Author: Gijs Vermeulen <gijsvrm at gmail.com>
Date:   Wed Sep 23 16:47:07 2020 +0200

mshtml: Implement IOleObject::[Get|Set]Extent.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45797
Signed-off-by: Gijs Vermeulen <gijsvrm at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 86dfc6ad275e4290cf2c56c204c5b16ea48a7872)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/mshtml/htmldoc.c        |  3 +-
 dlls/mshtml/mshtml_private.h |  1 +
 dlls/mshtml/oleobj.c         | 22 ++++++++--
 dlls/mshtml/tests/htmldoc.c  | 99 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 120 insertions(+), 5 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index a121023ae3e..9dfbdebb480 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -6003,10 +6003,11 @@ static HRESULT create_document_object(BOOL is_mhtml, IUnknown *outer, REFIID rii
     doc->IUnknown_inner.lpVtbl = &HTMLDocumentObjVtbl;
     doc->ICustomDoc_iface.lpVtbl = &CustomDocVtbl;
 
+    doc->basedoc.doc_obj = doc;
+
     init_dispex(&doc->dispex, (IUnknown*)&doc->ICustomDoc_iface, &HTMLDocumentObj_dispex);
     init_doc(&doc->basedoc, outer ? outer : &doc->IUnknown_inner, &doc->dispex.IDispatchEx_iface);
     TargetContainer_Init(doc);
-    doc->basedoc.doc_obj = doc;
     doc->is_mhtml = is_mhtml;
 
     doc->task_magic = get_task_target_magic();
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cc9eefc5283..0114d6484f0 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -709,6 +709,7 @@ struct HTMLDocumentObj {
 
     DWORD update;
     LONG task_magic;
+    SIZEL extent;
 };
 
 typedef struct nsWeakReference nsWeakReference;
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index 1d8d62669e2..00e937223a0 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -606,15 +606,27 @@ static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfTyp
 static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
 {
     HTMLDocument *This = impl_from_IOleObject(iface);
-    FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
+
+    if (dwDrawAspect != DVASPECT_CONTENT)
+        return E_INVALIDARG;
+
+    This->doc_obj->extent = *psizel;
+    return S_OK;
 }
 
 static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
 {
     HTMLDocument *This = impl_from_IOleObject(iface);
-    FIXME("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%d %p)\n", This, dwDrawAspect, psizel);
+
+    if (dwDrawAspect != DVASPECT_CONTENT)
+        return E_INVALIDARG;
+
+    *psizel = This->doc_obj->extent;
+    return S_OK;
 }
 
 static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
@@ -1473,4 +1485,6 @@ void HTMLDocument_OleObj_Init(HTMLDocument *This)
     This->IObjectWithSite_iface.lpVtbl = &ObjectWithSiteVtbl;
     This->IOleContainer_iface.lpVtbl = &OleContainerVtbl;
     This->IObjectSafety_iface.lpVtbl = &ObjectSafetyVtbl;
+    This->doc_obj->extent.cx = 1;
+    This->doc_obj->extent.cy = 1;
 }
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index 141d2378db7..2d3e5b3dcef 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -6955,6 +6955,104 @@ static void test_OnAmbientPropertyChange(IHTMLDocument2 *doc)
 
 
 
+static void test_GetSetExtent(IHTMLDocument2 *doc)
+{
+    IOleObject *oleobj = NULL;
+    HRESULT hres;
+    SIZE extent;
+
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
+    ok(hres == S_OK, "QueryInterface(IID_IOleObject) failed: %08x\n", hres);
+    if(FAILED(hres))
+        return;
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 1 && extent.cy == 1, "size = {%d %d} (expected {1 1})\n",
+       extent.cx, extent.cy);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, 0, &extent);
+    ok(hres == E_INVALIDARG, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 0xdeadbeef && extent.cy == 0xdeadbeef, "size = {%d %d}\n", extent.cx, extent.cy);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, 7, &extent);
+    ok(hres == E_INVALIDARG, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 0xdeadbeef && extent.cy == 0xdeadbeef, "size = {%d %d}\n", extent.cx, extent.cy);
+
+    extent.cx = 800;
+    extent.cy = 700;
+    hres = IOleObject_SetExtent(oleobj, 0, &extent);
+    ok(hres == E_INVALIDARG, "SetExtent failed: %08x\n", hres);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 1 && extent.cy == 1, "size = {%d %d} (expected {1 1})\n",
+       extent.cx, extent.cy);
+
+    extent.cx = 800;
+    extent.cy = 700;
+    hres = IOleObject_SetExtent(oleobj, 7, &extent);
+    ok(hres == E_INVALIDARG, "SetExtent failed: %08x\n", hres);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 1 && extent.cy == 1, "size = {%d %d} (expected {1 1})\n",
+       extent.cx, extent.cy);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_SetExtent(oleobj, 0, &extent);
+    todo_wine ok(hres == E_FAIL, "SetExtent failed: %08x\n", hres);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 1 && extent.cy == 1, "size = {%d %d} (expected {1 1})\n",
+       extent.cx, extent.cy);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_SetExtent(oleobj, 7, &extent);
+    todo_wine ok(hres == E_FAIL, "SetExtent failed: %08x\n", hres);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 1 && extent.cy == 1, "size = {%d %d} (expected {1 1})\n",
+       extent.cx, extent.cy);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    todo_wine ok(hres == E_FAIL, "SetExtent failed: %08x\n", hres);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    todo_wine ok(extent.cx == 1 && extent.cy == 1, "size = {%d %d} (expected {1 1})\n",
+       extent.cx, extent.cy);
+
+    extent.cx = 800;
+    extent.cy = 700;
+    hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
+
+    extent.cx = extent.cy = 0xdeadbeef;
+    hres = IOleObject_GetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "GetExtent failed: %08x\n", hres);
+    ok(extent.cx == 800 && extent.cy == 700, "size = {%d %d} (expected {800 700})\n",
+       extent.cx, extent.cy );
+
+    extent.cx = 1;
+    extent.cy = 1;
+    hres = IOleObject_SetExtent(oleobj, DVASPECT_CONTENT, &extent);
+    ok(hres == S_OK, "SetExtent failed: %08x\n", hres);
+
+    IOleObject_Release(oleobj);
+}
+
 static void test_OnAmbientPropertyChange2(IHTMLDocument2 *doc)
 {
     IOleControl *control = NULL;
@@ -7635,6 +7733,7 @@ static void test_HTMLDocument(BOOL do_load, BOOL mime)
     doc_unk = (IUnknown*)doc;
 
     test_QueryInterface(doc);
+    test_GetSetExtent(doc);
     test_Advise(doc);
     test_IsDirty(doc, S_FALSE);
     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);




More information about the wine-cvs mailing list