2 * Copyright 2008 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
29 #include "wine/debug.h"
31 #include "mshtml_private.h"
32 #include "htmlevent.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
39 IHTMLImgElement IHTMLImgElement_iface
;
41 nsIDOMHTMLImageElement
*nsimg
;
44 static inline HTMLImgElement
*impl_from_IHTMLImgElement(IHTMLImgElement
*iface
)
46 return CONTAINING_RECORD(iface
, HTMLImgElement
, IHTMLImgElement_iface
);
49 static HRESULT WINAPI
HTMLImgElement_QueryInterface(IHTMLImgElement
*iface
, REFIID riid
, void **ppv
)
51 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
53 return IHTMLDOMNode_QueryInterface(&This
->element
.node
.IHTMLDOMNode_iface
, riid
, ppv
);
56 static ULONG WINAPI
HTMLImgElement_AddRef(IHTMLImgElement
*iface
)
58 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
60 return IHTMLDOMNode_AddRef(&This
->element
.node
.IHTMLDOMNode_iface
);
63 static ULONG WINAPI
HTMLImgElement_Release(IHTMLImgElement
*iface
)
65 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
67 return IHTMLDOMNode_Release(&This
->element
.node
.IHTMLDOMNode_iface
);
70 static HRESULT WINAPI
HTMLImgElement_GetTypeInfoCount(IHTMLImgElement
*iface
, UINT
*pctinfo
)
72 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
73 return IDispatchEx_GetTypeInfoCount(&This
->element
.node
.dispex
.IDispatchEx_iface
, pctinfo
);
76 static HRESULT WINAPI
HTMLImgElement_GetTypeInfo(IHTMLImgElement
*iface
, UINT iTInfo
,
77 LCID lcid
, ITypeInfo
**ppTInfo
)
79 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
80 return IDispatchEx_GetTypeInfo(&This
->element
.node
.dispex
.IDispatchEx_iface
, iTInfo
, lcid
,
84 static HRESULT WINAPI
HTMLImgElement_GetIDsOfNames(IHTMLImgElement
*iface
, REFIID riid
,
85 LPOLESTR
*rgszNames
, UINT cNames
,
86 LCID lcid
, DISPID
*rgDispId
)
88 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
89 return IDispatchEx_GetIDsOfNames(&This
->element
.node
.dispex
.IDispatchEx_iface
, riid
, rgszNames
,
90 cNames
, lcid
, rgDispId
);
93 static HRESULT WINAPI
HTMLImgElement_Invoke(IHTMLImgElement
*iface
, DISPID dispIdMember
,
94 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
95 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
97 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
98 return IDispatchEx_Invoke(&This
->element
.node
.dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
99 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
102 static HRESULT WINAPI
HTMLImgElement_put_isMap(IHTMLImgElement
*iface
, VARIANT_BOOL v
)
104 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
105 FIXME("(%p)->(%x)\n", This
, v
);
109 static HRESULT WINAPI
HTMLImgElement_get_isMap(IHTMLImgElement
*iface
, VARIANT_BOOL
*p
)
111 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
112 FIXME("(%p)->(%p)\n", This
, p
);
116 static HRESULT WINAPI
HTMLImgElement_put_useMap(IHTMLImgElement
*iface
, BSTR v
)
118 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
119 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
123 static HRESULT WINAPI
HTMLImgElement_get_useMap(IHTMLImgElement
*iface
, BSTR
*p
)
125 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
126 FIXME("(%p)->(%p)\n", This
, p
);
130 static HRESULT WINAPI
HTMLImgElement_get_mimeType(IHTMLImgElement
*iface
, BSTR
*p
)
132 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
133 FIXME("(%p)->(%p)\n", This
, p
);
137 static HRESULT WINAPI
HTMLImgElement_get_fileSize(IHTMLImgElement
*iface
, BSTR
*p
)
139 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
140 FIXME("(%p)->(%p)\n", This
, p
);
144 static HRESULT WINAPI
HTMLImgElement_get_fileCreatedDate(IHTMLImgElement
*iface
, BSTR
*p
)
146 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
147 FIXME("(%p)->(%p)\n", This
, p
);
151 static HRESULT WINAPI
HTMLImgElement_get_fileModifiedDate(IHTMLImgElement
*iface
, BSTR
*p
)
153 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
154 FIXME("(%p)->(%p)\n", This
, p
);
158 static HRESULT WINAPI
HTMLImgElement_get_fileUpdatedDate(IHTMLImgElement
*iface
, BSTR
*p
)
160 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
161 FIXME("(%p)->(%p)\n", This
, p
);
165 static HRESULT WINAPI
HTMLImgElement_get_protocol(IHTMLImgElement
*iface
, BSTR
*p
)
167 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
168 FIXME("(%p)->(%p)\n", This
, p
);
172 static HRESULT WINAPI
HTMLImgElement_get_href(IHTMLImgElement
*iface
, BSTR
*p
)
174 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
175 FIXME("(%p)->(%p)\n", This
, p
);
179 static HRESULT WINAPI
HTMLImgElement_get_nameProp(IHTMLImgElement
*iface
, BSTR
*p
)
181 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
182 FIXME("(%p)->(%p)\n", This
, p
);
186 static HRESULT WINAPI
HTMLImgElement_put_border(IHTMLImgElement
*iface
, VARIANT v
)
188 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
189 FIXME("(%p)->()\n", This
);
193 static HRESULT WINAPI
HTMLImgElement_get_border(IHTMLImgElement
*iface
, VARIANT
*p
)
195 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
196 FIXME("(%p)->(%p)\n", This
, p
);
200 static HRESULT WINAPI
HTMLImgElement_put_vspace(IHTMLImgElement
*iface
, LONG v
)
202 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
203 FIXME("(%p)->(%d)\n", This
, v
);
207 static HRESULT WINAPI
HTMLImgElement_get_vspace(IHTMLImgElement
*iface
, LONG
*p
)
209 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
210 FIXME("(%p)->(%p)\n", This
, p
);
214 static HRESULT WINAPI
HTMLImgElement_put_hspace(IHTMLImgElement
*iface
, LONG v
)
216 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
217 FIXME("(%p)->(%d)\n", This
, v
);
221 static HRESULT WINAPI
HTMLImgElement_get_hspace(IHTMLImgElement
*iface
, LONG
*p
)
223 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
224 FIXME("(%p)->(%p)\n", This
, p
);
228 static HRESULT WINAPI
HTMLImgElement_put_alt(IHTMLImgElement
*iface
, BSTR v
)
230 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
234 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
236 nsAString_InitDepend(&alt_str
, v
);
237 nsres
= nsIDOMHTMLImageElement_SetAlt(This
->nsimg
, &alt_str
);
238 nsAString_Finish(&alt_str
);
240 ERR("SetAlt failed: %08x\n", nsres
);
245 static HRESULT WINAPI
HTMLImgElement_get_alt(IHTMLImgElement
*iface
, BSTR
*p
)
247 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
251 TRACE("(%p)->(%p)\n", This
, p
);
253 nsAString_Init(&alt_str
, NULL
);
254 nsres
= nsIDOMHTMLImageElement_GetAlt(This
->nsimg
, &alt_str
);
255 return return_nsstr(nsres
, &alt_str
, p
);
258 static HRESULT WINAPI
HTMLImgElement_put_src(IHTMLImgElement
*iface
, BSTR v
)
260 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
264 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
266 nsAString_InitDepend(&src_str
, v
);
267 nsres
= nsIDOMHTMLImageElement_SetSrc(This
->nsimg
, &src_str
);
268 nsAString_Finish(&src_str
);
270 ERR("SetSrc failed: %08x\n", nsres
);
275 static HRESULT WINAPI
HTMLImgElement_get_src(IHTMLImgElement
*iface
, BSTR
*p
)
277 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
278 const PRUnichar
*src
;
283 static const WCHAR blockedW
[] = {'B','L','O','C','K','E','D',':',':',0};
285 TRACE("(%p)->(%p)\n", This
, p
);
287 nsAString_Init(&src_str
, NULL
);
288 nsres
= nsIDOMHTMLImageElement_GetSrc(This
->nsimg
, &src_str
);
289 if(NS_SUCCEEDED(nsres
)) {
290 nsAString_GetData(&src_str
, &src
);
292 if(!strncmpiW(src
, blockedW
, sizeof(blockedW
)/sizeof(WCHAR
)-1)) {
293 TRACE("returning BLOCKED::\n");
294 *p
= SysAllocString(blockedW
);
296 hres
= E_OUTOFMEMORY
;
298 hres
= nsuri_to_url(src
, TRUE
, p
);
301 ERR("GetSrc failed: %08x\n", nsres
);
305 nsAString_Finish(&src_str
);
309 static HRESULT WINAPI
HTMLImgElement_put_lowsrc(IHTMLImgElement
*iface
, BSTR v
)
311 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
312 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
316 static HRESULT WINAPI
HTMLImgElement_get_lowsrc(IHTMLImgElement
*iface
, BSTR
*p
)
318 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
319 FIXME("(%p)->(%p)\n", This
, p
);
323 static HRESULT WINAPI
HTMLImgElement_put_vrml(IHTMLImgElement
*iface
, BSTR v
)
325 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
326 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
330 static HRESULT WINAPI
HTMLImgElement_get_vrml(IHTMLImgElement
*iface
, BSTR
*p
)
332 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
333 FIXME("(%p)->(%p)\n", This
, p
);
337 static HRESULT WINAPI
HTMLImgElement_put_dynsrc(IHTMLImgElement
*iface
, BSTR v
)
339 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
340 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
344 static HRESULT WINAPI
HTMLImgElement_get_dynsrc(IHTMLImgElement
*iface
, BSTR
*p
)
346 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
347 FIXME("(%p)->(%p)\n", This
, p
);
351 static HRESULT WINAPI
HTMLImgElement_get_readyState(IHTMLImgElement
*iface
, BSTR
*p
)
353 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
354 FIXME("(%p)->(%p)\n", This
, p
);
358 static HRESULT WINAPI
HTMLImgElement_get_complete(IHTMLImgElement
*iface
, VARIANT_BOOL
*p
)
360 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
361 FIXME("(%p)->(%p)\n", This
, p
);
365 static HRESULT WINAPI
HTMLImgElement_put_loop(IHTMLImgElement
*iface
, VARIANT v
)
367 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
368 FIXME("(%p)->()\n", This
);
372 static HRESULT WINAPI
HTMLImgElement_get_loop(IHTMLImgElement
*iface
, VARIANT
*p
)
374 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
375 FIXME("(%p)->(%p)\n", This
, p
);
379 static HRESULT WINAPI
HTMLImgElement_put_align(IHTMLImgElement
*iface
, BSTR v
)
381 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
382 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
386 static HRESULT WINAPI
HTMLImgElement_get_align(IHTMLImgElement
*iface
, BSTR
*p
)
388 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
389 FIXME("(%p)->(%p)\n", This
, p
);
393 static HRESULT WINAPI
HTMLImgElement_put_onload(IHTMLImgElement
*iface
, VARIANT v
)
395 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
397 TRACE("(%p)->(%s)\n", This
, debugstr_variant(&v
));
399 return set_node_event(&This
->element
.node
, EVENTID_LOAD
, &v
);
402 static HRESULT WINAPI
HTMLImgElement_get_onload(IHTMLImgElement
*iface
, VARIANT
*p
)
404 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
406 TRACE("(%p)->(%p)\n", This
, p
);
408 return get_node_event(&This
->element
.node
, EVENTID_LOAD
, p
);
411 static HRESULT WINAPI
HTMLImgElement_put_onerror(IHTMLImgElement
*iface
, VARIANT v
)
413 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
415 TRACE("(%p)->()\n", This
);
417 return set_node_event(&This
->element
.node
, EVENTID_ERROR
, &v
);
420 static HRESULT WINAPI
HTMLImgElement_get_onerror(IHTMLImgElement
*iface
, VARIANT
*p
)
422 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
424 TRACE("(%p)->(%p)\n", This
, p
);
426 return get_node_event(&This
->element
.node
, EVENTID_ERROR
, p
);
429 static HRESULT WINAPI
HTMLImgElement_put_onabort(IHTMLImgElement
*iface
, VARIANT v
)
431 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
432 FIXME("(%p)->()\n", This
);
436 static HRESULT WINAPI
HTMLImgElement_get_onabort(IHTMLImgElement
*iface
, VARIANT
*p
)
438 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
439 FIXME("(%p)->(%p)\n", This
, p
);
443 static HRESULT WINAPI
HTMLImgElement_put_name(IHTMLImgElement
*iface
, BSTR v
)
445 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
446 FIXME("(%p)->(%s)\n", This
, debugstr_w(v
));
450 static HRESULT WINAPI
HTMLImgElement_get_name(IHTMLImgElement
*iface
, BSTR
*p
)
452 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
456 TRACE("(%p)->(%p)\n", This
, p
);
458 nsAString_Init(&name
, NULL
);
459 nsres
= nsIDOMHTMLImageElement_GetName(This
->nsimg
, &name
);
460 return return_nsstr(nsres
, &name
, p
);
463 static HRESULT WINAPI
HTMLImgElement_put_width(IHTMLImgElement
*iface
, LONG v
)
465 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
468 TRACE("(%p)->(%d)\n", This
, v
);
470 nsres
= nsIDOMHTMLImageElement_SetWidth(This
->nsimg
, v
);
471 if(NS_FAILED(nsres
)) {
472 ERR("SetWidth failed: %08x\n", nsres
);
479 static HRESULT WINAPI
HTMLImgElement_get_width(IHTMLImgElement
*iface
, LONG
*p
)
481 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
485 TRACE("(%p)->(%p)\n", This
, p
);
487 nsres
= nsIDOMHTMLImageElement_GetWidth(This
->nsimg
, &width
);
488 if(NS_FAILED(nsres
)) {
489 ERR("GetWidth failed: %08x\n", nsres
);
497 static HRESULT WINAPI
HTMLImgElement_put_height(IHTMLImgElement
*iface
, LONG v
)
499 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
502 TRACE("(%p)->(%d)\n", This
, v
);
504 nsres
= nsIDOMHTMLImageElement_SetHeight(This
->nsimg
, v
);
505 if(NS_FAILED(nsres
)) {
506 ERR("SetHeight failed: %08x\n", nsres
);
513 static HRESULT WINAPI
HTMLImgElement_get_height(IHTMLImgElement
*iface
, LONG
*p
)
515 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
519 TRACE("(%p)->(%p)\n", This
, p
);
521 nsres
= nsIDOMHTMLImageElement_GetHeight(This
->nsimg
, &height
);
522 if(NS_FAILED(nsres
)) {
523 ERR("GetHeight failed: %08x\n", nsres
);
531 static HRESULT WINAPI
HTMLImgElement_put_start(IHTMLImgElement
*iface
, BSTR v
)
533 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
534 FIXME("(%p)->()\n", This
);
538 static HRESULT WINAPI
HTMLImgElement_get_start(IHTMLImgElement
*iface
, BSTR
*p
)
540 HTMLImgElement
*This
= impl_from_IHTMLImgElement(iface
);
541 FIXME("(%p)->(%p)\n", This
, p
);
545 static const IHTMLImgElementVtbl HTMLImgElementVtbl
= {
546 HTMLImgElement_QueryInterface
,
547 HTMLImgElement_AddRef
,
548 HTMLImgElement_Release
,
549 HTMLImgElement_GetTypeInfoCount
,
550 HTMLImgElement_GetTypeInfo
,
551 HTMLImgElement_GetIDsOfNames
,
552 HTMLImgElement_Invoke
,
553 HTMLImgElement_put_isMap
,
554 HTMLImgElement_get_isMap
,
555 HTMLImgElement_put_useMap
,
556 HTMLImgElement_get_useMap
,
557 HTMLImgElement_get_mimeType
,
558 HTMLImgElement_get_fileSize
,
559 HTMLImgElement_get_fileCreatedDate
,
560 HTMLImgElement_get_fileModifiedDate
,
561 HTMLImgElement_get_fileUpdatedDate
,
562 HTMLImgElement_get_protocol
,
563 HTMLImgElement_get_href
,
564 HTMLImgElement_get_nameProp
,
565 HTMLImgElement_put_border
,
566 HTMLImgElement_get_border
,
567 HTMLImgElement_put_vspace
,
568 HTMLImgElement_get_vspace
,
569 HTMLImgElement_put_hspace
,
570 HTMLImgElement_get_hspace
,
571 HTMLImgElement_put_alt
,
572 HTMLImgElement_get_alt
,
573 HTMLImgElement_put_src
,
574 HTMLImgElement_get_src
,
575 HTMLImgElement_put_lowsrc
,
576 HTMLImgElement_get_lowsrc
,
577 HTMLImgElement_put_vrml
,
578 HTMLImgElement_get_vrml
,
579 HTMLImgElement_put_dynsrc
,
580 HTMLImgElement_get_dynsrc
,
581 HTMLImgElement_get_readyState
,
582 HTMLImgElement_get_complete
,
583 HTMLImgElement_put_loop
,
584 HTMLImgElement_get_loop
,
585 HTMLImgElement_put_align
,
586 HTMLImgElement_get_align
,
587 HTMLImgElement_put_onload
,
588 HTMLImgElement_get_onload
,
589 HTMLImgElement_put_onerror
,
590 HTMLImgElement_get_onerror
,
591 HTMLImgElement_put_onabort
,
592 HTMLImgElement_get_onabort
,
593 HTMLImgElement_put_name
,
594 HTMLImgElement_get_name
,
595 HTMLImgElement_put_width
,
596 HTMLImgElement_get_width
,
597 HTMLImgElement_put_height
,
598 HTMLImgElement_get_height
,
599 HTMLImgElement_put_start
,
600 HTMLImgElement_get_start
603 static inline HTMLImgElement
*impl_from_HTMLDOMNode(HTMLDOMNode
*iface
)
605 return CONTAINING_RECORD(iface
, HTMLImgElement
, element
.node
);
608 static HRESULT
HTMLImgElement_QI(HTMLDOMNode
*iface
, REFIID riid
, void **ppv
)
610 HTMLImgElement
*This
= impl_from_HTMLDOMNode(iface
);
614 if(IsEqualGUID(&IID_IHTMLImgElement
, riid
)) {
615 TRACE("(%p)->(IID_IHTMLImgElement %p)\n", This
, ppv
);
616 *ppv
= &This
->IHTMLImgElement_iface
;
618 return HTMLElement_QI(&This
->element
.node
, riid
, ppv
);
621 IUnknown_AddRef((IUnknown
*)*ppv
);
625 static HRESULT
HTMLImgElement_get_readystate(HTMLDOMNode
*iface
, BSTR
*p
)
627 HTMLImgElement
*This
= impl_from_HTMLDOMNode(iface
);
629 return IHTMLImgElement_get_readyState(&This
->IHTMLImgElement_iface
, p
);
632 static const NodeImplVtbl HTMLImgElementImplVtbl
= {
634 HTMLElement_destructor
,
636 HTMLElement_get_attr_col
,
643 HTMLImgElement_get_readystate
646 static const tid_t HTMLImgElement_iface_tids
[] = {
651 static dispex_static_data_t HTMLImgElement_dispex
= {
655 HTMLImgElement_iface_tids
658 HRESULT
HTMLImgElement_Create(HTMLDocumentNode
*doc
, nsIDOMHTMLElement
*nselem
, HTMLElement
**elem
)
663 ret
= heap_alloc_zero(sizeof(HTMLImgElement
));
665 return E_OUTOFMEMORY
;
667 ret
->IHTMLImgElement_iface
.lpVtbl
= &HTMLImgElementVtbl
;
668 ret
->element
.node
.vtbl
= &HTMLImgElementImplVtbl
;
670 HTMLElement_Init(&ret
->element
, doc
, nselem
, &HTMLImgElement_dispex
);
672 nsres
= nsIDOMHTMLElement_QueryInterface(nselem
, &IID_nsIDOMHTMLImageElement
, (void**)&ret
->nsimg
);
674 /* Share nsimg reference with nsnode */
675 assert(nsres
== NS_OK
&& (nsIDOMNode
*)ret
->nsimg
== ret
->element
.node
.nsnode
);
676 nsIDOMNode_Release(ret
->element
.node
.nsnode
);
678 *elem
= &ret
->element
;
682 static inline HTMLImageElementFactory
*impl_from_IHTMLImageElementFactory(IHTMLImageElementFactory
*iface
)
684 return CONTAINING_RECORD(iface
, HTMLImageElementFactory
, IHTMLImageElementFactory_iface
);
687 static HRESULT WINAPI
HTMLImageElementFactory_QueryInterface(IHTMLImageElementFactory
*iface
,
688 REFIID riid
, void **ppv
)
690 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
694 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
695 TRACE("(%p)->(IID_Unknown %p)\n", This
, ppv
);
696 *ppv
= &This
->IHTMLImageElementFactory_iface
;
697 }else if(IsEqualGUID(&IID_IHTMLImageElementFactory
, riid
)) {
698 TRACE("(%p)->(IID_IHTMLImageElementFactory %p)\n", This
, ppv
);
699 *ppv
= &This
->IHTMLImageElementFactory_iface
;
700 }else if(dispex_query_interface(&This
->dispex
, riid
, ppv
))
701 return *ppv
? S_OK
: E_NOINTERFACE
;
704 IUnknown_AddRef((IUnknown
*)*ppv
);
708 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
709 return E_NOINTERFACE
;
712 static ULONG WINAPI
HTMLImageElementFactory_AddRef(IHTMLImageElementFactory
*iface
)
714 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
715 LONG ref
= InterlockedIncrement(&This
->ref
);
717 TRACE("(%p) ref=%d\n", This
, ref
);
722 static ULONG WINAPI
HTMLImageElementFactory_Release(IHTMLImageElementFactory
*iface
)
724 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
725 LONG ref
= InterlockedDecrement(&This
->ref
);
727 TRACE("(%p) ref=%d\n", This
, ref
);
735 static HRESULT WINAPI
HTMLImageElementFactory_GetTypeInfoCount(IHTMLImageElementFactory
*iface
,
738 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
739 FIXME("(%p)->(%p)\n", This
, pctinfo
);
743 static HRESULT WINAPI
HTMLImageElementFactory_GetTypeInfo(IHTMLImageElementFactory
*iface
,
744 UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
746 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
747 FIXME("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
751 static HRESULT WINAPI
HTMLImageElementFactory_GetIDsOfNames(IHTMLImageElementFactory
*iface
,
752 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
,
755 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
756 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
,
757 cNames
, lcid
, rgDispId
);
761 static HRESULT WINAPI
HTMLImageElementFactory_Invoke(IHTMLImageElementFactory
*iface
,
762 DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
763 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
,
766 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
767 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
768 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
772 static LONG
var_to_size(const VARIANT
*v
)
783 hres
= VarI4FromStr(V_BSTR(v
), 0, 0, &ret
);
785 FIXME("VarI4FromStr failed: %08x\n", hres
);
791 FIXME("unsupported size %s\n", debugstr_variant(v
));
796 static HRESULT WINAPI
HTMLImageElementFactory_create(IHTMLImageElementFactory
*iface
,
797 VARIANT width
, VARIANT height
, IHTMLImgElement
**img_elem
)
799 HTMLImageElementFactory
*This
= impl_from_IHTMLImageElementFactory(iface
);
800 HTMLDocumentNode
*doc
;
801 IHTMLImgElement
*img
;
803 nsIDOMHTMLElement
*nselem
;
807 static const PRUnichar imgW
[] = {'I','M','G',0};
809 TRACE("(%p)->(%s %s %p)\n", This
, debugstr_variant(&width
),
810 debugstr_variant(&height
), img_elem
);
812 if(!This
->window
|| !This
->window
->base
.inner_window
->doc
) {
817 doc
= This
->window
->base
.inner_window
->doc
;
821 hres
= create_nselem(doc
, imgW
, &nselem
);
825 hres
= HTMLElement_Create(doc
, (nsIDOMNode
*)nselem
, FALSE
, &elem
);
826 nsIDOMHTMLElement_Release(nselem
);
828 ERR("HTMLElement_Create failed\n");
832 hres
= IHTMLElement_QueryInterface(&elem
->IHTMLElement_iface
, &IID_IHTMLImgElement
,
834 IHTMLElement_Release(&elem
->IHTMLElement_iface
);
836 ERR("IHTMLElement_QueryInterface failed: 0x%08x\n", hres
);
840 l
= var_to_size(&width
);
842 IHTMLImgElement_put_width(img
, l
);
843 l
= var_to_size(&height
);
845 IHTMLImgElement_put_height(img
, l
);
851 static const IHTMLImageElementFactoryVtbl HTMLImageElementFactoryVtbl
= {
852 HTMLImageElementFactory_QueryInterface
,
853 HTMLImageElementFactory_AddRef
,
854 HTMLImageElementFactory_Release
,
855 HTMLImageElementFactory_GetTypeInfoCount
,
856 HTMLImageElementFactory_GetTypeInfo
,
857 HTMLImageElementFactory_GetIDsOfNames
,
858 HTMLImageElementFactory_Invoke
,
859 HTMLImageElementFactory_create
862 static inline HTMLImageElementFactory
*impl_from_DispatchEx(DispatchEx
*iface
)
864 return CONTAINING_RECORD(iface
, HTMLImageElementFactory
, dispex
);
867 static HRESULT
HTMLImageElementFactory_value(DispatchEx
*dispex
, LCID lcid
,
868 WORD flags
, DISPPARAMS
*params
, VARIANT
*res
, EXCEPINFO
*ei
,
869 IServiceProvider
*caller
)
871 HTMLImageElementFactory
*This
= impl_from_DispatchEx(dispex
);
872 IHTMLImgElement
*img
;
873 VARIANT empty
, *width
, *height
;
875 int argc
= params
->cArgs
- params
->cNamedArgs
;
879 V_VT(&empty
) = VT_EMPTY
;
881 width
= argc
>= 1 ? params
->rgvarg
+ (params
->cArgs
- 1) : &empty
;
882 height
= argc
>= 2 ? params
->rgvarg
+ (params
->cArgs
- 2) : &empty
;
884 hres
= IHTMLImageElementFactory_create(&This
->IHTMLImageElementFactory_iface
, *width
, *height
,
889 V_VT(res
) = VT_DISPATCH
;
890 V_DISPATCH(res
) = (IDispatch
*)img
;
895 static const tid_t HTMLImageElementFactory_iface_tids
[] = {
896 IHTMLImageElementFactory_tid
,
900 static const dispex_static_data_vtbl_t HTMLImageElementFactory_dispex_vtbl
= {
901 HTMLImageElementFactory_value
,
907 static dispex_static_data_t HTMLImageElementFactory_dispex
= {
908 &HTMLImageElementFactory_dispex_vtbl
,
909 IHTMLImageElementFactory_tid
,
911 HTMLImageElementFactory_iface_tids
914 HRESULT
HTMLImageElementFactory_Create(HTMLInnerWindow
*window
, HTMLImageElementFactory
**ret_val
)
916 HTMLImageElementFactory
*ret
;
918 ret
= heap_alloc(sizeof(HTMLImageElementFactory
));
920 return E_OUTOFMEMORY
;
922 ret
->IHTMLImageElementFactory_iface
.lpVtbl
= &HTMLImageElementFactoryVtbl
;
924 ret
->window
= window
;
926 init_dispex(&ret
->dispex
, (IUnknown
*)&ret
->IHTMLImageElementFactory_iface
,
927 &HTMLImageElementFactory_dispex
);