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