Module: wine Branch: refs/heads/master Commit: 181332b7ec793930660663a984166d176d6bab6a URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=181332b7ec793930660663a9...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Jun 23 22:12:48 2006 +0200
mshtml: Added HTMLLoadOptions implementation (with tests).
---
dlls/mshtml/loadopts.c | 82 +++++++++++++++++++++++++++-- dlls/mshtml/tests/.gitignore | 1 dlls/mshtml/tests/Makefile.in | 1 dlls/mshtml/tests/misc.c | 117 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 dlls/mshtml/tests/misc.c
diff --git a/dlls/mshtml/loadopts.c b/dlls/mshtml/loadopts.c index fec2ffb..971ed6a 100644 --- a/dlls/mshtml/loadopts.c +++ b/dlls/mshtml/loadopts.c @@ -35,10 +35,20 @@ #include "mshtml_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+typedef struct load_opt { + DWORD option; + PVOID buffer; + DWORD size; + + struct load_opt *next; +} load_opt; + typedef struct { const IHtmlLoadOptionsVtbl *lpHtmlLoadOptionsVtbl;
LONG ref; + + load_opt *opts; } HTMLLoadOptions;
#define LOADOPTS(x) ((IHtmlLoadOptions*) &(x)->lpHtmlLoadOptionsVtbl) @@ -89,8 +99,19 @@ static ULONG WINAPI HtmlLoadOptions_Rele
TRACE("(%p) ref=%ld\n", This, ref);
- if(!ref) + if(!ref) { + load_opt *iter = This->opts, *last; + + while(iter) { + last = iter; + iter = iter->next; + + HeapFree(GetProcessHeap(), 0, last->buffer); + HeapFree(GetProcessHeap(), 0, last); + } + HeapFree(GetProcessHeap(), 0, This); + }
return ref; } @@ -99,16 +120,66 @@ static HRESULT WINAPI HtmlLoadOptions_Qu LPVOID pBuffer, ULONG *pcbBuf) { HTMLLoadOptions *This = LOADOPTS_THIS(iface); - FIXME("(%p)->(%ld %p %p)\n", This, dwOption, pBuffer, pcbBuf); - return E_NOTIMPL; + load_opt *iter; + + TRACE("(%p)->(%ld %p %p)\n", This, dwOption, pBuffer, pcbBuf); + + for(iter = This->opts; iter; iter = iter->next) { + if(iter->option == dwOption) + break; + } + + if(!iter) { + *pcbBuf = 0; + return S_OK; + } + + if(*pcbBuf < iter->size) { + *pcbBuf = iter->size; + return E_FAIL; + } + + memcpy(pBuffer, iter->buffer, iter->size); + *pcbBuf = iter->size; + + return S_OK; }
static HRESULT WINAPI HtmlLoadOptions_SetOption(IHtmlLoadOptions *iface, DWORD dwOption, LPVOID pBuffer, ULONG cbBuf) { HTMLLoadOptions *This = LOADOPTS_THIS(iface); - FIXME("(%p)->(%ld %p %ld)\n", This, dwOption, pBuffer, cbBuf); - return E_NOTIMPL; + load_opt *iter = NULL; + + TRACE("(%p)->(%ld %p %ld)\n", This, dwOption, pBuffer, cbBuf); + + for(iter = This->opts; iter; iter = iter->next) { + if(iter->option == dwOption) + break; + } + + if(!iter) { + iter = HeapAlloc(GetProcessHeap(), 0, sizeof(load_opt)); + iter->next = This->opts; + This->opts = iter; + + iter->option = dwOption; + }else { + HeapFree(GetProcessHeap(), 0, iter->buffer); + } + + if(!cbBuf) { + iter->buffer = NULL; + iter->size = 0; + + return S_OK; + } + + iter->size = cbBuf; + iter->buffer = HeapAlloc(GetProcessHeap(), 0, cbBuf); + memcpy(iter->buffer, pBuffer, iter->size); + + return S_OK; }
#undef LOADOPTS_THIS @@ -132,6 +203,7 @@ HRESULT HTMLLoadOptions_Create(IUnknown
ret->lpHtmlLoadOptionsVtbl = &HtmlLoadOptionsVtbl; ret->ref = 1; + ret->opts = NULL;
hres = IHtmlLoadOptions_QueryInterface(LOADOPTS(ret), riid, ppv); IHtmlLoadOptions_Release(LOADOPTS(ret)); diff --git a/dlls/mshtml/tests/.gitignore b/dlls/mshtml/tests/.gitignore index ece3988..3fe22e7 100644 --- a/dlls/mshtml/tests/.gitignore +++ b/dlls/mshtml/tests/.gitignore @@ -1,4 +1,5 @@ Makefile htmldoc.ok +misc.ok protocol.ok testlist.c diff --git a/dlls/mshtml/tests/Makefile.in b/dlls/mshtml/tests/Makefile.in index c2d9ecb..8b6eda5 100644 --- a/dlls/mshtml/tests/Makefile.in +++ b/dlls/mshtml/tests/Makefile.in @@ -8,6 +8,7 @@ EXTRALIBS = -luuid
CTESTS = \ htmldoc.c \ + misc.c \ protocol.c
@MAKE_TEST_RULES@ diff --git a/dlls/mshtml/tests/misc.c b/dlls/mshtml/tests/misc.c new file mode 100644 index 0000000..8c0d184 --- /dev/null +++ b/dlls/mshtml/tests/misc.c @@ -0,0 +1,117 @@ +/* + * Copyright 2006 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 + */ + +#define COBJMACROS + +#include <wine/test.h> +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "ole2.h" +#include "optary.h" + +#include "initguid.h" + +static void test_HTMLLoadOptions(void) +{ + IHtmlLoadOptions *loadopts; + BYTE buf[100]; + DWORD size, i, data = 0xdeadbeef; + HRESULT hres; + + hres = CoCreateInstance(&CLSID_HTMLLoadOptions, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IHtmlLoadOptions, (void**)&loadopts); + ok(hres == S_OK, "creating HTMLLoadOptions failed: %08lx\n", hres); + if(FAILED(hres)) + return; + + for(i=0; i <= HTMLLOADOPTION_FRAMELOAD+3; i++) { + size = 0xdeadbeef; + memset(buf, 0xdd, sizeof(buf)); + hres = IHtmlLoadOptions_QueryOption(loadopts, i, NULL, &size); + ok(hres == S_OK, "QueryOption failed: %08lx\n", hres); + ok(size == 0, "size = %ld\n", size); + ok(buf[0] == 0xdd, "buf changed\n"); + } + + size = 0xdeadbeef; + hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, NULL, &size); + ok(hres == S_OK, "QueryOption failed: %08lx\n", hres); + ok(size == 0, "size = %ld\n", size); + + hres = IHtmlLoadOptions_SetOption(loadopts, HTMLLOADOPTION_CODEPAGE, &data, sizeof(data)); + ok(hres == S_OK, "SetOption failed: %08lx\n", hres); + + size = sizeof(data); + memset(buf, 0xdd, sizeof(buf)); + hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, buf, &size); + ok(hres == S_OK, "QueryOption failed: %08lx\n", hres); + ok(size == sizeof(data), "size = %ld\n", size); + ok(*(DWORD*)buf == data, "unexpected buf\n"); + + size = sizeof(data)-1; + memset(buf, 0xdd, sizeof(buf)); + hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, buf, &size); + ok(hres == E_FAIL, "QueryOption failed: %08lx\n", hres); + ok(size == sizeof(data), "size = %ld\n", size); + ok(buf[0] == 0xdd, "buf changed\n"); + + data = 100; + hres = IHtmlLoadOptions_SetOption(loadopts, HTMLLOADOPTION_CODEPAGE, &data, 0); + ok(hres == S_OK, "SetOption failed: %08lx\n", hres); + + size = 0xdeadbeef; + memset(buf, 0xdd, sizeof(buf)); + hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, buf, &size); + ok(hres == S_OK, "QueryOption failed: %08lx\n", hres); + ok(size == 0, "size = %ld\n", size); + ok(buf[0] == 0xdd, "buf changed\n"); + + hres = IHtmlLoadOptions_SetOption(loadopts, HTMLLOADOPTION_CODEPAGE, NULL, 0); + ok(hres == S_OK, "SetOption failed: %08lx\n", hres); + + hres = IHtmlLoadOptions_SetOption(loadopts, 1000, &data, sizeof(data)); + ok(hres == S_OK, "SetOption failed: %08lx\n", hres); + + size = sizeof(data); + memset(buf, 0xdd, sizeof(buf)); + hres = IHtmlLoadOptions_QueryOption(loadopts, 1000, buf, &size); + ok(hres == S_OK, "QueryOption failed: %08lx\n", hres); + ok(size == sizeof(data), "size = %ld\n", size); + ok(*(DWORD*)buf == data, "unexpected buf\n"); + + hres = IHtmlLoadOptions_SetOption(loadopts, 1000, buf, sizeof(buf)); + ok(hres == S_OK, "SetOption failed: %08lx\n", hres); + + size = 0xdeadbeef; + hres = IHtmlLoadOptions_QueryOption(loadopts, 1000, buf, &size); + ok(hres == S_OK, "QueryOption failed: %08lx\n", hres); + ok(size == sizeof(buf), "size = %ld\n", size); + + IHtmlLoadOptions_Release(loadopts); +} + +START_TEST(misc) +{ + CoInitialize(NULL); + + test_HTMLLoadOptions(); + + CoUninitialize(); +}