dwmapi: Clear DWM_TIMING_INFO structure before returning.
[wine.git] / dlls / mshtml / omnavigator.c
blob9962cc20dc78b9ef8ea5d9cbea29fd63917f85cb
1 /*
2 * Copyright 2008,2009 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdarg.h>
21 #define COBJMACROS
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
28 #include "wine/debug.h"
30 #include "mshtml_private.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34 typedef struct HTMLPluginsCollection HTMLPluginsCollection;
35 typedef struct HTMLMimeTypesCollection HTMLMimeTypesCollection;
37 typedef struct {
38 DispatchEx dispex;
39 IOmNavigator IOmNavigator_iface;
41 LONG ref;
43 HTMLPluginsCollection *plugins;
44 HTMLMimeTypesCollection *mime_types;
45 } OmNavigator;
47 typedef struct {
48 DispatchEx dispex;
49 IHTMLDOMImplementation IHTMLDOMImplementation_iface;
50 IHTMLDOMImplementation2 IHTMLDOMImplementation2_iface;
52 LONG ref;
54 nsIDOMDOMImplementation *implementation;
55 GeckoBrowser *browser;
56 } HTMLDOMImplementation;
58 static inline HTMLDOMImplementation *impl_from_IHTMLDOMImplementation(IHTMLDOMImplementation *iface)
60 return CONTAINING_RECORD(iface, HTMLDOMImplementation, IHTMLDOMImplementation_iface);
63 static HRESULT WINAPI HTMLDOMImplementation_QueryInterface(IHTMLDOMImplementation *iface, REFIID riid, void **ppv)
65 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
67 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
69 if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IHTMLDOMImplementation, riid)) {
70 *ppv = &This->IHTMLDOMImplementation_iface;
71 }else if(IsEqualGUID(&IID_IHTMLDOMImplementation2, riid)) {
72 *ppv = &This->IHTMLDOMImplementation2_iface;
73 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
74 return *ppv ? S_OK : E_NOINTERFACE;
75 }else {
76 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
77 *ppv = NULL;
78 return E_NOINTERFACE;
81 IUnknown_AddRef((IUnknown*)*ppv);
82 return S_OK;
85 static ULONG WINAPI HTMLDOMImplementation_AddRef(IHTMLDOMImplementation *iface)
87 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
88 LONG ref = InterlockedIncrement(&This->ref);
90 TRACE("(%p) ref=%ld\n", This, ref);
92 return ref;
95 static ULONG WINAPI HTMLDOMImplementation_Release(IHTMLDOMImplementation *iface)
97 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
98 LONG ref = InterlockedDecrement(&This->ref);
100 TRACE("(%p) ref=%ld\n", This, ref);
102 if(!ref) {
103 assert(!This->browser);
104 if(This->implementation)
105 nsIDOMDOMImplementation_Release(This->implementation);
106 release_dispex(&This->dispex);
107 heap_free(This);
110 return ref;
113 static HRESULT WINAPI HTMLDOMImplementation_GetTypeInfoCount(IHTMLDOMImplementation *iface, UINT *pctinfo)
115 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
117 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
120 static HRESULT WINAPI HTMLDOMImplementation_GetTypeInfo(IHTMLDOMImplementation *iface, UINT iTInfo,
121 LCID lcid, ITypeInfo **ppTInfo)
123 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
125 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
128 static HRESULT WINAPI HTMLDOMImplementation_GetIDsOfNames(IHTMLDOMImplementation *iface, REFIID riid,
129 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
131 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
133 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames,
134 cNames, lcid, rgDispId);
137 static HRESULT WINAPI HTMLDOMImplementation_Invoke(IHTMLDOMImplementation *iface, DISPID dispIdMember,
138 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
139 EXCEPINFO *pExcepInfo, UINT *puArgErr)
141 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
143 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid,
144 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
147 static HRESULT WINAPI HTMLDOMImplementation_hasFeature(IHTMLDOMImplementation *iface, BSTR feature,
148 VARIANT version, VARIANT_BOOL *pfHasFeature)
150 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation(iface);
152 FIXME("(%p)->(%s %s %p) returning false\n", This, debugstr_w(feature), debugstr_variant(&version), pfHasFeature);
154 *pfHasFeature = VARIANT_FALSE;
155 return S_OK;
158 static const IHTMLDOMImplementationVtbl HTMLDOMImplementationVtbl = {
159 HTMLDOMImplementation_QueryInterface,
160 HTMLDOMImplementation_AddRef,
161 HTMLDOMImplementation_Release,
162 HTMLDOMImplementation_GetTypeInfoCount,
163 HTMLDOMImplementation_GetTypeInfo,
164 HTMLDOMImplementation_GetIDsOfNames,
165 HTMLDOMImplementation_Invoke,
166 HTMLDOMImplementation_hasFeature
169 static inline HTMLDOMImplementation *impl_from_IHTMLDOMImplementation2(IHTMLDOMImplementation2 *iface)
171 return CONTAINING_RECORD(iface, HTMLDOMImplementation, IHTMLDOMImplementation2_iface);
174 static HRESULT WINAPI HTMLDOMImplementation2_QueryInterface(IHTMLDOMImplementation2 *iface, REFIID riid, void **ppv)
176 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
177 return IHTMLDOMImplementation_QueryInterface(&This->IHTMLDOMImplementation_iface, riid, ppv);
180 static ULONG WINAPI HTMLDOMImplementation2_AddRef(IHTMLDOMImplementation2 *iface)
182 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
183 return IHTMLDOMImplementation_AddRef(&This->IHTMLDOMImplementation_iface);
186 static ULONG WINAPI HTMLDOMImplementation2_Release(IHTMLDOMImplementation2 *iface)
188 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
189 return IHTMLDOMImplementation_Release(&This->IHTMLDOMImplementation_iface);
192 static HRESULT WINAPI HTMLDOMImplementation2_GetTypeInfoCount(IHTMLDOMImplementation2 *iface, UINT *pctinfo)
194 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
195 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
198 static HRESULT WINAPI HTMLDOMImplementation2_GetTypeInfo(IHTMLDOMImplementation2 *iface, UINT iTInfo,
199 LCID lcid, ITypeInfo **ppTInfo)
201 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
202 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
205 static HRESULT WINAPI HTMLDOMImplementation2_GetIDsOfNames(IHTMLDOMImplementation2 *iface, REFIID riid,
206 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
208 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
209 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames,
210 cNames, lcid, rgDispId);
213 static HRESULT WINAPI HTMLDOMImplementation2_Invoke(IHTMLDOMImplementation2 *iface, DISPID dispIdMember,
214 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
215 EXCEPINFO *pExcepInfo, UINT *puArgErr)
217 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
218 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid,
219 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
222 static HRESULT WINAPI HTMLDOMImplementation2_createDocumentType(IHTMLDOMImplementation2 *iface, BSTR name,
223 VARIANT *public_id, VARIANT *system_id, IDOMDocumentType **new_type)
225 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
226 FIXME("(%p)->(%s %s %s %p)\n", This, debugstr_w(name), debugstr_variant(public_id),
227 debugstr_variant(system_id), new_type);
228 return E_NOTIMPL;
231 static HRESULT WINAPI HTMLDOMImplementation2_createDocument(IHTMLDOMImplementation2 *iface, VARIANT *ns,
232 VARIANT *tag_name, IDOMDocumentType *document_type, IHTMLDocument7 **new_document)
234 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
235 FIXME("(%p)->(%s %s %p %p)\n", This, debugstr_variant(ns), debugstr_variant(tag_name),
236 document_type, new_document);
237 return E_NOTIMPL;
240 static HRESULT WINAPI HTMLDOMImplementation2_createHTMLDocument(IHTMLDOMImplementation2 *iface, BSTR title,
241 IHTMLDocument7 **new_document)
243 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
244 HTMLDocumentNode *new_document_node;
245 nsIDOMHTMLDocument *html_doc;
246 nsIDOMDocument *doc;
247 nsAString title_str;
248 nsresult nsres;
249 HRESULT hres;
251 FIXME("(%p)->(%s %p)\n", This, debugstr_w(title), new_document);
253 if(!This->browser)
254 return E_UNEXPECTED;
256 nsAString_InitDepend(&title_str, title);
257 nsres = nsIDOMDOMImplementation_CreateHTMLDocument(This->implementation, &title_str, &doc);
258 nsAString_Finish(&title_str);
259 if(NS_FAILED(nsres)) {
260 ERR("CreateHTMLDocument failed: %08lx\n", nsres);
261 return E_FAIL;
264 nsres = nsIDOMDocument_QueryInterface(doc, &IID_nsIDOMHTMLDocument, (void**)&html_doc);
265 nsIDOMDocument_Release(doc);
266 assert(nsres == NS_OK);
268 hres = create_document_node(html_doc, This->browser, NULL, dispex_compat_mode(&This->dispex), &new_document_node);
269 nsIDOMHTMLDocument_Release(html_doc);
270 if(FAILED(hres))
271 return hres;
273 *new_document = &new_document_node->basedoc.IHTMLDocument7_iface;
274 return S_OK;
277 static HRESULT WINAPI HTMLDOMImplementation2_hasFeature(IHTMLDOMImplementation2 *iface, BSTR feature,
278 VARIANT version, VARIANT_BOOL *pfHasFeature)
280 HTMLDOMImplementation *This = impl_from_IHTMLDOMImplementation2(iface);
282 FIXME("(%p)->(%s %s %p) returning false\n", This, debugstr_w(feature), debugstr_variant(&version), pfHasFeature);
284 *pfHasFeature = VARIANT_FALSE;
285 return S_OK;
288 static const IHTMLDOMImplementation2Vtbl HTMLDOMImplementation2Vtbl = {
289 HTMLDOMImplementation2_QueryInterface,
290 HTMLDOMImplementation2_AddRef,
291 HTMLDOMImplementation2_Release,
292 HTMLDOMImplementation2_GetTypeInfoCount,
293 HTMLDOMImplementation2_GetTypeInfo,
294 HTMLDOMImplementation2_GetIDsOfNames,
295 HTMLDOMImplementation2_Invoke,
296 HTMLDOMImplementation2_createDocumentType,
297 HTMLDOMImplementation2_createDocument,
298 HTMLDOMImplementation2_createHTMLDocument,
299 HTMLDOMImplementation2_hasFeature
302 static const tid_t HTMLDOMImplementation_iface_tids[] = {
303 IHTMLDOMImplementation_tid,
306 static dispex_static_data_t HTMLDOMImplementation_dispex = {
307 L"DOMImplementation",
308 NULL,
309 DispHTMLDOMImplementation_tid,
310 HTMLDOMImplementation_iface_tids
313 HRESULT create_dom_implementation(HTMLDocumentNode *doc_node, IHTMLDOMImplementation **ret)
315 HTMLDOMImplementation *dom_implementation;
316 nsresult nsres;
318 if(!doc_node->browser)
319 return E_UNEXPECTED;
321 dom_implementation = heap_alloc_zero(sizeof(*dom_implementation));
322 if(!dom_implementation)
323 return E_OUTOFMEMORY;
325 dom_implementation->IHTMLDOMImplementation_iface.lpVtbl = &HTMLDOMImplementationVtbl;
326 dom_implementation->IHTMLDOMImplementation2_iface.lpVtbl = &HTMLDOMImplementation2Vtbl;
327 dom_implementation->ref = 1;
328 dom_implementation->browser = doc_node->browser;
330 init_dispatch(&dom_implementation->dispex, (IUnknown*)&dom_implementation->IHTMLDOMImplementation_iface,
331 &HTMLDOMImplementation_dispex, doc_node->document_mode);
333 nsres = nsIDOMHTMLDocument_GetImplementation(doc_node->nsdoc, &dom_implementation->implementation);
334 if(NS_FAILED(nsres)) {
335 ERR("GetDOMImplementation failed: %08lx\n", nsres);
336 IHTMLDOMImplementation_Release(&dom_implementation->IHTMLDOMImplementation_iface);
337 return E_FAIL;
340 *ret = &dom_implementation->IHTMLDOMImplementation_iface;
341 return S_OK;
344 void detach_dom_implementation(IHTMLDOMImplementation *iface)
346 HTMLDOMImplementation *dom_implementation = impl_from_IHTMLDOMImplementation(iface);
347 dom_implementation->browser = NULL;
350 typedef struct {
351 DispatchEx dispex;
352 IHTMLScreen IHTMLScreen_iface;
354 LONG ref;
355 } HTMLScreen;
357 static inline HTMLScreen *impl_from_IHTMLScreen(IHTMLScreen *iface)
359 return CONTAINING_RECORD(iface, HTMLScreen, IHTMLScreen_iface);
362 static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv)
364 HTMLScreen *This = impl_from_IHTMLScreen(iface);
366 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
368 if(IsEqualGUID(&IID_IUnknown, riid)) {
369 *ppv = &This->IHTMLScreen_iface;
370 }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) {
371 *ppv = &This->IHTMLScreen_iface;
372 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
373 return *ppv ? S_OK : E_NOINTERFACE;
374 }else {
375 *ppv = NULL;
376 WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
377 return E_NOINTERFACE;
380 IUnknown_AddRef((IUnknown*)*ppv);
381 return S_OK;
384 static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface)
386 HTMLScreen *This = impl_from_IHTMLScreen(iface);
387 LONG ref = InterlockedIncrement(&This->ref);
389 TRACE("(%p) ref=%ld\n", This, ref);
391 return ref;
394 static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface)
396 HTMLScreen *This = impl_from_IHTMLScreen(iface);
397 LONG ref = InterlockedDecrement(&This->ref);
399 TRACE("(%p) ref=%ld\n", This, ref);
401 if(!ref) {
402 release_dispex(&This->dispex);
403 heap_free(This);
406 return ref;
409 static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo)
411 HTMLScreen *This = impl_from_IHTMLScreen(iface);
412 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
415 static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo,
416 LCID lcid, ITypeInfo **ppTInfo)
418 HTMLScreen *This = impl_from_IHTMLScreen(iface);
419 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
422 static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid,
423 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
425 HTMLScreen *This = impl_from_IHTMLScreen(iface);
426 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
427 lcid, rgDispId);
430 static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember,
431 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
432 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
434 HTMLScreen *This = impl_from_IHTMLScreen(iface);
435 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
436 pDispParams, pVarResult, pExcepInfo, puArgErr);
439 static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p)
441 HTMLScreen *This = impl_from_IHTMLScreen(iface);
442 HDC hdc = GetDC(0);
444 TRACE("(%p)->(%p)\n", This, p);
446 *p = GetDeviceCaps(hdc, BITSPIXEL);
447 ReleaseDC(0, hdc);
448 return S_OK;
451 static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v)
453 HTMLScreen *This = impl_from_IHTMLScreen(iface);
454 FIXME("(%p)->(%ld)\n", This, v);
455 return E_NOTIMPL;
458 static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p)
460 HTMLScreen *This = impl_from_IHTMLScreen(iface);
461 FIXME("(%p)->(%p)\n", This, p);
462 return E_NOTIMPL;
465 static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p)
467 HTMLScreen *This = impl_from_IHTMLScreen(iface);
469 TRACE("(%p)->(%p)\n", This, p);
471 *p = GetSystemMetrics(SM_CXSCREEN);
472 return S_OK;
475 static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p)
477 HTMLScreen *This = impl_from_IHTMLScreen(iface);
479 TRACE("(%p)->(%p)\n", This, p);
481 *p = GetSystemMetrics(SM_CYSCREEN);
482 return S_OK;
485 static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v)
487 HTMLScreen *This = impl_from_IHTMLScreen(iface);
488 FIXME("(%p)->(%ld)\n", This, v);
489 return E_NOTIMPL;
492 static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p)
494 HTMLScreen *This = impl_from_IHTMLScreen(iface);
495 FIXME("(%p)->(%p)\n", This, p);
496 return E_NOTIMPL;
499 static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p)
501 HTMLScreen *This = impl_from_IHTMLScreen(iface);
502 RECT work_area;
504 TRACE("(%p)->(%p)\n", This, p);
506 if(!SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0))
507 return E_FAIL;
509 *p = work_area.bottom-work_area.top;
510 return S_OK;
513 static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p)
515 HTMLScreen *This = impl_from_IHTMLScreen(iface);
516 RECT work_area;
518 TRACE("(%p)->(%p)\n", This, p);
520 if(!SystemParametersInfoW(SPI_GETWORKAREA, 0, &work_area, 0))
521 return E_FAIL;
523 *p = work_area.right-work_area.left;
524 return S_OK;
527 static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p)
529 HTMLScreen *This = impl_from_IHTMLScreen(iface);
530 FIXME("(%p)->(%p)\n", This, p);
531 return E_NOTIMPL;
534 static const IHTMLScreenVtbl HTMLSreenVtbl = {
535 HTMLScreen_QueryInterface,
536 HTMLScreen_AddRef,
537 HTMLScreen_Release,
538 HTMLScreen_GetTypeInfoCount,
539 HTMLScreen_GetTypeInfo,
540 HTMLScreen_GetIDsOfNames,
541 HTMLScreen_Invoke,
542 HTMLScreen_get_colorDepth,
543 HTMLScreen_put_bufferDepth,
544 HTMLScreen_get_bufferDepth,
545 HTMLScreen_get_width,
546 HTMLScreen_get_height,
547 HTMLScreen_put_updateInterval,
548 HTMLScreen_get_updateInterval,
549 HTMLScreen_get_availHeight,
550 HTMLScreen_get_availWidth,
551 HTMLScreen_get_fontSmoothingEnabled
554 static const tid_t HTMLScreen_iface_tids[] = {
555 IHTMLScreen_tid,
558 static dispex_static_data_t HTMLScreen_dispex = {
559 L"Screen",
560 NULL,
561 DispHTMLScreen_tid,
562 HTMLScreen_iface_tids
565 HRESULT create_html_screen(compat_mode_t compat_mode, IHTMLScreen **ret)
567 HTMLScreen *screen;
569 screen = heap_alloc_zero(sizeof(HTMLScreen));
570 if(!screen)
571 return E_OUTOFMEMORY;
573 screen->IHTMLScreen_iface.lpVtbl = &HTMLSreenVtbl;
574 screen->ref = 1;
576 init_dispatch(&screen->dispex, (IUnknown*)&screen->IHTMLScreen_iface, &HTMLScreen_dispex, compat_mode);
578 *ret = &screen->IHTMLScreen_iface;
579 return S_OK;
582 static inline OmHistory *impl_from_IOmHistory(IOmHistory *iface)
584 return CONTAINING_RECORD(iface, OmHistory, IOmHistory_iface);
587 static HRESULT WINAPI OmHistory_QueryInterface(IOmHistory *iface, REFIID riid, void **ppv)
589 OmHistory *This = impl_from_IOmHistory(iface);
591 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
593 if(IsEqualGUID(&IID_IUnknown, riid)) {
594 *ppv = &This->IOmHistory_iface;
595 }else if(IsEqualGUID(&IID_IOmHistory, riid)) {
596 *ppv = &This->IOmHistory_iface;
597 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
598 return *ppv ? S_OK : E_NOINTERFACE;
599 }else {
600 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
601 *ppv = NULL;
602 return E_NOINTERFACE;
605 IUnknown_AddRef((IUnknown*)*ppv);
606 return S_OK;
609 static ULONG WINAPI OmHistory_AddRef(IOmHistory *iface)
611 OmHistory *This = impl_from_IOmHistory(iface);
612 LONG ref = InterlockedIncrement(&This->ref);
614 TRACE("(%p) ref=%ld\n", This, ref);
616 return ref;
619 static ULONG WINAPI OmHistory_Release(IOmHistory *iface)
621 OmHistory *This = impl_from_IOmHistory(iface);
622 LONG ref = InterlockedDecrement(&This->ref);
624 TRACE("(%p) ref=%ld\n", This, ref);
626 if(!ref) {
627 release_dispex(&This->dispex);
628 heap_free(This);
631 return ref;
634 static HRESULT WINAPI OmHistory_GetTypeInfoCount(IOmHistory *iface, UINT *pctinfo)
636 OmHistory *This = impl_from_IOmHistory(iface);
637 FIXME("(%p)->(%p)\n", This, pctinfo);
638 return E_NOTIMPL;
641 static HRESULT WINAPI OmHistory_GetTypeInfo(IOmHistory *iface, UINT iTInfo,
642 LCID lcid, ITypeInfo **ppTInfo)
644 OmHistory *This = impl_from_IOmHistory(iface);
646 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
649 static HRESULT WINAPI OmHistory_GetIDsOfNames(IOmHistory *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames,
650 LCID lcid, DISPID *rgDispId)
652 OmHistory *This = impl_from_IOmHistory(iface);
654 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
655 lcid, rgDispId);
658 static HRESULT WINAPI OmHistory_Invoke(IOmHistory *iface, DISPID dispIdMember, REFIID riid, LCID lcid,
659 WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
661 OmHistory *This = impl_from_IOmHistory(iface);
663 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
664 pDispParams, pVarResult, pExcepInfo, puArgErr);
667 static HRESULT WINAPI OmHistory_get_length(IOmHistory *iface, short *p)
669 OmHistory *This = impl_from_IOmHistory(iface);
670 GeckoBrowser *browser = NULL;
672 TRACE("(%p)->(%p)\n", This, p);
674 if(This->window && This->window->base.outer_window)
675 browser = This->window->base.outer_window->browser;
677 *p = browser && browser->doc->travel_log
678 ? ITravelLog_CountEntries(browser->doc->travel_log, browser->doc->browser_service)
679 : 0;
680 return S_OK;
683 static HRESULT WINAPI OmHistory_back(IOmHistory *iface, VARIANT *pvargdistance)
685 OmHistory *This = impl_from_IOmHistory(iface);
686 FIXME("(%p)->(%s)\n", This, debugstr_variant(pvargdistance));
687 return E_NOTIMPL;
690 static HRESULT WINAPI OmHistory_forward(IOmHistory *iface, VARIANT *pvargdistance)
692 OmHistory *This = impl_from_IOmHistory(iface);
693 FIXME("(%p)->(%s)\n", This, debugstr_variant(pvargdistance));
694 return E_NOTIMPL;
697 static HRESULT WINAPI OmHistory_go(IOmHistory *iface, VARIANT *pvargdistance)
699 OmHistory *This = impl_from_IOmHistory(iface);
700 FIXME("(%p)->(%s)\n", This, debugstr_variant(pvargdistance));
701 return E_NOTIMPL;
704 static const IOmHistoryVtbl OmHistoryVtbl = {
705 OmHistory_QueryInterface,
706 OmHistory_AddRef,
707 OmHistory_Release,
708 OmHistory_GetTypeInfoCount,
709 OmHistory_GetTypeInfo,
710 OmHistory_GetIDsOfNames,
711 OmHistory_Invoke,
712 OmHistory_get_length,
713 OmHistory_back,
714 OmHistory_forward,
715 OmHistory_go
718 static const tid_t OmHistory_iface_tids[] = {
719 IOmHistory_tid,
722 static dispex_static_data_t OmHistory_dispex = {
723 L"History",
724 NULL,
725 DispHTMLHistory_tid,
726 OmHistory_iface_tids
730 HRESULT create_history(HTMLInnerWindow *window, OmHistory **ret)
732 OmHistory *history;
734 history = heap_alloc_zero(sizeof(*history));
735 if(!history)
736 return E_OUTOFMEMORY;
738 init_dispatch(&history->dispex, (IUnknown*)&history->IOmHistory_iface, &OmHistory_dispex,
739 dispex_compat_mode(&window->event_target.dispex));
740 history->IOmHistory_iface.lpVtbl = &OmHistoryVtbl;
741 history->ref = 1;
743 history->window = window;
745 *ret = history;
746 return S_OK;
749 struct HTMLPluginsCollection {
750 DispatchEx dispex;
751 IHTMLPluginsCollection IHTMLPluginsCollection_iface;
753 LONG ref;
755 OmNavigator *navigator;
758 static inline HTMLPluginsCollection *impl_from_IHTMLPluginsCollection(IHTMLPluginsCollection *iface)
760 return CONTAINING_RECORD(iface, HTMLPluginsCollection, IHTMLPluginsCollection_iface);
763 static HRESULT WINAPI HTMLPluginsCollection_QueryInterface(IHTMLPluginsCollection *iface, REFIID riid, void **ppv)
765 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
767 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
769 if(IsEqualGUID(&IID_IUnknown, riid)) {
770 *ppv = &This->IHTMLPluginsCollection_iface;
771 }else if(IsEqualGUID(&IID_IHTMLPluginsCollection, riid)) {
772 *ppv = &This->IHTMLPluginsCollection_iface;
773 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
774 return *ppv ? S_OK : E_NOINTERFACE;
775 }else {
776 *ppv = NULL;
777 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
778 return E_NOINTERFACE;
781 IUnknown_AddRef((IUnknown*)*ppv);
782 return S_OK;
785 static ULONG WINAPI HTMLPluginsCollection_AddRef(IHTMLPluginsCollection *iface)
787 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
788 LONG ref = InterlockedIncrement(&This->ref);
790 TRACE("(%p) ref=%ld\n", This, ref);
792 return ref;
795 static ULONG WINAPI HTMLPluginsCollection_Release(IHTMLPluginsCollection *iface)
797 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
798 LONG ref = InterlockedDecrement(&This->ref);
800 TRACE("(%p) ref=%ld\n", This, ref);
802 if(!ref) {
803 if(This->navigator)
804 This->navigator->plugins = NULL;
805 release_dispex(&This->dispex);
806 heap_free(This);
809 return ref;
812 static HRESULT WINAPI HTMLPluginsCollection_GetTypeInfoCount(IHTMLPluginsCollection *iface, UINT *pctinfo)
814 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
815 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
818 static HRESULT WINAPI HTMLPluginsCollection_GetTypeInfo(IHTMLPluginsCollection *iface, UINT iTInfo,
819 LCID lcid, ITypeInfo **ppTInfo)
821 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
822 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
825 static HRESULT WINAPI HTMLPluginsCollection_GetIDsOfNames(IHTMLPluginsCollection *iface, REFIID riid,
826 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
828 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
829 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
830 lcid, rgDispId);
833 static HRESULT WINAPI HTMLPluginsCollection_Invoke(IHTMLPluginsCollection *iface, DISPID dispIdMember,
834 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
835 EXCEPINFO *pExcepInfo, UINT *puArgErr)
837 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
838 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
839 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
842 static HRESULT WINAPI HTMLPluginsCollection_get_length(IHTMLPluginsCollection *iface, LONG *p)
844 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
846 TRACE("(%p)->(%p)\n", This, p);
848 /* IE always returns 0 here */
849 *p = 0;
850 return S_OK;
853 static HRESULT WINAPI HTMLPluginsCollection_refresh(IHTMLPluginsCollection *iface, VARIANT_BOOL reload)
855 HTMLPluginsCollection *This = impl_from_IHTMLPluginsCollection(iface);
857 TRACE("(%p)->(%x)\n", This, reload);
859 /* Nothing to do here. */
860 return S_OK;
863 static const IHTMLPluginsCollectionVtbl HTMLPluginsCollectionVtbl = {
864 HTMLPluginsCollection_QueryInterface,
865 HTMLPluginsCollection_AddRef,
866 HTMLPluginsCollection_Release,
867 HTMLPluginsCollection_GetTypeInfoCount,
868 HTMLPluginsCollection_GetTypeInfo,
869 HTMLPluginsCollection_GetIDsOfNames,
870 HTMLPluginsCollection_Invoke,
871 HTMLPluginsCollection_get_length,
872 HTMLPluginsCollection_refresh
875 static const tid_t HTMLPluginsCollection_iface_tids[] = {
876 IHTMLPluginsCollection_tid,
879 static dispex_static_data_t HTMLPluginsCollection_dispex = {
880 L"PluginArray",
881 NULL,
882 DispCPlugins_tid,
883 HTMLPluginsCollection_iface_tids
886 static HRESULT create_plugins_collection(OmNavigator *navigator, HTMLPluginsCollection **ret)
888 HTMLPluginsCollection *col;
890 col = heap_alloc_zero(sizeof(*col));
891 if(!col)
892 return E_OUTOFMEMORY;
894 col->IHTMLPluginsCollection_iface.lpVtbl = &HTMLPluginsCollectionVtbl;
895 col->ref = 1;
896 col->navigator = navigator;
898 init_dispatch(&col->dispex, (IUnknown*)&col->IHTMLPluginsCollection_iface,
899 &HTMLPluginsCollection_dispex, dispex_compat_mode(&navigator->dispex));
901 *ret = col;
902 return S_OK;
905 struct HTMLMimeTypesCollection {
906 DispatchEx dispex;
907 IHTMLMimeTypesCollection IHTMLMimeTypesCollection_iface;
909 LONG ref;
911 OmNavigator *navigator;
914 static inline HTMLMimeTypesCollection *impl_from_IHTMLMimeTypesCollection(IHTMLMimeTypesCollection *iface)
916 return CONTAINING_RECORD(iface, HTMLMimeTypesCollection, IHTMLMimeTypesCollection_iface);
919 static HRESULT WINAPI HTMLMimeTypesCollection_QueryInterface(IHTMLMimeTypesCollection *iface, REFIID riid, void **ppv)
921 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
923 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
925 if(IsEqualGUID(&IID_IUnknown, riid)) {
926 *ppv = &This->IHTMLMimeTypesCollection_iface;
927 }else if(IsEqualGUID(&IID_IHTMLMimeTypesCollection, riid)) {
928 *ppv = &This->IHTMLMimeTypesCollection_iface;
929 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
930 return *ppv ? S_OK : E_NOINTERFACE;
931 }else {
932 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
933 *ppv = NULL;
934 return E_NOINTERFACE;
937 IUnknown_AddRef((IUnknown*)*ppv);
938 return S_OK;
941 static ULONG WINAPI HTMLMimeTypesCollection_AddRef(IHTMLMimeTypesCollection *iface)
943 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
944 LONG ref = InterlockedIncrement(&This->ref);
946 TRACE("(%p) ref=%ld\n", This, ref);
948 return ref;
951 static ULONG WINAPI HTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection *iface)
953 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
954 LONG ref = InterlockedDecrement(&This->ref);
956 TRACE("(%p) ref=%ld\n", This, ref);
958 if(!ref) {
959 if(This->navigator)
960 This->navigator->mime_types = NULL;
961 release_dispex(&This->dispex);
962 heap_free(This);
965 return ref;
968 static HRESULT WINAPI HTMLMimeTypesCollection_GetTypeInfoCount(IHTMLMimeTypesCollection *iface, UINT *pctinfo)
970 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
971 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
974 static HRESULT WINAPI HTMLMimeTypesCollection_GetTypeInfo(IHTMLMimeTypesCollection *iface, UINT iTInfo,
975 LCID lcid, ITypeInfo **ppTInfo)
977 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
978 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
981 static HRESULT WINAPI HTMLMimeTypesCollection_GetIDsOfNames(IHTMLMimeTypesCollection *iface, REFIID riid,
982 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
984 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
985 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
986 lcid, rgDispId);
989 static HRESULT WINAPI HTMLMimeTypesCollection_Invoke(IHTMLMimeTypesCollection *iface, DISPID dispIdMember,
990 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
991 EXCEPINFO *pExcepInfo, UINT *puArgErr)
993 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
994 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
995 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
998 static HRESULT WINAPI HTMLMimeTypesCollection_get_length(IHTMLMimeTypesCollection *iface, LONG *p)
1000 HTMLMimeTypesCollection *This = impl_from_IHTMLMimeTypesCollection(iface);
1002 TRACE("(%p)->(%p)\n", This, p);
1004 /* This is just a stub for compatibility with other browser in IE */
1005 *p = 0;
1006 return S_OK;
1009 static const IHTMLMimeTypesCollectionVtbl HTMLMimeTypesCollectionVtbl = {
1010 HTMLMimeTypesCollection_QueryInterface,
1011 HTMLMimeTypesCollection_AddRef,
1012 HTMLMimeTypesCollection_Release,
1013 HTMLMimeTypesCollection_GetTypeInfoCount,
1014 HTMLMimeTypesCollection_GetTypeInfo,
1015 HTMLMimeTypesCollection_GetIDsOfNames,
1016 HTMLMimeTypesCollection_Invoke,
1017 HTMLMimeTypesCollection_get_length
1020 static const tid_t HTMLMimeTypesCollection_iface_tids[] = {
1021 IHTMLMimeTypesCollection_tid,
1024 static dispex_static_data_t HTMLMimeTypesCollection_dispex = {
1025 L"MimeTypeArray",
1026 NULL,
1027 IHTMLMimeTypesCollection_tid,
1028 HTMLMimeTypesCollection_iface_tids
1031 static HRESULT create_mime_types_collection(OmNavigator *navigator, HTMLMimeTypesCollection **ret)
1033 HTMLMimeTypesCollection *col;
1035 col = heap_alloc_zero(sizeof(*col));
1036 if(!col)
1037 return E_OUTOFMEMORY;
1039 col->IHTMLMimeTypesCollection_iface.lpVtbl = &HTMLMimeTypesCollectionVtbl;
1040 col->ref = 1;
1041 col->navigator = navigator;
1043 init_dispatch(&col->dispex, (IUnknown*)&col->IHTMLMimeTypesCollection_iface,
1044 &HTMLMimeTypesCollection_dispex, dispex_compat_mode(&navigator->dispex));
1046 *ret = col;
1047 return S_OK;
1050 static inline OmNavigator *impl_from_IOmNavigator(IOmNavigator *iface)
1052 return CONTAINING_RECORD(iface, OmNavigator, IOmNavigator_iface);
1055 static HRESULT WINAPI OmNavigator_QueryInterface(IOmNavigator *iface, REFIID riid, void **ppv)
1057 OmNavigator *This = impl_from_IOmNavigator(iface);
1059 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
1061 if(IsEqualGUID(&IID_IUnknown, riid)) {
1062 *ppv = &This->IOmNavigator_iface;
1063 }else if(IsEqualGUID(&IID_IOmNavigator, riid)) {
1064 *ppv = &This->IOmNavigator_iface;
1065 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
1066 return *ppv ? S_OK : E_NOINTERFACE;
1067 }else {
1068 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
1069 *ppv = NULL;
1070 return E_NOINTERFACE;
1073 IUnknown_AddRef((IUnknown*)*ppv);
1074 return S_OK;
1077 static ULONG WINAPI OmNavigator_AddRef(IOmNavigator *iface)
1079 OmNavigator *This = impl_from_IOmNavigator(iface);
1080 LONG ref = InterlockedIncrement(&This->ref);
1082 TRACE("(%p) ref=%ld\n", This, ref);
1084 return ref;
1087 static ULONG WINAPI OmNavigator_Release(IOmNavigator *iface)
1089 OmNavigator *This = impl_from_IOmNavigator(iface);
1090 LONG ref = InterlockedDecrement(&This->ref);
1092 TRACE("(%p) ref=%ld\n", This, ref);
1094 if(!ref) {
1095 if(This->plugins)
1096 This->plugins->navigator = NULL;
1097 if(This->mime_types)
1098 This->mime_types->navigator = NULL;
1099 release_dispex(&This->dispex);
1100 heap_free(This);
1103 return ref;
1106 static HRESULT WINAPI OmNavigator_GetTypeInfoCount(IOmNavigator *iface, UINT *pctinfo)
1108 OmNavigator *This = impl_from_IOmNavigator(iface);
1109 FIXME("(%p)->(%p)\n", This, pctinfo);
1110 return E_NOTIMPL;
1113 static HRESULT WINAPI OmNavigator_GetTypeInfo(IOmNavigator *iface, UINT iTInfo,
1114 LCID lcid, ITypeInfo **ppTInfo)
1116 OmNavigator *This = impl_from_IOmNavigator(iface);
1118 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1121 static HRESULT WINAPI OmNavigator_GetIDsOfNames(IOmNavigator *iface, REFIID riid,
1122 LPOLESTR *rgszNames, UINT cNames,
1123 LCID lcid, DISPID *rgDispId)
1125 OmNavigator *This = impl_from_IOmNavigator(iface);
1127 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
1128 lcid, rgDispId);
1131 static HRESULT WINAPI OmNavigator_Invoke(IOmNavigator *iface, DISPID dispIdMember,
1132 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1133 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1135 OmNavigator *This = impl_from_IOmNavigator(iface);
1137 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1138 pDispParams, pVarResult, pExcepInfo, puArgErr);
1141 static HRESULT WINAPI OmNavigator_get_appCodeName(IOmNavigator *iface, BSTR *p)
1143 OmNavigator *This = impl_from_IOmNavigator(iface);
1145 TRACE("(%p)->(%p)\n", This, p);
1147 *p = SysAllocString(L"Mozilla");
1148 return S_OK;
1151 static HRESULT WINAPI OmNavigator_get_appName(IOmNavigator *iface, BSTR *p)
1153 OmNavigator *This = impl_from_IOmNavigator(iface);
1155 TRACE("(%p)->(%p)\n", This, p);
1157 *p = SysAllocString(dispex_compat_mode(&This->dispex) == COMPAT_MODE_IE11
1158 ? L"Netscape" : L"Microsoft Internet Explorer");
1159 if(!*p)
1160 return E_OUTOFMEMORY;
1162 return S_OK;
1165 /* undocumented, added in IE8 */
1166 extern HRESULT WINAPI MapBrowserEmulationModeToUserAgent(const void*,WCHAR**);
1168 /* Retrieves allocated user agent via CoTaskMemAlloc */
1169 static HRESULT get_user_agent(OmNavigator *navigator, WCHAR **user_agent)
1171 DWORD version;
1173 switch(dispex_compat_mode(&navigator->dispex)) {
1174 case COMPAT_MODE_QUIRKS:
1175 case COMPAT_MODE_IE5:
1176 case COMPAT_MODE_IE7:
1177 version = 7;
1178 break;
1179 case COMPAT_MODE_IE8:
1180 version = 8;
1181 break;
1182 case COMPAT_MODE_IE9:
1183 version = 9;
1184 break;
1185 case COMPAT_MODE_IE10:
1186 version = 10;
1187 break;
1188 case COMPAT_MODE_IE11:
1189 version = 11;
1190 break;
1191 default:
1192 assert(0);
1193 return E_FAIL;
1195 return MapBrowserEmulationModeToUserAgent(&version, user_agent);
1198 static HRESULT WINAPI OmNavigator_get_appVersion(IOmNavigator *iface, BSTR *p)
1200 OmNavigator *This = impl_from_IOmNavigator(iface);
1201 WCHAR *user_agent;
1202 unsigned len;
1203 HRESULT hres;
1204 const unsigned skip_prefix = 8; /* strlen("Mozilla/") */
1206 TRACE("(%p)->(%p)\n", This, p);
1208 hres = get_user_agent(This, &user_agent);
1209 if(FAILED(hres))
1210 return hres;
1211 len = wcslen(user_agent);
1213 if(len < skip_prefix) {
1214 CoTaskMemFree(user_agent);
1215 *p = NULL;
1216 return S_OK;
1219 *p = SysAllocStringLen(user_agent + skip_prefix, len - skip_prefix);
1220 CoTaskMemFree(user_agent);
1221 return *p ? S_OK : E_OUTOFMEMORY;
1224 static HRESULT WINAPI OmNavigator_get_userAgent(IOmNavigator *iface, BSTR *p)
1226 OmNavigator *This = impl_from_IOmNavigator(iface);
1227 WCHAR *user_agent;
1228 HRESULT hres;
1230 TRACE("(%p)->(%p)\n", This, p);
1232 hres = get_user_agent(This, &user_agent);
1233 if(FAILED(hres))
1234 return hres;
1236 *p = SysAllocString(user_agent);
1237 CoTaskMemFree(user_agent);
1238 return *p ? S_OK : E_OUTOFMEMORY;
1241 static HRESULT WINAPI OmNavigator_javaEnabled(IOmNavigator *iface, VARIANT_BOOL *enabled)
1243 OmNavigator *This = impl_from_IOmNavigator(iface);
1245 FIXME("(%p)->(%p) semi-stub\n", This, enabled);
1247 *enabled = VARIANT_TRUE;
1248 return S_OK;
1251 static HRESULT WINAPI OmNavigator_taintEnabled(IOmNavigator *iface, VARIANT_BOOL *enabled)
1253 OmNavigator *This = impl_from_IOmNavigator(iface);
1254 FIXME("(%p)->(%p)\n", This, enabled);
1255 return E_NOTIMPL;
1258 static HRESULT WINAPI OmNavigator_get_mimeTypes(IOmNavigator *iface, IHTMLMimeTypesCollection **p)
1260 OmNavigator *This = impl_from_IOmNavigator(iface);
1262 TRACE("(%p)->(%p)\n", This, p);
1264 if(!This->mime_types) {
1265 HRESULT hres;
1267 hres = create_mime_types_collection(This, &This->mime_types);
1268 if(FAILED(hres))
1269 return hres;
1270 }else {
1271 IHTMLMimeTypesCollection_AddRef(&This->mime_types->IHTMLMimeTypesCollection_iface);
1274 *p = &This->mime_types->IHTMLMimeTypesCollection_iface;
1275 return S_OK;
1278 static HRESULT WINAPI OmNavigator_get_plugins(IOmNavigator *iface, IHTMLPluginsCollection **p)
1280 OmNavigator *This = impl_from_IOmNavigator(iface);
1282 TRACE("(%p)->(%p)\n", This, p);
1284 if(!This->plugins) {
1285 HRESULT hres;
1287 hres = create_plugins_collection(This, &This->plugins);
1288 if(FAILED(hres))
1289 return hres;
1290 }else {
1291 IHTMLPluginsCollection_AddRef(&This->plugins->IHTMLPluginsCollection_iface);
1294 *p = &This->plugins->IHTMLPluginsCollection_iface;
1295 return S_OK;
1298 static HRESULT WINAPI OmNavigator_get_cookieEnabled(IOmNavigator *iface, VARIANT_BOOL *p)
1300 OmNavigator *This = impl_from_IOmNavigator(iface);
1302 WARN("(%p)->(%p) semi-stub\n", This, p);
1304 *p = VARIANT_TRUE;
1305 return S_OK;
1308 static HRESULT WINAPI OmNavigator_get_opsProfile(IOmNavigator *iface, IHTMLOpsProfile **p)
1310 OmNavigator *This = impl_from_IOmNavigator(iface);
1311 FIXME("(%p)->(%p)\n", This, p);
1312 return E_NOTIMPL;
1315 static HRESULT WINAPI OmNavigator_toString(IOmNavigator *iface, BSTR *String)
1317 OmNavigator *This = impl_from_IOmNavigator(iface);
1319 TRACE("(%p)->(%p)\n", This, String);
1321 return dispex_to_string(&This->dispex, String);
1324 static HRESULT WINAPI OmNavigator_get_cpuClass(IOmNavigator *iface, BSTR *p)
1326 OmNavigator *This = impl_from_IOmNavigator(iface);
1328 TRACE("(%p)->(%p)\n", This, p);
1330 #ifdef _WIN64
1331 *p = SysAllocString(L"x64");
1332 #else
1333 *p = SysAllocString(L"x86");
1334 #endif
1335 return *p ? S_OK : E_OUTOFMEMORY;
1338 static HRESULT get_language_string(LCID lcid, BSTR *p)
1340 BSTR ret;
1341 int len;
1343 len = LCIDToLocaleName(lcid, NULL, 0, 0);
1344 if(!len) {
1345 WARN("LCIDToLocaleName failed: %lu\n", GetLastError());
1346 return E_FAIL;
1349 ret = SysAllocStringLen(NULL, len-1);
1350 if(!ret)
1351 return E_OUTOFMEMORY;
1353 len = LCIDToLocaleName(lcid, ret, len, 0);
1354 if(!len) {
1355 WARN("LCIDToLocaleName failed: %lu\n", GetLastError());
1356 SysFreeString(ret);
1357 return E_FAIL;
1360 *p = ret;
1361 return S_OK;
1364 static HRESULT WINAPI OmNavigator_get_systemLanguage(IOmNavigator *iface, BSTR *p)
1366 OmNavigator *This = impl_from_IOmNavigator(iface);
1368 TRACE("(%p)->(%p)\n", This, p);
1370 return get_language_string(LOCALE_SYSTEM_DEFAULT, p);
1373 static HRESULT WINAPI OmNavigator_get_browserLanguage(IOmNavigator *iface, BSTR *p)
1375 OmNavigator *This = impl_from_IOmNavigator(iface);
1377 TRACE("(%p)->(%p)\n", This, p);
1379 return get_language_string(GetUserDefaultUILanguage(), p);
1382 static HRESULT WINAPI OmNavigator_get_userLanguage(IOmNavigator *iface, BSTR *p)
1384 OmNavigator *This = impl_from_IOmNavigator(iface);
1386 TRACE("(%p)->(%p)\n", This, p);
1388 return get_language_string(LOCALE_USER_DEFAULT, p);
1391 static HRESULT WINAPI OmNavigator_get_platform(IOmNavigator *iface, BSTR *p)
1393 OmNavigator *This = impl_from_IOmNavigator(iface);
1395 TRACE("(%p)->(%p)\n", This, p);
1397 #ifdef _WIN64
1398 *p = SysAllocString(L"Win64");
1399 #else
1400 *p = SysAllocString(L"Win32");
1401 #endif
1402 return S_OK;
1405 static HRESULT WINAPI OmNavigator_get_appMinorVersion(IOmNavigator *iface, BSTR *p)
1407 OmNavigator *This = impl_from_IOmNavigator(iface);
1409 TRACE("(%p)->(%p)\n", This, p);
1411 /* NOTE: MSIE returns "0" or values like ";SP2;". Returning "0" should be enough. */
1412 *p = SysAllocString(L"0");
1413 return S_OK;
1416 static HRESULT WINAPI OmNavigator_get_connectionSpeed(IOmNavigator *iface, LONG *p)
1418 OmNavigator *This = impl_from_IOmNavigator(iface);
1419 FIXME("(%p)->(%p)\n", This, p);
1420 return E_NOTIMPL;
1423 static HRESULT WINAPI OmNavigator_get_onLine(IOmNavigator *iface, VARIANT_BOOL *p)
1425 OmNavigator *This = impl_from_IOmNavigator(iface);
1427 WARN("(%p)->(%p) semi-stub, returning true\n", This, p);
1429 *p = VARIANT_TRUE;
1430 return S_OK;
1433 static HRESULT WINAPI OmNavigator_get_userProfile(IOmNavigator *iface, IHTMLOpsProfile **p)
1435 OmNavigator *This = impl_from_IOmNavigator(iface);
1436 FIXME("(%p)->(%p)\n", This, p);
1437 return E_NOTIMPL;
1440 static const IOmNavigatorVtbl OmNavigatorVtbl = {
1441 OmNavigator_QueryInterface,
1442 OmNavigator_AddRef,
1443 OmNavigator_Release,
1444 OmNavigator_GetTypeInfoCount,
1445 OmNavigator_GetTypeInfo,
1446 OmNavigator_GetIDsOfNames,
1447 OmNavigator_Invoke,
1448 OmNavigator_get_appCodeName,
1449 OmNavigator_get_appName,
1450 OmNavigator_get_appVersion,
1451 OmNavigator_get_userAgent,
1452 OmNavigator_javaEnabled,
1453 OmNavigator_taintEnabled,
1454 OmNavigator_get_mimeTypes,
1455 OmNavigator_get_plugins,
1456 OmNavigator_get_cookieEnabled,
1457 OmNavigator_get_opsProfile,
1458 OmNavigator_toString,
1459 OmNavigator_get_cpuClass,
1460 OmNavigator_get_systemLanguage,
1461 OmNavigator_get_browserLanguage,
1462 OmNavigator_get_userLanguage,
1463 OmNavigator_get_platform,
1464 OmNavigator_get_appMinorVersion,
1465 OmNavigator_get_connectionSpeed,
1466 OmNavigator_get_onLine,
1467 OmNavigator_get_userProfile
1470 static const tid_t OmNavigator_iface_tids[] = {
1471 IOmNavigator_tid,
1474 static dispex_static_data_t OmNavigator_dispex = {
1475 L"Navigator",
1476 NULL,
1477 DispHTMLNavigator_tid,
1478 OmNavigator_iface_tids
1481 HRESULT create_navigator(compat_mode_t compat_mode, IOmNavigator **navigator)
1483 OmNavigator *ret;
1485 ret = heap_alloc_zero(sizeof(*ret));
1486 if(!ret)
1487 return E_OUTOFMEMORY;
1489 ret->IOmNavigator_iface.lpVtbl = &OmNavigatorVtbl;
1490 ret->ref = 1;
1492 init_dispatch(&ret->dispex, (IUnknown*)&ret->IOmNavigator_iface, &OmNavigator_dispex, compat_mode);
1494 *navigator = &ret->IOmNavigator_iface;
1495 return S_OK;
1498 typedef struct {
1499 DispatchEx dispex;
1500 IHTMLPerformanceTiming IHTMLPerformanceTiming_iface;
1502 LONG ref;
1503 } HTMLPerformanceTiming;
1505 static inline HTMLPerformanceTiming *impl_from_IHTMLPerformanceTiming(IHTMLPerformanceTiming *iface)
1507 return CONTAINING_RECORD(iface, HTMLPerformanceTiming, IHTMLPerformanceTiming_iface);
1510 static HRESULT WINAPI HTMLPerformanceTiming_QueryInterface(IHTMLPerformanceTiming *iface, REFIID riid, void **ppv)
1512 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1514 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
1516 if(IsEqualGUID(&IID_IUnknown, riid)) {
1517 *ppv = &This->IHTMLPerformanceTiming_iface;
1518 }else if(IsEqualGUID(&IID_IHTMLPerformanceTiming, riid)) {
1519 *ppv = &This->IHTMLPerformanceTiming_iface;
1520 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
1521 return *ppv ? S_OK : E_NOINTERFACE;
1522 }else {
1523 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
1524 *ppv = NULL;
1525 return E_NOINTERFACE;
1528 IUnknown_AddRef((IUnknown*)*ppv);
1529 return S_OK;
1532 static ULONG WINAPI HTMLPerformanceTiming_AddRef(IHTMLPerformanceTiming *iface)
1534 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1535 LONG ref = InterlockedIncrement(&This->ref);
1537 TRACE("(%p) ref=%ld\n", This, ref);
1539 return ref;
1542 static ULONG WINAPI HTMLPerformanceTiming_Release(IHTMLPerformanceTiming *iface)
1544 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1545 LONG ref = InterlockedDecrement(&This->ref);
1547 TRACE("(%p) ref=%ld\n", This, ref);
1549 if(!ref) {
1550 release_dispex(&This->dispex);
1551 heap_free(This);
1554 return ref;
1557 static HRESULT WINAPI HTMLPerformanceTiming_GetTypeInfoCount(IHTMLPerformanceTiming *iface, UINT *pctinfo)
1559 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1560 FIXME("(%p)->(%p)\n", This, pctinfo);
1561 return E_NOTIMPL;
1564 static HRESULT WINAPI HTMLPerformanceTiming_GetTypeInfo(IHTMLPerformanceTiming *iface, UINT iTInfo,
1565 LCID lcid, ITypeInfo **ppTInfo)
1567 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1569 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1572 static HRESULT WINAPI HTMLPerformanceTiming_GetIDsOfNames(IHTMLPerformanceTiming *iface, REFIID riid,
1573 LPOLESTR *rgszNames, UINT cNames,
1574 LCID lcid, DISPID *rgDispId)
1576 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1578 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
1579 lcid, rgDispId);
1582 static HRESULT WINAPI HTMLPerformanceTiming_Invoke(IHTMLPerformanceTiming *iface, DISPID dispIdMember,
1583 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1584 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1586 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1588 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1589 pDispParams, pVarResult, pExcepInfo, puArgErr);
1592 #define TIMING_FAKE_TIMESTAMP 0xdeadbeef
1594 static HRESULT WINAPI HTMLPerformanceTiming_get_navigationStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1596 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1598 FIXME("(%p)->(%p) returning fake value\n", This, p);
1600 *p = TIMING_FAKE_TIMESTAMP;
1601 return S_OK;
1604 static HRESULT WINAPI HTMLPerformanceTiming_get_unloadEventStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1606 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1608 FIXME("(%p)->(%p) returning fake value\n", This, p);
1610 *p = TIMING_FAKE_TIMESTAMP;
1611 return S_OK;
1614 static HRESULT WINAPI HTMLPerformanceTiming_get_unloadEventEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1616 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1618 FIXME("(%p)->(%p) returning fake value\n", This, p);
1620 *p = TIMING_FAKE_TIMESTAMP;
1621 return S_OK;
1624 static HRESULT WINAPI HTMLPerformanceTiming_get_redirectStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1626 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1628 FIXME("(%p)->(%p) returning fake value\n", This, p);
1630 *p = TIMING_FAKE_TIMESTAMP;
1631 return S_OK;
1634 static HRESULT WINAPI HTMLPerformanceTiming_get_redirectEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1636 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1638 FIXME("(%p)->(%p) returning fake value\n", This, p);
1640 *p = TIMING_FAKE_TIMESTAMP;
1641 return S_OK;
1644 static HRESULT WINAPI HTMLPerformanceTiming_get_fetchStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1646 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1648 FIXME("(%p)->(%p) returning fake value\n", This, p);
1650 *p = TIMING_FAKE_TIMESTAMP;
1651 return S_OK;
1654 static HRESULT WINAPI HTMLPerformanceTiming_get_domainLookupStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1656 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1658 FIXME("(%p)->(%p) returning fake value\n", This, p);
1660 *p = TIMING_FAKE_TIMESTAMP;
1661 return S_OK;
1664 static HRESULT WINAPI HTMLPerformanceTiming_get_domainLookupEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1666 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1668 FIXME("(%p)->(%p) returning fake value\n", This, p);
1670 *p = TIMING_FAKE_TIMESTAMP;
1671 return S_OK;
1674 static HRESULT WINAPI HTMLPerformanceTiming_get_connectStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1676 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1678 FIXME("(%p)->(%p) returning fake value\n", This, p);
1680 *p = TIMING_FAKE_TIMESTAMP;
1681 return S_OK;
1684 static HRESULT WINAPI HTMLPerformanceTiming_get_connectEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1686 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1688 FIXME("(%p)->(%p) returning fake value\n", This, p);
1690 *p = TIMING_FAKE_TIMESTAMP;
1691 return S_OK;
1694 static HRESULT WINAPI HTMLPerformanceTiming_get_requestStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1696 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1698 FIXME("(%p)->(%p) returning fake value\n", This, p);
1700 *p = TIMING_FAKE_TIMESTAMP;
1701 return S_OK;
1704 static HRESULT WINAPI HTMLPerformanceTiming_get_responseStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1706 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1708 FIXME("(%p)->(%p) returning fake value\n", This, p);
1710 *p = TIMING_FAKE_TIMESTAMP;
1711 return S_OK;
1714 static HRESULT WINAPI HTMLPerformanceTiming_get_responseEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1716 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1718 FIXME("(%p)->(%p) returning fake value\n", This, p);
1720 *p = TIMING_FAKE_TIMESTAMP;
1721 return S_OK;
1724 static HRESULT WINAPI HTMLPerformanceTiming_get_domLoading(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1726 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1728 FIXME("(%p)->(%p) returning fake value\n", This, p);
1730 *p = TIMING_FAKE_TIMESTAMP;
1731 return S_OK;
1734 static HRESULT WINAPI HTMLPerformanceTiming_get_domInteractive(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1736 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1738 FIXME("(%p)->(%p) returning fake value\n", This, p);
1740 *p = TIMING_FAKE_TIMESTAMP;
1741 return S_OK;
1744 static HRESULT WINAPI HTMLPerformanceTiming_get_domContentLoadedEventStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1746 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1748 FIXME("(%p)->(%p) returning fake value\n", This, p);
1750 *p = TIMING_FAKE_TIMESTAMP;
1751 return S_OK;
1754 static HRESULT WINAPI HTMLPerformanceTiming_get_domContentLoadedEventEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1756 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1758 FIXME("(%p)->(%p) returning fake value\n", This, p);
1760 *p = TIMING_FAKE_TIMESTAMP;
1761 return S_OK;
1764 static HRESULT WINAPI HTMLPerformanceTiming_get_domComplete(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1766 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1768 FIXME("(%p)->(%p) returning fake value\n", This, p);
1770 *p = TIMING_FAKE_TIMESTAMP;
1771 return S_OK;
1774 static HRESULT WINAPI HTMLPerformanceTiming_get_loadEventStart(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1776 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1778 FIXME("(%p)->(%p) returning fake value\n", This, p);
1780 *p = TIMING_FAKE_TIMESTAMP;
1781 return S_OK;
1784 static HRESULT WINAPI HTMLPerformanceTiming_get_loadEventEnd(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1786 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1788 FIXME("(%p)->(%p) returning fake value\n", This, p);
1790 *p = TIMING_FAKE_TIMESTAMP;
1791 return S_OK;
1794 static HRESULT WINAPI HTMLPerformanceTiming_get_msFirstPaint(IHTMLPerformanceTiming *iface, ULONGLONG *p)
1796 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1798 FIXME("(%p)->(%p) returning fake value\n", This, p);
1800 *p = TIMING_FAKE_TIMESTAMP;
1801 return S_OK;
1804 static HRESULT WINAPI HTMLPerformanceTiming_toString(IHTMLPerformanceTiming *iface, BSTR *string)
1806 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1808 TRACE("(%p)->(%p)\n", This, string);
1810 return dispex_to_string(&This->dispex, string);
1813 static HRESULT WINAPI HTMLPerformanceTiming_toJSON(IHTMLPerformanceTiming *iface, VARIANT *p)
1815 HTMLPerformanceTiming *This = impl_from_IHTMLPerformanceTiming(iface);
1816 FIXME("(%p)->(%p)\n", This, p);
1817 return E_NOTIMPL;
1820 static const IHTMLPerformanceTimingVtbl HTMLPerformanceTimingVtbl = {
1821 HTMLPerformanceTiming_QueryInterface,
1822 HTMLPerformanceTiming_AddRef,
1823 HTMLPerformanceTiming_Release,
1824 HTMLPerformanceTiming_GetTypeInfoCount,
1825 HTMLPerformanceTiming_GetTypeInfo,
1826 HTMLPerformanceTiming_GetIDsOfNames,
1827 HTMLPerformanceTiming_Invoke,
1828 HTMLPerformanceTiming_get_navigationStart,
1829 HTMLPerformanceTiming_get_unloadEventStart,
1830 HTMLPerformanceTiming_get_unloadEventEnd,
1831 HTMLPerformanceTiming_get_redirectStart,
1832 HTMLPerformanceTiming_get_redirectEnd,
1833 HTMLPerformanceTiming_get_fetchStart,
1834 HTMLPerformanceTiming_get_domainLookupStart,
1835 HTMLPerformanceTiming_get_domainLookupEnd,
1836 HTMLPerformanceTiming_get_connectStart,
1837 HTMLPerformanceTiming_get_connectEnd,
1838 HTMLPerformanceTiming_get_requestStart,
1839 HTMLPerformanceTiming_get_responseStart,
1840 HTMLPerformanceTiming_get_responseEnd,
1841 HTMLPerformanceTiming_get_domLoading,
1842 HTMLPerformanceTiming_get_domInteractive,
1843 HTMLPerformanceTiming_get_domContentLoadedEventStart,
1844 HTMLPerformanceTiming_get_domContentLoadedEventEnd,
1845 HTMLPerformanceTiming_get_domComplete,
1846 HTMLPerformanceTiming_get_loadEventStart,
1847 HTMLPerformanceTiming_get_loadEventEnd,
1848 HTMLPerformanceTiming_get_msFirstPaint,
1849 HTMLPerformanceTiming_toString,
1850 HTMLPerformanceTiming_toJSON
1853 static const tid_t HTMLPerformanceTiming_iface_tids[] = {
1854 IHTMLPerformanceTiming_tid,
1857 static dispex_static_data_t HTMLPerformanceTiming_dispex = {
1858 L"PerformanceTiming",
1859 NULL,
1860 IHTMLPerformanceTiming_tid,
1861 HTMLPerformanceTiming_iface_tids
1864 typedef struct {
1865 DispatchEx dispex;
1866 IHTMLPerformanceNavigation IHTMLPerformanceNavigation_iface;
1868 LONG ref;
1869 } HTMLPerformanceNavigation;
1871 static inline HTMLPerformanceNavigation *impl_from_IHTMLPerformanceNavigation(IHTMLPerformanceNavigation *iface)
1873 return CONTAINING_RECORD(iface, HTMLPerformanceNavigation, IHTMLPerformanceNavigation_iface);
1876 static HRESULT WINAPI HTMLPerformanceNavigation_QueryInterface(IHTMLPerformanceNavigation *iface, REFIID riid, void **ppv)
1878 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1880 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
1882 if(IsEqualGUID(&IID_IUnknown, riid)) {
1883 *ppv = &This->IHTMLPerformanceNavigation_iface;
1884 }else if(IsEqualGUID(&IID_IHTMLPerformanceNavigation, riid)) {
1885 *ppv = &This->IHTMLPerformanceNavigation_iface;
1886 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
1887 return *ppv ? S_OK : E_NOINTERFACE;
1888 }else {
1889 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
1890 *ppv = NULL;
1891 return E_NOINTERFACE;
1894 IUnknown_AddRef((IUnknown*)*ppv);
1895 return S_OK;
1898 static ULONG WINAPI HTMLPerformanceNavigation_AddRef(IHTMLPerformanceNavigation *iface)
1900 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1901 LONG ref = InterlockedIncrement(&This->ref);
1903 TRACE("(%p) ref=%ld\n", This, ref);
1905 return ref;
1908 static ULONG WINAPI HTMLPerformanceNavigation_Release(IHTMLPerformanceNavigation *iface)
1910 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1911 LONG ref = InterlockedDecrement(&This->ref);
1913 TRACE("(%p) ref=%ld\n", This, ref);
1915 if(!ref) {
1916 release_dispex(&This->dispex);
1917 heap_free(This);
1920 return ref;
1923 static HRESULT WINAPI HTMLPerformanceNavigation_GetTypeInfoCount(IHTMLPerformanceNavigation *iface, UINT *pctinfo)
1925 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1926 FIXME("(%p)->(%p)\n", This, pctinfo);
1927 return E_NOTIMPL;
1930 static HRESULT WINAPI HTMLPerformanceNavigation_GetTypeInfo(IHTMLPerformanceNavigation *iface, UINT iTInfo,
1931 LCID lcid, ITypeInfo **ppTInfo)
1933 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1935 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
1938 static HRESULT WINAPI HTMLPerformanceNavigation_GetIDsOfNames(IHTMLPerformanceNavigation *iface, REFIID riid,
1939 LPOLESTR *rgszNames, UINT cNames,
1940 LCID lcid, DISPID *rgDispId)
1942 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1944 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
1945 lcid, rgDispId);
1948 static HRESULT WINAPI HTMLPerformanceNavigation_Invoke(IHTMLPerformanceNavigation *iface, DISPID dispIdMember,
1949 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1950 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1952 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1954 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
1955 pDispParams, pVarResult, pExcepInfo, puArgErr);
1958 static HRESULT WINAPI HTMLPerformanceNavigation_get_type(IHTMLPerformanceNavigation *iface, ULONG *p)
1960 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1962 FIXME("(%p)->(%p) returning TYPE_NAVIGATE\n", This, p);
1964 *p = 0; /* TYPE_NAVIGATE */
1965 return S_OK;
1968 static HRESULT WINAPI HTMLPerformanceNavigation_get_redirectCount(IHTMLPerformanceNavigation *iface, ULONG *p)
1970 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1971 FIXME("(%p)->(%p)\n", This, p);
1972 return E_NOTIMPL;
1975 static HRESULT WINAPI HTMLPerformanceNavigation_toString(IHTMLPerformanceNavigation *iface, BSTR *string)
1977 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1979 TRACE("(%p)->(%p)\n", This, string);
1981 return dispex_to_string(&This->dispex, string);
1984 static HRESULT WINAPI HTMLPerformanceNavigation_toJSON(IHTMLPerformanceNavigation *iface, VARIANT *p)
1986 HTMLPerformanceNavigation *This = impl_from_IHTMLPerformanceNavigation(iface);
1987 FIXME("(%p)->(%p)\n", This, p);
1988 return E_NOTIMPL;
1991 static const IHTMLPerformanceNavigationVtbl HTMLPerformanceNavigationVtbl = {
1992 HTMLPerformanceNavigation_QueryInterface,
1993 HTMLPerformanceNavigation_AddRef,
1994 HTMLPerformanceNavigation_Release,
1995 HTMLPerformanceNavigation_GetTypeInfoCount,
1996 HTMLPerformanceNavigation_GetTypeInfo,
1997 HTMLPerformanceNavigation_GetIDsOfNames,
1998 HTMLPerformanceNavigation_Invoke,
1999 HTMLPerformanceNavigation_get_type,
2000 HTMLPerformanceNavigation_get_redirectCount,
2001 HTMLPerformanceNavigation_toString,
2002 HTMLPerformanceNavigation_toJSON
2005 static const tid_t HTMLPerformanceNavigation_iface_tids[] = {
2006 IHTMLPerformanceNavigation_tid,
2009 static dispex_static_data_t HTMLPerformanceNavigation_dispex = {
2010 L"PerformanceNavigation",
2011 NULL,
2012 IHTMLPerformanceNavigation_tid,
2013 HTMLPerformanceNavigation_iface_tids
2016 typedef struct {
2017 DispatchEx dispex;
2018 IHTMLPerformance IHTMLPerformance_iface;
2020 LONG ref;
2022 IHTMLPerformanceNavigation *navigation;
2023 IHTMLPerformanceTiming *timing;
2024 } HTMLPerformance;
2026 static inline HTMLPerformance *impl_from_IHTMLPerformance(IHTMLPerformance *iface)
2028 return CONTAINING_RECORD(iface, HTMLPerformance, IHTMLPerformance_iface);
2031 static HRESULT WINAPI HTMLPerformance_QueryInterface(IHTMLPerformance *iface, REFIID riid, void **ppv)
2033 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2035 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
2037 if(IsEqualGUID(&IID_IUnknown, riid)) {
2038 *ppv = &This->IHTMLPerformance_iface;
2039 }else if(IsEqualGUID(&IID_IHTMLPerformance, riid)) {
2040 *ppv = &This->IHTMLPerformance_iface;
2041 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
2042 return *ppv ? S_OK : E_NOINTERFACE;
2043 }else {
2044 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
2045 *ppv = NULL;
2046 return E_NOINTERFACE;
2049 IUnknown_AddRef((IUnknown*)*ppv);
2050 return S_OK;
2053 static ULONG WINAPI HTMLPerformance_AddRef(IHTMLPerformance *iface)
2055 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2056 LONG ref = InterlockedIncrement(&This->ref);
2058 TRACE("(%p) ref=%ld\n", This, ref);
2060 return ref;
2063 static ULONG WINAPI HTMLPerformance_Release(IHTMLPerformance *iface)
2065 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2066 LONG ref = InterlockedDecrement(&This->ref);
2068 TRACE("(%p) ref=%ld\n", This, ref);
2070 if(!ref) {
2071 if(This->timing)
2072 IHTMLPerformanceTiming_Release(This->timing);
2073 if(This->navigation)
2074 IHTMLPerformanceNavigation_Release(This->navigation);
2075 release_dispex(&This->dispex);
2076 heap_free(This);
2079 return ref;
2082 static HRESULT WINAPI HTMLPerformance_GetTypeInfoCount(IHTMLPerformance *iface, UINT *pctinfo)
2084 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2085 FIXME("(%p)->(%p)\n", This, pctinfo);
2086 return E_NOTIMPL;
2089 static HRESULT WINAPI HTMLPerformance_GetTypeInfo(IHTMLPerformance *iface, UINT iTInfo,
2090 LCID lcid, ITypeInfo **ppTInfo)
2092 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2094 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2097 static HRESULT WINAPI HTMLPerformance_GetIDsOfNames(IHTMLPerformance *iface, REFIID riid,
2098 LPOLESTR *rgszNames, UINT cNames,
2099 LCID lcid, DISPID *rgDispId)
2101 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2103 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
2104 lcid, rgDispId);
2107 static HRESULT WINAPI HTMLPerformance_Invoke(IHTMLPerformance *iface, DISPID dispIdMember,
2108 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2109 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2111 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2113 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2114 pDispParams, pVarResult, pExcepInfo, puArgErr);
2117 static HRESULT WINAPI HTMLPerformance_get_navigation(IHTMLPerformance *iface,
2118 IHTMLPerformanceNavigation **p)
2120 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2122 TRACE("(%p)->(%p)\n", This, p);
2124 if(!This->navigation) {
2125 HTMLPerformanceNavigation *navigation;
2127 navigation = heap_alloc_zero(sizeof(*navigation));
2128 if(!navigation)
2129 return E_OUTOFMEMORY;
2131 navigation->IHTMLPerformanceNavigation_iface.lpVtbl = &HTMLPerformanceNavigationVtbl;
2132 navigation->ref = 1;
2133 init_dispatch(&navigation->dispex, (IUnknown*)&navigation->IHTMLPerformanceNavigation_iface,
2134 &HTMLPerformanceNavigation_dispex, dispex_compat_mode(&This->dispex));
2136 This->navigation = &navigation->IHTMLPerformanceNavigation_iface;
2139 IHTMLPerformanceNavigation_AddRef(*p = This->navigation);
2140 return S_OK;
2143 static HRESULT WINAPI HTMLPerformance_get_timing(IHTMLPerformance *iface, IHTMLPerformanceTiming **p)
2145 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2147 TRACE("(%p)->(%p)\n", This, p);
2149 if(!This->timing) {
2150 HTMLPerformanceTiming *timing;
2152 timing = heap_alloc_zero(sizeof(*timing));
2153 if(!timing)
2154 return E_OUTOFMEMORY;
2156 timing->IHTMLPerformanceTiming_iface.lpVtbl = &HTMLPerformanceTimingVtbl;
2157 timing->ref = 1;
2158 init_dispatch(&timing->dispex, (IUnknown*)&timing->IHTMLPerformanceTiming_iface,
2159 &HTMLPerformanceTiming_dispex, dispex_compat_mode(&This->dispex));
2161 This->timing = &timing->IHTMLPerformanceTiming_iface;
2164 IHTMLPerformanceTiming_AddRef(*p = This->timing);
2165 return S_OK;
2168 static HRESULT WINAPI HTMLPerformance_toString(IHTMLPerformance *iface, BSTR *string)
2170 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2172 TRACE("(%p)->(%p)\n", This, string);
2174 return dispex_to_string(&This->dispex, string);
2177 static HRESULT WINAPI HTMLPerformance_toJSON(IHTMLPerformance *iface, VARIANT *var)
2179 HTMLPerformance *This = impl_from_IHTMLPerformance(iface);
2180 FIXME("(%p)->(%p)\n", This, var);
2181 return E_NOTIMPL;
2184 static const IHTMLPerformanceVtbl HTMLPerformanceVtbl = {
2185 HTMLPerformance_QueryInterface,
2186 HTMLPerformance_AddRef,
2187 HTMLPerformance_Release,
2188 HTMLPerformance_GetTypeInfoCount,
2189 HTMLPerformance_GetTypeInfo,
2190 HTMLPerformance_GetIDsOfNames,
2191 HTMLPerformance_Invoke,
2192 HTMLPerformance_get_navigation,
2193 HTMLPerformance_get_timing,
2194 HTMLPerformance_toString,
2195 HTMLPerformance_toJSON
2198 static const tid_t HTMLPerformance_iface_tids[] = {
2199 IHTMLPerformance_tid,
2202 static dispex_static_data_t HTMLPerformance_dispex = {
2203 L"Performance",
2204 NULL,
2205 IHTMLPerformance_tid,
2206 HTMLPerformance_iface_tids
2209 HRESULT create_performance(compat_mode_t compat_mode, IHTMLPerformance **ret)
2211 HTMLPerformance *performance;
2213 performance = heap_alloc_zero(sizeof(*performance));
2214 if(!performance)
2215 return E_OUTOFMEMORY;
2217 performance->IHTMLPerformance_iface.lpVtbl = &HTMLPerformanceVtbl;
2218 performance->ref = 1;
2220 init_dispatch(&performance->dispex, (IUnknown*)&performance->IHTMLPerformance_iface,
2221 &HTMLPerformance_dispex, compat_mode);
2223 *ret = &performance->IHTMLPerformance_iface;
2224 return S_OK;
2227 typedef struct {
2228 DispatchEx dispex;
2229 IHTMLNamespaceCollection IHTMLNamespaceCollection_iface;
2231 LONG ref;
2232 } HTMLNamespaceCollection;
2234 static inline HTMLNamespaceCollection *impl_from_IHTMLNamespaceCollection(IHTMLNamespaceCollection *iface)
2236 return CONTAINING_RECORD(iface, HTMLNamespaceCollection, IHTMLNamespaceCollection_iface);
2239 static HRESULT WINAPI HTMLNamespaceCollection_QueryInterface(IHTMLNamespaceCollection *iface, REFIID riid, void **ppv)
2241 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2243 TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
2245 if(IsEqualGUID(&IID_IUnknown, riid)) {
2246 *ppv = &This->IHTMLNamespaceCollection_iface;
2247 }else if(IsEqualGUID(&IID_IHTMLNamespaceCollection, riid)) {
2248 *ppv = &This->IHTMLNamespaceCollection_iface;
2249 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
2250 return *ppv ? S_OK : E_NOINTERFACE;
2251 }else {
2252 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid));
2253 *ppv = NULL;
2254 return E_NOINTERFACE;
2257 IUnknown_AddRef((IUnknown*)*ppv);
2258 return S_OK;
2261 static ULONG WINAPI HTMLNamespaceCollection_AddRef(IHTMLNamespaceCollection *iface)
2263 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2264 LONG ref = InterlockedIncrement(&This->ref);
2266 TRACE("(%p) ref=%ld\n", This, ref);
2268 return ref;
2271 static ULONG WINAPI HTMLNamespaceCollection_Release(IHTMLNamespaceCollection *iface)
2273 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2274 LONG ref = InterlockedDecrement(&This->ref);
2276 TRACE("(%p) ref=%ld\n", This, ref);
2278 if(!ref) {
2279 release_dispex(&This->dispex);
2280 heap_free(This);
2283 return ref;
2286 static HRESULT WINAPI HTMLNamespaceCollection_GetTypeInfoCount(IHTMLNamespaceCollection *iface, UINT *pctinfo)
2288 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2289 FIXME("(%p)->(%p)\n", This, pctinfo);
2290 return E_NOTIMPL;
2293 static HRESULT WINAPI HTMLNamespaceCollection_GetTypeInfo(IHTMLNamespaceCollection *iface, UINT iTInfo,
2294 LCID lcid, ITypeInfo **ppTInfo)
2296 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2298 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2301 static HRESULT WINAPI HTMLNamespaceCollection_GetIDsOfNames(IHTMLNamespaceCollection *iface, REFIID riid,
2302 LPOLESTR *rgszNames, UINT cNames,
2303 LCID lcid, DISPID *rgDispId)
2305 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2307 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
2308 lcid, rgDispId);
2311 static HRESULT WINAPI HTMLNamespaceCollection_Invoke(IHTMLNamespaceCollection *iface, DISPID dispIdMember,
2312 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2313 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2315 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2317 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2318 pDispParams, pVarResult, pExcepInfo, puArgErr);
2321 static HRESULT WINAPI HTMLNamespaceCollection_get_length(IHTMLNamespaceCollection *iface, LONG *p)
2323 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2324 FIXME("(%p)->(%p) returning 0\n", This, p);
2325 *p = 0;
2326 return S_OK;
2329 static HRESULT WINAPI HTMLNamespaceCollection_item(IHTMLNamespaceCollection *iface, VARIANT index, IDispatch **p)
2331 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2332 FIXME("(%p)->(%s %p)\n", This, debugstr_variant(&index), p);
2333 return E_NOTIMPL;
2336 static HRESULT WINAPI HTMLNamespaceCollection_add(IHTMLNamespaceCollection *iface, BSTR namespace, BSTR urn,
2337 VARIANT implementation_url, IDispatch **p)
2339 HTMLNamespaceCollection *This = impl_from_IHTMLNamespaceCollection(iface);
2340 FIXME("(%p)->(%s %s %s %p)\n", This, debugstr_w(namespace), debugstr_w(urn), debugstr_variant(&implementation_url), p);
2341 return E_NOTIMPL;
2344 static const IHTMLNamespaceCollectionVtbl HTMLNamespaceCollectionVtbl = {
2345 HTMLNamespaceCollection_QueryInterface,
2346 HTMLNamespaceCollection_AddRef,
2347 HTMLNamespaceCollection_Release,
2348 HTMLNamespaceCollection_GetTypeInfoCount,
2349 HTMLNamespaceCollection_GetTypeInfo,
2350 HTMLNamespaceCollection_GetIDsOfNames,
2351 HTMLNamespaceCollection_Invoke,
2352 HTMLNamespaceCollection_get_length,
2353 HTMLNamespaceCollection_item,
2354 HTMLNamespaceCollection_add
2357 static const tid_t HTMLNamespaceCollection_iface_tids[] = {
2358 IHTMLNamespaceCollection_tid,
2361 static dispex_static_data_t HTMLNamespaceCollection_dispex = {
2362 L"MSNamespaceInfoCollection",
2363 NULL,
2364 DispHTMLNamespaceCollection_tid,
2365 HTMLNamespaceCollection_iface_tids
2368 HRESULT create_namespace_collection(compat_mode_t compat_mode, IHTMLNamespaceCollection **ret)
2370 HTMLNamespaceCollection *namespaces;
2372 if (!(namespaces = heap_alloc_zero(sizeof(*namespaces))))
2373 return E_OUTOFMEMORY;
2375 namespaces->IHTMLNamespaceCollection_iface.lpVtbl = &HTMLNamespaceCollectionVtbl;
2376 namespaces->ref = 1;
2377 init_dispatch(&namespaces->dispex, (IUnknown*)&namespaces->IHTMLNamespaceCollection_iface,
2378 &HTMLNamespaceCollection_dispex, compat_mode);
2379 *ret = &namespaces->IHTMLNamespaceCollection_iface;
2380 return S_OK;
2383 struct console {
2384 DispatchEx dispex;
2385 IWineMSHTMLConsole IWineMSHTMLConsole_iface;
2386 LONG ref;
2389 static inline struct console *impl_from_IWineMSHTMLConsole(IWineMSHTMLConsole *iface)
2391 return CONTAINING_RECORD(iface, struct console, IWineMSHTMLConsole_iface);
2394 static HRESULT WINAPI console_QueryInterface(IWineMSHTMLConsole *iface, REFIID riid, void **ppv)
2396 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2398 TRACE("(%p)->(%s %p)\n", console, debugstr_mshtml_guid(riid), ppv);
2400 if(IsEqualGUID(&IID_IUnknown, riid)) {
2401 *ppv = &console->IWineMSHTMLConsole_iface;
2402 }else if(IsEqualGUID(&IID_IWineMSHTMLConsole, riid)) {
2403 *ppv = &console->IWineMSHTMLConsole_iface;
2404 }else if(dispex_query_interface(&console->dispex, riid, ppv)) {
2405 return *ppv ? S_OK : E_NOINTERFACE;
2406 }else {
2407 WARN("(%p)->(%s %p)\n", console, debugstr_mshtml_guid(riid), ppv);
2408 *ppv = NULL;
2409 return E_NOINTERFACE;
2412 IUnknown_AddRef((IUnknown*)*ppv);
2413 return S_OK;
2416 static ULONG WINAPI console_AddRef(IWineMSHTMLConsole *iface)
2418 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2419 LONG ref = InterlockedIncrement(&console->ref);
2421 TRACE("(%p) ref=%ld\n", console, ref);
2423 return ref;
2426 static ULONG WINAPI console_Release(IWineMSHTMLConsole *iface)
2428 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2429 LONG ref = InterlockedDecrement(&console->ref);
2431 TRACE("(%p) ref=%ld\n", console, ref);
2433 if(!ref) {
2434 release_dispex(&console->dispex);
2435 heap_free(console);
2438 return ref;
2441 static HRESULT WINAPI console_GetTypeInfoCount(IWineMSHTMLConsole *iface, UINT *pctinfo)
2443 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2444 FIXME("(%p)->(%p)\n", console, pctinfo);
2445 return E_NOTIMPL;
2448 static HRESULT WINAPI console_GetTypeInfo(IWineMSHTMLConsole *iface, UINT iTInfo,
2449 LCID lcid, ITypeInfo **ppTInfo)
2451 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2453 return IDispatchEx_GetTypeInfo(&console->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
2456 static HRESULT WINAPI console_GetIDsOfNames(IWineMSHTMLConsole *iface, REFIID riid,
2457 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
2459 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2461 return IDispatchEx_GetIDsOfNames(&console->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
2462 lcid, rgDispId);
2465 static HRESULT WINAPI console_Invoke(IWineMSHTMLConsole *iface, DISPID dispIdMember,
2466 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
2467 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2469 struct console *console = impl_from_IWineMSHTMLConsole(iface);
2471 return IDispatchEx_Invoke(&console->dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags,
2472 pDispParams, pVarResult, pExcepInfo, puArgErr);
2475 static HRESULT WINAPI console_assert(IWineMSHTMLConsole *iface, VARIANT_BOOL *assertion, VARIANT *vararg_start)
2477 FIXME("iface %p, assertion %p, vararg_start %p stub.\n", iface, assertion, vararg_start);
2479 return S_OK;
2482 static HRESULT WINAPI console_clear(IWineMSHTMLConsole *iface)
2484 FIXME("iface %p stub.\n", iface);
2486 return S_OK;
2489 static HRESULT WINAPI console_count(IWineMSHTMLConsole *iface, VARIANT *label)
2491 FIXME("iface %p, label %p stub.\n", iface, label);
2493 return S_OK;
2496 static HRESULT WINAPI console_debug(IWineMSHTMLConsole *iface, VARIANT *vararg_start)
2498 FIXME("iface %p, vararg_start %p stub.\n", iface, vararg_start);
2500 return S_OK;
2503 static HRESULT WINAPI console_dir(IWineMSHTMLConsole *iface, VARIANT *object)
2505 FIXME("iface %p, object %p stub.\n", iface, object);
2507 return S_OK;
2510 static HRESULT WINAPI console_dirxml(IWineMSHTMLConsole *iface, VARIANT *object)
2512 FIXME("iface %p, object %p stub.\n", iface, object);
2514 return S_OK;
2517 static HRESULT WINAPI console_error(IWineMSHTMLConsole *iface, VARIANT *vararg_start)
2519 FIXME("iface %p, vararg_start %p stub.\n", iface, vararg_start);
2521 return S_OK;
2524 static HRESULT WINAPI console_group(IWineMSHTMLConsole *iface, VARIANT *label)
2526 FIXME("iface %p, label %p stub.\n", iface, label);
2528 return S_OK;
2531 static HRESULT WINAPI console_group_collapsed(IWineMSHTMLConsole *iface, VARIANT *label)
2533 FIXME("iface %p, label %p stub.\n", iface, label);
2535 return S_OK;
2538 static HRESULT WINAPI console_group_end(IWineMSHTMLConsole *iface)
2540 FIXME("iface %p, stub.\n", iface);
2542 return S_OK;
2545 static HRESULT WINAPI console_info(IWineMSHTMLConsole *iface, VARIANT *vararg_start)
2547 FIXME("iface %p, vararg_start %p stub.\n", iface, vararg_start);
2549 return S_OK;
2552 static HRESULT WINAPI console_log(IWineMSHTMLConsole *iface, VARIANT *vararg_start)
2554 FIXME("iface %p, vararg_start %p stub.\n", iface, vararg_start);
2556 return S_OK;
2559 static HRESULT WINAPI console_time(IWineMSHTMLConsole *iface, VARIANT *label)
2561 FIXME("iface %p, label %p stub.\n", iface, label);
2563 return S_OK;
2566 static HRESULT WINAPI console_time_end(IWineMSHTMLConsole *iface, VARIANT *label)
2568 FIXME("iface %p, label %p stub.\n", iface, label);
2570 return S_OK;
2573 static HRESULT WINAPI console_trace(IWineMSHTMLConsole *iface, VARIANT *vararg_start)
2575 FIXME("iface %p, vararg_start %p stub.\n", iface, vararg_start);
2577 return S_OK;
2580 static HRESULT WINAPI console_warn(IWineMSHTMLConsole *iface, VARIANT *vararg_start)
2582 FIXME("iface %p, vararg_start %p stub.\n", iface, vararg_start);
2584 return S_OK;
2587 static const IWineMSHTMLConsoleVtbl WineMSHTMLConsoleVtbl = {
2588 console_QueryInterface,
2589 console_AddRef,
2590 console_Release,
2591 console_GetTypeInfoCount,
2592 console_GetTypeInfo,
2593 console_GetIDsOfNames,
2594 console_Invoke,
2595 console_assert,
2596 console_clear,
2597 console_count,
2598 console_debug,
2599 console_dir,
2600 console_dirxml,
2601 console_error,
2602 console_group,
2603 console_group_collapsed,
2604 console_group_end,
2605 console_info,
2606 console_log,
2607 console_time,
2608 console_time_end,
2609 console_trace,
2610 console_warn,
2613 static const tid_t console_iface_tids[] = {
2614 IWineMSHTMLConsole_tid,
2617 static dispex_static_data_t console_dispex = {
2618 L"Console",
2619 NULL,
2620 IWineMSHTMLConsole_tid,
2621 console_iface_tids
2624 void create_console(compat_mode_t compat_mode, IWineMSHTMLConsole **ret)
2626 struct console *obj;
2628 obj = heap_alloc_zero(sizeof(*obj));
2629 if(!obj)
2631 ERR("No memory.\n");
2632 return;
2635 obj->IWineMSHTMLConsole_iface.lpVtbl = &WineMSHTMLConsoleVtbl;
2636 obj->ref = 1;
2637 init_dispatch(&obj->dispex, (IUnknown*)&obj->IWineMSHTMLConsole_iface, &console_dispex, compat_mode);
2639 *ret = &obj->IWineMSHTMLConsole_iface;