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
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
;
39 IOmNavigator IOmNavigator_iface
;
41 HTMLPluginsCollection
*plugins
;
42 HTMLMimeTypesCollection
*mime_types
;
47 IHTMLDOMImplementation IHTMLDOMImplementation_iface
;
48 IHTMLDOMImplementation2 IHTMLDOMImplementation2_iface
;
50 nsIDOMDOMImplementation
*implementation
;
51 GeckoBrowser
*browser
;
52 } HTMLDOMImplementation
;
54 static inline HTMLDOMImplementation
*impl_from_IHTMLDOMImplementation(IHTMLDOMImplementation
*iface
)
56 return CONTAINING_RECORD(iface
, HTMLDOMImplementation
, IHTMLDOMImplementation_iface
);
59 static HRESULT WINAPI
HTMLDOMImplementation_QueryInterface(IHTMLDOMImplementation
*iface
, REFIID riid
, void **ppv
)
61 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
63 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
65 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IHTMLDOMImplementation
, riid
)) {
66 *ppv
= &This
->IHTMLDOMImplementation_iface
;
67 }else if(IsEqualGUID(&IID_IHTMLDOMImplementation2
, riid
)) {
68 *ppv
= &This
->IHTMLDOMImplementation2_iface
;
69 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
70 return *ppv
? S_OK
: E_NOINTERFACE
;
72 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
77 IUnknown_AddRef((IUnknown
*)*ppv
);
81 static ULONG WINAPI
HTMLDOMImplementation_AddRef(IHTMLDOMImplementation
*iface
)
83 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
84 LONG ref
= dispex_ref_incr(&This
->dispex
);
86 TRACE("(%p) ref=%ld\n", This
, ref
);
91 static ULONG WINAPI
HTMLDOMImplementation_Release(IHTMLDOMImplementation
*iface
)
93 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
94 LONG ref
= dispex_ref_decr(&This
->dispex
);
96 TRACE("(%p) ref=%ld\n", This
, ref
);
101 static HRESULT WINAPI
HTMLDOMImplementation_GetTypeInfoCount(IHTMLDOMImplementation
*iface
, UINT
*pctinfo
)
103 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
105 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
108 static HRESULT WINAPI
HTMLDOMImplementation_GetTypeInfo(IHTMLDOMImplementation
*iface
, UINT iTInfo
,
109 LCID lcid
, ITypeInfo
**ppTInfo
)
111 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
113 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
116 static HRESULT WINAPI
HTMLDOMImplementation_GetIDsOfNames(IHTMLDOMImplementation
*iface
, REFIID riid
,
117 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
119 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
121 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
,
122 cNames
, lcid
, rgDispId
);
125 static HRESULT WINAPI
HTMLDOMImplementation_Invoke(IHTMLDOMImplementation
*iface
, DISPID dispIdMember
,
126 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
127 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
129 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
131 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
132 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
135 static HRESULT WINAPI
HTMLDOMImplementation_hasFeature(IHTMLDOMImplementation
*iface
, BSTR feature
,
136 VARIANT version
, VARIANT_BOOL
*pfHasFeature
)
138 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation(iface
);
140 FIXME("(%p)->(%s %s %p) returning false\n", This
, debugstr_w(feature
), debugstr_variant(&version
), pfHasFeature
);
142 *pfHasFeature
= VARIANT_FALSE
;
146 static const IHTMLDOMImplementationVtbl HTMLDOMImplementationVtbl
= {
147 HTMLDOMImplementation_QueryInterface
,
148 HTMLDOMImplementation_AddRef
,
149 HTMLDOMImplementation_Release
,
150 HTMLDOMImplementation_GetTypeInfoCount
,
151 HTMLDOMImplementation_GetTypeInfo
,
152 HTMLDOMImplementation_GetIDsOfNames
,
153 HTMLDOMImplementation_Invoke
,
154 HTMLDOMImplementation_hasFeature
157 static inline HTMLDOMImplementation
*impl_from_IHTMLDOMImplementation2(IHTMLDOMImplementation2
*iface
)
159 return CONTAINING_RECORD(iface
, HTMLDOMImplementation
, IHTMLDOMImplementation2_iface
);
162 static HRESULT WINAPI
HTMLDOMImplementation2_QueryInterface(IHTMLDOMImplementation2
*iface
, REFIID riid
, void **ppv
)
164 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
165 return IHTMLDOMImplementation_QueryInterface(&This
->IHTMLDOMImplementation_iface
, riid
, ppv
);
168 static ULONG WINAPI
HTMLDOMImplementation2_AddRef(IHTMLDOMImplementation2
*iface
)
170 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
171 return IHTMLDOMImplementation_AddRef(&This
->IHTMLDOMImplementation_iface
);
174 static ULONG WINAPI
HTMLDOMImplementation2_Release(IHTMLDOMImplementation2
*iface
)
176 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
177 return IHTMLDOMImplementation_Release(&This
->IHTMLDOMImplementation_iface
);
180 static HRESULT WINAPI
HTMLDOMImplementation2_GetTypeInfoCount(IHTMLDOMImplementation2
*iface
, UINT
*pctinfo
)
182 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
183 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
186 static HRESULT WINAPI
HTMLDOMImplementation2_GetTypeInfo(IHTMLDOMImplementation2
*iface
, UINT iTInfo
,
187 LCID lcid
, ITypeInfo
**ppTInfo
)
189 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
190 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
193 static HRESULT WINAPI
HTMLDOMImplementation2_GetIDsOfNames(IHTMLDOMImplementation2
*iface
, REFIID riid
,
194 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
196 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
197 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
,
198 cNames
, lcid
, rgDispId
);
201 static HRESULT WINAPI
HTMLDOMImplementation2_Invoke(IHTMLDOMImplementation2
*iface
, DISPID dispIdMember
,
202 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
203 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
205 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
206 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
207 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
210 static HRESULT WINAPI
HTMLDOMImplementation2_createDocumentType(IHTMLDOMImplementation2
*iface
, BSTR name
,
211 VARIANT
*public_id
, VARIANT
*system_id
, IDOMDocumentType
**new_type
)
213 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
214 FIXME("(%p)->(%s %s %s %p)\n", This
, debugstr_w(name
), debugstr_variant(public_id
),
215 debugstr_variant(system_id
), new_type
);
219 static HRESULT WINAPI
HTMLDOMImplementation2_createDocument(IHTMLDOMImplementation2
*iface
, VARIANT
*ns
,
220 VARIANT
*tag_name
, IDOMDocumentType
*document_type
, IHTMLDocument7
**new_document
)
222 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
223 FIXME("(%p)->(%s %s %p %p)\n", This
, debugstr_variant(ns
), debugstr_variant(tag_name
),
224 document_type
, new_document
);
228 static HRESULT WINAPI
HTMLDOMImplementation2_createHTMLDocument(IHTMLDOMImplementation2
*iface
, BSTR title
,
229 IHTMLDocument7
**new_document
)
231 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
232 HTMLDocumentNode
*new_document_node
;
238 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(title
), new_document
);
243 nsAString_InitDepend(&title_str
, title
);
244 nsres
= nsIDOMDOMImplementation_CreateHTMLDocument(This
->implementation
, &title_str
, &doc
);
245 nsAString_Finish(&title_str
);
246 if(NS_FAILED(nsres
)) {
247 ERR("CreateHTMLDocument failed: %08lx\n", nsres
);
251 hres
= create_document_node(doc
, This
->browser
, NULL
, dispex_compat_mode(&This
->dispex
), &new_document_node
);
252 nsIDOMDocument_Release(doc
);
256 *new_document
= &new_document_node
->IHTMLDocument7_iface
;
260 static HRESULT WINAPI
HTMLDOMImplementation2_hasFeature(IHTMLDOMImplementation2
*iface
, BSTR feature
,
261 VARIANT version
, VARIANT_BOOL
*pfHasFeature
)
263 HTMLDOMImplementation
*This
= impl_from_IHTMLDOMImplementation2(iface
);
265 FIXME("(%p)->(%s %s %p) returning false\n", This
, debugstr_w(feature
), debugstr_variant(&version
), pfHasFeature
);
267 *pfHasFeature
= VARIANT_FALSE
;
271 static const IHTMLDOMImplementation2Vtbl HTMLDOMImplementation2Vtbl
= {
272 HTMLDOMImplementation2_QueryInterface
,
273 HTMLDOMImplementation2_AddRef
,
274 HTMLDOMImplementation2_Release
,
275 HTMLDOMImplementation2_GetTypeInfoCount
,
276 HTMLDOMImplementation2_GetTypeInfo
,
277 HTMLDOMImplementation2_GetIDsOfNames
,
278 HTMLDOMImplementation2_Invoke
,
279 HTMLDOMImplementation2_createDocumentType
,
280 HTMLDOMImplementation2_createDocument
,
281 HTMLDOMImplementation2_createHTMLDocument
,
282 HTMLDOMImplementation2_hasFeature
285 static inline HTMLDOMImplementation
*HTMLDOMImplementation_from_DispatchEx(DispatchEx
*iface
)
287 return CONTAINING_RECORD(iface
, HTMLDOMImplementation
, dispex
);
290 static void HTMLDOMImplementation_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
292 HTMLDOMImplementation
*This
= HTMLDOMImplementation_from_DispatchEx(dispex
);
293 if(This
->implementation
)
294 note_cc_edge((nsISupports
*)This
->implementation
, "implementation", cb
);
297 static void HTMLDOMImplementation_unlink(DispatchEx
*dispex
)
299 HTMLDOMImplementation
*This
= HTMLDOMImplementation_from_DispatchEx(dispex
);
300 unlink_ref(&This
->implementation
);
303 static void HTMLDOMImplementation_destructor(DispatchEx
*dispex
)
305 HTMLDOMImplementation
*This
= HTMLDOMImplementation_from_DispatchEx(dispex
);
306 assert(!This
->browser
);
310 static const dispex_static_data_vtbl_t HTMLDOMImplementation_dispex_vtbl
= {
311 .destructor
= HTMLDOMImplementation_destructor
,
312 .traverse
= HTMLDOMImplementation_traverse
,
313 .unlink
= HTMLDOMImplementation_unlink
316 static void HTMLDOMImplementation_init_dispex_info(dispex_data_t
*info
, compat_mode_t compat_mode
)
318 if(compat_mode
>= COMPAT_MODE_IE9
)
319 dispex_info_add_interface(info
, IHTMLDOMImplementation2_tid
, NULL
);
322 static const tid_t HTMLDOMImplementation_iface_tids
[] = {
323 IHTMLDOMImplementation_tid
,
326 static dispex_static_data_t HTMLDOMImplementation_dispex
= {
328 &HTMLDOMImplementation_dispex_vtbl
,
329 DispHTMLDOMImplementation_tid
,
330 HTMLDOMImplementation_iface_tids
,
331 HTMLDOMImplementation_init_dispex_info
334 HRESULT
create_dom_implementation(HTMLDocumentNode
*doc_node
, IHTMLDOMImplementation
**ret
)
336 HTMLDOMImplementation
*dom_implementation
;
339 if(!doc_node
->browser
)
342 dom_implementation
= calloc(1, sizeof(*dom_implementation
));
343 if(!dom_implementation
)
344 return E_OUTOFMEMORY
;
346 dom_implementation
->IHTMLDOMImplementation_iface
.lpVtbl
= &HTMLDOMImplementationVtbl
;
347 dom_implementation
->IHTMLDOMImplementation2_iface
.lpVtbl
= &HTMLDOMImplementation2Vtbl
;
348 dom_implementation
->browser
= doc_node
->browser
;
350 init_dispatch(&dom_implementation
->dispex
, (IUnknown
*)&dom_implementation
->IHTMLDOMImplementation_iface
,
351 &HTMLDOMImplementation_dispex
, doc_node
->document_mode
);
353 nsres
= nsIDOMDocument_GetImplementation(doc_node
->dom_document
, &dom_implementation
->implementation
);
354 if(NS_FAILED(nsres
)) {
355 ERR("GetDOMImplementation failed: %08lx\n", nsres
);
356 IHTMLDOMImplementation_Release(&dom_implementation
->IHTMLDOMImplementation_iface
);
360 *ret
= &dom_implementation
->IHTMLDOMImplementation_iface
;
364 void detach_dom_implementation(IHTMLDOMImplementation
*iface
)
366 HTMLDOMImplementation
*dom_implementation
= impl_from_IHTMLDOMImplementation(iface
);
367 dom_implementation
->browser
= NULL
;
372 IHTMLScreen IHTMLScreen_iface
;
375 static inline HTMLScreen
*impl_from_IHTMLScreen(IHTMLScreen
*iface
)
377 return CONTAINING_RECORD(iface
, HTMLScreen
, IHTMLScreen_iface
);
380 static HRESULT WINAPI
HTMLScreen_QueryInterface(IHTMLScreen
*iface
, REFIID riid
, void **ppv
)
382 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
384 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
386 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
387 *ppv
= &This
->IHTMLScreen_iface
;
388 }else if(IsEqualGUID(&IID_IHTMLScreen
, riid
)) {
389 *ppv
= &This
->IHTMLScreen_iface
;
390 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
391 return *ppv
? S_OK
: E_NOINTERFACE
;
394 WARN("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
395 return E_NOINTERFACE
;
398 IUnknown_AddRef((IUnknown
*)*ppv
);
402 static ULONG WINAPI
HTMLScreen_AddRef(IHTMLScreen
*iface
)
404 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
405 LONG ref
= dispex_ref_incr(&This
->dispex
);
407 TRACE("(%p) ref=%ld\n", This
, ref
);
412 static ULONG WINAPI
HTMLScreen_Release(IHTMLScreen
*iface
)
414 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
415 LONG ref
= dispex_ref_decr(&This
->dispex
);
417 TRACE("(%p) ref=%ld\n", This
, ref
);
422 static HRESULT WINAPI
HTMLScreen_GetTypeInfoCount(IHTMLScreen
*iface
, UINT
*pctinfo
)
424 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
425 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
428 static HRESULT WINAPI
HTMLScreen_GetTypeInfo(IHTMLScreen
*iface
, UINT iTInfo
,
429 LCID lcid
, ITypeInfo
**ppTInfo
)
431 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
432 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
435 static HRESULT WINAPI
HTMLScreen_GetIDsOfNames(IHTMLScreen
*iface
, REFIID riid
,
436 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
438 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
439 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
443 static HRESULT WINAPI
HTMLScreen_Invoke(IHTMLScreen
*iface
, DISPID dispIdMember
,
444 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
445 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
447 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
448 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
449 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
452 static HRESULT WINAPI
HTMLScreen_get_colorDepth(IHTMLScreen
*iface
, LONG
*p
)
454 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
457 TRACE("(%p)->(%p)\n", This
, p
);
459 *p
= GetDeviceCaps(hdc
, BITSPIXEL
);
464 static HRESULT WINAPI
HTMLScreen_put_bufferDepth(IHTMLScreen
*iface
, LONG v
)
466 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
467 FIXME("(%p)->(%ld)\n", This
, v
);
471 static HRESULT WINAPI
HTMLScreen_get_bufferDepth(IHTMLScreen
*iface
, LONG
*p
)
473 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
474 FIXME("(%p)->(%p)\n", This
, p
);
478 static HRESULT WINAPI
HTMLScreen_get_width(IHTMLScreen
*iface
, LONG
*p
)
480 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
482 TRACE("(%p)->(%p)\n", This
, p
);
484 *p
= GetSystemMetrics(SM_CXSCREEN
);
488 static HRESULT WINAPI
HTMLScreen_get_height(IHTMLScreen
*iface
, LONG
*p
)
490 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
492 TRACE("(%p)->(%p)\n", This
, p
);
494 *p
= GetSystemMetrics(SM_CYSCREEN
);
498 static HRESULT WINAPI
HTMLScreen_put_updateInterval(IHTMLScreen
*iface
, LONG v
)
500 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
501 FIXME("(%p)->(%ld)\n", This
, v
);
505 static HRESULT WINAPI
HTMLScreen_get_updateInterval(IHTMLScreen
*iface
, LONG
*p
)
507 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
508 FIXME("(%p)->(%p)\n", This
, p
);
512 static HRESULT WINAPI
HTMLScreen_get_availHeight(IHTMLScreen
*iface
, LONG
*p
)
514 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
517 TRACE("(%p)->(%p)\n", This
, p
);
519 if(!SystemParametersInfoW(SPI_GETWORKAREA
, 0, &work_area
, 0))
522 *p
= work_area
.bottom
-work_area
.top
;
526 static HRESULT WINAPI
HTMLScreen_get_availWidth(IHTMLScreen
*iface
, LONG
*p
)
528 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
531 TRACE("(%p)->(%p)\n", This
, p
);
533 if(!SystemParametersInfoW(SPI_GETWORKAREA
, 0, &work_area
, 0))
536 *p
= work_area
.right
-work_area
.left
;
540 static HRESULT WINAPI
HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen
*iface
, VARIANT_BOOL
*p
)
542 HTMLScreen
*This
= impl_from_IHTMLScreen(iface
);
543 FIXME("(%p)->(%p)\n", This
, p
);
547 static const IHTMLScreenVtbl HTMLSreenVtbl
= {
548 HTMLScreen_QueryInterface
,
551 HTMLScreen_GetTypeInfoCount
,
552 HTMLScreen_GetTypeInfo
,
553 HTMLScreen_GetIDsOfNames
,
555 HTMLScreen_get_colorDepth
,
556 HTMLScreen_put_bufferDepth
,
557 HTMLScreen_get_bufferDepth
,
558 HTMLScreen_get_width
,
559 HTMLScreen_get_height
,
560 HTMLScreen_put_updateInterval
,
561 HTMLScreen_get_updateInterval
,
562 HTMLScreen_get_availHeight
,
563 HTMLScreen_get_availWidth
,
564 HTMLScreen_get_fontSmoothingEnabled
567 static inline HTMLScreen
*HTMLScreen_from_DispatchEx(DispatchEx
*iface
)
569 return CONTAINING_RECORD(iface
, HTMLScreen
, dispex
);
572 static void HTMLScreen_destructor(DispatchEx
*dispex
)
574 HTMLScreen
*This
= HTMLScreen_from_DispatchEx(dispex
);
578 static const dispex_static_data_vtbl_t HTMLScreen_dispex_vtbl
= {
579 .destructor
= HTMLScreen_destructor
,
582 static const tid_t HTMLScreen_iface_tids
[] = {
586 static dispex_static_data_t HTMLScreen_dispex
= {
588 &HTMLScreen_dispex_vtbl
,
590 HTMLScreen_iface_tids
593 HRESULT
create_html_screen(compat_mode_t compat_mode
, IHTMLScreen
**ret
)
597 screen
= calloc(1, sizeof(HTMLScreen
));
599 return E_OUTOFMEMORY
;
601 screen
->IHTMLScreen_iface
.lpVtbl
= &HTMLSreenVtbl
;
603 init_dispatch(&screen
->dispex
, (IUnknown
*)&screen
->IHTMLScreen_iface
, &HTMLScreen_dispex
, compat_mode
);
605 *ret
= &screen
->IHTMLScreen_iface
;
609 static inline OmHistory
*impl_from_IOmHistory(IOmHistory
*iface
)
611 return CONTAINING_RECORD(iface
, OmHistory
, IOmHistory_iface
);
614 static HRESULT WINAPI
OmHistory_QueryInterface(IOmHistory
*iface
, REFIID riid
, void **ppv
)
616 OmHistory
*This
= impl_from_IOmHistory(iface
);
618 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
620 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
621 *ppv
= &This
->IOmHistory_iface
;
622 }else if(IsEqualGUID(&IID_IOmHistory
, riid
)) {
623 *ppv
= &This
->IOmHistory_iface
;
624 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
625 return *ppv
? S_OK
: E_NOINTERFACE
;
627 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
629 return E_NOINTERFACE
;
632 IUnknown_AddRef((IUnknown
*)*ppv
);
636 static ULONG WINAPI
OmHistory_AddRef(IOmHistory
*iface
)
638 OmHistory
*This
= impl_from_IOmHistory(iface
);
639 LONG ref
= dispex_ref_incr(&This
->dispex
);
641 TRACE("(%p) ref=%ld\n", This
, ref
);
646 static ULONG WINAPI
OmHistory_Release(IOmHistory
*iface
)
648 OmHistory
*This
= impl_from_IOmHistory(iface
);
649 LONG ref
= dispex_ref_decr(&This
->dispex
);
651 TRACE("(%p) ref=%ld\n", This
, ref
);
656 static HRESULT WINAPI
OmHistory_GetTypeInfoCount(IOmHistory
*iface
, UINT
*pctinfo
)
658 OmHistory
*This
= impl_from_IOmHistory(iface
);
659 FIXME("(%p)->(%p)\n", This
, pctinfo
);
663 static HRESULT WINAPI
OmHistory_GetTypeInfo(IOmHistory
*iface
, UINT iTInfo
,
664 LCID lcid
, ITypeInfo
**ppTInfo
)
666 OmHistory
*This
= impl_from_IOmHistory(iface
);
668 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
671 static HRESULT WINAPI
OmHistory_GetIDsOfNames(IOmHistory
*iface
, REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
672 LCID lcid
, DISPID
*rgDispId
)
674 OmHistory
*This
= impl_from_IOmHistory(iface
);
676 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
680 static HRESULT WINAPI
OmHistory_Invoke(IOmHistory
*iface
, DISPID dispIdMember
, REFIID riid
, LCID lcid
,
681 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
683 OmHistory
*This
= impl_from_IOmHistory(iface
);
685 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
686 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
689 static HRESULT WINAPI
OmHistory_get_length(IOmHistory
*iface
, short *p
)
691 OmHistory
*This
= impl_from_IOmHistory(iface
);
692 GeckoBrowser
*browser
= NULL
;
694 TRACE("(%p)->(%p)\n", This
, p
);
696 if(This
->window
&& This
->window
->base
.outer_window
)
697 browser
= This
->window
->base
.outer_window
->browser
;
699 *p
= browser
&& browser
->doc
->travel_log
700 ? ITravelLog_CountEntries(browser
->doc
->travel_log
, browser
->doc
->browser_service
)
705 static HRESULT WINAPI
OmHistory_back(IOmHistory
*iface
, VARIANT
*pvargdistance
)
707 OmHistory
*This
= impl_from_IOmHistory(iface
);
708 FIXME("(%p)->(%s)\n", This
, debugstr_variant(pvargdistance
));
712 static HRESULT WINAPI
OmHistory_forward(IOmHistory
*iface
, VARIANT
*pvargdistance
)
714 OmHistory
*This
= impl_from_IOmHistory(iface
);
715 FIXME("(%p)->(%s)\n", This
, debugstr_variant(pvargdistance
));
719 static HRESULT WINAPI
OmHistory_go(IOmHistory
*iface
, VARIANT
*pvargdistance
)
721 OmHistory
*This
= impl_from_IOmHistory(iface
);
722 FIXME("(%p)->(%s)\n", This
, debugstr_variant(pvargdistance
));
726 static const IOmHistoryVtbl OmHistoryVtbl
= {
727 OmHistory_QueryInterface
,
730 OmHistory_GetTypeInfoCount
,
731 OmHistory_GetTypeInfo
,
732 OmHistory_GetIDsOfNames
,
734 OmHistory_get_length
,
740 static inline OmHistory
*OmHistory_from_DispatchEx(DispatchEx
*iface
)
742 return CONTAINING_RECORD(iface
, OmHistory
, dispex
);
745 static void OmHistory_destructor(DispatchEx
*dispex
)
747 OmHistory
*This
= OmHistory_from_DispatchEx(dispex
);
751 static const dispex_static_data_vtbl_t OmHistory_dispex_vtbl
= {
752 .destructor
= OmHistory_destructor
,
755 static const tid_t OmHistory_iface_tids
[] = {
759 static dispex_static_data_t OmHistory_dispex
= {
761 &OmHistory_dispex_vtbl
,
767 HRESULT
create_history(HTMLInnerWindow
*window
, OmHistory
**ret
)
771 history
= calloc(1, sizeof(*history
));
773 return E_OUTOFMEMORY
;
775 init_dispatch(&history
->dispex
, (IUnknown
*)&history
->IOmHistory_iface
, &OmHistory_dispex
,
776 dispex_compat_mode(&window
->event_target
.dispex
));
777 history
->IOmHistory_iface
.lpVtbl
= &OmHistoryVtbl
;
779 history
->window
= window
;
785 struct HTMLPluginsCollection
{
787 IHTMLPluginsCollection IHTMLPluginsCollection_iface
;
789 OmNavigator
*navigator
;
792 static inline HTMLPluginsCollection
*impl_from_IHTMLPluginsCollection(IHTMLPluginsCollection
*iface
)
794 return CONTAINING_RECORD(iface
, HTMLPluginsCollection
, IHTMLPluginsCollection_iface
);
797 static HRESULT WINAPI
HTMLPluginsCollection_QueryInterface(IHTMLPluginsCollection
*iface
, REFIID riid
, void **ppv
)
799 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
801 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
803 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
804 *ppv
= &This
->IHTMLPluginsCollection_iface
;
805 }else if(IsEqualGUID(&IID_IHTMLPluginsCollection
, riid
)) {
806 *ppv
= &This
->IHTMLPluginsCollection_iface
;
807 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
808 return *ppv
? S_OK
: E_NOINTERFACE
;
811 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
812 return E_NOINTERFACE
;
815 IUnknown_AddRef((IUnknown
*)*ppv
);
819 static ULONG WINAPI
HTMLPluginsCollection_AddRef(IHTMLPluginsCollection
*iface
)
821 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
822 LONG ref
= dispex_ref_incr(&This
->dispex
);
824 TRACE("(%p) ref=%ld\n", This
, ref
);
829 static ULONG WINAPI
HTMLPluginsCollection_Release(IHTMLPluginsCollection
*iface
)
831 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
832 LONG ref
= dispex_ref_decr(&This
->dispex
);
834 TRACE("(%p) ref=%ld\n", This
, ref
);
839 static HRESULT WINAPI
HTMLPluginsCollection_GetTypeInfoCount(IHTMLPluginsCollection
*iface
, UINT
*pctinfo
)
841 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
842 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
845 static HRESULT WINAPI
HTMLPluginsCollection_GetTypeInfo(IHTMLPluginsCollection
*iface
, UINT iTInfo
,
846 LCID lcid
, ITypeInfo
**ppTInfo
)
848 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
849 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
852 static HRESULT WINAPI
HTMLPluginsCollection_GetIDsOfNames(IHTMLPluginsCollection
*iface
, REFIID riid
,
853 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
855 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
856 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
860 static HRESULT WINAPI
HTMLPluginsCollection_Invoke(IHTMLPluginsCollection
*iface
, DISPID dispIdMember
,
861 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
862 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
864 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
865 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
,
866 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
869 static HRESULT WINAPI
HTMLPluginsCollection_get_length(IHTMLPluginsCollection
*iface
, LONG
*p
)
871 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
873 TRACE("(%p)->(%p)\n", This
, p
);
875 /* IE always returns 0 here */
880 static HRESULT WINAPI
HTMLPluginsCollection_refresh(IHTMLPluginsCollection
*iface
, VARIANT_BOOL reload
)
882 HTMLPluginsCollection
*This
= impl_from_IHTMLPluginsCollection(iface
);
884 TRACE("(%p)->(%x)\n", This
, reload
);
886 /* Nothing to do here. */
890 static const IHTMLPluginsCollectionVtbl HTMLPluginsCollectionVtbl
= {
891 HTMLPluginsCollection_QueryInterface
,
892 HTMLPluginsCollection_AddRef
,
893 HTMLPluginsCollection_Release
,
894 HTMLPluginsCollection_GetTypeInfoCount
,
895 HTMLPluginsCollection_GetTypeInfo
,
896 HTMLPluginsCollection_GetIDsOfNames
,
897 HTMLPluginsCollection_Invoke
,
898 HTMLPluginsCollection_get_length
,
899 HTMLPluginsCollection_refresh
902 static inline HTMLPluginsCollection
*HTMLPluginsCollection_from_DispatchEx(DispatchEx
*iface
)
904 return CONTAINING_RECORD(iface
, HTMLPluginsCollection
, dispex
);
907 static void HTMLPluginsCollection_unlink(DispatchEx
*dispex
)
909 HTMLPluginsCollection
*This
= HTMLPluginsCollection_from_DispatchEx(dispex
);
910 if(This
->navigator
) {
911 This
->navigator
->plugins
= NULL
;
912 This
->navigator
= NULL
;
916 static void HTMLPluginsCollection_destructor(DispatchEx
*dispex
)
918 HTMLPluginsCollection
*This
= HTMLPluginsCollection_from_DispatchEx(dispex
);
922 static const dispex_static_data_vtbl_t HTMLPluginsCollection_dispex_vtbl
= {
923 .destructor
= HTMLPluginsCollection_destructor
,
924 .unlink
= HTMLPluginsCollection_unlink
927 static const tid_t HTMLPluginsCollection_iface_tids
[] = {
928 IHTMLPluginsCollection_tid
,
931 static dispex_static_data_t HTMLPluginsCollection_dispex
= {
933 &HTMLPluginsCollection_dispex_vtbl
,
935 HTMLPluginsCollection_iface_tids
938 static HRESULT
create_plugins_collection(OmNavigator
*navigator
, HTMLPluginsCollection
**ret
)
940 HTMLPluginsCollection
*col
;
942 col
= calloc(1, sizeof(*col
));
944 return E_OUTOFMEMORY
;
946 col
->IHTMLPluginsCollection_iface
.lpVtbl
= &HTMLPluginsCollectionVtbl
;
947 col
->navigator
= navigator
;
949 init_dispatch(&col
->dispex
, (IUnknown
*)&col
->IHTMLPluginsCollection_iface
,
950 &HTMLPluginsCollection_dispex
, dispex_compat_mode(&navigator
->dispex
));
956 struct HTMLMimeTypesCollection
{
958 IHTMLMimeTypesCollection IHTMLMimeTypesCollection_iface
;
960 OmNavigator
*navigator
;
963 static inline HTMLMimeTypesCollection
*impl_from_IHTMLMimeTypesCollection(IHTMLMimeTypesCollection
*iface
)
965 return CONTAINING_RECORD(iface
, HTMLMimeTypesCollection
, IHTMLMimeTypesCollection_iface
);
968 static HRESULT WINAPI
HTMLMimeTypesCollection_QueryInterface(IHTMLMimeTypesCollection
*iface
, REFIID riid
, void **ppv
)
970 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
972 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
974 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
975 *ppv
= &This
->IHTMLMimeTypesCollection_iface
;
976 }else if(IsEqualGUID(&IID_IHTMLMimeTypesCollection
, riid
)) {
977 *ppv
= &This
->IHTMLMimeTypesCollection_iface
;
978 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
979 return *ppv
? S_OK
: E_NOINTERFACE
;
981 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
983 return E_NOINTERFACE
;
986 IUnknown_AddRef((IUnknown
*)*ppv
);
990 static ULONG WINAPI
HTMLMimeTypesCollection_AddRef(IHTMLMimeTypesCollection
*iface
)
992 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
993 LONG ref
= dispex_ref_incr(&This
->dispex
);
995 TRACE("(%p) ref=%ld\n", This
, ref
);
1000 static ULONG WINAPI
HTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection
*iface
)
1002 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
1003 LONG ref
= dispex_ref_decr(&This
->dispex
);
1005 TRACE("(%p) ref=%ld\n", This
, ref
);
1010 static HRESULT WINAPI
HTMLMimeTypesCollection_GetTypeInfoCount(IHTMLMimeTypesCollection
*iface
, UINT
*pctinfo
)
1012 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
1013 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
1016 static HRESULT WINAPI
HTMLMimeTypesCollection_GetTypeInfo(IHTMLMimeTypesCollection
*iface
, UINT iTInfo
,
1017 LCID lcid
, ITypeInfo
**ppTInfo
)
1019 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
1020 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
1023 static HRESULT WINAPI
HTMLMimeTypesCollection_GetIDsOfNames(IHTMLMimeTypesCollection
*iface
, REFIID riid
,
1024 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1026 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
1027 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
1031 static HRESULT WINAPI
HTMLMimeTypesCollection_Invoke(IHTMLMimeTypesCollection
*iface
, DISPID dispIdMember
,
1032 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
,
1033 EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1035 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
1036 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
,
1037 wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1040 static HRESULT WINAPI
HTMLMimeTypesCollection_get_length(IHTMLMimeTypesCollection
*iface
, LONG
*p
)
1042 HTMLMimeTypesCollection
*This
= impl_from_IHTMLMimeTypesCollection(iface
);
1044 TRACE("(%p)->(%p)\n", This
, p
);
1046 /* This is just a stub for compatibility with other browser in IE */
1051 static const IHTMLMimeTypesCollectionVtbl HTMLMimeTypesCollectionVtbl
= {
1052 HTMLMimeTypesCollection_QueryInterface
,
1053 HTMLMimeTypesCollection_AddRef
,
1054 HTMLMimeTypesCollection_Release
,
1055 HTMLMimeTypesCollection_GetTypeInfoCount
,
1056 HTMLMimeTypesCollection_GetTypeInfo
,
1057 HTMLMimeTypesCollection_GetIDsOfNames
,
1058 HTMLMimeTypesCollection_Invoke
,
1059 HTMLMimeTypesCollection_get_length
1062 static inline HTMLMimeTypesCollection
*HTMLMimeTypesCollection_from_DispatchEx(DispatchEx
*iface
)
1064 return CONTAINING_RECORD(iface
, HTMLMimeTypesCollection
, dispex
);
1067 static void HTMLMimeTypesCollection_unlink(DispatchEx
*dispex
)
1069 HTMLMimeTypesCollection
*This
= HTMLMimeTypesCollection_from_DispatchEx(dispex
);
1070 if(This
->navigator
) {
1071 This
->navigator
->mime_types
= NULL
;
1072 This
->navigator
= NULL
;
1076 static void HTMLMimeTypesCollection_destructor(DispatchEx
*dispex
)
1078 HTMLMimeTypesCollection
*This
= HTMLMimeTypesCollection_from_DispatchEx(dispex
);
1082 static const dispex_static_data_vtbl_t HTMLMimeTypesCollection_dispex_vtbl
= {
1083 .destructor
= HTMLMimeTypesCollection_destructor
,
1084 .unlink
= HTMLMimeTypesCollection_unlink
1087 static const tid_t HTMLMimeTypesCollection_iface_tids
[] = {
1088 IHTMLMimeTypesCollection_tid
,
1091 static dispex_static_data_t HTMLMimeTypesCollection_dispex
= {
1093 &HTMLMimeTypesCollection_dispex_vtbl
,
1094 IHTMLMimeTypesCollection_tid
,
1095 HTMLMimeTypesCollection_iface_tids
1098 static HRESULT
create_mime_types_collection(OmNavigator
*navigator
, HTMLMimeTypesCollection
**ret
)
1100 HTMLMimeTypesCollection
*col
;
1102 col
= calloc(1, sizeof(*col
));
1104 return E_OUTOFMEMORY
;
1106 col
->IHTMLMimeTypesCollection_iface
.lpVtbl
= &HTMLMimeTypesCollectionVtbl
;
1107 col
->navigator
= navigator
;
1109 init_dispatch(&col
->dispex
, (IUnknown
*)&col
->IHTMLMimeTypesCollection_iface
,
1110 &HTMLMimeTypesCollection_dispex
, dispex_compat_mode(&navigator
->dispex
));
1116 static inline OmNavigator
*impl_from_IOmNavigator(IOmNavigator
*iface
)
1118 return CONTAINING_RECORD(iface
, OmNavigator
, IOmNavigator_iface
);
1121 static HRESULT WINAPI
OmNavigator_QueryInterface(IOmNavigator
*iface
, REFIID riid
, void **ppv
)
1123 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1125 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
1127 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
1128 *ppv
= &This
->IOmNavigator_iface
;
1129 }else if(IsEqualGUID(&IID_IOmNavigator
, riid
)) {
1130 *ppv
= &This
->IOmNavigator_iface
;
1131 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
1132 return *ppv
? S_OK
: E_NOINTERFACE
;
1134 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
1136 return E_NOINTERFACE
;
1139 IUnknown_AddRef((IUnknown
*)*ppv
);
1143 static ULONG WINAPI
OmNavigator_AddRef(IOmNavigator
*iface
)
1145 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1146 LONG ref
= dispex_ref_incr(&This
->dispex
);
1148 TRACE("(%p) ref=%ld\n", This
, ref
);
1153 static ULONG WINAPI
OmNavigator_Release(IOmNavigator
*iface
)
1155 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1156 LONG ref
= dispex_ref_decr(&This
->dispex
);
1158 TRACE("(%p) ref=%ld\n", This
, ref
);
1163 static HRESULT WINAPI
OmNavigator_GetTypeInfoCount(IOmNavigator
*iface
, UINT
*pctinfo
)
1165 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1166 FIXME("(%p)->(%p)\n", This
, pctinfo
);
1170 static HRESULT WINAPI
OmNavigator_GetTypeInfo(IOmNavigator
*iface
, UINT iTInfo
,
1171 LCID lcid
, ITypeInfo
**ppTInfo
)
1173 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1175 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
1178 static HRESULT WINAPI
OmNavigator_GetIDsOfNames(IOmNavigator
*iface
, REFIID riid
,
1179 LPOLESTR
*rgszNames
, UINT cNames
,
1180 LCID lcid
, DISPID
*rgDispId
)
1182 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1184 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
1188 static HRESULT WINAPI
OmNavigator_Invoke(IOmNavigator
*iface
, DISPID dispIdMember
,
1189 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
1190 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1192 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1194 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
1195 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1198 static HRESULT WINAPI
OmNavigator_get_appCodeName(IOmNavigator
*iface
, BSTR
*p
)
1200 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1202 TRACE("(%p)->(%p)\n", This
, p
);
1204 *p
= SysAllocString(L
"Mozilla");
1208 static HRESULT WINAPI
OmNavigator_get_appName(IOmNavigator
*iface
, BSTR
*p
)
1210 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1212 TRACE("(%p)->(%p)\n", This
, p
);
1214 *p
= SysAllocString(dispex_compat_mode(&This
->dispex
) == COMPAT_MODE_IE11
1215 ? L
"Netscape" : L
"Microsoft Internet Explorer");
1217 return E_OUTOFMEMORY
;
1222 /* undocumented, added in IE8 */
1223 extern HRESULT WINAPI
MapBrowserEmulationModeToUserAgent(const void*,WCHAR
**);
1225 /* Retrieves allocated user agent via CoTaskMemAlloc */
1226 static HRESULT
get_user_agent(OmNavigator
*navigator
, WCHAR
**user_agent
)
1228 DWORD version
= get_compat_mode_version(dispex_compat_mode(&navigator
->dispex
));
1230 return MapBrowserEmulationModeToUserAgent(&version
, user_agent
);
1233 static HRESULT WINAPI
OmNavigator_get_appVersion(IOmNavigator
*iface
, BSTR
*p
)
1235 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1239 const unsigned skip_prefix
= strlen("Mozilla/");
1241 TRACE("(%p)->(%p)\n", This
, p
);
1243 hres
= get_user_agent(This
, &user_agent
);
1246 len
= wcslen(user_agent
);
1248 if(len
< skip_prefix
) {
1249 CoTaskMemFree(user_agent
);
1254 *p
= SysAllocStringLen(user_agent
+ skip_prefix
, len
- skip_prefix
);
1255 CoTaskMemFree(user_agent
);
1256 return *p
? S_OK
: E_OUTOFMEMORY
;
1259 static HRESULT WINAPI
OmNavigator_get_userAgent(IOmNavigator
*iface
, BSTR
*p
)
1261 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1265 TRACE("(%p)->(%p)\n", This
, p
);
1267 hres
= get_user_agent(This
, &user_agent
);
1271 *p
= SysAllocString(user_agent
);
1272 CoTaskMemFree(user_agent
);
1273 return *p
? S_OK
: E_OUTOFMEMORY
;
1276 static HRESULT WINAPI
OmNavigator_javaEnabled(IOmNavigator
*iface
, VARIANT_BOOL
*enabled
)
1278 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1280 FIXME("(%p)->(%p) semi-stub\n", This
, enabled
);
1282 *enabled
= VARIANT_TRUE
;
1286 static HRESULT WINAPI
OmNavigator_taintEnabled(IOmNavigator
*iface
, VARIANT_BOOL
*enabled
)
1288 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1289 FIXME("(%p)->(%p)\n", This
, enabled
);
1293 static HRESULT WINAPI
OmNavigator_get_mimeTypes(IOmNavigator
*iface
, IHTMLMimeTypesCollection
**p
)
1295 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1297 TRACE("(%p)->(%p)\n", This
, p
);
1299 if(!This
->mime_types
) {
1302 hres
= create_mime_types_collection(This
, &This
->mime_types
);
1306 IHTMLMimeTypesCollection_AddRef(&This
->mime_types
->IHTMLMimeTypesCollection_iface
);
1309 *p
= &This
->mime_types
->IHTMLMimeTypesCollection_iface
;
1313 static HRESULT WINAPI
OmNavigator_get_plugins(IOmNavigator
*iface
, IHTMLPluginsCollection
**p
)
1315 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1317 TRACE("(%p)->(%p)\n", This
, p
);
1319 if(!This
->plugins
) {
1322 hres
= create_plugins_collection(This
, &This
->plugins
);
1326 IHTMLPluginsCollection_AddRef(&This
->plugins
->IHTMLPluginsCollection_iface
);
1329 *p
= &This
->plugins
->IHTMLPluginsCollection_iface
;
1333 static HRESULT WINAPI
OmNavigator_get_cookieEnabled(IOmNavigator
*iface
, VARIANT_BOOL
*p
)
1335 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1337 WARN("(%p)->(%p) semi-stub\n", This
, p
);
1343 static HRESULT WINAPI
OmNavigator_get_opsProfile(IOmNavigator
*iface
, IHTMLOpsProfile
**p
)
1345 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1346 FIXME("(%p)->(%p)\n", This
, p
);
1350 static HRESULT WINAPI
OmNavigator_toString(IOmNavigator
*iface
, BSTR
*String
)
1352 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1354 TRACE("(%p)->(%p)\n", This
, String
);
1356 return dispex_to_string(&This
->dispex
, String
);
1359 static HRESULT WINAPI
OmNavigator_get_cpuClass(IOmNavigator
*iface
, BSTR
*p
)
1361 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1363 TRACE("(%p)->(%p)\n", This
, p
);
1366 *p
= SysAllocString(L
"x64");
1368 *p
= SysAllocString(L
"x86");
1370 return *p
? S_OK
: E_OUTOFMEMORY
;
1373 static HRESULT
get_language_string(LCID lcid
, BSTR
*p
)
1378 len
= LCIDToLocaleName(lcid
, NULL
, 0, 0);
1380 WARN("LCIDToLocaleName failed: %lu\n", GetLastError());
1384 ret
= SysAllocStringLen(NULL
, len
-1);
1386 return E_OUTOFMEMORY
;
1388 len
= LCIDToLocaleName(lcid
, ret
, len
, 0);
1390 WARN("LCIDToLocaleName failed: %lu\n", GetLastError());
1399 static HRESULT WINAPI
OmNavigator_get_systemLanguage(IOmNavigator
*iface
, BSTR
*p
)
1401 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1403 TRACE("(%p)->(%p)\n", This
, p
);
1405 return get_language_string(LOCALE_SYSTEM_DEFAULT
, p
);
1408 static HRESULT WINAPI
OmNavigator_get_browserLanguage(IOmNavigator
*iface
, BSTR
*p
)
1410 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1412 TRACE("(%p)->(%p)\n", This
, p
);
1414 return get_language_string(GetUserDefaultUILanguage(), p
);
1417 static HRESULT WINAPI
OmNavigator_get_userLanguage(IOmNavigator
*iface
, BSTR
*p
)
1419 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1421 TRACE("(%p)->(%p)\n", This
, p
);
1423 return get_language_string(LOCALE_USER_DEFAULT
, p
);
1426 static HRESULT WINAPI
OmNavigator_get_platform(IOmNavigator
*iface
, BSTR
*p
)
1428 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1430 TRACE("(%p)->(%p)\n", This
, p
);
1433 *p
= SysAllocString(L
"Win64");
1435 *p
= SysAllocString(L
"Win32");
1440 static HRESULT WINAPI
OmNavigator_get_appMinorVersion(IOmNavigator
*iface
, BSTR
*p
)
1442 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1444 TRACE("(%p)->(%p)\n", This
, p
);
1446 /* NOTE: MSIE returns "0" or values like ";SP2;". Returning "0" should be enough. */
1447 *p
= SysAllocString(L
"0");
1451 static HRESULT WINAPI
OmNavigator_get_connectionSpeed(IOmNavigator
*iface
, LONG
*p
)
1453 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1454 FIXME("(%p)->(%p)\n", This
, p
);
1458 static HRESULT WINAPI
OmNavigator_get_onLine(IOmNavigator
*iface
, VARIANT_BOOL
*p
)
1460 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1462 WARN("(%p)->(%p) semi-stub, returning true\n", This
, p
);
1468 static HRESULT WINAPI
OmNavigator_get_userProfile(IOmNavigator
*iface
, IHTMLOpsProfile
**p
)
1470 OmNavigator
*This
= impl_from_IOmNavigator(iface
);
1471 FIXME("(%p)->(%p)\n", This
, p
);
1475 static const IOmNavigatorVtbl OmNavigatorVtbl
= {
1476 OmNavigator_QueryInterface
,
1478 OmNavigator_Release
,
1479 OmNavigator_GetTypeInfoCount
,
1480 OmNavigator_GetTypeInfo
,
1481 OmNavigator_GetIDsOfNames
,
1483 OmNavigator_get_appCodeName
,
1484 OmNavigator_get_appName
,
1485 OmNavigator_get_appVersion
,
1486 OmNavigator_get_userAgent
,
1487 OmNavigator_javaEnabled
,
1488 OmNavigator_taintEnabled
,
1489 OmNavigator_get_mimeTypes
,
1490 OmNavigator_get_plugins
,
1491 OmNavigator_get_cookieEnabled
,
1492 OmNavigator_get_opsProfile
,
1493 OmNavigator_toString
,
1494 OmNavigator_get_cpuClass
,
1495 OmNavigator_get_systemLanguage
,
1496 OmNavigator_get_browserLanguage
,
1497 OmNavigator_get_userLanguage
,
1498 OmNavigator_get_platform
,
1499 OmNavigator_get_appMinorVersion
,
1500 OmNavigator_get_connectionSpeed
,
1501 OmNavigator_get_onLine
,
1502 OmNavigator_get_userProfile
1505 static inline OmNavigator
*OmNavigator_from_DispatchEx(DispatchEx
*iface
)
1507 return CONTAINING_RECORD(iface
, OmNavigator
, dispex
);
1510 static void OmNavigator_unlink(DispatchEx
*dispex
)
1512 OmNavigator
*This
= OmNavigator_from_DispatchEx(dispex
);
1514 This
->plugins
->navigator
= NULL
;
1515 This
->plugins
= NULL
;
1517 if(This
->mime_types
) {
1518 This
->mime_types
->navigator
= NULL
;
1519 This
->mime_types
= NULL
;
1523 static void OmNavigator_destructor(DispatchEx
*dispex
)
1525 OmNavigator
*This
= OmNavigator_from_DispatchEx(dispex
);
1529 static const dispex_static_data_vtbl_t OmNavigator_dispex_vtbl
= {
1530 .destructor
= OmNavigator_destructor
,
1531 .unlink
= OmNavigator_unlink
1534 static const tid_t OmNavigator_iface_tids
[] = {
1538 static dispex_static_data_t OmNavigator_dispex
= {
1540 &OmNavigator_dispex_vtbl
,
1541 DispHTMLNavigator_tid
,
1542 OmNavigator_iface_tids
1545 HRESULT
create_navigator(compat_mode_t compat_mode
, IOmNavigator
**navigator
)
1549 ret
= calloc(1, sizeof(*ret
));
1551 return E_OUTOFMEMORY
;
1553 ret
->IOmNavigator_iface
.lpVtbl
= &OmNavigatorVtbl
;
1555 init_dispatch(&ret
->dispex
, (IUnknown
*)&ret
->IOmNavigator_iface
, &OmNavigator_dispex
, compat_mode
);
1557 *navigator
= &ret
->IOmNavigator_iface
;
1563 IHTMLPerformanceTiming IHTMLPerformanceTiming_iface
;
1565 HTMLInnerWindow
*window
;
1566 } HTMLPerformanceTiming
;
1568 static inline HTMLPerformanceTiming
*impl_from_IHTMLPerformanceTiming(IHTMLPerformanceTiming
*iface
)
1570 return CONTAINING_RECORD(iface
, HTMLPerformanceTiming
, IHTMLPerformanceTiming_iface
);
1573 static HRESULT WINAPI
HTMLPerformanceTiming_QueryInterface(IHTMLPerformanceTiming
*iface
, REFIID riid
, void **ppv
)
1575 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1577 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
1579 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
1580 *ppv
= &This
->IHTMLPerformanceTiming_iface
;
1581 }else if(IsEqualGUID(&IID_IHTMLPerformanceTiming
, riid
)) {
1582 *ppv
= &This
->IHTMLPerformanceTiming_iface
;
1583 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
1584 return *ppv
? S_OK
: E_NOINTERFACE
;
1586 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
1588 return E_NOINTERFACE
;
1591 IUnknown_AddRef((IUnknown
*)*ppv
);
1595 static ULONG WINAPI
HTMLPerformanceTiming_AddRef(IHTMLPerformanceTiming
*iface
)
1597 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1598 LONG ref
= dispex_ref_incr(&This
->dispex
);
1600 TRACE("(%p) ref=%ld\n", This
, ref
);
1605 static ULONG WINAPI
HTMLPerformanceTiming_Release(IHTMLPerformanceTiming
*iface
)
1607 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1608 LONG ref
= dispex_ref_decr(&This
->dispex
);
1610 TRACE("(%p) ref=%ld\n", This
, ref
);
1615 static HRESULT WINAPI
HTMLPerformanceTiming_GetTypeInfoCount(IHTMLPerformanceTiming
*iface
, UINT
*pctinfo
)
1617 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1618 FIXME("(%p)->(%p)\n", This
, pctinfo
);
1622 static HRESULT WINAPI
HTMLPerformanceTiming_GetTypeInfo(IHTMLPerformanceTiming
*iface
, UINT iTInfo
,
1623 LCID lcid
, ITypeInfo
**ppTInfo
)
1625 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1627 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
1630 static HRESULT WINAPI
HTMLPerformanceTiming_GetIDsOfNames(IHTMLPerformanceTiming
*iface
, REFIID riid
,
1631 LPOLESTR
*rgszNames
, UINT cNames
,
1632 LCID lcid
, DISPID
*rgDispId
)
1634 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1636 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
1640 static HRESULT WINAPI
HTMLPerformanceTiming_Invoke(IHTMLPerformanceTiming
*iface
, DISPID dispIdMember
,
1641 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
1642 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1644 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1646 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
1647 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1650 static ULONGLONG
get_fetch_time(HTMLPerformanceTiming
*This
)
1652 HTMLInnerWindow
*window
= This
->window
;
1654 /* If there's no prior doc unloaded and no redirects, fetch time == navigationStart time */
1655 if(!window
->unload_event_end_time
&& !window
->redirect_time
)
1656 return window
->navigation_start_time
;
1658 if(window
->dns_lookup_time
)
1659 return window
->dns_lookup_time
;
1660 if(window
->connect_time
)
1661 return window
->connect_time
;
1662 if(window
->request_time
)
1663 return window
->request_time
;
1664 if(window
->unload_event_end_time
)
1665 return window
->unload_event_end_time
;
1667 return window
->redirect_time
;
1670 static HRESULT WINAPI
HTMLPerformanceTiming_get_navigationStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1672 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1674 TRACE("(%p)->(%p)\n", This
, p
);
1676 *p
= This
->window
->navigation_start_time
;
1680 static HRESULT WINAPI
HTMLPerformanceTiming_get_unloadEventStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1682 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1684 TRACE("(%p)->(%p)\n", This
, p
);
1686 *p
= This
->window
->unload_event_start_time
;
1690 static HRESULT WINAPI
HTMLPerformanceTiming_get_unloadEventEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1692 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1694 TRACE("(%p)->(%p)\n", This
, p
);
1696 *p
= This
->window
->unload_event_end_time
;
1700 static HRESULT WINAPI
HTMLPerformanceTiming_get_redirectStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1702 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1704 TRACE("(%p)->(%p)\n", This
, p
);
1706 *p
= This
->window
->redirect_time
;
1710 static HRESULT WINAPI
HTMLPerformanceTiming_get_redirectEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1712 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1714 TRACE("(%p)->(%p)\n", This
, p
);
1716 *p
= This
->window
->redirect_time
? get_fetch_time(This
) : 0;
1720 static HRESULT WINAPI
HTMLPerformanceTiming_get_fetchStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1722 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1724 TRACE("(%p)->(%p)\n", This
, p
);
1726 *p
= get_fetch_time(This
);
1730 static HRESULT WINAPI
HTMLPerformanceTiming_get_domainLookupStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1732 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1734 TRACE("(%p)->(%p)\n", This
, p
);
1736 *p
= This
->window
->dns_lookup_time
? This
->window
->dns_lookup_time
: get_fetch_time(This
);
1740 static HRESULT WINAPI
HTMLPerformanceTiming_get_domainLookupEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1742 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1744 TRACE("(%p)->(%p)\n", This
, p
);
1746 *p
= This
->window
->connect_time
? This
->window
->connect_time
:
1747 This
->window
->dns_lookup_time
? This
->window
->dns_lookup_time
: get_fetch_time(This
);
1751 static HRESULT WINAPI
HTMLPerformanceTiming_get_connectStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1753 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1755 TRACE("(%p)->(%p)\n", This
, p
);
1757 *p
= This
->window
->connect_time
? This
->window
->connect_time
:
1758 This
->window
->dns_lookup_time
? This
->window
->dns_lookup_time
: get_fetch_time(This
);
1762 static HRESULT WINAPI
HTMLPerformanceTiming_get_connectEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1764 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1766 TRACE("(%p)->(%p)\n", This
, p
);
1768 *p
= This
->window
->request_time
? This
->window
->request_time
:
1769 This
->window
->connect_time
? This
->window
->connect_time
:
1770 This
->window
->dns_lookup_time
? This
->window
->dns_lookup_time
: get_fetch_time(This
);
1774 static HRESULT WINAPI
HTMLPerformanceTiming_get_requestStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1776 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1778 TRACE("(%p)->(%p)\n", This
, p
);
1780 *p
= This
->window
->request_time
? This
->window
->request_time
:
1781 This
->window
->connect_time
? This
->window
->connect_time
:
1782 This
->window
->dns_lookup_time
? This
->window
->dns_lookup_time
: get_fetch_time(This
);
1786 static HRESULT WINAPI
HTMLPerformanceTiming_get_responseStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1788 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1790 TRACE("(%p)->(%p)\n", This
, p
);
1792 *p
= This
->window
->response_start_time
;
1796 static HRESULT WINAPI
HTMLPerformanceTiming_get_responseEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1798 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1800 TRACE("(%p)->(%p)\n", This
, p
);
1802 *p
= This
->window
->response_end_time
;
1806 static HRESULT WINAPI
HTMLPerformanceTiming_get_domLoading(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1808 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1810 TRACE("(%p)->(%p)\n", This
, p
);
1812 /* Make sure this is after responseEnd, when the Gecko parser starts */
1813 *p
= This
->window
->response_end_time
;
1817 static HRESULT WINAPI
HTMLPerformanceTiming_get_domInteractive(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1819 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1821 TRACE("(%p)->(%p)\n", This
, p
);
1823 *p
= This
->window
->dom_interactive_time
;
1827 static HRESULT WINAPI
HTMLPerformanceTiming_get_domContentLoadedEventStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1829 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1831 TRACE("(%p)->(%p)\n", This
, p
);
1833 *p
= This
->window
->dom_content_loaded_event_start_time
;
1837 static HRESULT WINAPI
HTMLPerformanceTiming_get_domContentLoadedEventEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1839 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1841 TRACE("(%p)->(%p)\n", This
, p
);
1843 *p
= This
->window
->dom_content_loaded_event_end_time
;
1847 static HRESULT WINAPI
HTMLPerformanceTiming_get_domComplete(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1849 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1851 TRACE("(%p)->(%p)\n", This
, p
);
1853 *p
= This
->window
->dom_complete_time
;
1857 static HRESULT WINAPI
HTMLPerformanceTiming_get_loadEventStart(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1859 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1861 TRACE("(%p)->(%p)\n", This
, p
);
1863 *p
= This
->window
->load_event_start_time
;
1867 static HRESULT WINAPI
HTMLPerformanceTiming_get_loadEventEnd(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1869 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1871 TRACE("(%p)->(%p)\n", This
, p
);
1873 *p
= This
->window
->load_event_end_time
;
1877 static HRESULT WINAPI
HTMLPerformanceTiming_get_msFirstPaint(IHTMLPerformanceTiming
*iface
, ULONGLONG
*p
)
1879 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1881 TRACE("(%p)->(%p)\n", This
, p
);
1883 *p
= This
->window
->first_paint_time
;
1887 static HRESULT WINAPI
HTMLPerformanceTiming_toString(IHTMLPerformanceTiming
*iface
, BSTR
*string
)
1889 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1891 TRACE("(%p)->(%p)\n", This
, string
);
1893 return dispex_to_string(&This
->dispex
, string
);
1896 static HRESULT WINAPI
HTMLPerformanceTiming_toJSON(IHTMLPerformanceTiming
*iface
, VARIANT
*p
)
1898 HTMLPerformanceTiming
*This
= impl_from_IHTMLPerformanceTiming(iface
);
1899 FIXME("(%p)->(%p)\n", This
, p
);
1903 static const IHTMLPerformanceTimingVtbl HTMLPerformanceTimingVtbl
= {
1904 HTMLPerformanceTiming_QueryInterface
,
1905 HTMLPerformanceTiming_AddRef
,
1906 HTMLPerformanceTiming_Release
,
1907 HTMLPerformanceTiming_GetTypeInfoCount
,
1908 HTMLPerformanceTiming_GetTypeInfo
,
1909 HTMLPerformanceTiming_GetIDsOfNames
,
1910 HTMLPerformanceTiming_Invoke
,
1911 HTMLPerformanceTiming_get_navigationStart
,
1912 HTMLPerformanceTiming_get_unloadEventStart
,
1913 HTMLPerformanceTiming_get_unloadEventEnd
,
1914 HTMLPerformanceTiming_get_redirectStart
,
1915 HTMLPerformanceTiming_get_redirectEnd
,
1916 HTMLPerformanceTiming_get_fetchStart
,
1917 HTMLPerformanceTiming_get_domainLookupStart
,
1918 HTMLPerformanceTiming_get_domainLookupEnd
,
1919 HTMLPerformanceTiming_get_connectStart
,
1920 HTMLPerformanceTiming_get_connectEnd
,
1921 HTMLPerformanceTiming_get_requestStart
,
1922 HTMLPerformanceTiming_get_responseStart
,
1923 HTMLPerformanceTiming_get_responseEnd
,
1924 HTMLPerformanceTiming_get_domLoading
,
1925 HTMLPerformanceTiming_get_domInteractive
,
1926 HTMLPerformanceTiming_get_domContentLoadedEventStart
,
1927 HTMLPerformanceTiming_get_domContentLoadedEventEnd
,
1928 HTMLPerformanceTiming_get_domComplete
,
1929 HTMLPerformanceTiming_get_loadEventStart
,
1930 HTMLPerformanceTiming_get_loadEventEnd
,
1931 HTMLPerformanceTiming_get_msFirstPaint
,
1932 HTMLPerformanceTiming_toString
,
1933 HTMLPerformanceTiming_toJSON
1936 static inline HTMLPerformanceTiming
*HTMLPerformanceTiming_from_DispatchEx(DispatchEx
*iface
)
1938 return CONTAINING_RECORD(iface
, HTMLPerformanceTiming
, dispex
);
1941 static void HTMLPerformanceTiming_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
1943 HTMLPerformanceTiming
*This
= HTMLPerformanceTiming_from_DispatchEx(dispex
);
1945 note_cc_edge((nsISupports
*)&This
->window
->base
.IHTMLWindow2_iface
, "window", cb
);
1948 static void HTMLPerformanceTiming_unlink(DispatchEx
*dispex
)
1950 HTMLPerformanceTiming
*This
= HTMLPerformanceTiming_from_DispatchEx(dispex
);
1952 HTMLInnerWindow
*window
= This
->window
;
1953 This
->window
= NULL
;
1954 IHTMLWindow2_Release(&window
->base
.IHTMLWindow2_iface
);
1958 static void HTMLPerformanceTiming_destructor(DispatchEx
*dispex
)
1960 HTMLPerformanceTiming
*This
= HTMLPerformanceTiming_from_DispatchEx(dispex
);
1964 static const dispex_static_data_vtbl_t HTMLPerformanceTiming_dispex_vtbl
= {
1965 .destructor
= HTMLPerformanceTiming_destructor
,
1966 .traverse
= HTMLPerformanceTiming_traverse
,
1967 .unlink
= HTMLPerformanceTiming_unlink
1970 static const tid_t HTMLPerformanceTiming_iface_tids
[] = {
1971 IHTMLPerformanceTiming_tid
,
1974 static dispex_static_data_t HTMLPerformanceTiming_dispex
= {
1975 "PerformanceTiming",
1976 &HTMLPerformanceTiming_dispex_vtbl
,
1977 IHTMLPerformanceTiming_tid
,
1978 HTMLPerformanceTiming_iface_tids
1983 IHTMLPerformanceNavigation IHTMLPerformanceNavigation_iface
;
1985 HTMLInnerWindow
*window
;
1986 } HTMLPerformanceNavigation
;
1988 static inline HTMLPerformanceNavigation
*impl_from_IHTMLPerformanceNavigation(IHTMLPerformanceNavigation
*iface
)
1990 return CONTAINING_RECORD(iface
, HTMLPerformanceNavigation
, IHTMLPerformanceNavigation_iface
);
1993 static HRESULT WINAPI
HTMLPerformanceNavigation_QueryInterface(IHTMLPerformanceNavigation
*iface
, REFIID riid
, void **ppv
)
1995 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
1997 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
1999 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2000 *ppv
= &This
->IHTMLPerformanceNavigation_iface
;
2001 }else if(IsEqualGUID(&IID_IHTMLPerformanceNavigation
, riid
)) {
2002 *ppv
= &This
->IHTMLPerformanceNavigation_iface
;
2003 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
2004 return *ppv
? S_OK
: E_NOINTERFACE
;
2006 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
2008 return E_NOINTERFACE
;
2011 IUnknown_AddRef((IUnknown
*)*ppv
);
2015 static ULONG WINAPI
HTMLPerformanceNavigation_AddRef(IHTMLPerformanceNavigation
*iface
)
2017 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2018 LONG ref
= dispex_ref_incr(&This
->dispex
);
2020 TRACE("(%p) ref=%ld\n", This
, ref
);
2025 static ULONG WINAPI
HTMLPerformanceNavigation_Release(IHTMLPerformanceNavigation
*iface
)
2027 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2028 LONG ref
= dispex_ref_decr(&This
->dispex
);
2030 TRACE("(%p) ref=%ld\n", This
, ref
);
2035 static HRESULT WINAPI
HTMLPerformanceNavigation_GetTypeInfoCount(IHTMLPerformanceNavigation
*iface
, UINT
*pctinfo
)
2037 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2038 FIXME("(%p)->(%p)\n", This
, pctinfo
);
2042 static HRESULT WINAPI
HTMLPerformanceNavigation_GetTypeInfo(IHTMLPerformanceNavigation
*iface
, UINT iTInfo
,
2043 LCID lcid
, ITypeInfo
**ppTInfo
)
2045 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2047 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
2050 static HRESULT WINAPI
HTMLPerformanceNavigation_GetIDsOfNames(IHTMLPerformanceNavigation
*iface
, REFIID riid
,
2051 LPOLESTR
*rgszNames
, UINT cNames
,
2052 LCID lcid
, DISPID
*rgDispId
)
2054 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2056 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
2060 static HRESULT WINAPI
HTMLPerformanceNavigation_Invoke(IHTMLPerformanceNavigation
*iface
, DISPID dispIdMember
,
2061 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
2062 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2064 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2066 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
2067 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2070 static HRESULT WINAPI
HTMLPerformanceNavigation_get_type(IHTMLPerformanceNavigation
*iface
, ULONG
*p
)
2072 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2074 TRACE("(%p)->(%p)\n", This
, p
);
2076 *p
= This
->window
->navigation_type
;
2080 static HRESULT WINAPI
HTMLPerformanceNavigation_get_redirectCount(IHTMLPerformanceNavigation
*iface
, ULONG
*p
)
2082 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2084 TRACE("(%p)->(%p)\n", This
, p
);
2086 *p
= This
->window
->redirect_count
;
2090 static HRESULT WINAPI
HTMLPerformanceNavigation_toString(IHTMLPerformanceNavigation
*iface
, BSTR
*string
)
2092 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2094 TRACE("(%p)->(%p)\n", This
, string
);
2096 return dispex_to_string(&This
->dispex
, string
);
2099 static HRESULT WINAPI
HTMLPerformanceNavigation_toJSON(IHTMLPerformanceNavigation
*iface
, VARIANT
*p
)
2101 HTMLPerformanceNavigation
*This
= impl_from_IHTMLPerformanceNavigation(iface
);
2102 FIXME("(%p)->(%p)\n", This
, p
);
2106 static const IHTMLPerformanceNavigationVtbl HTMLPerformanceNavigationVtbl
= {
2107 HTMLPerformanceNavigation_QueryInterface
,
2108 HTMLPerformanceNavigation_AddRef
,
2109 HTMLPerformanceNavigation_Release
,
2110 HTMLPerformanceNavigation_GetTypeInfoCount
,
2111 HTMLPerformanceNavigation_GetTypeInfo
,
2112 HTMLPerformanceNavigation_GetIDsOfNames
,
2113 HTMLPerformanceNavigation_Invoke
,
2114 HTMLPerformanceNavigation_get_type
,
2115 HTMLPerformanceNavigation_get_redirectCount
,
2116 HTMLPerformanceNavigation_toString
,
2117 HTMLPerformanceNavigation_toJSON
2120 static inline HTMLPerformanceNavigation
*HTMLPerformanceNavigation_from_DispatchEx(DispatchEx
*iface
)
2122 return CONTAINING_RECORD(iface
, HTMLPerformanceNavigation
, dispex
);
2125 static void HTMLPerformanceNavigation_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
2127 HTMLPerformanceNavigation
*This
= HTMLPerformanceNavigation_from_DispatchEx(dispex
);
2129 note_cc_edge((nsISupports
*)&This
->window
->base
.IHTMLWindow2_iface
, "window", cb
);
2132 static void HTMLPerformanceNavigation_unlink(DispatchEx
*dispex
)
2134 HTMLPerformanceNavigation
*This
= HTMLPerformanceNavigation_from_DispatchEx(dispex
);
2136 HTMLInnerWindow
*window
= This
->window
;
2137 This
->window
= NULL
;
2138 IHTMLWindow2_Release(&window
->base
.IHTMLWindow2_iface
);
2142 static void HTMLPerformanceNavigation_destructor(DispatchEx
*dispex
)
2144 HTMLPerformanceNavigation
*This
= HTMLPerformanceNavigation_from_DispatchEx(dispex
);
2148 static const dispex_static_data_vtbl_t HTMLPerformanceNavigation_dispex_vtbl
= {
2149 .destructor
= HTMLPerformanceNavigation_destructor
,
2150 .traverse
= HTMLPerformanceNavigation_traverse
,
2151 .unlink
= HTMLPerformanceNavigation_unlink
2154 static const tid_t HTMLPerformanceNavigation_iface_tids
[] = {
2155 IHTMLPerformanceNavigation_tid
,
2158 static dispex_static_data_t HTMLPerformanceNavigation_dispex
= {
2159 "PerformanceNavigation",
2160 &HTMLPerformanceNavigation_dispex_vtbl
,
2161 IHTMLPerformanceNavigation_tid
,
2162 HTMLPerformanceNavigation_iface_tids
2167 IHTMLPerformance IHTMLPerformance_iface
;
2169 HTMLInnerWindow
*window
;
2170 IHTMLPerformanceNavigation
*navigation
;
2171 IHTMLPerformanceTiming
*timing
;
2174 static inline HTMLPerformance
*impl_from_IHTMLPerformance(IHTMLPerformance
*iface
)
2176 return CONTAINING_RECORD(iface
, HTMLPerformance
, IHTMLPerformance_iface
);
2179 static HRESULT WINAPI
HTMLPerformance_QueryInterface(IHTMLPerformance
*iface
, REFIID riid
, void **ppv
)
2181 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2183 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
2185 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2186 *ppv
= &This
->IHTMLPerformance_iface
;
2187 }else if(IsEqualGUID(&IID_IHTMLPerformance
, riid
)) {
2188 *ppv
= &This
->IHTMLPerformance_iface
;
2189 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
2190 return *ppv
? S_OK
: E_NOINTERFACE
;
2192 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
2194 return E_NOINTERFACE
;
2197 IUnknown_AddRef((IUnknown
*)*ppv
);
2201 static ULONG WINAPI
HTMLPerformance_AddRef(IHTMLPerformance
*iface
)
2203 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2204 LONG ref
= dispex_ref_incr(&This
->dispex
);
2206 TRACE("(%p) ref=%ld\n", This
, ref
);
2211 static ULONG WINAPI
HTMLPerformance_Release(IHTMLPerformance
*iface
)
2213 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2214 LONG ref
= dispex_ref_decr(&This
->dispex
);
2216 TRACE("(%p) ref=%ld\n", This
, ref
);
2221 static HRESULT WINAPI
HTMLPerformance_GetTypeInfoCount(IHTMLPerformance
*iface
, UINT
*pctinfo
)
2223 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2224 FIXME("(%p)->(%p)\n", This
, pctinfo
);
2228 static HRESULT WINAPI
HTMLPerformance_GetTypeInfo(IHTMLPerformance
*iface
, UINT iTInfo
,
2229 LCID lcid
, ITypeInfo
**ppTInfo
)
2231 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2233 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
2236 static HRESULT WINAPI
HTMLPerformance_GetIDsOfNames(IHTMLPerformance
*iface
, REFIID riid
,
2237 LPOLESTR
*rgszNames
, UINT cNames
,
2238 LCID lcid
, DISPID
*rgDispId
)
2240 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2242 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
2246 static HRESULT WINAPI
HTMLPerformance_Invoke(IHTMLPerformance
*iface
, DISPID dispIdMember
,
2247 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
2248 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2250 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2252 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
2253 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2256 static HRESULT WINAPI
HTMLPerformance_get_navigation(IHTMLPerformance
*iface
,
2257 IHTMLPerformanceNavigation
**p
)
2259 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2261 TRACE("(%p)->(%p)\n", This
, p
);
2263 if(!This
->navigation
) {
2264 HTMLPerformanceNavigation
*navigation
;
2266 navigation
= calloc(1, sizeof(*navigation
));
2268 return E_OUTOFMEMORY
;
2270 navigation
->IHTMLPerformanceNavigation_iface
.lpVtbl
= &HTMLPerformanceNavigationVtbl
;
2271 navigation
->window
= This
->window
;
2272 IHTMLWindow2_AddRef(&This
->window
->base
.IHTMLWindow2_iface
);
2274 init_dispatch(&navigation
->dispex
, (IUnknown
*)&navigation
->IHTMLPerformanceNavigation_iface
,
2275 &HTMLPerformanceNavigation_dispex
, dispex_compat_mode(&This
->dispex
));
2277 This
->navigation
= &navigation
->IHTMLPerformanceNavigation_iface
;
2280 IHTMLPerformanceNavigation_AddRef(*p
= This
->navigation
);
2284 static HRESULT WINAPI
HTMLPerformance_get_timing(IHTMLPerformance
*iface
, IHTMLPerformanceTiming
**p
)
2286 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2288 TRACE("(%p)->(%p)\n", This
, p
);
2291 HTMLPerformanceTiming
*timing
;
2293 timing
= calloc(1, sizeof(*timing
));
2295 return E_OUTOFMEMORY
;
2297 timing
->IHTMLPerformanceTiming_iface
.lpVtbl
= &HTMLPerformanceTimingVtbl
;
2298 timing
->window
= This
->window
;
2299 IHTMLWindow2_AddRef(&This
->window
->base
.IHTMLWindow2_iface
);
2301 init_dispatch(&timing
->dispex
, (IUnknown
*)&timing
->IHTMLPerformanceTiming_iface
,
2302 &HTMLPerformanceTiming_dispex
, dispex_compat_mode(&This
->dispex
));
2304 This
->timing
= &timing
->IHTMLPerformanceTiming_iface
;
2307 IHTMLPerformanceTiming_AddRef(*p
= This
->timing
);
2311 static HRESULT WINAPI
HTMLPerformance_toString(IHTMLPerformance
*iface
, BSTR
*string
)
2313 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2315 TRACE("(%p)->(%p)\n", This
, string
);
2317 return dispex_to_string(&This
->dispex
, string
);
2320 static HRESULT WINAPI
HTMLPerformance_toJSON(IHTMLPerformance
*iface
, VARIANT
*var
)
2322 HTMLPerformance
*This
= impl_from_IHTMLPerformance(iface
);
2323 FIXME("(%p)->(%p)\n", This
, var
);
2327 static const IHTMLPerformanceVtbl HTMLPerformanceVtbl
= {
2328 HTMLPerformance_QueryInterface
,
2329 HTMLPerformance_AddRef
,
2330 HTMLPerformance_Release
,
2331 HTMLPerformance_GetTypeInfoCount
,
2332 HTMLPerformance_GetTypeInfo
,
2333 HTMLPerformance_GetIDsOfNames
,
2334 HTMLPerformance_Invoke
,
2335 HTMLPerformance_get_navigation
,
2336 HTMLPerformance_get_timing
,
2337 HTMLPerformance_toString
,
2338 HTMLPerformance_toJSON
2341 static inline HTMLPerformance
*HTMLPerformance_from_DispatchEx(DispatchEx
*iface
)
2343 return CONTAINING_RECORD(iface
, HTMLPerformance
, dispex
);
2346 static void HTMLPerformance_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
2348 HTMLPerformance
*This
= HTMLPerformance_from_DispatchEx(dispex
);
2350 note_cc_edge((nsISupports
*)&This
->window
->base
.IHTMLWindow2_iface
, "window", cb
);
2351 if(This
->navigation
)
2352 note_cc_edge((nsISupports
*)This
->navigation
, "navigation", cb
);
2354 note_cc_edge((nsISupports
*)This
->timing
, "timing", cb
);
2357 static void HTMLPerformance_unlink(DispatchEx
*dispex
)
2359 HTMLPerformance
*This
= HTMLPerformance_from_DispatchEx(dispex
);
2361 HTMLInnerWindow
*window
= This
->window
;
2362 This
->window
= NULL
;
2363 IHTMLWindow2_Release(&window
->base
.IHTMLWindow2_iface
);
2365 unlink_ref(&This
->navigation
);
2366 unlink_ref(&This
->timing
);
2369 static void HTMLPerformance_destructor(DispatchEx
*dispex
)
2371 HTMLPerformance
*This
= HTMLPerformance_from_DispatchEx(dispex
);
2375 static const dispex_static_data_vtbl_t HTMLPerformance_dispex_vtbl
= {
2376 .destructor
= HTMLPerformance_destructor
,
2377 .traverse
= HTMLPerformance_traverse
,
2378 .unlink
= HTMLPerformance_unlink
2381 static const tid_t HTMLPerformance_iface_tids
[] = {
2382 IHTMLPerformance_tid
,
2385 static dispex_static_data_t HTMLPerformance_dispex
= {
2387 &HTMLPerformance_dispex_vtbl
,
2388 IHTMLPerformance_tid
,
2389 HTMLPerformance_iface_tids
2392 HRESULT
create_performance(HTMLInnerWindow
*window
, IHTMLPerformance
**ret
)
2394 compat_mode_t compat_mode
= dispex_compat_mode(&window
->event_target
.dispex
);
2395 HTMLPerformance
*performance
;
2397 performance
= calloc(1, sizeof(*performance
));
2399 return E_OUTOFMEMORY
;
2401 performance
->IHTMLPerformance_iface
.lpVtbl
= &HTMLPerformanceVtbl
;
2402 performance
->window
= window
;
2403 IHTMLWindow2_AddRef(&window
->base
.IHTMLWindow2_iface
);
2405 init_dispatch(&performance
->dispex
, (IUnknown
*)&performance
->IHTMLPerformance_iface
,
2406 &HTMLPerformance_dispex
, compat_mode
);
2408 *ret
= &performance
->IHTMLPerformance_iface
;
2414 IHTMLNamespaceCollection IHTMLNamespaceCollection_iface
;
2415 } HTMLNamespaceCollection
;
2417 static inline HTMLNamespaceCollection
*impl_from_IHTMLNamespaceCollection(IHTMLNamespaceCollection
*iface
)
2419 return CONTAINING_RECORD(iface
, HTMLNamespaceCollection
, IHTMLNamespaceCollection_iface
);
2422 static HRESULT WINAPI
HTMLNamespaceCollection_QueryInterface(IHTMLNamespaceCollection
*iface
, REFIID riid
, void **ppv
)
2424 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2426 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
2428 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2429 *ppv
= &This
->IHTMLNamespaceCollection_iface
;
2430 }else if(IsEqualGUID(&IID_IHTMLNamespaceCollection
, riid
)) {
2431 *ppv
= &This
->IHTMLNamespaceCollection_iface
;
2432 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
)) {
2433 return *ppv
? S_OK
: E_NOINTERFACE
;
2435 WARN("Unsupported interface %s\n", debugstr_mshtml_guid(riid
));
2437 return E_NOINTERFACE
;
2440 IUnknown_AddRef((IUnknown
*)*ppv
);
2444 static ULONG WINAPI
HTMLNamespaceCollection_AddRef(IHTMLNamespaceCollection
*iface
)
2446 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2447 LONG ref
= dispex_ref_incr(&This
->dispex
);
2449 TRACE("(%p) ref=%ld\n", This
, ref
);
2454 static ULONG WINAPI
HTMLNamespaceCollection_Release(IHTMLNamespaceCollection
*iface
)
2456 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2457 LONG ref
= dispex_ref_decr(&This
->dispex
);
2459 TRACE("(%p) ref=%ld\n", This
, ref
);
2464 static HRESULT WINAPI
HTMLNamespaceCollection_GetTypeInfoCount(IHTMLNamespaceCollection
*iface
, UINT
*pctinfo
)
2466 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2467 FIXME("(%p)->(%p)\n", This
, pctinfo
);
2471 static HRESULT WINAPI
HTMLNamespaceCollection_GetTypeInfo(IHTMLNamespaceCollection
*iface
, UINT iTInfo
,
2472 LCID lcid
, ITypeInfo
**ppTInfo
)
2474 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2476 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
2479 static HRESULT WINAPI
HTMLNamespaceCollection_GetIDsOfNames(IHTMLNamespaceCollection
*iface
, REFIID riid
,
2480 LPOLESTR
*rgszNames
, UINT cNames
,
2481 LCID lcid
, DISPID
*rgDispId
)
2483 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2485 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
2489 static HRESULT WINAPI
HTMLNamespaceCollection_Invoke(IHTMLNamespaceCollection
*iface
, DISPID dispIdMember
,
2490 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
2491 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2493 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2495 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
2496 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2499 static HRESULT WINAPI
HTMLNamespaceCollection_get_length(IHTMLNamespaceCollection
*iface
, LONG
*p
)
2501 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2502 FIXME("(%p)->(%p) returning 0\n", This
, p
);
2507 static HRESULT WINAPI
HTMLNamespaceCollection_item(IHTMLNamespaceCollection
*iface
, VARIANT index
, IDispatch
**p
)
2509 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2510 FIXME("(%p)->(%s %p)\n", This
, debugstr_variant(&index
), p
);
2514 static HRESULT WINAPI
HTMLNamespaceCollection_add(IHTMLNamespaceCollection
*iface
, BSTR
namespace, BSTR urn
,
2515 VARIANT implementation_url
, IDispatch
**p
)
2517 HTMLNamespaceCollection
*This
= impl_from_IHTMLNamespaceCollection(iface
);
2518 FIXME("(%p)->(%s %s %s %p)\n", This
, debugstr_w(namespace), debugstr_w(urn
), debugstr_variant(&implementation_url
), p
);
2522 static const IHTMLNamespaceCollectionVtbl HTMLNamespaceCollectionVtbl
= {
2523 HTMLNamespaceCollection_QueryInterface
,
2524 HTMLNamespaceCollection_AddRef
,
2525 HTMLNamespaceCollection_Release
,
2526 HTMLNamespaceCollection_GetTypeInfoCount
,
2527 HTMLNamespaceCollection_GetTypeInfo
,
2528 HTMLNamespaceCollection_GetIDsOfNames
,
2529 HTMLNamespaceCollection_Invoke
,
2530 HTMLNamespaceCollection_get_length
,
2531 HTMLNamespaceCollection_item
,
2532 HTMLNamespaceCollection_add
2535 static inline HTMLNamespaceCollection
*HTMLNamespaceCollection_from_DispatchEx(DispatchEx
*iface
)
2537 return CONTAINING_RECORD(iface
, HTMLNamespaceCollection
, dispex
);
2540 static void HTMLNamespaceCollection_destructor(DispatchEx
*dispex
)
2542 HTMLNamespaceCollection
*This
= HTMLNamespaceCollection_from_DispatchEx(dispex
);
2546 static const dispex_static_data_vtbl_t HTMLNamespaceCollection_dispex_vtbl
= {
2547 .destructor
= HTMLNamespaceCollection_destructor
,
2550 static const tid_t HTMLNamespaceCollection_iface_tids
[] = {
2551 IHTMLNamespaceCollection_tid
,
2554 static dispex_static_data_t HTMLNamespaceCollection_dispex
= {
2555 "MSNamespaceInfoCollection",
2556 &HTMLNamespaceCollection_dispex_vtbl
,
2557 DispHTMLNamespaceCollection_tid
,
2558 HTMLNamespaceCollection_iface_tids
2561 HRESULT
create_namespace_collection(compat_mode_t compat_mode
, IHTMLNamespaceCollection
**ret
)
2563 HTMLNamespaceCollection
*namespaces
;
2565 if (!(namespaces
= calloc(1, sizeof(*namespaces
))))
2566 return E_OUTOFMEMORY
;
2568 namespaces
->IHTMLNamespaceCollection_iface
.lpVtbl
= &HTMLNamespaceCollectionVtbl
;
2569 init_dispatch(&namespaces
->dispex
, (IUnknown
*)&namespaces
->IHTMLNamespaceCollection_iface
,
2570 &HTMLNamespaceCollection_dispex
, compat_mode
);
2571 *ret
= &namespaces
->IHTMLNamespaceCollection_iface
;
2577 IWineMSHTMLConsole IWineMSHTMLConsole_iface
;
2580 static inline struct console
*impl_from_IWineMSHTMLConsole(IWineMSHTMLConsole
*iface
)
2582 return CONTAINING_RECORD(iface
, struct console
, IWineMSHTMLConsole_iface
);
2585 static HRESULT WINAPI
console_QueryInterface(IWineMSHTMLConsole
*iface
, REFIID riid
, void **ppv
)
2587 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2589 TRACE("(%p)->(%s %p)\n", console
, debugstr_mshtml_guid(riid
), ppv
);
2591 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2592 *ppv
= &console
->IWineMSHTMLConsole_iface
;
2593 }else if(IsEqualGUID(&IID_IWineMSHTMLConsole
, riid
)) {
2594 *ppv
= &console
->IWineMSHTMLConsole_iface
;
2595 }else if(dispex_query_interface(&console
->dispex
, riid
, ppv
)) {
2596 return *ppv
? S_OK
: E_NOINTERFACE
;
2598 WARN("(%p)->(%s %p)\n", console
, debugstr_mshtml_guid(riid
), ppv
);
2600 return E_NOINTERFACE
;
2603 IUnknown_AddRef((IUnknown
*)*ppv
);
2607 static ULONG WINAPI
console_AddRef(IWineMSHTMLConsole
*iface
)
2609 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2610 LONG ref
= dispex_ref_incr(&console
->dispex
);
2612 TRACE("(%p) ref=%ld\n", console
, ref
);
2617 static ULONG WINAPI
console_Release(IWineMSHTMLConsole
*iface
)
2619 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2620 LONG ref
= dispex_ref_decr(&console
->dispex
);
2622 TRACE("(%p) ref=%ld\n", console
, ref
);
2627 static HRESULT WINAPI
console_GetTypeInfoCount(IWineMSHTMLConsole
*iface
, UINT
*pctinfo
)
2629 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2630 FIXME("(%p)->(%p)\n", console
, pctinfo
);
2634 static HRESULT WINAPI
console_GetTypeInfo(IWineMSHTMLConsole
*iface
, UINT iTInfo
,
2635 LCID lcid
, ITypeInfo
**ppTInfo
)
2637 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2639 return IDispatchEx_GetTypeInfo(&console
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
2642 static HRESULT WINAPI
console_GetIDsOfNames(IWineMSHTMLConsole
*iface
, REFIID riid
,
2643 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2645 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2647 return IDispatchEx_GetIDsOfNames(&console
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
2651 static HRESULT WINAPI
console_Invoke(IWineMSHTMLConsole
*iface
, DISPID dispIdMember
,
2652 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
2653 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2655 struct console
*console
= impl_from_IWineMSHTMLConsole(iface
);
2657 return IDispatchEx_Invoke(&console
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
2658 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2661 static HRESULT WINAPI
console_assert(IWineMSHTMLConsole
*iface
, VARIANT_BOOL
*assertion
, VARIANT
*vararg_start
)
2663 FIXME("iface %p, assertion %p, vararg_start %p stub.\n", iface
, assertion
, vararg_start
);
2668 static HRESULT WINAPI
console_clear(IWineMSHTMLConsole
*iface
)
2670 FIXME("iface %p stub.\n", iface
);
2675 static HRESULT WINAPI
console_count(IWineMSHTMLConsole
*iface
, VARIANT
*label
)
2677 FIXME("iface %p, label %p stub.\n", iface
, label
);
2682 static HRESULT WINAPI
console_debug(IWineMSHTMLConsole
*iface
, VARIANT
*vararg_start
)
2684 FIXME("iface %p, vararg_start %p stub.\n", iface
, vararg_start
);
2689 static HRESULT WINAPI
console_dir(IWineMSHTMLConsole
*iface
, VARIANT
*object
)
2691 FIXME("iface %p, object %p stub.\n", iface
, object
);
2696 static HRESULT WINAPI
console_dirxml(IWineMSHTMLConsole
*iface
, VARIANT
*object
)
2698 FIXME("iface %p, object %p stub.\n", iface
, object
);
2703 static HRESULT WINAPI
console_error(IWineMSHTMLConsole
*iface
, VARIANT
*vararg_start
)
2705 FIXME("iface %p, vararg_start %p stub.\n", iface
, vararg_start
);
2710 static HRESULT WINAPI
console_group(IWineMSHTMLConsole
*iface
, VARIANT
*label
)
2712 FIXME("iface %p, label %p stub.\n", iface
, label
);
2717 static HRESULT WINAPI
console_group_collapsed(IWineMSHTMLConsole
*iface
, VARIANT
*label
)
2719 FIXME("iface %p, label %p stub.\n", iface
, label
);
2724 static HRESULT WINAPI
console_group_end(IWineMSHTMLConsole
*iface
)
2726 FIXME("iface %p, stub.\n", iface
);
2731 static HRESULT WINAPI
console_info(IWineMSHTMLConsole
*iface
, VARIANT
*vararg_start
)
2733 FIXME("iface %p, vararg_start %p stub.\n", iface
, vararg_start
);
2738 static HRESULT WINAPI
console_log(IWineMSHTMLConsole
*iface
, VARIANT
*vararg_start
)
2740 FIXME("iface %p, vararg_start %p stub.\n", iface
, vararg_start
);
2745 static HRESULT WINAPI
console_time(IWineMSHTMLConsole
*iface
, VARIANT
*label
)
2747 FIXME("iface %p, label %p stub.\n", iface
, label
);
2752 static HRESULT WINAPI
console_time_end(IWineMSHTMLConsole
*iface
, VARIANT
*label
)
2754 FIXME("iface %p, label %p stub.\n", iface
, label
);
2759 static HRESULT WINAPI
console_trace(IWineMSHTMLConsole
*iface
, VARIANT
*vararg_start
)
2761 FIXME("iface %p, vararg_start %p stub.\n", iface
, vararg_start
);
2766 static HRESULT WINAPI
console_warn(IWineMSHTMLConsole
*iface
, VARIANT
*vararg_start
)
2768 FIXME("iface %p, vararg_start %p stub.\n", iface
, vararg_start
);
2773 static const IWineMSHTMLConsoleVtbl WineMSHTMLConsoleVtbl
= {
2774 console_QueryInterface
,
2777 console_GetTypeInfoCount
,
2778 console_GetTypeInfo
,
2779 console_GetIDsOfNames
,
2789 console_group_collapsed
,
2799 static inline struct console
*console_from_DispatchEx(DispatchEx
*iface
)
2801 return CONTAINING_RECORD(iface
, struct console
, dispex
);
2804 static void console_destructor(DispatchEx
*dispex
)
2806 struct console
*console
= console_from_DispatchEx(dispex
);
2810 static const dispex_static_data_vtbl_t console_dispex_vtbl
= {
2811 .destructor
= console_destructor
,
2814 static const tid_t console_iface_tids
[] = {
2815 IWineMSHTMLConsole_tid
,
2818 static dispex_static_data_t console_dispex
= {
2820 &console_dispex_vtbl
,
2821 IWineMSHTMLConsole_tid
,
2825 void create_console(compat_mode_t compat_mode
, IWineMSHTMLConsole
**ret
)
2827 struct console
*obj
;
2829 obj
= calloc(1, sizeof(*obj
));
2832 ERR("No memory.\n");
2836 obj
->IWineMSHTMLConsole_iface
.lpVtbl
= &WineMSHTMLConsoleVtbl
;
2837 init_dispatch(&obj
->dispex
, (IUnknown
*)&obj
->IWineMSHTMLConsole_iface
, &console_dispex
, compat_mode
);
2839 *ret
= &obj
->IWineMSHTMLConsole_iface
;
2842 struct media_query_list_listener
{
2844 IDispatch
*function
;
2847 struct media_query_list_callback
;
2848 struct media_query_list
{
2850 IWineMSHTMLMediaQueryList IWineMSHTMLMediaQueryList_iface
;
2851 nsIDOMMediaQueryList
*nsquerylist
;
2852 struct media_query_list_callback
*callback
;
2853 struct list listeners
;
2856 struct media_query_list_callback
{
2857 nsIDOMMediaQueryListListener nsIDOMMediaQueryListListener_iface
;
2858 struct media_query_list
*media_query_list
;
2862 static inline struct media_query_list
*impl_from_IWineMSHTMLMediaQueryList(IWineMSHTMLMediaQueryList
*iface
)
2864 return CONTAINING_RECORD(iface
, struct media_query_list
, IWineMSHTMLMediaQueryList_iface
);
2867 static HRESULT WINAPI
media_query_list_QueryInterface(IWineMSHTMLMediaQueryList
*iface
, REFIID riid
, void **ppv
)
2869 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2871 TRACE("(%p)->(%s %p)\n", media_query_list
, debugstr_mshtml_guid(riid
), ppv
);
2873 if(IsEqualGUID(&IID_IUnknown
, riid
) || IsEqualGUID(&IID_IWineMSHTMLMediaQueryList
, riid
)) {
2874 *ppv
= &media_query_list
->IWineMSHTMLMediaQueryList_iface
;
2875 }else if(dispex_query_interface(&media_query_list
->dispex
, riid
, ppv
)) {
2876 return *ppv
? S_OK
: E_NOINTERFACE
;
2879 return E_NOINTERFACE
;
2882 IUnknown_AddRef((IUnknown
*)*ppv
);
2886 static ULONG WINAPI
media_query_list_AddRef(IWineMSHTMLMediaQueryList
*iface
)
2888 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2889 LONG ref
= dispex_ref_incr(&media_query_list
->dispex
);
2891 TRACE("(%p) ref=%ld\n", media_query_list
, ref
);
2896 static ULONG WINAPI
media_query_list_Release(IWineMSHTMLMediaQueryList
*iface
)
2898 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2899 LONG ref
= dispex_ref_decr(&media_query_list
->dispex
);
2901 TRACE("(%p) ref=%ld\n", media_query_list
, ref
);
2906 static HRESULT WINAPI
media_query_list_GetTypeInfoCount(IWineMSHTMLMediaQueryList
*iface
, UINT
*pctinfo
)
2908 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2910 TRACE("(%p)->(%p)\n", media_query_list
, pctinfo
);
2912 return IDispatchEx_GetTypeInfoCount(&media_query_list
->dispex
.IDispatchEx_iface
, pctinfo
);
2915 static HRESULT WINAPI
media_query_list_GetTypeInfo(IWineMSHTMLMediaQueryList
*iface
, UINT iTInfo
,
2916 LCID lcid
, ITypeInfo
**ppTInfo
)
2918 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2920 return IDispatchEx_GetTypeInfo(&media_query_list
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
2923 static HRESULT WINAPI
media_query_list_GetIDsOfNames(IWineMSHTMLMediaQueryList
*iface
, REFIID riid
,
2924 LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2926 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2928 return IDispatchEx_GetIDsOfNames(&media_query_list
->dispex
.IDispatchEx_iface
, riid
, rgszNames
, cNames
,
2932 static HRESULT WINAPI
media_query_list_Invoke(IWineMSHTMLMediaQueryList
*iface
, DISPID dispIdMember
,
2933 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
2934 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2936 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2938 return IDispatchEx_Invoke(&media_query_list
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
, lcid
, wFlags
,
2939 pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
2942 static HRESULT WINAPI
media_query_list_get_media(IWineMSHTMLMediaQueryList
*iface
, BSTR
*p
)
2944 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2947 TRACE("(%p)->(%p)\n", media_query_list
, p
);
2949 nsAString_InitDepend(&nsstr
, NULL
);
2950 return return_nsstr(nsIDOMMediaQueryList_GetMedia(media_query_list
->nsquerylist
, &nsstr
), &nsstr
, p
);
2953 static HRESULT WINAPI
media_query_list_get_matches(IWineMSHTMLMediaQueryList
*iface
, VARIANT_BOOL
*p
)
2955 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2959 TRACE("(%p)->(%p)\n", media_query_list
, p
);
2961 nsres
= nsIDOMMediaQueryList_GetMatches(media_query_list
->nsquerylist
, &b
);
2962 if(NS_FAILED(nsres
))
2963 return map_nsresult(nsres
);
2964 *p
= b
? VARIANT_TRUE
: VARIANT_FALSE
;
2968 static HRESULT WINAPI
media_query_list_addListener(IWineMSHTMLMediaQueryList
*iface
, VARIANT
*listener
)
2970 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2971 struct media_query_list_listener
*entry
;
2973 TRACE("(%p)->(%s)\n", media_query_list
, debugstr_variant(listener
));
2975 if(V_VT(listener
) != VT_DISPATCH
|| !V_DISPATCH(listener
))
2978 LIST_FOR_EACH_ENTRY(entry
, &media_query_list
->listeners
, struct media_query_list_listener
, entry
)
2979 if(entry
->function
== V_DISPATCH(listener
))
2982 if(!(entry
= malloc(sizeof(*entry
))))
2983 return E_OUTOFMEMORY
;
2984 entry
->function
= V_DISPATCH(listener
);
2985 IDispatch_AddRef(V_DISPATCH(listener
));
2987 list_add_tail(&media_query_list
->listeners
, &entry
->entry
);
2991 static HRESULT WINAPI
media_query_list_removeListener(IWineMSHTMLMediaQueryList
*iface
, VARIANT
*listener
)
2993 struct media_query_list
*media_query_list
= impl_from_IWineMSHTMLMediaQueryList(iface
);
2994 struct media_query_list_listener
*entry
;
2996 TRACE("(%p)->(%s)\n", media_query_list
, debugstr_variant(listener
));
2998 if(V_VT(listener
) != VT_DISPATCH
|| !V_DISPATCH(listener
))
3001 LIST_FOR_EACH_ENTRY(entry
, &media_query_list
->listeners
, struct media_query_list_listener
, entry
) {
3002 if(entry
->function
== V_DISPATCH(listener
)) {
3003 list_remove(&entry
->entry
);
3004 IDispatch_Release(entry
->function
);
3013 static const IWineMSHTMLMediaQueryListVtbl media_query_list_vtbl
= {
3014 media_query_list_QueryInterface
,
3015 media_query_list_AddRef
,
3016 media_query_list_Release
,
3017 media_query_list_GetTypeInfoCount
,
3018 media_query_list_GetTypeInfo
,
3019 media_query_list_GetIDsOfNames
,
3020 media_query_list_Invoke
,
3021 media_query_list_get_media
,
3022 media_query_list_get_matches
,
3023 media_query_list_addListener
,
3024 media_query_list_removeListener
3027 static inline struct media_query_list_callback
*impl_from_nsIDOMMediaQueryListListener(nsIDOMMediaQueryListListener
*iface
)
3029 return CONTAINING_RECORD(iface
, struct media_query_list_callback
, nsIDOMMediaQueryListListener_iface
);
3032 static nsresult NSAPI
media_query_list_callback_QueryInterface(nsIDOMMediaQueryListListener
*iface
,
3033 nsIIDRef riid
, void **result
)
3035 struct media_query_list_callback
*callback
= impl_from_nsIDOMMediaQueryListListener(iface
);
3037 if(IsEqualGUID(&IID_nsISupports
, riid
) || IsEqualGUID(&IID_nsIDOMMediaQueryListListener
, riid
)) {
3038 *result
= &callback
->nsIDOMMediaQueryListListener_iface
;
3041 return NS_NOINTERFACE
;
3044 nsIDOMMediaQueryListListener_AddRef(&callback
->nsIDOMMediaQueryListListener_iface
);
3048 static nsrefcnt NSAPI
media_query_list_callback_AddRef(nsIDOMMediaQueryListListener
*iface
)
3050 struct media_query_list_callback
*callback
= impl_from_nsIDOMMediaQueryListListener(iface
);
3051 LONG ref
= InterlockedIncrement(&callback
->ref
);
3053 TRACE("(%p) ref=%ld\n", callback
, ref
);
3058 static nsrefcnt NSAPI
media_query_list_callback_Release(nsIDOMMediaQueryListListener
*iface
)
3060 struct media_query_list_callback
*callback
= impl_from_nsIDOMMediaQueryListListener(iface
);
3061 LONG ref
= InterlockedDecrement(&callback
->ref
);
3063 TRACE("(%p) ref=%ld\n", callback
, ref
);
3070 static nsresult NSAPI
media_query_list_callback_HandleChange(nsIDOMMediaQueryListListener
*iface
, nsIDOMMediaQueryList
*mql
)
3072 struct media_query_list_callback
*callback
= impl_from_nsIDOMMediaQueryListListener(iface
);
3073 IDispatch
*listener_funcs_buf
[4], **listener_funcs
= listener_funcs_buf
;
3074 struct media_query_list
*media_query_list
= callback
->media_query_list
;
3075 struct media_query_list_listener
*listener
;
3076 unsigned cnt
, i
= 0;
3080 if(!media_query_list
)
3083 cnt
= list_count(&media_query_list
->listeners
);
3084 if(cnt
> ARRAY_SIZE(listener_funcs_buf
) && !(listener_funcs
= malloc(cnt
* sizeof(*listener_funcs
))))
3085 return NS_ERROR_OUT_OF_MEMORY
;
3087 LIST_FOR_EACH_ENTRY(listener
, &media_query_list
->listeners
, struct media_query_list_listener
, entry
) {
3088 listener_funcs
[i
] = listener
->function
;
3089 IDispatch_AddRef(listener_funcs
[i
++]);
3092 for(i
= 0; i
< cnt
; i
++) {
3093 DISPPARAMS dp
= { args
, NULL
, 1, 0 };
3095 V_VT(args
) = VT_DISPATCH
;
3096 V_DISPATCH(args
) = (IDispatch
*)&media_query_list
->dispex
.IDispatchEx_iface
;
3097 V_VT(&v
) = VT_EMPTY
;
3099 TRACE("%p >>>\n", media_query_list
);
3100 hres
= call_disp_func(listener_funcs
[i
], &dp
, &v
);
3102 TRACE("%p <<< %s\n", media_query_list
, debugstr_variant(&v
));
3105 WARN("%p <<< %08lx\n", media_query_list
, hres
);
3107 IDispatch_Release(listener_funcs
[i
]);
3110 if(listener_funcs
!= listener_funcs_buf
)
3111 free(listener_funcs
);
3115 static const nsIDOMMediaQueryListListenerVtbl media_query_list_callback_vtbl
= {
3116 media_query_list_callback_QueryInterface
,
3117 media_query_list_callback_AddRef
,
3118 media_query_list_callback_Release
,
3119 media_query_list_callback_HandleChange
3122 static inline struct media_query_list
*media_query_list_from_DispatchEx(DispatchEx
*iface
)
3124 return CONTAINING_RECORD(iface
, struct media_query_list
, dispex
);
3127 static void media_query_list_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
3129 struct media_query_list
*media_query_list
= media_query_list_from_DispatchEx(dispex
);
3130 struct media_query_list_listener
*listener
;
3132 LIST_FOR_EACH_ENTRY(listener
, &media_query_list
->listeners
, struct media_query_list_listener
, entry
)
3133 note_cc_edge((nsISupports
*)listener
->function
, "function", cb
);
3134 if(media_query_list
->nsquerylist
)
3135 note_cc_edge((nsISupports
*)media_query_list
->nsquerylist
, "nsquerylist", cb
);
3138 static void media_query_list_unlink(DispatchEx
*dispex
)
3140 struct media_query_list
*media_query_list
= media_query_list_from_DispatchEx(dispex
);
3142 media_query_list
->callback
->media_query_list
= NULL
;
3143 while(!list_empty(&media_query_list
->listeners
)) {
3144 struct media_query_list_listener
*listener
= LIST_ENTRY(list_head(&media_query_list
->listeners
), struct media_query_list_listener
, entry
);
3145 list_remove(&listener
->entry
);
3146 IDispatch_Release(listener
->function
);
3149 unlink_ref(&media_query_list
->nsquerylist
);
3152 static void media_query_list_destructor(DispatchEx
*dispex
)
3154 struct media_query_list
*media_query_list
= media_query_list_from_DispatchEx(dispex
);
3155 nsIDOMMediaQueryListListener_Release(&media_query_list
->callback
->nsIDOMMediaQueryListListener_iface
);
3156 free(media_query_list
);
3159 static const dispex_static_data_vtbl_t media_query_list_dispex_vtbl
= {
3160 .destructor
= media_query_list_destructor
,
3161 .traverse
= media_query_list_traverse
,
3162 .unlink
= media_query_list_unlink
3165 static const tid_t media_query_list_iface_tids
[] = {
3166 IWineMSHTMLMediaQueryList_tid
,
3169 static dispex_static_data_t media_query_list_dispex
= {
3171 &media_query_list_dispex_vtbl
,
3172 IWineMSHTMLMediaQueryList_tid
,
3173 media_query_list_iface_tids
3176 HRESULT
create_media_query_list(HTMLWindow
*window
, BSTR media_query
, IDispatch
**ret
)
3178 struct media_query_list
*media_query_list
;
3183 if(!media_query
|| !media_query
[0])
3184 return E_INVALIDARG
;
3186 if(!(media_query_list
= malloc(sizeof(*media_query_list
))))
3187 return E_OUTOFMEMORY
;
3189 if(!(media_query_list
->callback
= malloc(sizeof(*media_query_list
->callback
)))) {
3190 free(media_query_list
);
3191 return E_OUTOFMEMORY
;
3193 media_query_list
->callback
->nsIDOMMediaQueryListListener_iface
.lpVtbl
= &media_query_list_callback_vtbl
;
3194 media_query_list
->callback
->media_query_list
= media_query_list
;
3195 media_query_list
->callback
->ref
= 1;
3197 nsAString_InitDepend(&nsstr
, media_query
);
3198 nsres
= nsIDOMWindow_MatchMedia(window
->outer_window
->nswindow
, &nsstr
, &nsunk
);
3199 nsAString_Finish(&nsstr
);
3200 if(NS_FAILED(nsres
)) {
3201 free(media_query_list
->callback
);
3202 free(media_query_list
);
3203 return map_nsresult(nsres
);
3205 nsres
= nsISupports_QueryInterface(nsunk
, &IID_nsIDOMMediaQueryList
, (void**)&media_query_list
->nsquerylist
);
3206 assert(NS_SUCCEEDED(nsres
));
3207 nsISupports_Release(nsunk
);
3209 nsres
= nsIDOMMediaQueryList_SetListener(media_query_list
->nsquerylist
, &media_query_list
->callback
->nsIDOMMediaQueryListListener_iface
);
3210 assert(NS_SUCCEEDED(nsres
));
3212 media_query_list
->IWineMSHTMLMediaQueryList_iface
.lpVtbl
= &media_query_list_vtbl
;
3213 list_init(&media_query_list
->listeners
);
3214 init_dispatch(&media_query_list
->dispex
, (IUnknown
*)&media_query_list
->IWineMSHTMLMediaQueryList_iface
,
3215 &media_query_list_dispex
, dispex_compat_mode(&window
->inner_window
->event_target
.dispex
));
3217 *ret
= (IDispatch
*)&media_query_list
->IWineMSHTMLMediaQueryList_iface
;