diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 8286ec1ecf4..564950264e2 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -79,6 +79,12 @@ static HRESULT WINAPI HTMLDocument_QueryInterface(IHTMLDocument2 *iface, REFIID
}else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) {
TRACE("(%p)->(IID_IOleInPlaceActiveObject, %p)\n", This, ppvObject);
*ppvObject = ACTOBJ(This);
+ }else if(IsEqualGUID(&IID_IViewObject, riid)) {
+ TRACE("(%p)->(IID_IViewObject, %p)\n", This, ppvObject);
+ *ppvObject = VIEWOBJ(This);
+ }else if(IsEqualGUID(&IID_IViewObject2, riid)) {
+ TRACE("(%p)->(IID_IViewObject2, %p)\n", This, ppvObject);
+ *ppvObject = VIEWOBJ2(This);
}
if(*ppvObject) {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cfe94983689..779fa67ec73 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -25,6 +25,7 @@ typedef struct {
const IOleDocumentVtbl *lpOleDocumentVtbl;
const IOleDocumentViewVtbl *lpOleDocumentViewVtbl;
const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl;
+ const IViewObject2Vtbl *lpViewObject2Vtbl;
ULONG ref;
@@ -43,7 +44,9 @@ typedef struct {
#define OLEOBJ(x) ((IOleObject*) &(x)->lpOleObjectVtbl)
#define OLEDOC(x) ((IOleDocument*) &(x)->lpOleDocumentVtbl)
#define DOCVIEW(x) ((IOleDocumentView*) &(x)->lpOleDocumentViewVtbl)
-#define ACTOBJ(x) ((IOleInPlaceActiveObject*) &(x)->lpOleInPlaceActiveObjectVtbl)
+#define ACTOBJ(x) ((IOleInPlaceActiveObject*) &(x)->lpOleInPlaceActiveObjectVtbl)
+#define VIEWOBJ(x) ((IViewObject*) &(x)->lpViewObject2Vtbl)
+#define VIEWOBJ2(x) ((IViewObject2*) &(x)->lpViewObject2Vtbl)
HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**);
diff --git a/dlls/mshtml/view.c b/dlls/mshtml/view.c
index d780c4c8b49..7385b27d318 100644
--- a/dlls/mshtml/view.c
+++ b/dlls/mshtml/view.c
@@ -374,9 +374,103 @@ static const IOleDocumentViewVtbl OleDocumentViewVtbl = {
OleDocumentView_Clone
};
+/**********************************************************
+ * IViewObject implementation
+ */
+
+#define VIEWOBJ_THIS \
+ HTMLDocument* const This=(HTMLDocument*)((char*)(iface)-offsetof(HTMLDocument,lpViewObject2Vtbl));
+
+static HRESULT WINAPI ViewObject_QueryInterface(IViewObject2 *iface, REFIID riid, void **ppvObject)
+{
+ VIEWOBJ_THIS
+ return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject);
+}
+
+static ULONG WINAPI ViewObject_AddRef(IViewObject2 *iface)
+{
+ VIEWOBJ_THIS
+ return IHTMLDocument2_AddRef(HTMLDOC(This));
+}
+
+static ULONG WINAPI ViewObject_Release(IViewObject2 *iface)
+{
+ VIEWOBJ_THIS
+ return IHTMLDocument2_Release(HTMLDOC(This));
+}
+
+static HRESULT WINAPI ViewObject_Draw(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect,
+ DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds,
+ LPCRECTL lprcWBounds, BOOL (CALLBACK *pfnContinue)(ULONG_PTR dwContinue), ULONG_PTR dwContinue)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%ld %ld %p %p %p %p %p %p %p %ld)\n", This, dwDrawAspect, lindex, pvAspect,
+ ptd, hdcTargetDev, hdcDraw, lprcBounds, lprcWBounds, pfnContinue, dwContinue);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ViewObject_GetColorSet(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect,
+ DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%ld %ld %p %p %p %p)\n", This, dwDrawAspect, lindex, pvAspect, ptd, hicTargetDev, ppColorSet);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ViewObject_Freeze(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex,
+ void *pvAspect, DWORD *pdwFreeze)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%ld %ld %p %p)\n", This, dwDrawAspect, lindex, pvAspect, pdwFreeze);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ViewObject_Unfreeze(IViewObject2 *iface, DWORD dwFreeze)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%ld)\n", This, dwFreeze);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ViewObject_SetAdvise(IViewObject2 *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%ld %ld %p)\n", This, aspects, advf, pAdvSink);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ViewObject_GetAdvise(IViewObject2 *iface, DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%p %p %p)\n", This, pAspects, pAdvf, ppAdvSink);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ViewObject_GetExtent(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex,
+ DVTARGETDEVICE* ptd, LPSIZEL lpsizel)
+{
+ VIEWOBJ_THIS
+ FIXME("(%p)->(%ld %ld %p %p)\n", This, dwDrawAspect, lindex, ptd, lpsizel);
+ return E_NOTIMPL;
+}
+
+static const IViewObject2Vtbl ViewObjectVtbl = {
+ ViewObject_QueryInterface,
+ ViewObject_AddRef,
+ ViewObject_Release,
+ ViewObject_Draw,
+ ViewObject_GetColorSet,
+ ViewObject_Freeze,
+ ViewObject_Unfreeze,
+ ViewObject_SetAdvise,
+ ViewObject_GetAdvise,
+ ViewObject_GetExtent
+};
+
void HTMLDocument_View_Init(HTMLDocument *This)
{
This->lpOleDocumentViewVtbl = &OleDocumentViewVtbl;
+ This->lpViewObject2Vtbl = &ViewObjectVtbl;
This->ipsite = NULL;
This->frame = NULL;