2 * Copyright 2005-2006 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
31 #include "wine/debug.h"
32 #include "wine/unicode.h"
34 #include "mshtml_private.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
38 #define NS_APPSTARTUPNOTIFIER_CONTRACTID "@mozilla.org/embedcomp/appstartup-notifier;1"
39 #define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"
40 #define NS_PROFILE_CONTRACTID "@mozilla.org/profile/manager;1"
41 #define NS_MEMORY_CONTRACTID "@mozilla.org/xpcom/memory-service;1"
42 #define NS_STRINGSTREAM_CONTRACTID "@mozilla.org/io/string-input-stream;1"
43 #define NS_COMMANDPARAMS_CONTRACTID "@mozilla.org/embedcomp/command-params;1"
44 #define NS_HTMLSERIALIZER_CONTRACTID "@mozilla.org/layout/contentserializer;1?mimetype=text/html"
46 #define APPSTARTUP_TOPIC "app-startup"
48 #define PR_UINT32_MAX 0xffffffff
50 struct nsCStringContainer
{
57 static nsresult (*NS_InitXPCOM2
)(nsIServiceManager
**,void*,void*);
58 static nsresult (*NS_ShutdownXPCOM
)(nsIServiceManager
*);
59 static nsresult (*NS_GetComponentRegistrar
)(nsIComponentRegistrar
**);
60 static nsresult (*NS_StringContainerInit
)(nsStringContainer
*);
61 static nsresult (*NS_CStringContainerInit
)(nsCStringContainer
*);
62 static nsresult (*NS_StringContainerFinish
)(nsStringContainer
*);
63 static nsresult (*NS_CStringContainerFinish
)(nsCStringContainer
*);
64 static nsresult (*NS_StringSetData
)(nsAString
*,const PRUnichar
*,PRUint32
);
65 static nsresult (*NS_CStringSetData
)(nsACString
*,const char*,PRUint32
);
66 static nsresult (*NS_NewLocalFile
)(const nsAString
*,PRBool
,nsIFile
**);
67 static PRUint32 (*NS_StringGetData
)(const nsAString
*,const PRUnichar
**,PRBool
*);
68 static PRUint32 (*NS_CStringGetData
)(const nsACString
*,const char**,PRBool
*);
70 static HINSTANCE hXPCOM
= NULL
;
72 static nsIServiceManager
*pServMgr
= NULL
;
73 static nsIComponentManager
*pCompMgr
= NULL
;
74 static nsIMemory
*nsmem
= NULL
;
76 static const WCHAR wszNsContainer
[] = {'N','s','C','o','n','t','a','i','n','e','r',0};
78 static ATOM nscontainer_class
;
80 static LRESULT WINAPI
nsembed_proc(HWND hwnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
85 static const WCHAR wszTHIS
[] = {'T','H','I','S',0};
87 if(msg
== WM_CREATE
) {
88 This
= *(NSContainer
**)lParam
;
89 SetPropW(hwnd
, wszTHIS
, This
);
91 This
= (NSContainer
*)GetPropW(hwnd
, wszTHIS
);
96 TRACE("(%p)->(WM_SIZE)\n", This
);
98 nsres
= nsIBaseWindow_SetSize(This
->window
,
99 LOWORD(lParam
), HIWORD(lParam
), TRUE
);
101 WARN("SetSize failed: %08x\n", nsres
);
104 return DefWindowProcW(hwnd
, msg
, wParam
, lParam
);
108 static void register_nscontainer_class(void)
110 static WNDCLASSEXW wndclass
= {
114 0, 0, NULL
, NULL
, NULL
, NULL
, NULL
,
118 wndclass
.hInstance
= hInst
;
119 nscontainer_class
= RegisterClassExW(&wndclass
);
122 static BOOL
load_xpcom(PRUnichar
*gre_path
)
124 WCHAR path_env
[MAX_PATH
];
127 static const WCHAR wszPATH
[] = {'P','A','T','H',0};
128 static const WCHAR strXPCOM
[] = {'x','p','c','o','m','.','d','l','l',0};
130 TRACE("(%s)\n", debugstr_w(gre_path
));
132 /* We have to modify PATH as XPCOM loads other DLLs from this directory. */
133 GetEnvironmentVariableW(wszPATH
, path_env
, sizeof(path_env
)/sizeof(WCHAR
));
134 len
= strlenW(path_env
);
135 path_env
[len
++] = ';';
136 strcpyW(path_env
+len
, gre_path
);
137 SetEnvironmentVariableW(wszPATH
, path_env
);
139 hXPCOM
= LoadLibraryW(strXPCOM
);
141 WARN("Could not load XPCOM: %d\n", GetLastError());
145 #define NS_DLSYM(func) \
146 func = (typeof(func))GetProcAddress(hXPCOM, #func); \
148 ERR("Could not GetProcAddress(" #func ") failed\n")
150 NS_DLSYM(NS_InitXPCOM2
);
151 NS_DLSYM(NS_ShutdownXPCOM
);
152 NS_DLSYM(NS_GetComponentRegistrar
);
153 NS_DLSYM(NS_StringContainerInit
);
154 NS_DLSYM(NS_CStringContainerInit
);
155 NS_DLSYM(NS_StringContainerFinish
);
156 NS_DLSYM(NS_CStringContainerFinish
);
157 NS_DLSYM(NS_StringSetData
);
158 NS_DLSYM(NS_CStringSetData
);
159 NS_DLSYM(NS_NewLocalFile
);
160 NS_DLSYM(NS_StringGetData
);
161 NS_DLSYM(NS_CStringGetData
);
168 static BOOL
load_mozilla(PRUnichar
*gre_path
)
170 DWORD res
, type
, i
, size
= MAX_PATH
;
171 HKEY mozilla_key
, hkey
;
175 static const WCHAR wszGreKey
[] =
176 {'S','o','f','t','w','a','r','e','\\',
177 'm','o','z','i','l','l','a','.','o','r','g','\\',
180 static const WCHAR wszGreHome
[] = {'G','r','e','H','o','m','e',0};
182 res
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, wszGreKey
, &mozilla_key
);
183 if(res
!= ERROR_SUCCESS
) {
184 TRACE("Could not open key %s\n", debugstr_w(wszGreKey
));
188 for(i
=0; !ret
&& RegEnumKeyW(mozilla_key
, i
, key_name
, sizeof(key_name
)/sizeof(WCHAR
)) == ERROR_SUCCESS
; i
++) {
189 RegOpenKeyW(mozilla_key
, key_name
, &hkey
);
190 res
= RegQueryValueExW(hkey
, wszGreHome
, NULL
, &type
, (LPBYTE
)gre_path
, &size
);
191 if(res
== ERROR_SUCCESS
)
196 RegCloseKey(mozilla_key
);
197 return ret
? load_xpcom(gre_path
) : FALSE
;
200 static BOOL
load_mozctl(PRUnichar
*gre_path
)
203 DWORD res
, type
, size
= MAX_PATH
;
205 static const WCHAR wszMozCtlKey
[] =
206 {'S','o','f','t','w','a','r','e','\\','M','o','z','i','l','l','a',0};
207 static const WCHAR wszBinDirectoryPath
[] =
208 {'B','i','n','D','i','r','e','c','t','o','r','y','P','a','t','h',0};
209 static const WCHAR wszMozCtlClsidKey
[] =
210 {'C','L','S','I','D','\\',
211 '{','1','3','3','9','B','5','4','C','-','3','4','5','3','-','1','1','D','2',
212 '-','9','3','B','9','-','0','0','0','0','0','0','0','0','0','0','0','0','}','\\',
213 'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
215 res
= RegOpenKeyW(HKEY_LOCAL_MACHINE
, wszMozCtlKey
, &hkey
);
216 if(res
== ERROR_SUCCESS
) {
217 res
= RegQueryValueExW(hkey
, wszBinDirectoryPath
, NULL
, &type
, (LPBYTE
)gre_path
, &size
);
218 if(res
== ERROR_SUCCESS
)
219 return load_xpcom(gre_path
);
221 ERR("Could not get value %s\n", debugstr_w(wszBinDirectoryPath
));
224 res
= RegOpenKeyW(HKEY_CLASSES_ROOT
, wszMozCtlClsidKey
, &hkey
);
225 if(res
== ERROR_SUCCESS
) {
226 res
= RegQueryValueExW(hkey
, NULL
, NULL
, &type
, (LPBYTE
)gre_path
, &size
);
227 if(res
== ERROR_SUCCESS
) {
229 if((ptr
= strrchrW(gre_path
, '\\')))
231 load_xpcom(gre_path
);
233 ERR("Could not get value of %s\n", debugstr_w(wszMozCtlClsidKey
));
237 TRACE("Could not find Mozilla ActiveX Control\n");
242 static BOOL
load_wine_gecko(PRUnichar
*gre_path
)
245 DWORD res
, type
, size
= MAX_PATH
;
247 static const WCHAR wszMshtmlKey
[] = {
248 'S','o','f','t','w','a','r','e','\\','W','i','n','e',
249 '\\','M','S','H','T','M','L',0};
250 static const WCHAR wszGeckoPath
[] =
251 {'G','e','c','k','o','P','a','t','h',0};
253 /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
254 res
= RegOpenKeyW(HKEY_CURRENT_USER
, wszMshtmlKey
, &hkey
);
255 if(res
!= ERROR_SUCCESS
)
258 res
= RegQueryValueExW(hkey
, wszGeckoPath
, NULL
, &type
, (LPBYTE
)gre_path
, &size
);
259 if(res
!= ERROR_SUCCESS
|| type
!= REG_SZ
)
262 return load_xpcom(gre_path
);
265 static void set_profile(void)
268 PRBool exists
= FALSE
;
271 static const WCHAR wszMSHTML
[] = {'M','S','H','T','M','L',0};
273 nsres
= nsIServiceManager_GetServiceByContactID(pServMgr
, NS_PROFILE_CONTRACTID
,
274 &IID_nsIProfile
, (void**)&profile
);
275 if(NS_FAILED(nsres
)) {
276 ERR("Could not get profile service: %08x\n", nsres
);
280 nsres
= nsIProfile_ProfileExists(profile
, wszMSHTML
, &exists
);
282 nsres
= nsIProfile_CreateNewProfile(profile
, wszMSHTML
, NULL
, NULL
, FALSE
);
284 ERR("CreateNewProfile failed: %08x\n", nsres
);
287 nsres
= nsIProfile_SetCurrentProfile(profile
, wszMSHTML
);
289 ERR("SetCurrentProfile failed: %08x\n", nsres
);
291 nsIProfile_Release(profile
);
294 static BOOL
load_gecko(void)
297 nsIObserver
*pStartNotif
;
298 nsIComponentRegistrar
*registrar
= NULL
;
301 PRUnichar gre_path
[MAX_PATH
];
303 static BOOL tried_load
= FALSE
;
308 return pCompMgr
!= NULL
;
311 if(!load_wine_gecko(gre_path
) && !load_mozctl(gre_path
) && !load_mozilla(gre_path
)) {
312 install_wine_gecko();
313 if(!load_wine_gecko(gre_path
)) {
314 MESSAGE("Could not load Mozilla. HTML rendering will be disabled.\n");
319 nsAString_Init(&path
, gre_path
);
320 nsres
= NS_NewLocalFile(&path
, FALSE
, &gre_dir
);
321 nsAString_Finish(&path
);
322 if(NS_FAILED(nsres
)) {
323 ERR("NS_NewLocalFile failed: %08x\n", nsres
);
328 nsres
= NS_InitXPCOM2(&pServMgr
, gre_dir
, NULL
);
329 if(NS_FAILED(nsres
)) {
330 ERR("NS_InitXPCOM2 failed: %08x\n", nsres
);
335 nsres
= nsIServiceManager_QueryInterface(pServMgr
, &IID_nsIComponentManager
, (void**)&pCompMgr
);
337 ERR("Could not get nsIComponentManager: %08x\n", nsres
);
339 nsres
= NS_GetComponentRegistrar(®istrar
);
340 if(NS_SUCCEEDED(nsres
)) {
341 nsres
= nsIComponentRegistrar_AutoRegister(registrar
, NULL
);
343 ERR("AutoRegister(NULL) failed: %08x\n", nsres
);
345 nsres
= nsIComponentRegistrar_AutoRegister(registrar
, gre_dir
);
347 ERR("AutoRegister(gre_dir) failed: %08x\n", nsres
);
349 init_nsio(pCompMgr
, registrar
);
351 ERR("NS_GetComponentRegistrar failed: %08x\n", nsres
);
354 nsres
= nsIComponentManager_CreateInstanceByContractID(pCompMgr
, NS_APPSTARTUPNOTIFIER_CONTRACTID
,
355 NULL
, &IID_nsIObserver
, (void**)&pStartNotif
);
356 if(NS_SUCCEEDED(nsres
)) {
357 nsres
= nsIObserver_Observe(pStartNotif
, NULL
, APPSTARTUP_TOPIC
, NULL
);
359 ERR("Observe failed: %08x\n", nsres
);
361 nsIObserver_Release(pStartNotif
);
363 ERR("could not get appstartup-notifier: %08x\n", nsres
);
368 nsres
= nsIComponentManager_CreateInstanceByContractID(pCompMgr
, NS_MEMORY_CONTRACTID
,
369 NULL
, &IID_nsIMemory
, (void**)&nsmem
);
371 ERR("Could not get nsIMemory: %08x\n", nsres
);
374 register_nsservice(registrar
, pServMgr
);
375 nsIComponentRegistrar_Release(registrar
);
381 void *nsalloc(size_t size
)
383 return nsIMemory_Alloc(nsmem
, size
);
386 void nsfree(void *mem
)
388 nsIMemory_Free(nsmem
, mem
);
391 void nsACString_Init(nsACString
*str
, const char *data
)
393 NS_CStringContainerInit(str
);
395 NS_CStringSetData(str
, data
, PR_UINT32_MAX
);
398 PRUint32
nsACString_GetData(const nsACString
*str
, const char **data
, PRBool
*termited
)
400 return NS_CStringGetData(str
, data
, termited
);
403 void nsACString_Finish(nsACString
*str
)
405 NS_CStringContainerFinish(str
);
408 void nsAString_Init(nsAString
*str
, const PRUnichar
*data
)
410 NS_StringContainerInit(str
);
412 NS_StringSetData(str
, data
, PR_UINT32_MAX
);
415 PRUint32
nsAString_GetData(const nsAString
*str
, const PRUnichar
**data
, PRBool
*termited
)
417 return NS_StringGetData(str
, data
, termited
);
420 void nsAString_Finish(nsAString
*str
)
422 NS_StringContainerFinish(str
);
425 nsIInputStream
*create_nsstream(const char *data
, PRInt32 data_len
)
427 nsIStringInputStream
*ret
;
433 nsres
= nsIComponentManager_CreateInstanceByContractID(pCompMgr
,
434 NS_STRINGSTREAM_CONTRACTID
, NULL
, &IID_nsIStringInputStream
,
436 if(NS_FAILED(nsres
)) {
437 ERR("Could not get nsIStringInputStream\n");
441 nsres
= nsIStringInputStream_SetData(ret
, data
, data_len
);
442 if(NS_FAILED(nsres
)) {
443 ERR("AdoptData failed: %08x\n", nsres
);
444 nsIStringInputStream_Release(ret
);
448 return (nsIInputStream
*)ret
;
451 nsICommandParams
*create_nscommand_params(void)
453 nsICommandParams
*ret
= NULL
;
459 nsres
= nsIComponentManager_CreateInstanceByContractID(pCompMgr
,
460 NS_COMMANDPARAMS_CONTRACTID
, NULL
, &IID_nsICommandParams
,
463 ERR("Could not get nsICommandParams\n");
468 static void nsnode_to_nsstring_rec(nsIContentSerializer
*serializer
, nsIDOMNode
*nsnode
, nsAString
*str
)
470 nsIDOMNodeList
*node_list
= NULL
;
471 PRBool has_children
= FALSE
;
475 nsIDOMNode_HasChildNodes(nsnode
, &has_children
);
477 nsres
= nsIDOMNode_GetNodeType(nsnode
, &type
);
478 if(NS_FAILED(nsres
)) {
479 ERR("GetType failed: %08x\n", nsres
);
485 nsIDOMElement
*nselem
;
486 nsIDOMNode_QueryInterface(nsnode
, &IID_nsIDOMElement
, (void**)&nselem
);
487 nsIContentSerializer_AppendElementStart(serializer
, nselem
, has_children
, str
);
488 nsIDOMElement_Release(nselem
);
493 nsIDOMNode_QueryInterface(nsnode
, &IID_nsIDOMText
, (void**)&nstext
);
494 nsIContentSerializer_AppendText(serializer
, nstext
, 0, -1, str
);
495 nsIDOMText_Release(nstext
);
498 case DOCUMENT_NODE
: {
499 nsIDOMDocument
*nsdoc
;
500 nsIDOMNode_QueryInterface(nsnode
, &IID_nsIDOMDocument
, (void**)&nsdoc
);
501 nsIContentSerializer_AppendDocumentStart(serializer
, nsdoc
, str
);
502 nsIDOMDocument_Release(nsdoc
);
505 FIXME("Unhandled type %u\n", type
);
509 PRUint32 child_cnt
, i
;
510 nsIDOMNode
*child_node
;
512 nsIDOMNode_GetChildNodes(nsnode
, &node_list
);
513 nsIDOMNodeList_GetLength(node_list
, &child_cnt
);
515 for(i
=0; i
<child_cnt
; i
++) {
516 nsres
= nsIDOMNodeList_Item(node_list
, i
, &child_node
);
517 if(NS_SUCCEEDED(nsres
)) {
518 nsnode_to_nsstring_rec(serializer
, child_node
, str
);
519 nsIDOMNode_Release(child_node
);
521 ERR("Item failed: %08x\n", nsres
);
525 nsIDOMNodeList_Release(node_list
);
528 if(type
== ELEMENT_NODE
) {
529 nsIDOMElement
*nselem
;
530 nsIDOMNode_QueryInterface(nsnode
, &IID_nsIDOMElement
, (void**)&nselem
);
531 nsIContentSerializer_AppendElementEnd(serializer
, nselem
, str
);
532 nsIDOMElement_Release(nselem
);
536 void nsnode_to_nsstring(nsIDOMNode
*nsdoc
, nsAString
*str
)
538 nsIContentSerializer
*serializer
;
542 nsres
= nsIComponentManager_CreateInstanceByContractID(pCompMgr
,
543 NS_HTMLSERIALIZER_CONTRACTID
, NULL
, &IID_nsIContentSerializer
,
544 (void**)&serializer
);
545 if(NS_FAILED(nsres
)) {
546 ERR("Could not get nsIContentSerializer: %08x\n", nsres
);
550 nsres
= nsIContentSerializer_Init(serializer
, 0, 100, NULL
, FALSE
);
552 ERR("Init failed: %08x\n", nsres
);
554 nsIDOMDocument_QueryInterface(nsdoc
, &IID_nsIDOMNode
, (void**)&nsnode
);
555 nsnode_to_nsstring_rec(serializer
, nsnode
, str
);
556 nsIDOMNode_Release(nsnode
);
558 nsres
= nsIContentSerializer_Flush(serializer
, str
);
560 ERR("Flush failed: %08x\n", nsres
);
562 nsIContentSerializer_Release(serializer
);
570 nsIComponentManager_Release(pCompMgr
);
573 nsIServiceManager_Release(pServMgr
);
576 nsIMemory_Release(nsmem
);
582 /**********************************************************
583 * nsIWebBrowserChrome interface
586 #define NSWBCHROME_THIS(iface) DEFINE_THIS(NSContainer, WebBrowserChrome, iface)
588 static nsresult NSAPI
nsWebBrowserChrome_QueryInterface(nsIWebBrowserChrome
*iface
,
589 nsIIDRef riid
, nsQIResult result
)
591 NSContainer
*This
= NSWBCHROME_THIS(iface
);
594 if(IsEqualGUID(&IID_nsISupports
, riid
)) {
595 TRACE("(%p)->(IID_nsISupports, %p)\n", This
, result
);
596 *result
= NSWBCHROME(This
);
597 }else if(IsEqualGUID(&IID_nsIWebBrowserChrome
, riid
)) {
598 TRACE("(%p)->(IID_nsIWebBrowserChrome, %p)\n", This
, result
);
599 *result
= NSWBCHROME(This
);
600 }else if(IsEqualGUID(&IID_nsIContextMenuListener
, riid
)) {
601 TRACE("(%p)->(IID_nsIContextMenuListener, %p)\n", This
, result
);
602 *result
= NSCML(This
);
603 }else if(IsEqualGUID(&IID_nsIURIContentListener
, riid
)) {
604 TRACE("(%p)->(IID_nsIURIContentListener %p)\n", This
, result
);
605 *result
= NSURICL(This
);
606 }else if(IsEqualGUID(&IID_nsIEmbeddingSiteWindow
, riid
)) {
607 TRACE("(%p)->(IID_nsIEmbeddingSiteWindow %p)\n", This
, result
);
608 *result
= NSEMBWNDS(This
);
609 }else if(IsEqualGUID(&IID_nsITooltipListener
, riid
)) {
610 TRACE("(%p)->(IID_nsITooltipListener %p)\n", This
, result
);
611 *result
= NSTOOLTIP(This
);
612 }else if(IsEqualGUID(&IID_nsIInterfaceRequestor
, riid
)) {
613 TRACE("(%p)->(IID_nsIInterfaceRequestor %p)\n", This
, result
);
614 *result
= NSIFACEREQ(This
);
615 }else if(IsEqualGUID(&IID_nsIWeakReference
, riid
)) {
616 TRACE("(%p)->(IID_nsIWeakReference %p)\n", This
, result
);
617 *result
= NSWEAKREF(This
);
618 }else if(IsEqualGUID(&IID_nsISupportsWeakReference
, riid
)) {
619 TRACE("(%p)->(IID_nsISupportsWeakReference %p)\n", This
, result
);
620 *result
= NSSUPWEAKREF(This
);
624 nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
628 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), result
);
629 return NS_NOINTERFACE
;
632 static nsrefcnt NSAPI
nsWebBrowserChrome_AddRef(nsIWebBrowserChrome
*iface
)
634 NSContainer
*This
= NSWBCHROME_THIS(iface
);
635 LONG ref
= InterlockedIncrement(&This
->ref
);
637 TRACE("(%p) ref=%d\n", This
, ref
);
642 static nsrefcnt NSAPI
nsWebBrowserChrome_Release(nsIWebBrowserChrome
*iface
)
644 NSContainer
*This
= NSWBCHROME_THIS(iface
);
645 LONG ref
= InterlockedDecrement(&This
->ref
);
647 TRACE("(%p) ref=%d\n", This
, ref
);
651 nsIWebBrowserChrome_Release(NSWBCHROME(This
->parent
));
658 static nsresult NSAPI
nsWebBrowserChrome_SetStatus(nsIWebBrowserChrome
*iface
,
659 PRUint32 statusType
, const PRUnichar
*status
)
661 NSContainer
*This
= NSWBCHROME_THIS(iface
);
662 TRACE("(%p)->(%d %s)\n", This
, statusType
, debugstr_w(status
));
663 return NS_ERROR_NOT_IMPLEMENTED
;
666 static nsresult NSAPI
nsWebBrowserChrome_GetWebBrowser(nsIWebBrowserChrome
*iface
,
667 nsIWebBrowser
**aWebBrowser
)
669 NSContainer
*This
= NSWBCHROME_THIS(iface
);
671 TRACE("(%p)->(%p)\n", This
, aWebBrowser
);
674 return NS_ERROR_INVALID_ARG
;
677 nsIWebBrowser_AddRef(This
->webbrowser
);
678 *aWebBrowser
= This
->webbrowser
;
682 static nsresult NSAPI
nsWebBrowserChrome_SetWebBrowser(nsIWebBrowserChrome
*iface
,
683 nsIWebBrowser
*aWebBrowser
)
685 NSContainer
*This
= NSWBCHROME_THIS(iface
);
687 TRACE("(%p)->(%p)\n", This
, aWebBrowser
);
689 if(aWebBrowser
!= This
->webbrowser
)
690 ERR("Wrong nsWebBrowser!\n");
695 static nsresult NSAPI
nsWebBrowserChrome_GetChromeFlags(nsIWebBrowserChrome
*iface
,
696 PRUint32
*aChromeFlags
)
698 NSContainer
*This
= NSWBCHROME_THIS(iface
);
699 WARN("(%p)->(%p)\n", This
, aChromeFlags
);
700 return NS_ERROR_NOT_IMPLEMENTED
;
703 static nsresult NSAPI
nsWebBrowserChrome_SetChromeFlags(nsIWebBrowserChrome
*iface
,
704 PRUint32 aChromeFlags
)
706 NSContainer
*This
= NSWBCHROME_THIS(iface
);
707 WARN("(%p)->(%08x)\n", This
, aChromeFlags
);
708 return NS_ERROR_NOT_IMPLEMENTED
;
711 static nsresult NSAPI
nsWebBrowserChrome_DestroyBrowserWindow(nsIWebBrowserChrome
*iface
)
713 NSContainer
*This
= NSWBCHROME_THIS(iface
);
714 TRACE("(%p)\n", This
);
715 return NS_ERROR_NOT_IMPLEMENTED
;
718 static nsresult NSAPI
nsWebBrowserChrome_SizeBrowserTo(nsIWebBrowserChrome
*iface
,
719 PRInt32 aCX
, PRInt32 aCY
)
721 NSContainer
*This
= NSWBCHROME_THIS(iface
);
722 WARN("(%p)->(%d %d)\n", This
, aCX
, aCY
);
723 return NS_ERROR_NOT_IMPLEMENTED
;
726 static nsresult NSAPI
nsWebBrowserChrome_ShowAsModal(nsIWebBrowserChrome
*iface
)
728 NSContainer
*This
= NSWBCHROME_THIS(iface
);
729 WARN("(%p)\n", This
);
730 return NS_ERROR_NOT_IMPLEMENTED
;
733 static nsresult NSAPI
nsWebBrowserChrome_IsWindowModal(nsIWebBrowserChrome
*iface
, PRBool
*_retval
)
735 NSContainer
*This
= NSWBCHROME_THIS(iface
);
736 WARN("(%p)->(%p)\n", This
, _retval
);
737 return NS_ERROR_NOT_IMPLEMENTED
;
740 static nsresult NSAPI
nsWebBrowserChrome_ExitModalEventLoop(nsIWebBrowserChrome
*iface
,
743 NSContainer
*This
= NSWBCHROME_THIS(iface
);
744 WARN("(%p)->(%08x)\n", This
, aStatus
);
745 return NS_ERROR_NOT_IMPLEMENTED
;
748 #undef NSWBCHROME_THIS
750 static const nsIWebBrowserChromeVtbl nsWebBrowserChromeVtbl
= {
751 nsWebBrowserChrome_QueryInterface
,
752 nsWebBrowserChrome_AddRef
,
753 nsWebBrowserChrome_Release
,
754 nsWebBrowserChrome_SetStatus
,
755 nsWebBrowserChrome_GetWebBrowser
,
756 nsWebBrowserChrome_SetWebBrowser
,
757 nsWebBrowserChrome_GetChromeFlags
,
758 nsWebBrowserChrome_SetChromeFlags
,
759 nsWebBrowserChrome_DestroyBrowserWindow
,
760 nsWebBrowserChrome_SizeBrowserTo
,
761 nsWebBrowserChrome_ShowAsModal
,
762 nsWebBrowserChrome_IsWindowModal
,
763 nsWebBrowserChrome_ExitModalEventLoop
766 /**********************************************************
767 * nsIContextMenuListener interface
770 #define NSCML_THIS(iface) DEFINE_THIS(NSContainer, ContextMenuListener, iface)
772 static nsresult NSAPI
nsContextMenuListener_QueryInterface(nsIContextMenuListener
*iface
,
773 nsIIDRef riid
, nsQIResult result
)
775 NSContainer
*This
= NSCML_THIS(iface
);
776 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
779 static nsrefcnt NSAPI
nsContextMenuListener_AddRef(nsIContextMenuListener
*iface
)
781 NSContainer
*This
= NSCML_THIS(iface
);
782 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
785 static nsrefcnt NSAPI
nsContextMenuListener_Release(nsIContextMenuListener
*iface
)
787 NSContainer
*This
= NSCML_THIS(iface
);
788 return nsIWebBrowserChrome_Release(NSWBCHROME(This
));
791 static nsresult NSAPI
nsContextMenuListener_OnShowContextMenu(nsIContextMenuListener
*iface
,
792 PRUint32 aContextFlags
, nsIDOMEvent
*aEvent
, nsIDOMNode
*aNode
)
794 NSContainer
*This
= NSCML_THIS(iface
);
795 nsIDOMMouseEvent
*event
;
797 DWORD dwID
= CONTEXT_MENU_DEFAULT
;
800 TRACE("(%p)->(%08x %p %p)\n", This
, aContextFlags
, aEvent
, aNode
);
802 nsres
= nsIDOMEvent_QueryInterface(aEvent
, &IID_nsIDOMMouseEvent
, (void**)&event
);
803 if(NS_FAILED(nsres
)) {
804 ERR("Could not get nsIDOMMouseEvent interface: %08x\n", nsres
);
808 nsIDOMMouseEvent_GetScreenX(event
, &pt
.x
);
809 nsIDOMMouseEvent_GetScreenY(event
, &pt
.y
);
810 nsIDOMMouseEvent_Release(event
);
812 switch(aContextFlags
) {
814 case CONTEXT_DOCUMENT
:
816 dwID
= CONTEXT_MENU_DEFAULT
;
819 case CONTEXT_IMAGE
|CONTEXT_LINK
:
820 dwID
= CONTEXT_MENU_IMAGE
;
823 dwID
= CONTEXT_MENU_ANCHOR
;
826 dwID
= CONTEXT_MENU_CONTROL
;
829 FIXME("aContextFlags=%08x\n", aContextFlags
);
832 HTMLDocument_ShowContextMenu(This
->doc
, dwID
, &pt
);
839 static const nsIContextMenuListenerVtbl nsContextMenuListenerVtbl
= {
840 nsContextMenuListener_QueryInterface
,
841 nsContextMenuListener_AddRef
,
842 nsContextMenuListener_Release
,
843 nsContextMenuListener_OnShowContextMenu
846 /**********************************************************
847 * nsIURIContentListener interface
850 #define NSURICL_THIS(iface) DEFINE_THIS(NSContainer, URIContentListener, iface)
852 static nsresult NSAPI
nsURIContentListener_QueryInterface(nsIURIContentListener
*iface
,
853 nsIIDRef riid
, nsQIResult result
)
855 NSContainer
*This
= NSURICL_THIS(iface
);
856 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
859 static nsrefcnt NSAPI
nsURIContentListener_AddRef(nsIURIContentListener
*iface
)
861 NSContainer
*This
= NSURICL_THIS(iface
);
862 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
865 static nsrefcnt NSAPI
nsURIContentListener_Release(nsIURIContentListener
*iface
)
867 NSContainer
*This
= NSURICL_THIS(iface
);
868 return nsIWebBrowserChrome_Release(NSWBCHROME(This
));
871 static nsresult NSAPI
nsURIContentListener_OnStartURIOpen(nsIURIContentListener
*iface
,
872 nsIURI
*aURI
, PRBool
*_retval
)
874 NSContainer
*This
= NSURICL_THIS(iface
);
875 nsIWineURI
*wine_uri
;
880 nsACString_Init(&spec_str
, NULL
);
881 nsIURI_GetSpec(aURI
, &spec_str
);
882 nsACString_GetData(&spec_str
, &spec
, NULL
);
884 TRACE("(%p)->(%p(%s) %p)\n", This
, aURI
, debugstr_a(spec
), _retval
);
886 nsACString_Finish(&spec_str
);
888 nsres
= nsIURI_QueryInterface(aURI
, &IID_nsIWineURI
, (void**)&wine_uri
);
889 if(NS_FAILED(nsres
)) {
890 WARN("Could not get nsIWineURI interface: %08x\n", nsres
);
891 return NS_ERROR_NOT_IMPLEMENTED
;
894 nsIWineURI_SetNSContainer(wine_uri
, This
);
896 if(This
->bscallback
&& This
->bscallback
->mon
) {
900 hres
= IMoniker_GetDisplayName(This
->bscallback
->mon
, NULL
, 0, &url
);
901 if(SUCCEEDED(hres
)) {
902 IMoniker
*mon
= NULL
;
904 hres
= CreateURLMoniker(NULL
, url
, &mon
);
905 if(SUCCEEDED(hres
)) {
906 nsIWineURI_SetMoniker(wine_uri
, mon
);
907 IMoniker_Release(mon
);
909 WARN("CreateURLMoniker failed: %08x\n", hres
);
912 WARN("GetDisplayName failed: %08x\n", hres
);
916 nsIWineURI_Release(wine_uri
);
919 return This
->content_listener
920 ? nsIURIContentListener_OnStartURIOpen(This
->content_listener
, aURI
, _retval
)
924 static nsresult NSAPI
nsURIContentListener_DoContent(nsIURIContentListener
*iface
,
925 const char *aContentType
, PRBool aIsContentPreferred
, nsIRequest
*aRequest
,
926 nsIStreamListener
**aContentHandler
, PRBool
*_retval
)
928 NSContainer
*This
= NSURICL_THIS(iface
);
930 TRACE("(%p)->(%s %x %p %p %p)\n", This
, debugstr_a(aContentType
), aIsContentPreferred
,
931 aRequest
, aContentHandler
, _retval
);
933 return This
->content_listener
934 ? nsIURIContentListener_DoContent(This
->content_listener
, aContentType
,
935 aIsContentPreferred
, aRequest
, aContentHandler
, _retval
)
936 : NS_ERROR_NOT_IMPLEMENTED
;
939 static nsresult NSAPI
nsURIContentListener_IsPreferred(nsIURIContentListener
*iface
,
940 const char *aContentType
, char **aDesiredContentType
, PRBool
*_retval
)
942 NSContainer
*This
= NSURICL_THIS(iface
);
944 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_a(aContentType
), aDesiredContentType
, _retval
);
946 /* FIXME: Should we do something here? */
949 return This
->content_listener
950 ? nsIURIContentListener_IsPreferred(This
->content_listener
, aContentType
,
951 aDesiredContentType
, _retval
)
955 static nsresult NSAPI
nsURIContentListener_CanHandleContent(nsIURIContentListener
*iface
,
956 const char *aContentType
, PRBool aIsContentPreferred
, char **aDesiredContentType
,
959 NSContainer
*This
= NSURICL_THIS(iface
);
961 TRACE("(%p)->(%s %x %p %p)\n", This
, debugstr_a(aContentType
), aIsContentPreferred
,
962 aDesiredContentType
, _retval
);
964 return This
->content_listener
965 ? nsIURIContentListener_CanHandleContent(This
->content_listener
, aContentType
,
966 aIsContentPreferred
, aDesiredContentType
, _retval
)
967 : NS_ERROR_NOT_IMPLEMENTED
;
970 static nsresult NSAPI
nsURIContentListener_GetLoadCookie(nsIURIContentListener
*iface
,
971 nsISupports
**aLoadCookie
)
973 NSContainer
*This
= NSURICL_THIS(iface
);
975 WARN("(%p)->(%p)\n", This
, aLoadCookie
);
977 return This
->content_listener
978 ? nsIURIContentListener_GetLoadCookie(This
->content_listener
, aLoadCookie
)
979 : NS_ERROR_NOT_IMPLEMENTED
;
982 static nsresult NSAPI
nsURIContentListener_SetLoadCookie(nsIURIContentListener
*iface
,
983 nsISupports
*aLoadCookie
)
985 NSContainer
*This
= NSURICL_THIS(iface
);
987 WARN("(%p)->(%p)\n", This
, aLoadCookie
);
989 return This
->content_listener
990 ? nsIURIContentListener_SetLoadCookie(This
->content_listener
, aLoadCookie
)
991 : NS_ERROR_NOT_IMPLEMENTED
;
994 static nsresult NSAPI
nsURIContentListener_GetParentContentListener(nsIURIContentListener
*iface
,
995 nsIURIContentListener
**aParentContentListener
)
997 NSContainer
*This
= NSURICL_THIS(iface
);
999 TRACE("(%p)->(%p)\n", This
, aParentContentListener
);
1001 if(This
->content_listener
)
1002 nsIURIContentListener_AddRef(This
->content_listener
);
1004 *aParentContentListener
= This
->content_listener
;
1008 static nsresult NSAPI
nsURIContentListener_SetParentContentListener(nsIURIContentListener
*iface
,
1009 nsIURIContentListener
*aParentContentListener
)
1011 NSContainer
*This
= NSURICL_THIS(iface
);
1013 TRACE("(%p)->(%p)\n", This
, aParentContentListener
);
1015 if(aParentContentListener
== NSURICL(This
))
1018 if(This
->content_listener
)
1019 nsIURIContentListener_Release(This
->content_listener
);
1021 This
->content_listener
= aParentContentListener
;
1022 if(This
->content_listener
)
1023 nsIURIContentListener_AddRef(This
->content_listener
);
1030 static const nsIURIContentListenerVtbl nsURIContentListenerVtbl
= {
1031 nsURIContentListener_QueryInterface
,
1032 nsURIContentListener_AddRef
,
1033 nsURIContentListener_Release
,
1034 nsURIContentListener_OnStartURIOpen
,
1035 nsURIContentListener_DoContent
,
1036 nsURIContentListener_IsPreferred
,
1037 nsURIContentListener_CanHandleContent
,
1038 nsURIContentListener_GetLoadCookie
,
1039 nsURIContentListener_SetLoadCookie
,
1040 nsURIContentListener_GetParentContentListener
,
1041 nsURIContentListener_SetParentContentListener
1044 /**********************************************************
1045 * nsIEmbeddinSiteWindow interface
1048 #define NSEMBWNDS_THIS(iface) DEFINE_THIS(NSContainer, EmbeddingSiteWindow, iface)
1050 static nsresult NSAPI
nsEmbeddingSiteWindow_QueryInterface(nsIEmbeddingSiteWindow
*iface
,
1051 nsIIDRef riid
, nsQIResult result
)
1053 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1054 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1057 static nsrefcnt NSAPI
nsEmbeddingSiteWindow_AddRef(nsIEmbeddingSiteWindow
*iface
)
1059 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1060 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
1063 static nsrefcnt NSAPI
nsEmbeddingSiteWindow_Release(nsIEmbeddingSiteWindow
*iface
)
1065 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1066 return nsIWebBrowserChrome_Release(NSWBCHROME(This
));
1069 static nsresult NSAPI
nsEmbeddingSiteWindow_SetDimensions(nsIEmbeddingSiteWindow
*iface
,
1070 PRUint32 flags
, PRInt32 x
, PRInt32 y
, PRInt32 cx
, PRInt32 cy
)
1072 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1073 WARN("(%p)->(%08x %d %d %d %d)\n", This
, flags
, x
, y
, cx
, cy
);
1074 return NS_ERROR_NOT_IMPLEMENTED
;
1077 static nsresult NSAPI
nsEmbeddingSiteWindow_GetDimensions(nsIEmbeddingSiteWindow
*iface
,
1078 PRUint32 flags
, PRInt32
*x
, PRInt32
*y
, PRInt32
*cx
, PRInt32
*cy
)
1080 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1081 WARN("(%p)->(%08x %p %p %p %p)\n", This
, flags
, x
, y
, cx
, cy
);
1082 return NS_ERROR_NOT_IMPLEMENTED
;
1085 static nsresult NSAPI
nsEmbeddingSiteWindow_SetFocus(nsIEmbeddingSiteWindow
*iface
)
1087 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1088 WARN("(%p)\n", This
);
1089 return NS_ERROR_NOT_IMPLEMENTED
;
1092 static nsresult NSAPI
nsEmbeddingSiteWindow_GetVisibility(nsIEmbeddingSiteWindow
*iface
,
1093 PRBool
*aVisibility
)
1095 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1096 WARN("(%p)->(%p)\n", This
, aVisibility
);
1097 return NS_ERROR_NOT_IMPLEMENTED
;
1100 static nsresult NSAPI
nsEmbeddingSiteWindow_SetVisibility(nsIEmbeddingSiteWindow
*iface
,
1103 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1104 WARN("(%p)->(%x)\n", This
, aVisibility
);
1105 return NS_ERROR_NOT_IMPLEMENTED
;
1108 static nsresult NSAPI
nsEmbeddingSiteWindow_GetTitle(nsIEmbeddingSiteWindow
*iface
,
1111 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1112 WARN("(%p)->(%p)\n", This
, aTitle
);
1113 return NS_ERROR_NOT_IMPLEMENTED
;
1116 static nsresult NSAPI
nsEmbeddingSiteWindow_SetTitle(nsIEmbeddingSiteWindow
*iface
,
1117 const PRUnichar
*aTitle
)
1119 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1120 WARN("(%p)->(%s)\n", This
, debugstr_w(aTitle
));
1121 return NS_ERROR_NOT_IMPLEMENTED
;
1124 static nsresult NSAPI
nsEmbeddingSiteWindow_GetSiteWindow(nsIEmbeddingSiteWindow
*iface
,
1127 NSContainer
*This
= NSEMBWNDS_THIS(iface
);
1129 TRACE("(%p)->(%p)\n", This
, aSiteWindow
);
1131 *aSiteWindow
= This
->hwnd
;
1135 static const nsIEmbeddingSiteWindowVtbl nsEmbeddingSiteWindowVtbl
= {
1136 nsEmbeddingSiteWindow_QueryInterface
,
1137 nsEmbeddingSiteWindow_AddRef
,
1138 nsEmbeddingSiteWindow_Release
,
1139 nsEmbeddingSiteWindow_SetDimensions
,
1140 nsEmbeddingSiteWindow_GetDimensions
,
1141 nsEmbeddingSiteWindow_SetFocus
,
1142 nsEmbeddingSiteWindow_GetVisibility
,
1143 nsEmbeddingSiteWindow_SetVisibility
,
1144 nsEmbeddingSiteWindow_GetTitle
,
1145 nsEmbeddingSiteWindow_SetTitle
,
1146 nsEmbeddingSiteWindow_GetSiteWindow
1149 #define NSTOOLTIP_THIS(iface) DEFINE_THIS(NSContainer, TooltipListener, iface)
1151 static nsresult NSAPI
nsTooltipListener_QueryInterface(nsITooltipListener
*iface
, nsIIDRef riid
,
1154 NSContainer
*This
= NSTOOLTIP_THIS(iface
);
1155 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1158 static nsrefcnt NSAPI
nsTooltipListener_AddRef(nsITooltipListener
*iface
)
1160 NSContainer
*This
= NSTOOLTIP_THIS(iface
);
1161 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
1164 static nsrefcnt NSAPI
nsTooltipListener_Release(nsITooltipListener
*iface
)
1166 NSContainer
*This
= NSTOOLTIP_THIS(iface
);
1167 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
1170 static nsresult NSAPI
nsTooltipListener_OnShowTooltip(nsITooltipListener
*iface
,
1171 PRInt32 aXCoord
, PRInt32 aYCoord
, const PRUnichar
*aTipText
)
1173 NSContainer
*This
= NSTOOLTIP_THIS(iface
);
1175 show_tooltip(This
->doc
, aXCoord
, aYCoord
, aTipText
);
1180 static nsresult NSAPI
nsTooltipListener_OnHideTooltip(nsITooltipListener
*iface
)
1182 NSContainer
*This
= NSTOOLTIP_THIS(iface
);
1184 hide_tooltip(This
->doc
);
1189 #undef NSTOOLTIM_THIS
1191 static const nsITooltipListenerVtbl nsTooltipListenerVtbl
= {
1192 nsTooltipListener_QueryInterface
,
1193 nsTooltipListener_AddRef
,
1194 nsTooltipListener_Release
,
1195 nsTooltipListener_OnShowTooltip
,
1196 nsTooltipListener_OnHideTooltip
1199 #define NSIFACEREQ_THIS(iface) DEFINE_THIS(NSContainer, InterfaceRequestor, iface)
1201 static nsresult NSAPI
nsInterfaceRequestor_QueryInterface(nsIInterfaceRequestor
*iface
,
1202 nsIIDRef riid
, nsQIResult result
)
1204 NSContainer
*This
= NSIFACEREQ_THIS(iface
);
1205 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1208 static nsrefcnt NSAPI
nsInterfaceRequestor_AddRef(nsIInterfaceRequestor
*iface
)
1210 NSContainer
*This
= NSIFACEREQ_THIS(iface
);
1211 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
1214 static nsrefcnt NSAPI
nsInterfaceRequestor_Release(nsIInterfaceRequestor
*iface
)
1216 NSContainer
*This
= NSIFACEREQ_THIS(iface
);
1217 return nsIWebBrowserChrome_Release(NSWBCHROME(This
));
1220 static nsresult NSAPI
nsInterfaceRequestor_GetInterface(nsIInterfaceRequestor
*iface
,
1221 nsIIDRef riid
, nsQIResult result
)
1223 NSContainer
*This
= NSIFACEREQ_THIS(iface
);
1225 if(IsEqualGUID(&IID_nsIDOMWindow
, riid
)) {
1226 TRACE("(%p)->(IID_nsIDOMWindow %p)\n", This
, result
);
1227 return nsIWebBrowser_GetContentDOMWindow(This
->webbrowser
, (nsIDOMWindow
**)result
);
1230 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1233 #undef NSIFACEREQ_THIS
1235 static const nsIInterfaceRequestorVtbl nsInterfaceRequestorVtbl
= {
1236 nsInterfaceRequestor_QueryInterface
,
1237 nsInterfaceRequestor_AddRef
,
1238 nsInterfaceRequestor_Release
,
1239 nsInterfaceRequestor_GetInterface
1242 #define NSWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, WeakReference, iface)
1244 static nsresult NSAPI
nsWeakReference_QueryInterface(nsIWeakReference
*iface
,
1245 nsIIDRef riid
, nsQIResult result
)
1247 NSContainer
*This
= NSWEAKREF_THIS(iface
);
1248 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1251 static nsrefcnt NSAPI
nsWeakReference_AddRef(nsIWeakReference
*iface
)
1253 NSContainer
*This
= NSWEAKREF_THIS(iface
);
1254 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
1257 static nsrefcnt NSAPI
nsWeakReference_Release(nsIWeakReference
*iface
)
1259 NSContainer
*This
= NSWEAKREF_THIS(iface
);
1260 return nsIWebBrowserChrome_Release(NSWBCHROME(This
));
1263 static nsresult NSAPI
nsWeakReference_QueryReferent(nsIWeakReference
*iface
,
1264 const nsIID
*riid
, void **result
)
1266 NSContainer
*This
= NSWEAKREF_THIS(iface
);
1267 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1270 #undef NSWEAKREF_THIS
1272 static const nsIWeakReferenceVtbl nsWeakReferenceVtbl
= {
1273 nsWeakReference_QueryInterface
,
1274 nsWeakReference_AddRef
,
1275 nsWeakReference_Release
,
1276 nsWeakReference_QueryReferent
1279 #define NSSUPWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, SupportsWeakReference, iface)
1281 static nsresult NSAPI
nsSupportsWeakReference_QueryInterface(nsISupportsWeakReference
*iface
,
1282 nsIIDRef riid
, nsQIResult result
)
1284 NSContainer
*This
= NSSUPWEAKREF_THIS(iface
);
1285 return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This
), riid
, result
);
1288 static nsrefcnt NSAPI
nsSupportsWeakReference_AddRef(nsISupportsWeakReference
*iface
)
1290 NSContainer
*This
= NSSUPWEAKREF_THIS(iface
);
1291 return nsIWebBrowserChrome_AddRef(NSWBCHROME(This
));
1294 static nsrefcnt NSAPI
nsSupportsWeakReference_Release(nsISupportsWeakReference
*iface
)
1296 NSContainer
*This
= NSSUPWEAKREF_THIS(iface
);
1297 return nsIWebBrowserChrome_Release(NSWBCHROME(This
));
1300 static nsresult NSAPI
nsSupportsWeakReference_GetWeakReference(nsISupportsWeakReference
*iface
,
1301 nsIWeakReference
**_retval
)
1303 NSContainer
*This
= NSSUPWEAKREF_THIS(iface
);
1305 TRACE("(%p)->(%p)\n", This
, _retval
);
1307 nsIWeakReference_AddRef(NSWEAKREF(This
));
1308 *_retval
= NSWEAKREF(This
);
1312 #undef NSWEAKREF_THIS
1314 const nsISupportsWeakReferenceVtbl nsSupportsWeakReferenceVtbl
= {
1315 nsSupportsWeakReference_QueryInterface
,
1316 nsSupportsWeakReference_AddRef
,
1317 nsSupportsWeakReference_Release
,
1318 nsSupportsWeakReference_GetWeakReference
1322 NSContainer
*NSContainer_Create(HTMLDocument
*doc
, NSContainer
*parent
)
1324 nsIWebBrowserSetup
*wbsetup
;
1331 ret
= mshtml_alloc(sizeof(NSContainer
));
1333 ret
->lpWebBrowserChromeVtbl
= &nsWebBrowserChromeVtbl
;
1334 ret
->lpContextMenuListenerVtbl
= &nsContextMenuListenerVtbl
;
1335 ret
->lpURIContentListenerVtbl
= &nsURIContentListenerVtbl
;
1336 ret
->lpEmbeddingSiteWindowVtbl
= &nsEmbeddingSiteWindowVtbl
;
1337 ret
->lpTooltipListenerVtbl
= &nsTooltipListenerVtbl
;
1338 ret
->lpInterfaceRequestorVtbl
= &nsInterfaceRequestorVtbl
;
1339 ret
->lpWeakReferenceVtbl
= &nsWeakReferenceVtbl
;
1340 ret
->lpSupportsWeakReferenceVtbl
= &nsSupportsWeakReferenceVtbl
;
1345 ret
->bscallback
= NULL
;
1346 ret
->content_listener
= NULL
;
1349 nsIWebBrowserChrome_AddRef(NSWBCHROME(parent
));
1350 ret
->parent
= parent
;
1352 nsres
= nsIComponentManager_CreateInstanceByContractID(pCompMgr
, NS_WEBBROWSER_CONTRACTID
,
1353 NULL
, &IID_nsIWebBrowser
, (void**)&ret
->webbrowser
);
1354 if(NS_FAILED(nsres
))
1355 ERR("Creating WebBrowser failed: %08x\n", nsres
);
1357 nsres
= nsIWebBrowser_SetContainerWindow(ret
->webbrowser
, NSWBCHROME(ret
));
1358 if(NS_FAILED(nsres
))
1359 ERR("SetContainerWindow failed: %08x\n", nsres
);
1361 nsres
= nsIWebBrowser_QueryInterface(ret
->webbrowser
, &IID_nsIBaseWindow
,
1362 (void**)&ret
->window
);
1363 if(NS_FAILED(nsres
))
1364 ERR("Could not get nsIBaseWindow interface: %08x\n", nsres
);
1366 nsres
= nsIWebBrowser_QueryInterface(ret
->webbrowser
, &IID_nsIWebBrowserSetup
,
1368 if(NS_SUCCEEDED(nsres
)) {
1369 nsres
= nsIWebBrowserSetup_SetProperty(wbsetup
, SETUP_IS_CHROME_WRAPPER
, TRUE
);
1370 nsIWebBrowserSetup_Release(wbsetup
);
1371 if(NS_FAILED(nsres
))
1372 ERR("SetProperty(SETUP_IS_CHROME_WRAPPER) failed: %08x\n", nsres
);
1374 ERR("Could not get nsIWebBrowserSetup interface\n");
1377 nsres
= nsIWebBrowser_QueryInterface(ret
->webbrowser
, &IID_nsIWebNavigation
,
1378 (void**)&ret
->navigation
);
1379 if(NS_FAILED(nsres
))
1380 ERR("Could not get nsIWebNavigation interface: %08x\n", nsres
);
1382 nsres
= nsIWebBrowserFocus_QueryInterface(ret
->webbrowser
, &IID_nsIWebBrowserFocus
,
1383 (void**)&ret
->focus
);
1384 if(NS_FAILED(nsres
))
1385 ERR("Could not get nsIWebBrowserFocus interface: %08x\n", nsres
);
1387 if(!nscontainer_class
)
1388 register_nscontainer_class();
1390 ret
->hwnd
= CreateWindowExW(0, wszNsContainer
, NULL
,
1391 WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, 0, 0, 100, 100,
1392 GetDesktopWindow(), NULL
, hInst
, ret
);
1394 nsres
= nsIBaseWindow_InitWindow(ret
->window
, ret
->hwnd
, NULL
, 0, 0, 100, 100);
1395 if(NS_SUCCEEDED(nsres
)) {
1396 nsres
= nsIBaseWindow_Create(ret
->window
);
1397 if(NS_FAILED(nsres
))
1398 WARN("Creating window failed: %08x\n", nsres
);
1400 nsIBaseWindow_SetVisibility(ret
->window
, FALSE
);
1401 nsIBaseWindow_SetEnabled(ret
->window
, FALSE
);
1403 ERR("InitWindow failed: %08x\n", nsres
);
1406 nsres
= nsIWebBrowser_SetParentURIContentListener(ret
->webbrowser
, NSURICL(ret
));
1407 if(NS_FAILED(nsres
))
1408 ERR("SetParentURIContentListener failed: %08x\n", nsres
);
1413 void NSContainer_Release(NSContainer
*This
)
1415 TRACE("(%p)\n", This
);
1417 ShowWindow(This
->hwnd
, SW_HIDE
);
1418 SetParent(This
->hwnd
, NULL
);
1420 nsIBaseWindow_SetVisibility(This
->window
, FALSE
);
1421 nsIBaseWindow_Destroy(This
->window
);
1423 nsIWebBrowser_SetContainerWindow(This
->webbrowser
, NULL
);
1425 nsIWebBrowser_Release(This
->webbrowser
);
1426 This
->webbrowser
= NULL
;
1428 nsIWebNavigation_Release(This
->navigation
);
1429 This
->navigation
= NULL
;
1431 nsIBaseWindow_Release(This
->window
);
1432 This
->window
= NULL
;
1434 nsIWebBrowserFocus_Release(This
->focus
);
1437 if(This
->content_listener
) {
1438 nsIURIContentListener_Release(This
->content_listener
);
1439 This
->content_listener
= NULL
;
1443 DestroyWindow(This
->hwnd
);
1447 nsIWebBrowserChrome_Release(NSWBCHROME(This
));