Reactos
at master 730 lines 22 kB view raw
1/* 2 * Copyright 2008 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 21static const WCHAR autoW[] = {'a','u','t','o',0}; 22static const WCHAR yesW[] = {'y','e','s',0}; 23static const WCHAR noW[] = {'n','o',0}; 24static const WCHAR pxW[] = {'p','x',0}; 25 26HRESULT set_frame_doc(HTMLFrameBase *frame, nsIDOMDocument *nsdoc) 27{ 28 nsIDOMWindow *nswindow; 29 HTMLOuterWindow *window; 30 nsresult nsres; 31 HRESULT hres = S_OK; 32 33 if(frame->content_window) 34 return S_OK; 35 36 nsres = nsIDOMDocument_GetDefaultView(nsdoc, &nswindow); 37 if(NS_FAILED(nsres) || !nswindow) 38 return E_FAIL; 39 40 window = nswindow_to_window(nswindow); 41 if(!window) 42 hres = HTMLOuterWindow_Create(frame->element.node.doc->basedoc.doc_obj, nswindow, 43 frame->element.node.doc->basedoc.window, &window); 44 nsIDOMWindow_Release(nswindow); 45 if(FAILED(hres)) 46 return hres; 47 48 frame->content_window = window; 49 window->frame_element = frame; 50 return S_OK; 51} 52 53static inline HTMLFrameBase *impl_from_IHTMLFrameBase(IHTMLFrameBase *iface) 54{ 55 return CONTAINING_RECORD(iface, HTMLFrameBase, IHTMLFrameBase_iface); 56} 57 58static HRESULT WINAPI HTMLFrameBase_QueryInterface(IHTMLFrameBase *iface, REFIID riid, void **ppv) 59{ 60 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 61 62 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); 63} 64 65static ULONG WINAPI HTMLFrameBase_AddRef(IHTMLFrameBase *iface) 66{ 67 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 68 69 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); 70} 71 72static ULONG WINAPI HTMLFrameBase_Release(IHTMLFrameBase *iface) 73{ 74 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 75 76 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); 77} 78 79static HRESULT WINAPI HTMLFrameBase_GetTypeInfoCount(IHTMLFrameBase *iface, UINT *pctinfo) 80{ 81 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 82 83 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo); 84} 85 86static HRESULT WINAPI HTMLFrameBase_GetTypeInfo(IHTMLFrameBase *iface, UINT iTInfo, 87 LCID lcid, ITypeInfo **ppTInfo) 88{ 89 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 90 91 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid, 92 ppTInfo); 93} 94 95static HRESULT WINAPI HTMLFrameBase_GetIDsOfNames(IHTMLFrameBase *iface, REFIID riid, 96 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) 97{ 98 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 99 100 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames, 101 cNames, lcid, rgDispId); 102} 103 104static HRESULT WINAPI HTMLFrameBase_Invoke(IHTMLFrameBase *iface, DISPID dispIdMember, 105 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 106 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 107{ 108 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 109 110 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid, 111 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 112} 113 114static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v) 115{ 116 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 117 118 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 119 120 if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) { 121 nsAString nsstr; 122 nsresult nsres; 123 124 nsAString_InitDepend(&nsstr, v); 125 if(This->nsframe) 126 nsres = nsIDOMHTMLFrameElement_SetSrc(This->nsframe, &nsstr); 127 else 128 nsres = nsIDOMHTMLIFrameElement_SetSrc(This->nsiframe, &nsstr); 129 nsAString_Finish(&nsstr); 130 if(NS_FAILED(nsres)) { 131 ERR("SetSrc failed: %08x\n", nsres); 132 return E_FAIL; 133 } 134 135 return S_OK; 136 } 137 138 return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri, BINDING_NAVIGATED); 139} 140 141static HRESULT WINAPI HTMLFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p) 142{ 143 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 144 nsAString nsstr; 145 nsresult nsres; 146 147 TRACE("(%p)->(%p)\n", This, p); 148 149 if(!This->nsframe && !This->nsiframe) { 150 ERR("No attached frame object\n"); 151 return E_UNEXPECTED; 152 } 153 154 nsAString_Init(&nsstr, NULL); 155 if(This->nsframe) 156 nsres = nsIDOMHTMLFrameElement_GetSrc(This->nsframe, &nsstr); 157 else 158 nsres = nsIDOMHTMLIFrameElement_GetSrc(This->nsiframe, &nsstr); 159 return return_nsstr(nsres, &nsstr, p); 160} 161 162static HRESULT WINAPI HTMLFrameBase_put_name(IHTMLFrameBase *iface, BSTR v) 163{ 164 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 165 nsAString name_str; 166 nsresult nsres; 167 168 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 169 170 if(!This->nsframe && !This->nsiframe) { 171 ERR("No attached ns frame object\n"); 172 return E_UNEXPECTED; 173 } 174 175 nsAString_InitDepend(&name_str, v); 176 if(This->nsframe) 177 nsres = nsIDOMHTMLFrameElement_SetName(This->nsframe, &name_str); 178 else 179 nsres = nsIDOMHTMLIFrameElement_SetName(This->nsiframe, &name_str); 180 nsAString_Finish(&name_str); 181 if(NS_FAILED(nsres)) { 182 ERR("SetName failed: %08x\n", nsres); 183 return E_FAIL; 184 } 185 186 return S_OK; 187} 188 189static HRESULT WINAPI HTMLFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p) 190{ 191 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 192 nsAString nsstr; 193 nsresult nsres; 194 195 TRACE("(%p)->(%p)\n", This, p); 196 197 if(!This->nsframe && !This->nsiframe) { 198 ERR("No attached ns frame object\n"); 199 return E_UNEXPECTED; 200 } 201 202 nsAString_Init(&nsstr, NULL); 203 if(This->nsframe) 204 nsres = nsIDOMHTMLFrameElement_GetName(This->nsframe, &nsstr); 205 else 206 nsres = nsIDOMHTMLIFrameElement_GetName(This->nsiframe, &nsstr); 207 return return_nsstr(nsres, &nsstr, p); 208} 209 210static HRESULT WINAPI HTMLFrameBase_put_border(IHTMLFrameBase *iface, VARIANT v) 211{ 212 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 213 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); 214 return E_NOTIMPL; 215} 216 217static HRESULT WINAPI HTMLFrameBase_get_border(IHTMLFrameBase *iface, VARIANT *p) 218{ 219 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 220 FIXME("(%p)->(%p)\n", This, p); 221 return E_NOTIMPL; 222} 223 224static HRESULT WINAPI HTMLFrameBase_put_frameBorder(IHTMLFrameBase *iface, BSTR v) 225{ 226 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 227 nsAString nsstr; 228 nsresult nsres; 229 230 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 231 232 if(!This->nsframe && !This->nsiframe) { 233 ERR("No attached ns frame object\n"); 234 return E_UNEXPECTED; 235 } 236 237 nsAString_InitDepend(&nsstr, v); 238 if(This->nsframe) 239 nsres = nsIDOMHTMLFrameElement_SetFrameBorder(This->nsframe, &nsstr); 240 else 241 nsres = nsIDOMHTMLIFrameElement_SetFrameBorder(This->nsiframe, &nsstr); 242 nsAString_Finish(&nsstr); 243 if(NS_FAILED(nsres)) { 244 ERR("SetFrameBorder failed: %08x\n", nsres); 245 return E_FAIL; 246 } 247 248 return S_OK; 249} 250 251static HRESULT WINAPI HTMLFrameBase_get_frameBorder(IHTMLFrameBase *iface, BSTR *p) 252{ 253 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 254 nsAString nsstr; 255 nsresult nsres; 256 257 TRACE("(%p)->(%p)\n", This, p); 258 259 if(!This->nsframe && !This->nsiframe) { 260 ERR("No attached ns frame object\n"); 261 return E_UNEXPECTED; 262 } 263 264 nsAString_Init(&nsstr, NULL); 265 if(This->nsframe) 266 nsres = nsIDOMHTMLFrameElement_GetFrameBorder(This->nsframe, &nsstr); 267 else 268 nsres = nsIDOMHTMLIFrameElement_GetFrameBorder(This->nsiframe, &nsstr); 269 return return_nsstr(nsres, &nsstr, p); 270} 271 272static HRESULT WINAPI HTMLFrameBase_put_frameSpacing(IHTMLFrameBase *iface, VARIANT v) 273{ 274 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 275 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); 276 return E_NOTIMPL; 277} 278 279static HRESULT WINAPI HTMLFrameBase_get_frameSpacing(IHTMLFrameBase *iface, VARIANT *p) 280{ 281 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 282 FIXME("(%p)->(%p)\n", This, p); 283 return E_NOTIMPL; 284} 285 286static HRESULT WINAPI HTMLFrameBase_put_marginWidth(IHTMLFrameBase *iface, VARIANT v) 287{ 288 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 289 nsAString nsstr; 290 nsresult nsres; 291 292 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); 293 294 if(V_VT(&v) != VT_BSTR) { 295 FIXME("unsupported %s\n", debugstr_variant(&v)); 296 return E_NOTIMPL; 297 } 298 299 nsAString_InitDepend(&nsstr, V_BSTR(&v)); 300 if(This->nsframe) 301 nsres = nsIDOMHTMLFrameElement_SetMarginWidth(This->nsframe, &nsstr); 302 else 303 nsres = nsIDOMHTMLIFrameElement_SetMarginWidth(This->nsiframe, &nsstr); 304 nsAString_Finish(&nsstr); 305 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; 306} 307 308static HRESULT WINAPI HTMLFrameBase_get_marginWidth(IHTMLFrameBase *iface, VARIANT *p) 309{ 310 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 311 nsAString nsstr; 312 nsresult nsres; 313 HRESULT hres = S_OK; 314 315 TRACE("(%p)->(%p)\n", This, p); 316 317 nsAString_Init(&nsstr, NULL); 318 if(This->nsframe) 319 nsres = nsIDOMHTMLFrameElement_GetMarginWidth(This->nsframe, &nsstr); 320 else 321 nsres = nsIDOMHTMLIFrameElement_GetMarginWidth(This->nsiframe, &nsstr); 322 if(NS_SUCCEEDED(nsres)) { 323 const PRUnichar *str, *end; 324 325 nsAString_GetData(&nsstr, &str); 326 327 if(*str) { 328 BSTR ret; 329 330 end = strstrW(str, pxW); 331 if(!end) 332 end = str+strlenW(str); 333 ret = SysAllocStringLen(str, end-str); 334 if(ret) { 335 V_VT(p) = VT_BSTR; 336 V_BSTR(p) = ret; 337 }else { 338 hres = E_OUTOFMEMORY; 339 } 340 }else { 341 V_VT(p) = VT_BSTR; 342 V_BSTR(p) = NULL; 343 } 344 }else { 345 ERR("GetMarginWidth failed: %08x\n", nsres); 346 hres = E_FAIL; 347 } 348 349 nsAString_Finish(&nsstr); 350 return hres; 351} 352 353static HRESULT WINAPI HTMLFrameBase_put_marginHeight(IHTMLFrameBase *iface, VARIANT v) 354{ 355 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 356 nsAString nsstr; 357 nsresult nsres; 358 359 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); 360 361 if(V_VT(&v) != VT_BSTR) { 362 FIXME("unsupported %s\n", debugstr_variant(&v)); 363 return E_NOTIMPL; 364 } 365 366 nsAString_InitDepend(&nsstr, V_BSTR(&v)); 367 if(This->nsframe) 368 nsres = nsIDOMHTMLFrameElement_SetMarginHeight(This->nsframe, &nsstr); 369 else 370 nsres = nsIDOMHTMLIFrameElement_SetMarginHeight(This->nsiframe, &nsstr); 371 nsAString_Finish(&nsstr); 372 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; 373} 374 375static HRESULT WINAPI HTMLFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p) 376{ 377 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 378 nsAString nsstr; 379 nsresult nsres; 380 HRESULT hres = S_OK; 381 382 TRACE("(%p)->(%p)\n", This, p); 383 384 nsAString_Init(&nsstr, NULL); 385 if(This->nsframe) 386 nsres = nsIDOMHTMLFrameElement_GetMarginHeight(This->nsframe, &nsstr); 387 else 388 nsres = nsIDOMHTMLIFrameElement_GetMarginHeight(This->nsiframe, &nsstr); 389 if(NS_SUCCEEDED(nsres)) { 390 const PRUnichar *str, *end; 391 392 nsAString_GetData(&nsstr, &str); 393 394 if(*str) { 395 BSTR ret; 396 397 end = strstrW(str, pxW); 398 if(!end) 399 end = str+strlenW(str); 400 ret = SysAllocStringLen(str, end-str); 401 if(ret) { 402 V_VT(p) = VT_BSTR; 403 V_BSTR(p) = ret; 404 }else { 405 hres = E_OUTOFMEMORY; 406 } 407 }else { 408 V_VT(p) = VT_BSTR; 409 V_BSTR(p) = NULL; 410 } 411 }else { 412 ERR("SetMarginHeight failed: %08x\n", nsres); 413 hres = E_FAIL; 414 } 415 416 nsAString_Finish(&nsstr); 417 return hres; 418} 419 420static HRESULT WINAPI HTMLFrameBase_put_noResize(IHTMLFrameBase *iface, VARIANT_BOOL v) 421{ 422 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 423 FIXME("(%p)->(%x)\n", This, v); 424 return E_NOTIMPL; 425} 426 427static HRESULT WINAPI HTMLFrameBase_get_noResize(IHTMLFrameBase *iface, VARIANT_BOOL *p) 428{ 429 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 430 FIXME("(%p)->(%p)\n", This, p); 431 return E_NOTIMPL; 432} 433 434static HRESULT WINAPI HTMLFrameBase_put_scrolling(IHTMLFrameBase *iface, BSTR v) 435{ 436 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 437 nsAString nsstr; 438 nsresult nsres; 439 440 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 441 442 if(!(!strcmpiW(v, yesW) || !strcmpiW(v, noW) || !strcmpiW(v, autoW))) 443 return E_INVALIDARG; 444 445 if(This->nsframe) { 446 nsAString_InitDepend(&nsstr, v); 447 nsres = nsIDOMHTMLFrameElement_SetScrolling(This->nsframe, &nsstr); 448 }else if(This->nsiframe) { 449 nsAString_InitDepend(&nsstr, v); 450 nsres = nsIDOMHTMLIFrameElement_SetScrolling(This->nsiframe, &nsstr); 451 }else { 452 ERR("No attached ns frame object\n"); 453 return E_UNEXPECTED; 454 } 455 nsAString_Finish(&nsstr); 456 457 if(NS_FAILED(nsres)) { 458 ERR("SetScrolling failed: 0x%08x\n", nsres); 459 return E_FAIL; 460 } 461 462 return S_OK; 463} 464 465static HRESULT WINAPI HTMLFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p) 466{ 467 HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); 468 nsAString nsstr; 469 const PRUnichar *strdata; 470 nsresult nsres; 471 472 TRACE("(%p)->(%p)\n", This, p); 473 474 if(This->nsframe) { 475 nsAString_Init(&nsstr, NULL); 476 nsres = nsIDOMHTMLFrameElement_GetScrolling(This->nsframe, &nsstr); 477 }else if(This->nsiframe) { 478 nsAString_Init(&nsstr, NULL); 479 nsres = nsIDOMHTMLIFrameElement_GetScrolling(This->nsiframe, &nsstr); 480 }else { 481 ERR("No attached ns frame object\n"); 482 return E_UNEXPECTED; 483 } 484 485 if(NS_FAILED(nsres)) { 486 ERR("GetScrolling failed: 0x%08x\n", nsres); 487 nsAString_Finish(&nsstr); 488 return E_FAIL; 489 } 490 491 nsAString_GetData(&nsstr, &strdata); 492 493 if(*strdata) 494 *p = SysAllocString(strdata); 495 else 496 *p = SysAllocString(autoW); 497 498 nsAString_Finish(&nsstr); 499 500 return *p ? S_OK : E_OUTOFMEMORY; 501} 502 503static const IHTMLFrameBaseVtbl HTMLFrameBaseVtbl = { 504 HTMLFrameBase_QueryInterface, 505 HTMLFrameBase_AddRef, 506 HTMLFrameBase_Release, 507 HTMLFrameBase_GetTypeInfoCount, 508 HTMLFrameBase_GetTypeInfo, 509 HTMLFrameBase_GetIDsOfNames, 510 HTMLFrameBase_Invoke, 511 HTMLFrameBase_put_src, 512 HTMLFrameBase_get_src, 513 HTMLFrameBase_put_name, 514 HTMLFrameBase_get_name, 515 HTMLFrameBase_put_border, 516 HTMLFrameBase_get_border, 517 HTMLFrameBase_put_frameBorder, 518 HTMLFrameBase_get_frameBorder, 519 HTMLFrameBase_put_frameSpacing, 520 HTMLFrameBase_get_frameSpacing, 521 HTMLFrameBase_put_marginWidth, 522 HTMLFrameBase_get_marginWidth, 523 HTMLFrameBase_put_marginHeight, 524 HTMLFrameBase_get_marginHeight, 525 HTMLFrameBase_put_noResize, 526 HTMLFrameBase_get_noResize, 527 HTMLFrameBase_put_scrolling, 528 HTMLFrameBase_get_scrolling 529}; 530 531static inline HTMLFrameBase *impl_from_IHTMLFrameBase2(IHTMLFrameBase2 *iface) 532{ 533 return CONTAINING_RECORD(iface, HTMLFrameBase, IHTMLFrameBase2_iface); 534} 535 536static HRESULT WINAPI HTMLFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv) 537{ 538 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 539 540 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); 541} 542 543static ULONG WINAPI HTMLFrameBase2_AddRef(IHTMLFrameBase2 *iface) 544{ 545 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 546 547 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); 548} 549 550static ULONG WINAPI HTMLFrameBase2_Release(IHTMLFrameBase2 *iface) 551{ 552 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 553 554 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); 555} 556 557static HRESULT WINAPI HTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo) 558{ 559 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 560 FIXME("(%p)\n", This); 561 return E_NOTIMPL; 562} 563 564static HRESULT WINAPI HTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo, 565 LCID lcid, ITypeInfo **ppTInfo) 566{ 567 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 568 FIXME("(%p)\n", This); 569 return E_NOTIMPL; 570} 571 572static HRESULT WINAPI HTMLFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid, 573 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) 574{ 575 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 576 FIXME("(%p)\n", This); 577 return E_NOTIMPL; 578} 579 580static HRESULT WINAPI HTMLFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember, 581 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 582 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 583{ 584 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 585 FIXME("(%p)\n", This); 586 return E_NOTIMPL; 587} 588 589static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p) 590{ 591 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 592 593 TRACE("(%p)->(%p)\n", This, p); 594 595 if(This->content_window) { 596 IHTMLWindow2_AddRef(&This->content_window->base.IHTMLWindow2_iface); 597 *p = &This->content_window->base.IHTMLWindow2_iface; 598 }else { 599 WARN("NULL content window\n"); 600 *p = NULL; 601 } 602 return S_OK; 603} 604 605static HRESULT WINAPI HTMLFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v) 606{ 607 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 608 609 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); 610 611 return set_node_event(&This->element.node, EVENTID_LOAD, &v); 612} 613 614static HRESULT WINAPI HTMLFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p) 615{ 616 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 617 618 TRACE("(%p)->(%p)\n", This, p); 619 620 return get_node_event(&This->element.node, EVENTID_LOAD, p); 621} 622 623static HRESULT WINAPI HTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v) 624{ 625 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 626 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); 627 return E_NOTIMPL; 628} 629 630static HRESULT WINAPI HTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p) 631{ 632 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 633 FIXME("(%p)->(%p)\n", This, p); 634 return E_NOTIMPL; 635} 636 637static HRESULT WINAPI HTMLFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p) 638{ 639 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 640 641 TRACE("(%p)->(%p)\n", This, p); 642 643 if(!This->content_window || !This->content_window->base.inner_window->doc) { 644 FIXME("no document associated\n"); 645 return E_FAIL; 646 } 647 648 return IHTMLDocument2_get_readyState(&This->content_window->base.inner_window->doc->basedoc.IHTMLDocument2_iface, p); 649} 650 651static HRESULT WINAPI HTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v) 652{ 653 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 654 655 FIXME("(%p)->(%x) semi-stub\n", This, v); 656 657 return S_OK; 658} 659 660static HRESULT WINAPI HTMLFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p) 661{ 662 HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); 663 664 FIXME("(%p)->(%p) semi-stub\n", This, p); 665 666 *p = VARIANT_TRUE; 667 return S_OK; 668} 669 670static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = { 671 HTMLFrameBase2_QueryInterface, 672 HTMLFrameBase2_AddRef, 673 HTMLFrameBase2_Release, 674 HTMLFrameBase2_GetTypeInfoCount, 675 HTMLFrameBase2_GetTypeInfo, 676 HTMLFrameBase2_GetIDsOfNames, 677 HTMLFrameBase2_Invoke, 678 HTMLFrameBase2_get_contentWindow, 679 HTMLFrameBase2_put_onload, 680 HTMLFrameBase2_get_onload, 681 HTMLFrameBase2_put_onreadystatechange, 682 HTMLFrameBase2_get_onreadystatechange, 683 HTMLFrameBase2_get_readyState, 684 HTMLFrameBase2_put_allowTransparency, 685 HTMLFrameBase2_get_allowTransparency 686}; 687 688HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv) 689{ 690 if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) { 691 TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv); 692 *ppv = &This->IHTMLFrameBase_iface; 693 }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) { 694 TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv); 695 *ppv = &This->IHTMLFrameBase2_iface; 696 }else { 697 return HTMLElement_QI(&This->element.node, riid, ppv); 698 } 699 700 IUnknown_AddRef((IUnknown*)*ppv); 701 return S_OK; 702} 703 704void HTMLFrameBase_destructor(HTMLFrameBase *This) 705{ 706 if(This->content_window) 707 This->content_window->frame_element = NULL; 708 709 HTMLElement_destructor(&This->element.node); 710} 711 712void HTMLFrameBase_Init(HTMLFrameBase *This, HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, 713 dispex_static_data_t *dispex_data) 714{ 715 nsresult nsres; 716 717 This->IHTMLFrameBase_iface.lpVtbl = &HTMLFrameBaseVtbl; 718 This->IHTMLFrameBase2_iface.lpVtbl = &HTMLFrameBase2Vtbl; 719 720 HTMLElement_Init(&This->element, doc, nselem, dispex_data); 721 722 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLFrameElement, (void**)&This->nsframe); 723 if(NS_FAILED(nsres)) { 724 This->nsframe = NULL; 725 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&This->nsiframe); 726 assert(nsres == NS_OK); 727 }else { 728 This->nsiframe = NULL; 729 } 730}