mshtml: Add Polish translation.
[wine] / dlls / mshtml / htmlstylesheet.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "winnls.h"
30 #include "ole2.h"
31
32 #include "wine/debug.h"
33 #include "wine/unicode.h"
34
35 #include "mshtml_private.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
38
39 typedef struct {
40     const IHTMLStyleSheetVtbl *lpHTMLStyleSheetVtbl;
41
42     LONG ref;
43
44     nsIDOMCSSStyleSheet *nsstylesheet;
45 } HTMLStyleSheet;
46
47 typedef struct {
48     const IHTMLStyleSheetsCollectionVtbl *lpHTMLStyleSheetsCollectionVtbl;
49
50     LONG ref;
51
52     nsIDOMStyleSheetList *nslist;
53 } HTMLStyleSheetsCollection;
54
55 typedef struct {
56     const IHTMLStyleSheetRulesCollectionVtbl *lpHTMLStyleSheetRulesCollectionVtbl;
57
58     LONG ref;
59
60     nsIDOMCSSRuleList *nslist;
61 } HTMLStyleSheetRulesCollection;
62
63 #define HTMLSTYLESHEET(x)     ((IHTMLStyleSheet*)                &(x)->lpHTMLStyleSheetVtbl);
64 #define HTMLSTYLESHEETSCOL(x) ((IHTMLStyleSheetsCollection*)     &(x)->lpHTMLStyleSheetsCollectionVtbl);
65 #define HTMLSTYLERULESCOL(x)  ((IHTMLStyleSheetRulesCollection*) &(x)->lpHTMLStyleSheetRulesCollectionVtbl)
66
67 #define HTMLSTYLERULESCOL_THIS(iface) \
68     DEFINE_THIS(HTMLStyleSheetRulesCollection, HTMLStyleSheetRulesCollection, iface)
69
70 static HRESULT WINAPI HTMLStyleSheetRulesCollection_QueryInterface(IHTMLStyleSheetRulesCollection *iface,
71         REFIID riid, void **ppv)
72 {
73     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
74
75     if(IsEqualGUID(&IID_IUnknown, riid)) {
76         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
77         *ppv = HTMLSTYLERULESCOL(This);
78     }else if(IsEqualGUID(&IID_IHTMLStyleSheetRulesCollection, riid)) {
79         TRACE("(%p)->(IID_IHTMLStyleSheetRulesCollection %p)\n", This, ppv);
80         *ppv = HTMLSTYLERULESCOL(This);
81     }
82
83     if(*ppv) {
84         IUnknown_AddRef((IUnknown*)*ppv);
85         return S_OK;
86     }
87
88     FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
89     return E_NOINTERFACE;
90 }
91
92 static ULONG WINAPI HTMLStyleSheetRulesCollection_AddRef(IHTMLStyleSheetRulesCollection *iface)
93 {
94     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
95     LONG ref = InterlockedIncrement(&This->ref);
96
97     TRACE("(%p) ref=%d\n", This, ref);
98
99     return ref;
100 }
101
102 static ULONG WINAPI HTMLStyleSheetRulesCollection_Release(IHTMLStyleSheetRulesCollection *iface)
103 {
104     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
105     LONG ref = InterlockedDecrement(&This->ref);
106
107     TRACE("(%p) ref=%d\n", This, ref);
108
109     if(!ref) {
110         if(This->nslist)
111             nsIDOMCSSRuleList_Release(This->nslist);
112         heap_free(This);
113     }
114
115     return ref;
116 }
117
118 static HRESULT WINAPI HTMLStyleSheetRulesCollection_GetTypeInfoCount(
119         IHTMLStyleSheetRulesCollection *iface, UINT *pctinfo)
120 {
121     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
122     FIXME("(%p)->(%p)\n", This, pctinfo);
123     return E_NOTIMPL;
124 }
125
126 static HRESULT WINAPI HTMLStyleSheetRulesCollection_GetTypeInfo(IHTMLStyleSheetRulesCollection *iface,
127         UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
128 {
129     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
130     FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
131     return E_NOTIMPL;
132 }
133
134 static HRESULT WINAPI HTMLStyleSheetRulesCollection_GetIDsOfNames(IHTMLStyleSheetRulesCollection *iface,
135         REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
136 {
137     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
138     FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
139           lcid, rgDispId);
140     return E_NOTIMPL;
141 }
142
143 static HRESULT WINAPI HTMLStyleSheetRulesCollection_Invoke(IHTMLStyleSheetRulesCollection *iface,
144         DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
145         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
146 {
147     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
148     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
149           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
150     return E_NOTIMPL;
151 }
152
153 static HRESULT WINAPI HTMLStyleSheetRulesCollection_get_length(IHTMLStyleSheetRulesCollection *iface,
154         long *p)
155 {
156     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
157     PRUint32 len = 0;
158
159     TRACE("(%p)->(%p)\n", This, p);
160
161     if(This->nslist) {
162         nsresult nsres;
163
164         nsres = nsIDOMCSSRuleList_GetLength(This->nslist, &len);
165         if(NS_FAILED(nsres))
166             ERR("GetLength failed: %08x\n", nsres);
167     }
168
169     *p = len;
170     return S_OK;
171 }
172
173 static HRESULT WINAPI HTMLStyleSheetRulesCollection_item(IHTMLStyleSheetRulesCollection *iface,
174         long index, IHTMLStyleSheetRule **ppHTMLStyleSheetRule)
175 {
176     HTMLStyleSheetRulesCollection *This = HTMLSTYLERULESCOL_THIS(iface);
177     FIXME("(%p)->(%ld %p)\n", This, index, ppHTMLStyleSheetRule);
178     return E_NOTIMPL;
179 }
180
181 #undef HTMLSTYLERULECOL_THIS
182
183 static const IHTMLStyleSheetRulesCollectionVtbl HTMLStyleSheetRulesCollectionVtbl = {
184     HTMLStyleSheetRulesCollection_QueryInterface,
185     HTMLStyleSheetRulesCollection_AddRef,
186     HTMLStyleSheetRulesCollection_Release,
187     HTMLStyleSheetRulesCollection_GetTypeInfoCount,
188     HTMLStyleSheetRulesCollection_GetTypeInfo,
189     HTMLStyleSheetRulesCollection_GetIDsOfNames,
190     HTMLStyleSheetRulesCollection_Invoke,
191     HTMLStyleSheetRulesCollection_get_length,
192     HTMLStyleSheetRulesCollection_item
193 };
194
195 static IHTMLStyleSheetRulesCollection *HTMLStyleSheetRulesCollection_Create(nsIDOMCSSRuleList *nslist)
196 {
197     HTMLStyleSheetRulesCollection *ret;
198
199     ret = heap_alloc(sizeof(*ret));
200     ret->lpHTMLStyleSheetRulesCollectionVtbl = &HTMLStyleSheetRulesCollectionVtbl;
201     ret->ref = 1;
202     ret->nslist = nslist;
203
204     if(nslist)
205         nsIDOMCSSRuleList_AddRef(nslist);
206
207     return HTMLSTYLERULESCOL(ret);
208 }
209
210 #define HTMLSTYLESHEETSCOL_THIS(iface) \
211     DEFINE_THIS(HTMLStyleSheetsCollection, HTMLStyleSheetsCollection, iface)
212
213 static HRESULT WINAPI HTMLStyleSheetsCollection_QueryInterface(IHTMLStyleSheetsCollection *iface,
214          REFIID riid, void **ppv)
215 {
216     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
217
218     *ppv = NULL;
219
220     if(IsEqualGUID(&IID_IUnknown, riid)) {
221         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
222         *ppv = HTMLSTYLESHEETSCOL(This);
223     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
224         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
225         *ppv = HTMLSTYLESHEETSCOL(This);
226     }else if(IsEqualGUID(&IID_IHTMLStyleSheetsCollection, riid)) {
227         TRACE("(%p)->(IID_IHTMLStyleSheetsCollection %p)\n", This, ppv);
228         *ppv = HTMLSTYLESHEETSCOL(This);
229     }
230
231     if(*ppv) {
232         IUnknown_AddRef((IUnknown*)*ppv);
233         return S_OK;
234     }
235
236     WARN("unsupported %s\n", debugstr_guid(riid));
237     return E_NOINTERFACE;
238 }
239
240 static ULONG WINAPI HTMLStyleSheetsCollection_AddRef(IHTMLStyleSheetsCollection *iface)
241 {
242     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
243     LONG ref = InterlockedIncrement(&This->ref);
244
245     TRACE("(%p) ref=%d\n", This, ref);
246
247     return ref;
248 }
249
250 static ULONG WINAPI HTMLStyleSheetsCollection_Release(IHTMLStyleSheetsCollection *iface)
251 {
252     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
253     LONG ref = InterlockedDecrement(&This->ref);
254
255     TRACE("(%p) ref=%d\n", This, ref);
256
257     if(!ref) {
258         if(This->nslist)
259             nsIDOMStyleSheetList_Release(This->nslist);
260         heap_free(This);
261     }
262
263     return ref;
264 }
265
266 static HRESULT WINAPI HTMLStyleSheetsCollection_GetTypeInfoCount(IHTMLStyleSheetsCollection *iface,
267         UINT *pctinfo)
268 {
269     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
270     FIXME("(%p)->(%p)\n", This, pctinfo);
271     return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI HTMLStyleSheetsCollection_GetTypeInfo(IHTMLStyleSheetsCollection *iface,
275         UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
276 {
277     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
278     FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
279     return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI HTMLStyleSheetsCollection_GetIDsOfNames(IHTMLStyleSheetsCollection *iface,
283         REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
284 {
285     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
286     FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
287           lcid, rgDispId);
288     return E_NOTIMPL;
289 }
290
291 static HRESULT WINAPI HTMLStyleSheetsCollection_Invoke(IHTMLStyleSheetsCollection *iface,
292         DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
293         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
294 {
295     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
296     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
297           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
298     return E_NOTIMPL;
299 }
300
301 static HRESULT WINAPI HTMLStyleSheetsCollection_get_length(IHTMLStyleSheetsCollection *iface,
302         long *p)
303 {
304     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
305     PRUint32 len = 0;
306
307     TRACE("(%p)->(%p)\n", This, p);
308
309     if(This->nslist)
310         nsIDOMStyleSheetList_GetLength(This->nslist, &len);
311
312     *p = len;
313     return S_OK;
314 }
315
316 static HRESULT WINAPI HTMLStyleSheetsCollection_get__newEnum(IHTMLStyleSheetsCollection *iface,
317         IUnknown **p)
318 {
319     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
320     FIXME("(%p)->(%p)\n", This, p);
321     return E_NOTIMPL;
322 }
323
324 static HRESULT WINAPI HTMLStyleSheetsCollection_item(IHTMLStyleSheetsCollection *iface,
325         VARIANT *pvarIndex, VARIANT *pvarResult)
326 {
327     HTMLStyleSheetsCollection *This = HTMLSTYLESHEETSCOL_THIS(iface);
328
329     TRACE("(%p)->(%p %p)\n", This, pvarIndex, pvarResult);
330
331     switch(V_VT(pvarIndex)) {
332     case VT_I4: {
333         nsIDOMStyleSheet *nsstylesheet;
334         nsresult nsres;
335
336         TRACE("index=%d\n", V_I4(pvarIndex));
337
338         nsres = nsIDOMStyleSheetList_Item(This->nslist, V_I4(pvarIndex), &nsstylesheet);
339         if(NS_FAILED(nsres) || !nsstylesheet) {
340             WARN("Item failed: %08x\n", nsres);
341             V_VT(pvarResult) = VT_EMPTY;
342             return E_INVALIDARG;
343         }
344
345         V_VT(pvarResult) = VT_DISPATCH;
346         V_DISPATCH(pvarResult) = (IDispatch*)HTMLStyleSheet_Create(nsstylesheet);
347
348         return S_OK;
349     }
350
351     case VT_BSTR:
352         FIXME("id=%s not implemented\n", debugstr_w(V_BSTR(pvarResult)));
353         return E_NOTIMPL;
354
355     default:
356         WARN("Invalid vt=%d\n", V_VT(pvarIndex));
357     }
358
359     return E_INVALIDARG;
360 }
361
362 #undef HTMLSTYLESHEETSCOL_THIS
363
364 static const IHTMLStyleSheetsCollectionVtbl HTMLStyleSheetsCollectionVtbl = {
365     HTMLStyleSheetsCollection_QueryInterface,
366     HTMLStyleSheetsCollection_AddRef,
367     HTMLStyleSheetsCollection_Release,
368     HTMLStyleSheetsCollection_GetTypeInfoCount,
369     HTMLStyleSheetsCollection_GetTypeInfo,
370     HTMLStyleSheetsCollection_GetIDsOfNames,
371     HTMLStyleSheetsCollection_Invoke,
372     HTMLStyleSheetsCollection_get_length,
373     HTMLStyleSheetsCollection_get__newEnum,
374     HTMLStyleSheetsCollection_item
375 };
376
377 IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList *nslist)
378 {
379     HTMLStyleSheetsCollection *ret = heap_alloc(sizeof(HTMLStyleSheetsCollection));
380
381     ret->lpHTMLStyleSheetsCollectionVtbl = &HTMLStyleSheetsCollectionVtbl;
382     ret->ref = 1;
383
384     if(nslist)
385         nsIDOMStyleSheetList_AddRef(nslist);
386     ret->nslist = nslist;
387
388     return HTMLSTYLESHEETSCOL(ret);
389 }
390
391 #define HTMLSTYLESHEET_THIS(iface) DEFINE_THIS(HTMLStyleSheet, HTMLStyleSheet, iface)
392
393 static HRESULT WINAPI HTMLStyleSheet_QueryInterface(IHTMLStyleSheet *iface, REFIID riid, void **ppv)
394 {
395     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
396
397     *ppv = NULL;
398
399     if(IsEqualGUID(&IID_IUnknown, riid)) {
400         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
401         *ppv = HTMLSTYLESHEET(This);
402     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
403         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
404         *ppv = HTMLSTYLESHEET(This);
405     }else if(IsEqualGUID(&IID_IHTMLStyleSheet, riid)) {
406         TRACE("(%p)->(IID_IHTMLStyleSheet %p)\n", This, ppv);
407         *ppv = HTMLSTYLESHEET(This);
408     }
409
410     if(*ppv) {
411         IUnknown_AddRef((IUnknown*)*ppv);
412         return S_OK;
413     }
414
415     WARN("unsupported %s\n", debugstr_guid(riid));
416     return E_NOINTERFACE;
417 }
418
419 static ULONG WINAPI HTMLStyleSheet_AddRef(IHTMLStyleSheet *iface)
420 {
421     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
422     LONG ref = InterlockedIncrement(&This->ref);
423
424     TRACE("(%p) ref=%d\n", This, ref);
425
426     return ref;
427 }
428
429 static ULONG WINAPI HTMLStyleSheet_Release(IHTMLStyleSheet *iface)
430 {
431     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
432     LONG ref = InterlockedDecrement(&This->ref);
433
434     TRACE("(%p) ref=%d\n", This, ref);
435
436     if(!ref)
437         heap_free(This);
438
439     return ref;
440 }
441
442 static HRESULT WINAPI HTMLStyleSheet_GetTypeInfoCount(IHTMLStyleSheet *iface, UINT *pctinfo)
443 {
444     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
445     FIXME("(%p)->(%p)\n", This, pctinfo);
446     return E_NOTIMPL;
447 }
448
449 static HRESULT WINAPI HTMLStyleSheet_GetTypeInfo(IHTMLStyleSheet *iface, UINT iTInfo,
450                                               LCID lcid, ITypeInfo **ppTInfo)
451 {
452     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
453     FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
454     return E_NOTIMPL;
455 }
456
457 static HRESULT WINAPI HTMLStyleSheet_GetIDsOfNames(IHTMLStyleSheet *iface, REFIID riid,
458                                                 LPOLESTR *rgszNames, UINT cNames,
459                                                 LCID lcid, DISPID *rgDispId)
460 {
461     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
462     FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
463           lcid, rgDispId);
464     return E_NOTIMPL;
465 }
466
467 static HRESULT WINAPI HTMLStyleSheet_Invoke(IHTMLStyleSheet *iface, DISPID dispIdMember,
468                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
469                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
470 {
471     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
472     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
473           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
474     return E_NOTIMPL;
475 }
476
477 static HRESULT WINAPI HTMLStyleSheet_put_title(IHTMLStyleSheet *iface, BSTR v)
478 {
479     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
480     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
481     return E_NOTIMPL;
482 }
483
484 static HRESULT WINAPI HTMLStyleSheet_get_title(IHTMLStyleSheet *iface, BSTR *p)
485 {
486     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
487     FIXME("(%p)->(%p)\n", This, p);
488     return E_NOTIMPL;
489 }
490
491 static HRESULT WINAPI HTMLStyleSheet_get_parentStyleSheet(IHTMLStyleSheet *iface,
492                                                           IHTMLStyleSheet **p)
493 {
494     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
495     FIXME("(%p)->(%p)\n", This, p);
496     return E_NOTIMPL;
497 }
498
499 static HRESULT WINAPI HTMLStyleSheet_get_owningElement(IHTMLStyleSheet *iface, IHTMLElement **p)
500 {
501     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
502     FIXME("(%p)->(%p)\n", This, p);
503     return E_NOTIMPL;
504 }
505
506 static HRESULT WINAPI HTMLStyleSheet_put_disabled(IHTMLStyleSheet *iface, VARIANT_BOOL v)
507 {
508     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
509     FIXME("(%p)->(%x)\n", This, v);
510     return E_NOTIMPL;
511 }
512
513 static HRESULT WINAPI HTMLStyleSheet_get_disabled(IHTMLStyleSheet *iface, VARIANT_BOOL *p)
514 {
515     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
516     FIXME("(%p)->(%p)\n", This, p);
517     return E_NOTIMPL;
518 }
519
520 static HRESULT WINAPI HTMLStyleSheet_get_readOnly(IHTMLStyleSheet *iface, VARIANT_BOOL *p)
521 {
522     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
523     FIXME("(%p)->(%p)\n", This, p);
524     return E_NOTIMPL;
525 }
526
527 static HRESULT WINAPI HTMLStyleSheet_get_imports(IHTMLStyleSheet *iface,
528                                                  IHTMLStyleSheetsCollection **p)
529 {
530     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
531     FIXME("(%p)->(%p)\n", This, p);
532     return E_NOTIMPL;
533 }
534
535 static HRESULT WINAPI HTMLStyleSheet_put_href(IHTMLStyleSheet *iface, BSTR v)
536 {
537     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
538     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
539     return E_NOTIMPL;
540 }
541
542 static HRESULT WINAPI HTMLStyleSheet_get_href(IHTMLStyleSheet *iface, BSTR *p)
543 {
544     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
545     FIXME("(%p)->(%p)\n", This, p);
546     return E_NOTIMPL;
547 }
548
549 static HRESULT WINAPI HTMLStyleSheet_get_type(IHTMLStyleSheet *iface, BSTR *p)
550 {
551     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
552     FIXME("(%p)->(%p)\n", This, p);
553     return E_NOTIMPL;
554 }
555
556 static HRESULT WINAPI HTMLStyleSheet_get_id(IHTMLStyleSheet *iface, BSTR *p)
557 {
558     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
559     FIXME("(%p)->(%p)\n", This, p);
560     return E_NOTIMPL;
561 }
562
563 static HRESULT WINAPI HTMLStyleSheet_addImport(IHTMLStyleSheet *iface, BSTR bstrURL,
564                                                long lIndex, long *plIndex)
565 {
566     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
567     FIXME("(%p)->(%s %ld %p)\n", This, debugstr_w(bstrURL), lIndex, plIndex);
568     return E_NOTIMPL;
569 }
570
571 static HRESULT WINAPI HTMLStyleSheet_addRule(IHTMLStyleSheet *iface, BSTR bstrSelector,
572                                              BSTR bstrStyle, long lIndex, long *plIndex)
573 {
574     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
575     FIXME("(%p)->(%s %s %ld %p)\n", This, debugstr_w(bstrSelector), debugstr_w(bstrStyle),
576           lIndex, plIndex);
577     return E_NOTIMPL;
578 }
579
580 static HRESULT WINAPI HTMLStyleSheet_removeImport(IHTMLStyleSheet *iface, long lIndex)
581 {
582     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
583     FIXME("(%p)->(%ld)\n", This, lIndex);
584     return E_NOTIMPL;
585 }
586
587 static HRESULT WINAPI HTMLStyleSheet_removeRule(IHTMLStyleSheet *iface, long lIndex)
588 {
589     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
590     FIXME("(%p)->(%ld)\n", This, lIndex);
591     return E_NOTIMPL;
592 }
593
594 static HRESULT WINAPI HTMLStyleSheet_put_media(IHTMLStyleSheet *iface, BSTR v)
595 {
596     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
597     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
598     return E_NOTIMPL;
599 }
600
601 static HRESULT WINAPI HTMLStyleSheet_get_media(IHTMLStyleSheet *iface, BSTR *p)
602 {
603     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
604     FIXME("(%p)->(%p)\n", This, p);
605     return E_NOTIMPL;
606 }
607
608 static HRESULT WINAPI HTMLStyleSheet_put_cssText(IHTMLStyleSheet *iface, BSTR v)
609 {
610     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
611     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
612     return E_NOTIMPL;
613 }
614
615 static HRESULT WINAPI HTMLStyleSheet_get_cssText(IHTMLStyleSheet *iface, BSTR *p)
616 {
617     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
618     FIXME("(%p)->(%p)\n", This, p);
619     return E_NOTIMPL;
620 }
621
622 static HRESULT WINAPI HTMLStyleSheet_get_rules(IHTMLStyleSheet *iface,
623                                                IHTMLStyleSheetRulesCollection **p)
624 {
625     HTMLStyleSheet *This = HTMLSTYLESHEET_THIS(iface);
626     nsIDOMCSSRuleList *nslist = NULL;
627     nsresult nsres;
628
629     TRACE("(%p)->(%p)\n", This, p);
630
631     /* Gecko has buggy security checks and GetCssRules will fail. We have a correct
632      * implementation and it will work when the bug will be fixed in Gecko. */
633     nsres = nsIDOMCSSStyleSheet_GetCssRules(This->nsstylesheet, &nslist);
634     if(NS_FAILED(nsres))
635         WARN("GetCssRules failed: %08x\n", nsres);
636
637     *p = HTMLStyleSheetRulesCollection_Create(nslist);
638     return S_OK;
639 }
640
641 static const IHTMLStyleSheetVtbl HTMLStyleSheetVtbl = {
642     HTMLStyleSheet_QueryInterface,
643     HTMLStyleSheet_AddRef,
644     HTMLStyleSheet_Release,
645     HTMLStyleSheet_GetTypeInfoCount,
646     HTMLStyleSheet_GetTypeInfo,
647     HTMLStyleSheet_GetIDsOfNames,
648     HTMLStyleSheet_Invoke,
649     HTMLStyleSheet_put_title,
650     HTMLStyleSheet_get_title,
651     HTMLStyleSheet_get_parentStyleSheet,
652     HTMLStyleSheet_get_owningElement,
653     HTMLStyleSheet_put_disabled,
654     HTMLStyleSheet_get_disabled,
655     HTMLStyleSheet_get_readOnly,
656     HTMLStyleSheet_get_imports,
657     HTMLStyleSheet_put_href,
658     HTMLStyleSheet_get_href,
659     HTMLStyleSheet_get_type,
660     HTMLStyleSheet_get_id,
661     HTMLStyleSheet_addImport,
662     HTMLStyleSheet_addRule,
663     HTMLStyleSheet_removeImport,
664     HTMLStyleSheet_removeRule,
665     HTMLStyleSheet_put_media,
666     HTMLStyleSheet_get_media,
667     HTMLStyleSheet_put_cssText,
668     HTMLStyleSheet_get_cssText,
669     HTMLStyleSheet_get_rules
670 };
671
672 IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet *nsstylesheet)
673 {
674     HTMLStyleSheet *ret = heap_alloc(sizeof(HTMLStyleSheet));
675     nsresult nsres;
676
677     ret->lpHTMLStyleSheetVtbl = &HTMLStyleSheetVtbl;
678     ret->ref = 1;
679     ret->nsstylesheet = NULL;
680
681     if(nsstylesheet) {
682         nsres = nsIDOMStyleSheet_QueryInterface(nsstylesheet, &IID_nsIDOMCSSStyleSheet,
683                 (void**)&ret->nsstylesheet);
684         if(NS_FAILED(nsres))
685             ERR("Could not get nsICSSStyleSheet interface: %08x\n", nsres);
686     }
687
688     return HTMLSTYLESHEET(ret);
689 }