From 06884fb1810ceb8d6c34439522f0edc9ef19238f Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 30 Nov 2009 17:56:01 +0100 Subject: [PATCH] mshtml: Added IHTMLWindow2::get_screen implementation. --- dlls/mshtml/Makefile.in | 1 + dlls/mshtml/htmlscreen.c | 230 +++++++++++++++++++++++++++++++++++ dlls/mshtml/htmlwindow.c | 16 ++- dlls/mshtml/mshtml_private.h | 6 +- dlls/mshtml/tests/dom.c | 21 ++++ 5 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 dlls/mshtml/htmlscreen.c diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index bc992a4abbd..53c995e6366 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -33,6 +33,7 @@ C_SRCS = \ htmllocation.c \ htmlnode.c \ htmloption.c \ + htmlscreen.c \ htmlscript.c \ htmlselect.c \ htmlstyle.c \ diff --git a/dlls/mshtml/htmlscreen.c b/dlls/mshtml/htmlscreen.c new file mode 100644 index 00000000000..0ac98019968 --- /dev/null +++ b/dlls/mshtml/htmlscreen.c @@ -0,0 +1,230 @@ +/* + * Copyright 2009 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +typedef struct { + const IHTMLScreenVtbl *lpIHTMLScreenVtbl; + + LONG ref; +} HTMLScreen; + +#define HTMLSCREEN(x) ((IHTMLScreen*) &(x)->lpIHTMLScreenVtbl) + +#define HTMLSCREEN_THIS(iface) DEFINE_THIS(HTMLScreen, IHTMLScreen, iface) + +static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = HTMLSCREEN(This); + }else if(IsEqualGUID(&IID_IDispatch, riid)) { + TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); + *ppv = HTMLSCREEN(This); + }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) { + TRACE("(%p)->(IID_IHTMLScreen %p)\n", This, ppv); + *ppv = HTMLSCREEN(This); + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) + heap_free(This); + + return ref; +} + +static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%d)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%d)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +#undef HTMLSCREEN_THIS + +static const IHTMLScreenVtbl HTMLSreenVtbl = { + HTMLScreen_QueryInterface, + HTMLScreen_AddRef, + HTMLScreen_Release, + HTMLScreen_GetTypeInfoCount, + HTMLScreen_GetTypeInfo, + HTMLScreen_GetIDsOfNames, + HTMLScreen_Invoke, + HTMLScreen_get_colorDepth, + HTMLScreen_put_bufferDepth, + HTMLScreen_get_bufferDepth, + HTMLScreen_get_width, + HTMLScreen_get_height, + HTMLScreen_put_updateInterval, + HTMLScreen_get_updateInterval, + HTMLScreen_get_availHeight, + HTMLScreen_get_availWidth, + HTMLScreen_get_fontSmoothingEnabled +}; + +HRESULT HTMLScreen_Create(IHTMLScreen **ret) +{ + HTMLScreen *screen; + + screen = heap_alloc_zero(sizeof(HTMLScreen)); + if(!screen) + return E_OUTOFMEMORY; + + screen->lpIHTMLScreenVtbl = &HTMLSreenVtbl; + screen->ref = 1; + + *ret = HTMLSCREEN(screen); + return S_OK; +} diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 17d2bfe32cb..f8a69386402 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -950,8 +950,20 @@ static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VA static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if(!This->screen) { + HRESULT hres; + + hres = HTMLScreen_Create(&This->screen); + if(FAILED(hres)) + return hres; + } + + *p = This->screen; + IHTMLScreen_AddRef(This->screen); + return S_OK; } static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index ef4642b4ba8..8ccc40238cd 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -247,6 +247,7 @@ struct HTMLWindow { HTMLOptionElementFactory *option_factory; HTMLImageElementFactory *image_factory; HTMLLocation *location; + IHTMLScreen *screen; global_prop_t *global_props; DWORD global_prop_cnt; @@ -594,8 +595,8 @@ struct HTMLDocumentNode { #define HTMLFRAMEBASE2(x) ((IHTMLFrameBase2*) &(x)->lpIHTMLFrameBase2Vtbl) #define HTMLOPTFACTORY(x) ((IHTMLOptionElementFactory*) &(x)->lpHTMLOptionElementFactoryVtbl) -#define HTMLIMGFACTORY(x) ((IHTMLImageElementFactory*) &(x)->lpHTMLImageElementFactoryVtbl) -#define HTMLLOCATION(x) ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl) +#define HTMLIMGFACTORY(x) ((IHTMLImageElementFactory*) &(x)->lpHTMLImageElementFactoryVtbl) +#define HTMLLOCATION(x) ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl) #define DISPATCHEX(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl) @@ -618,6 +619,7 @@ HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*); HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*); HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**); IOmNavigator *OmNavigator_Create(void); +HRESULT HTMLScreen_Create(IHTMLScreen**); void HTMLDocument_HTMLDocument3_Init(HTMLDocument*); void HTMLDocument_HTMLDocument5_Init(HTMLDocument*); diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 0376ac24312..86e74c35150 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -3032,6 +3032,26 @@ static void test_navigator(IHTMLDocument2 *doc) ok(!ref, "navigator should be destroyed here\n"); } +static void test_screen(IHTMLWindow2 *window) +{ + IHTMLScreen *screen, *screen2; + HRESULT hres; + + screen = NULL; + hres = IHTMLWindow2_get_screen(window, &screen); + ok(hres == S_OK, "get_screen failed: %08x\n", hres); + ok(screen != NULL, "screen == NULL\n"); + + screen2 = NULL; + hres = IHTMLWindow2_get_screen(window, &screen2); + ok(hres == S_OK, "get_screen failed: %08x\n", hres); + ok(screen2 != NULL, "screen == NULL\n"); + ok(iface_cmp((IUnknown*)screen2, (IUnknown*)screen), "screen2 != screen\n"); + IHTMLScreen_Release(screen2); + + IHTMLScreen_Release(screen); +} + static void test_current_style(IHTMLCurrentStyle *current_style) { BSTR str; @@ -4654,6 +4674,7 @@ static void test_window(IHTMLDocument2 *doc) test_window_name(window, NULL); set_window_name(window, "test"); test_window_length(window, 0); + test_screen(window); IHTMLWindow2_Release(window); }