ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

nsembed.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2005-2007 Jacek Caban for CodeWeavers
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 #include "config.h"
00020 
00021 #include <stdarg.h>
00022 
00023 #define COBJMACROS
00024 
00025 #include "windef.h"
00026 #include "winbase.h"
00027 #include "winuser.h"
00028 #include "winreg.h"
00029 #include "ole2.h"
00030 
00031 #include "wine/debug.h"
00032 #include "wine/unicode.h"
00033 
00034 #include "mshtml_private.h"
00035 #include "htmlevent.h"
00036 
00037 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
00038 WINE_DECLARE_DEBUG_CHANNEL(gecko);
00039 
00040 #define NS_APPSTARTUPNOTIFIER_CONTRACTID "@mozilla.org/embedcomp/appstartup-notifier;1"
00041 #define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"
00042 #define NS_MEMORY_CONTRACTID "@mozilla.org/xpcom/memory-service;1"
00043 #define NS_COMMANDPARAMS_CONTRACTID "@mozilla.org/embedcomp/command-params;1"
00044 #define NS_HTMLSERIALIZER_CONTRACTID "@mozilla.org/layout/contentserializer;1?mimetype=text/html"
00045 #define NS_EDITORCONTROLLER_CONTRACTID "@mozilla.org/editor/editorcontroller;1"
00046 #define NS_PREFERENCES_CONTRACTID "@mozilla.org/preferences;1"
00047 
00048 #define APPSTARTUP_TOPIC "app-startup"
00049 
00050 #define PR_UINT32_MAX 0xffffffff
00051 
00052 #define NS_STRING_CONTAINER_INIT_DEPEND  0x0002
00053 #define NS_CSTRING_CONTAINER_INIT_DEPEND 0x0002
00054 
00055 static nsresult (*NS_InitXPCOM2)(nsIServiceManager**,void*,void*);
00056 static nsresult (*NS_ShutdownXPCOM)(nsIServiceManager*);
00057 static nsresult (*NS_GetComponentRegistrar)(nsIComponentRegistrar**);
00058 static nsresult (*NS_StringContainerInit2)(nsStringContainer*,const PRUnichar*,PRUint32,PRUint32);
00059 static nsresult (*NS_CStringContainerInit2)(nsCStringContainer*,const char*,PRUint32,PRUint32);
00060 static nsresult (*NS_StringContainerFinish)(nsStringContainer*);
00061 static nsresult (*NS_CStringContainerFinish)(nsCStringContainer*);
00062 static nsresult (*NS_StringSetData)(nsAString*,const PRUnichar*,PRUint32);
00063 static nsresult (*NS_CStringSetData)(nsACString*,const char*,PRUint32);
00064 static nsresult (*NS_NewLocalFile)(const nsAString*,PRBool,nsIFile**);
00065 static PRUint32 (*NS_StringGetData)(const nsAString*,const PRUnichar **,PRBool*);
00066 static PRUint32 (*NS_CStringGetData)(const nsACString*,const char**,PRBool*);
00067 
00068 static HINSTANCE hXPCOM = NULL;
00069 
00070 static nsIServiceManager *pServMgr = NULL;
00071 static nsIComponentManager *pCompMgr = NULL;
00072 static nsIMemory *nsmem = NULL;
00073 
00074 static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e','r',0};
00075 
00076 static ATOM nscontainer_class;
00077 
00078 static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
00079 {
00080     NSContainer *This;
00081     nsresult nsres;
00082 
00083     static const WCHAR wszTHIS[] = {'T','H','I','S',0};
00084 
00085     if(msg == WM_CREATE) {
00086         This = *(NSContainer**)lParam;
00087         SetPropW(hwnd, wszTHIS, This);
00088     }else {
00089         This = GetPropW(hwnd, wszTHIS);
00090     }
00091 
00092     switch(msg) {
00093     case WM_SIZE:
00094         TRACE("(%p)->(WM_SIZE)\n", This);
00095 
00096         nsres = nsIBaseWindow_SetSize(This->window,
00097                 LOWORD(lParam), HIWORD(lParam), TRUE);
00098         if(NS_FAILED(nsres))
00099             WARN("SetSize failed: %08x\n", nsres);
00100         break;
00101 
00102     case WM_PARENTNOTIFY:
00103         TRACE("WM_PARENTNOTIFY %x\n", (unsigned)wParam);
00104 
00105         switch(wParam) {
00106         case WM_LBUTTONDOWN:
00107         case WM_RBUTTONDOWN:
00108             nsIWebBrowserFocus_Activate(This->focus);
00109         }
00110     }
00111 
00112     return DefWindowProcW(hwnd, msg, wParam, lParam);
00113 }
00114 
00115 
00116 static void register_nscontainer_class(void)
00117 {
00118     static WNDCLASSEXW wndclass = {
00119         sizeof(WNDCLASSEXW),
00120         CS_DBLCLKS,
00121         nsembed_proc,
00122         0, 0, NULL, NULL, NULL, NULL, NULL,
00123         wszNsContainer,
00124         NULL,
00125     };
00126     wndclass.hInstance = hInst;
00127     nscontainer_class = RegisterClassExW(&wndclass);
00128 }
00129 
00130 static void set_environment(LPCWSTR gre_path)
00131 {
00132     WCHAR path_env[MAX_PATH], buf[20];
00133     int len, debug_level = 0;
00134 
00135     static const WCHAR pathW[] = {'P','A','T','H',0};
00136     static const WCHAR warnW[] = {'w','a','r','n',0};
00137     static const WCHAR xpcom_debug_breakW[] =
00138         {'X','P','C','O','M','_','D','E','B','U','G','_','B','R','E','A','K',0};
00139     static const WCHAR nspr_log_modulesW[] =
00140         {'N','S','P','R','_','L','O','G','_','M','O','D','U','L','E','S',0};
00141     static const WCHAR debug_formatW[] = {'a','l','l',':','%','d',0};
00142 
00143     /* We have to modify PATH as XPCOM loads other DLLs from this directory. */
00144     GetEnvironmentVariableW(pathW, path_env, sizeof(path_env)/sizeof(WCHAR));
00145     len = strlenW(path_env);
00146     path_env[len++] = ';';
00147     strcpyW(path_env+len, gre_path);
00148     SetEnvironmentVariableW(pathW, path_env);
00149 
00150     SetEnvironmentVariableW(xpcom_debug_breakW, warnW);
00151 
00152     if(TRACE_ON(gecko))
00153         debug_level = 5;
00154     else if(WARN_ON(gecko))
00155         debug_level = 3;
00156     else if(ERR_ON(gecko))
00157         debug_level = 2;
00158 
00159     sprintfW(buf, debug_formatW, debug_level);
00160     SetEnvironmentVariableW(nspr_log_modulesW, buf);
00161 }
00162 
00163 static BOOL load_xpcom(const PRUnichar *gre_path)
00164 {
00165     static const WCHAR strXPCOM[] = {'x','p','c','o','m','.','d','l','l',0};
00166 
00167     TRACE("(%s)\n", debugstr_w(gre_path));
00168 
00169     set_environment(gre_path);
00170 
00171     hXPCOM = LoadLibraryW(strXPCOM);
00172     if(!hXPCOM) {
00173         WARN("Could not load XPCOM: %d\n", GetLastError());
00174         return FALSE;
00175     }
00176 
00177 #define NS_DLSYM(func) \
00178     func = (void *)GetProcAddress(hXPCOM, #func); \
00179     if(!func) \
00180         ERR("Could not GetProcAddress(" #func ") failed\n")
00181 
00182     NS_DLSYM(NS_InitXPCOM2);
00183     NS_DLSYM(NS_ShutdownXPCOM);
00184     NS_DLSYM(NS_GetComponentRegistrar);
00185     NS_DLSYM(NS_StringContainerInit2);
00186     NS_DLSYM(NS_CStringContainerInit2);
00187     NS_DLSYM(NS_StringContainerFinish);
00188     NS_DLSYM(NS_CStringContainerFinish);
00189     NS_DLSYM(NS_StringSetData);
00190     NS_DLSYM(NS_CStringSetData);
00191     NS_DLSYM(NS_NewLocalFile);
00192     NS_DLSYM(NS_StringGetData);
00193     NS_DLSYM(NS_CStringGetData);
00194 
00195 #undef NS_DLSYM
00196 
00197     return TRUE;
00198 }
00199 
00200 static BOOL check_version(LPCWSTR gre_path, const char *version_string)
00201 {
00202     WCHAR file_name[MAX_PATH];
00203     char version[128];
00204     DWORD read=0;
00205     HANDLE hfile;
00206 
00207     static const WCHAR wszVersion[] = {'\\','V','E','R','S','I','O','N',0};
00208 
00209     strcpyW(file_name, gre_path);
00210     strcatW(file_name, wszVersion);
00211 
00212     hfile = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, NULL,
00213                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
00214     if(hfile == INVALID_HANDLE_VALUE) {
00215         ERR("Could not open VERSION file\n");
00216         return FALSE;
00217     }
00218 
00219     ReadFile(hfile, version, sizeof(version), &read, NULL);
00220     version[read] = 0;
00221     CloseHandle(hfile);
00222 
00223     TRACE("%s\n", debugstr_a(version));
00224 
00225     if(strcmp(version, version_string)) {
00226         ERR("Unexpected version %s, expected %s\n", debugstr_a(version),
00227             debugstr_a(version_string));
00228         return FALSE;
00229     }
00230 
00231     return TRUE;
00232 }
00233 
00234 static BOOL load_wine_gecko_v(PRUnichar *gre_path, HKEY mshtml_key,
00235         const char *version, const char *version_string)
00236 {
00237     DWORD res, type, size = MAX_PATH;
00238     HKEY hkey = mshtml_key;
00239 
00240     static const WCHAR wszGeckoPath[] =
00241         {'G','e','c','k','o','P','a','t','h',0};
00242 
00243     if(version) {
00244         /* @@ Wine registry key: HKCU\Software\Wine\MSHTML<version> */
00245         res = RegOpenKeyA(mshtml_key, version, &hkey);
00246         if(res != ERROR_SUCCESS)
00247             return FALSE;
00248     }
00249 
00250     res = RegQueryValueExW(hkey, wszGeckoPath, NULL, &type, (LPBYTE)gre_path, &size);
00251     if(hkey != mshtml_key)
00252         RegCloseKey(hkey);
00253     if(res != ERROR_SUCCESS || type != REG_SZ)
00254         return FALSE;
00255 
00256     if(!check_version(gre_path, version_string))
00257         return FALSE;
00258 
00259     return load_xpcom(gre_path);
00260 }
00261 
00262 static BOOL load_wine_gecko(PRUnichar *gre_path)
00263 {
00264     HKEY hkey;
00265     DWORD res;
00266     BOOL ret;
00267 
00268     static const WCHAR wszMshtmlKey[] = {
00269         'S','o','f','t','w','a','r','e','\\','W','i','n','e',
00270         '\\','M','S','H','T','M','L',0};
00271 
00272     /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
00273     res = RegOpenKeyW(HKEY_CURRENT_USER, wszMshtmlKey, &hkey);
00274     if(res != ERROR_SUCCESS)
00275         return FALSE;
00276 
00277     ret = load_wine_gecko_v(gre_path, hkey, GECKO_VERSION, GECKO_VERSION_STRING);
00278 
00279     RegCloseKey(hkey);
00280     return ret;
00281 }
00282 
00283 static void set_bool_pref(nsIPrefBranch *pref, const char *pref_name, BOOL val)
00284 {
00285     nsresult nsres;
00286 
00287     nsres = nsIPrefBranch_SetBoolPref(pref, pref_name, val);
00288     if(NS_FAILED(nsres))
00289         ERR("Could not set pref %s\n", debugstr_a(pref_name));
00290 }
00291 
00292 static void set_int_pref(nsIPrefBranch *pref, const char *pref_name, int val)
00293 {
00294     nsresult nsres;
00295 
00296     nsres = nsIPrefBranch_SetIntPref(pref, pref_name, val);
00297     if(NS_FAILED(nsres))
00298         ERR("Could not set pref %s\n", debugstr_a(pref_name));
00299 }
00300 
00301 static void set_string_pref(nsIPrefBranch *pref, const char *pref_name, const char *val)
00302 {
00303     nsresult nsres;
00304 
00305     nsres = nsIPrefBranch_SetCharPref(pref, pref_name, val);
00306     if(NS_FAILED(nsres))
00307         ERR("Could not set pref %s\n", debugstr_a(pref_name));
00308 }
00309 
00310 static void set_lang(nsIPrefBranch *pref)
00311 {
00312     char langs[100];
00313     DWORD res, size, type;
00314     HKEY hkey;
00315 
00316     static const WCHAR international_keyW[] =
00317         {'S','o','f','t','w','a','r','e',
00318          '\\','M','i','c','r','o','s','o','f','t',
00319          '\\','I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',
00320          '\\','I','n','t','e','r','n','a','t','i','o','n','a','l',0};
00321 
00322     res = RegOpenKeyW(HKEY_CURRENT_USER, international_keyW, &hkey);
00323     if(res != ERROR_SUCCESS)
00324         return;
00325 
00326     size = sizeof(langs);
00327     res = RegQueryValueExA(hkey, "AcceptLanguage", 0, &type, (LPBYTE)langs, &size);
00328     RegCloseKey(hkey);
00329     if(res != ERROR_SUCCESS || type != REG_SZ)
00330         return;
00331 
00332     TRACE("Setting lang %s\n", debugstr_a(langs));
00333 
00334     set_string_pref(pref, "intl.accept_languages", langs);
00335 }
00336 
00337 static void set_proxy(nsIPrefBranch *pref)
00338 {
00339     char proxy[512];
00340     char * proxy_port;
00341     int proxy_port_num;
00342     DWORD enabled = 0, res, size, type;
00343     HKEY hkey;
00344 
00345     static const WCHAR proxy_keyW[] =
00346         {'S','o','f','t','w','a','r','e',
00347          '\\','M','i','c','r','o','s','o','f','t',
00348          '\\','W','i','n','d','o','w','s',
00349          '\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',
00350          '\\','I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s',0};
00351 
00352     res = RegOpenKeyW(HKEY_CURRENT_USER, proxy_keyW, &hkey);
00353     if(res != ERROR_SUCCESS)
00354         return;
00355 
00356     size = sizeof(enabled);
00357     res = RegQueryValueExA(hkey, "ProxyEnable", 0, &type, (LPBYTE)&enabled, &size);
00358     if(res != ERROR_SUCCESS || type != REG_DWORD || enabled == 0)
00359     {
00360         RegCloseKey(hkey);
00361         return;
00362     }
00363 
00364     size = sizeof(proxy);
00365     res = RegQueryValueExA(hkey, "ProxyServer", 0, &type, (LPBYTE)proxy, &size);
00366     RegCloseKey(hkey);
00367     if(res != ERROR_SUCCESS || type != REG_SZ)
00368         return;
00369 
00370     proxy_port = strchr(proxy, ':');
00371     if (!proxy_port)
00372         return;
00373 
00374     *proxy_port = 0;
00375     proxy_port_num = atoi(proxy_port + 1);
00376     TRACE("Setting proxy to %s, port %d\n", debugstr_a(proxy), proxy_port_num);
00377 
00378     set_string_pref(pref, "network.proxy.http", proxy);
00379     set_string_pref(pref, "network.proxy.ssl", proxy);
00380 
00381     set_int_pref(pref, "network.proxy.type", 1);
00382     set_int_pref(pref, "network.proxy.http_port", proxy_port_num);
00383     set_int_pref(pref, "network.proxy.ssl_port", proxy_port_num);
00384 }
00385 
00386 static void set_preferences(void)
00387 {
00388     nsIPrefBranch *pref;
00389     nsresult nsres;
00390 
00391     nsres = nsIServiceManager_GetServiceByContractID(pServMgr, NS_PREFERENCES_CONTRACTID,
00392             &IID_nsIPrefBranch, (void**)&pref);
00393     if(NS_FAILED(nsres)) {
00394         ERR("Could not get preference service: %08x\n", nsres);
00395         return;
00396     }
00397 
00398     set_lang(pref);
00399     set_proxy(pref);
00400     set_bool_pref(pref, "security.warn_entering_secure", FALSE);
00401     set_bool_pref(pref, "security.warn_submit_insecure", FALSE);
00402     set_int_pref(pref, "layout.spellcheckDefault", 0);
00403 
00404     nsIPrefBranch_Release(pref);
00405 }
00406 
00407 static BOOL init_xpcom(const PRUnichar *gre_path)
00408 {
00409     nsresult nsres;
00410     nsIObserver *pStartNotif;
00411     nsIComponentRegistrar *registrar = NULL;
00412     nsAString path;
00413     nsIFile *gre_dir;
00414 
00415     nsAString_InitDepend(&path, gre_path);
00416     nsres = NS_NewLocalFile(&path, FALSE, &gre_dir);
00417     nsAString_Finish(&path);
00418     if(NS_FAILED(nsres)) {
00419         ERR("NS_NewLocalFile failed: %08x\n", nsres);
00420         FreeLibrary(hXPCOM);
00421         return FALSE;
00422     }
00423 
00424     nsres = NS_InitXPCOM2(&pServMgr, gre_dir, NULL);
00425     if(NS_FAILED(nsres)) {
00426         ERR("NS_InitXPCOM2 failed: %08x\n", nsres);
00427         FreeLibrary(hXPCOM);
00428         return FALSE;
00429     }
00430 
00431     nsres = nsIServiceManager_QueryInterface(pServMgr, &IID_nsIComponentManager, (void**)&pCompMgr);
00432     if(NS_FAILED(nsres))
00433         ERR("Could not get nsIComponentManager: %08x\n", nsres);
00434 
00435     nsres = NS_GetComponentRegistrar(&registrar);
00436     if(NS_SUCCEEDED(nsres)) {
00437         nsres = nsIComponentRegistrar_AutoRegister(registrar, NULL);
00438         if(NS_FAILED(nsres))
00439             ERR("AutoRegister(NULL) failed: %08x\n", nsres);
00440 
00441         init_nsio(pCompMgr, registrar);
00442     }else {
00443         ERR("NS_GetComponentRegistrar failed: %08x\n", nsres);
00444     }
00445 
00446     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_APPSTARTUPNOTIFIER_CONTRACTID,
00447             NULL, &IID_nsIObserver, (void**)&pStartNotif);
00448     if(NS_SUCCEEDED(nsres)) {
00449         nsres = nsIObserver_Observe(pStartNotif, NULL, APPSTARTUP_TOPIC, NULL);
00450         if(NS_FAILED(nsres))
00451             ERR("Observe failed: %08x\n", nsres);
00452 
00453         nsIObserver_Release(pStartNotif);
00454     }else {
00455         ERR("could not get appstartup-notifier: %08x\n", nsres);
00456     }
00457 
00458     set_preferences();
00459 
00460     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_MEMORY_CONTRACTID,
00461             NULL, &IID_nsIMemory, (void**)&nsmem);
00462     if(NS_FAILED(nsres))
00463         ERR("Could not get nsIMemory: %08x\n", nsres);
00464 
00465     if(registrar) {
00466         register_nsservice(registrar, pServMgr);
00467         nsIComponentRegistrar_Release(registrar);
00468     }
00469 
00470     return TRUE;
00471 }
00472 
00473 static CRITICAL_SECTION cs_load_gecko;
00474 static CRITICAL_SECTION_DEBUG cs_load_gecko_dbg =
00475 {
00476     0, 0, &cs_load_gecko,
00477     { &cs_load_gecko_dbg.ProcessLocksList, &cs_load_gecko_dbg.ProcessLocksList },
00478       0, 0, { (DWORD_PTR)(__FILE__ ": load_gecko") }
00479 };
00480 static CRITICAL_SECTION cs_load_gecko = { &cs_load_gecko_dbg, -1, 0, 0, 0, 0 };
00481 
00482 BOOL load_gecko(BOOL silent)
00483 {
00484     PRUnichar gre_path[MAX_PATH];
00485     BOOL ret = FALSE;
00486 
00487     static DWORD loading_thread;
00488 
00489     TRACE("()\n");
00490 
00491     /* load_gecko may be called recursively */
00492     if(loading_thread == GetCurrentThreadId())
00493         return pCompMgr != NULL;
00494 
00495     EnterCriticalSection(&cs_load_gecko);
00496 
00497     if(!loading_thread) {
00498         loading_thread = GetCurrentThreadId();
00499 
00500         if(load_wine_gecko(gre_path)
00501            || (install_wine_gecko(silent) && load_wine_gecko(gre_path)))
00502             ret = init_xpcom(gre_path);
00503         else
00504            MESSAGE("Could not load wine-gecko. HTML rendering will be disabled.\n");
00505     }else {
00506         ret = pCompMgr != NULL;
00507     }
00508 
00509     LeaveCriticalSection(&cs_load_gecko);
00510 
00511     return ret;
00512 }
00513 
00514 void *nsalloc(size_t size)
00515 {
00516     return nsIMemory_Alloc(nsmem, size);
00517 }
00518 
00519 void nsfree(void *mem)
00520 {
00521     nsIMemory_Free(nsmem, mem);
00522 }
00523 
00524 static BOOL nsACString_Init(nsACString *str, const char *data)
00525 {
00526     return NS_SUCCEEDED(NS_CStringContainerInit2(str, data, PR_UINT32_MAX, 0));
00527 }
00528 
00529 /*
00530  * Initializes nsACString with data owned by caller.
00531  * Caller must ensure that data is valid during lifetime of string object.
00532  */
00533 void nsACString_InitDepend(nsACString *str, const char *data)
00534 {
00535     NS_CStringContainerInit2(str, data, PR_UINT32_MAX, NS_CSTRING_CONTAINER_INIT_DEPEND);
00536 }
00537 
00538 void nsACString_SetData(nsACString *str, const char *data)
00539 {
00540     NS_CStringSetData(str, data, PR_UINT32_MAX);
00541 }
00542 
00543 PRUint32 nsACString_GetData(const nsACString *str, const char **data)
00544 {
00545     return NS_CStringGetData(str, data, NULL);
00546 }
00547 
00548 void nsACString_Finish(nsACString *str)
00549 {
00550     NS_CStringContainerFinish(str);
00551 }
00552 
00553 BOOL nsAString_Init(nsAString *str, const PRUnichar *data)
00554 {
00555     return NS_SUCCEEDED(NS_StringContainerInit2(str, data, PR_UINT32_MAX, 0));
00556 }
00557 
00558 /*
00559  * Initializes nsAString with data owned by caller.
00560  * Caller must ensure that data is valid during lifetime of string object.
00561  */
00562 void nsAString_InitDepend(nsAString *str, const PRUnichar *data)
00563 {
00564     NS_StringContainerInit2(str, data, PR_UINT32_MAX, NS_STRING_CONTAINER_INIT_DEPEND);
00565 }
00566 
00567 void nsAString_SetData(nsAString *str, const PRUnichar *data)
00568 {
00569     NS_StringSetData(str, data, PR_UINT32_MAX);
00570 }
00571 
00572 PRUint32 nsAString_GetData(const nsAString *str, const PRUnichar **data)
00573 {
00574     return NS_StringGetData(str, data, NULL);
00575 }
00576 
00577 void nsAString_Finish(nsAString *str)
00578 {
00579     NS_StringContainerFinish(str);
00580 }
00581 
00582 nsICommandParams *create_nscommand_params(void)
00583 {
00584     nsICommandParams *ret = NULL;
00585     nsresult nsres;
00586 
00587     if(!pCompMgr)
00588         return NULL;
00589 
00590     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
00591             NS_COMMANDPARAMS_CONTRACTID, NULL, &IID_nsICommandParams,
00592             (void**)&ret);
00593     if(NS_FAILED(nsres))
00594         ERR("Could not get nsICommandParams\n");
00595 
00596     return ret;
00597 }
00598 
00599 nsresult get_nsinterface(nsISupports *iface, REFIID riid, void **ppv)
00600 {
00601     nsIInterfaceRequestor *iface_req;
00602     nsresult nsres;
00603 
00604     nsres = nsISupports_QueryInterface(iface, &IID_nsIInterfaceRequestor, (void**)&iface_req);
00605     if(NS_FAILED(nsres))
00606         return nsres;
00607 
00608     nsres = nsIInterfaceRequestor_GetInterface(iface_req, riid, ppv);
00609     nsIInterfaceRequestor_Release(iface_req);
00610 
00611     return nsres;
00612 }
00613 
00614 static HRESULT nsnode_to_nsstring_rec(nsIContentSerializer *serializer, nsIDOMNode *nsnode, nsAString *str)
00615 {
00616     nsIDOMNodeList *node_list = NULL;
00617     PRBool has_children = FALSE;
00618     PRUint16 type;
00619     nsresult nsres;
00620 
00621     nsIDOMNode_HasChildNodes(nsnode, &has_children);
00622 
00623     nsres = nsIDOMNode_GetNodeType(nsnode, &type);
00624     if(NS_FAILED(nsres)) {
00625         ERR("GetType failed: %08x\n", nsres);
00626         return E_FAIL;
00627     }
00628 
00629     switch(type) {
00630     case ELEMENT_NODE: {
00631         nsIDOMElement *nselem;
00632         nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem);
00633         nsIContentSerializer_AppendElementStart(serializer, nselem, nselem, str);
00634         nsIDOMElement_Release(nselem);
00635         break;
00636     }
00637     case TEXT_NODE: {
00638         nsIDOMText *nstext;
00639         nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&nstext);
00640         nsIContentSerializer_AppendText(serializer, nstext, 0, -1, str);
00641         nsIDOMText_Release(nstext);
00642         break;
00643     }
00644     case COMMENT_NODE: {
00645         nsIDOMComment *nscomment;
00646         nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMComment, (void**)&nscomment);
00647         nsres = nsIContentSerializer_AppendComment(serializer, nscomment, 0, -1, str);
00648         break;
00649     }
00650     case DOCUMENT_NODE: {
00651         nsIDOMDocument *nsdoc;
00652         nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMDocument, (void**)&nsdoc);
00653         nsIContentSerializer_AppendDocumentStart(serializer, nsdoc, str);
00654         nsIDOMDocument_Release(nsdoc);
00655         break;
00656     }
00657     case DOCUMENT_TYPE_NODE:
00658         WARN("Ignoring DOCUMENT_TYPE_NODE\n");
00659         break;
00660     case DOCUMENT_FRAGMENT_NODE:
00661         break;
00662     default:
00663         FIXME("Unhandled type %u\n", type);
00664     }
00665 
00666     if(has_children) {
00667         PRUint32 child_cnt, i;
00668         nsIDOMNode *child_node;
00669 
00670         nsIDOMNode_GetChildNodes(nsnode, &node_list);
00671         nsIDOMNodeList_GetLength(node_list, &child_cnt);
00672 
00673         for(i=0; i<child_cnt; i++) {
00674             nsres = nsIDOMNodeList_Item(node_list, i, &child_node);
00675             if(NS_SUCCEEDED(nsres)) {
00676                 nsnode_to_nsstring_rec(serializer, child_node, str);
00677                 nsIDOMNode_Release(child_node);
00678             }else {
00679                 ERR("Item failed: %08x\n", nsres);
00680             }
00681         }
00682 
00683         nsIDOMNodeList_Release(node_list);
00684     }
00685 
00686     if(type == ELEMENT_NODE) {
00687         nsIDOMElement *nselem;
00688         nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem);
00689         nsIContentSerializer_AppendElementEnd(serializer, nselem, str);
00690         nsIDOMElement_Release(nselem);
00691     }
00692 
00693     return S_OK;
00694 }
00695 
00696 HRESULT nsnode_to_nsstring(nsIDOMNode *nsnode, nsAString *str)
00697 {
00698     nsIContentSerializer *serializer;
00699     nsresult nsres;
00700     HRESULT hres;
00701 
00702     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
00703             NS_HTMLSERIALIZER_CONTRACTID, NULL, &IID_nsIContentSerializer,
00704             (void**)&serializer);
00705     if(NS_FAILED(nsres)) {
00706         ERR("Could not get nsIContentSerializer: %08x\n", nsres);
00707         return E_FAIL;
00708     }
00709 
00710     nsres = nsIContentSerializer_Init(serializer, 0, 100, NULL, FALSE, FALSE /* FIXME */);
00711     if(NS_FAILED(nsres))
00712         ERR("Init failed: %08x\n", nsres);
00713 
00714     hres = nsnode_to_nsstring_rec(serializer, nsnode, str);
00715     if(SUCCEEDED(hres)) {
00716         nsres = nsIContentSerializer_Flush(serializer, str);
00717         if(NS_FAILED(nsres))
00718             ERR("Flush failed: %08x\n", nsres);
00719     }
00720 
00721     nsIContentSerializer_Release(serializer);
00722     return hres;
00723 }
00724 
00725 void get_editor_controller(NSContainer *This)
00726 {
00727     nsIEditingSession *editing_session = NULL;
00728     nsIControllerContext *ctrlctx;
00729     nsresult nsres;
00730 
00731     if(This->editor) {
00732         nsIEditor_Release(This->editor);
00733         This->editor = NULL;
00734     }
00735 
00736     if(This->editor_controller) {
00737         nsIController_Release(This->editor_controller);
00738         This->editor_controller = NULL;
00739     }
00740 
00741     nsres = get_nsinterface((nsISupports*)This->webbrowser, &IID_nsIEditingSession,
00742             (void**)&editing_session);
00743     if(NS_FAILED(nsres)) {
00744         ERR("Could not get nsIEditingSession: %08x\n", nsres);
00745         return;
00746     }
00747 
00748     nsres = nsIEditingSession_GetEditorForWindow(editing_session,
00749             This->doc->basedoc.window->nswindow, &This->editor);
00750     nsIEditingSession_Release(editing_session);
00751     if(NS_FAILED(nsres)) {
00752         ERR("Could not get editor: %08x\n", nsres);
00753         return;
00754     }
00755 
00756     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr,
00757             NS_EDITORCONTROLLER_CONTRACTID, NULL, &IID_nsIControllerContext, (void**)&ctrlctx);
00758     if(NS_SUCCEEDED(nsres)) {
00759         nsres = nsIControllerContext_SetCommandContext(ctrlctx, (nsISupports *)This->editor);
00760         if(NS_FAILED(nsres))
00761             ERR("SetCommandContext failed: %08x\n", nsres);
00762         nsres = nsIControllerContext_QueryInterface(ctrlctx, &IID_nsIController,
00763                 (void**)&This->editor_controller);
00764         nsIControllerContext_Release(ctrlctx);
00765         if(NS_FAILED(nsres))
00766             ERR("Could not get nsIController interface: %08x\n", nsres);
00767     }else {
00768         ERR("Could not create edit controller: %08x\n", nsres);
00769     }
00770 }
00771 
00772 void close_gecko(void)
00773 {
00774     TRACE("()\n");
00775 
00776     release_nsio();
00777 
00778     if(pCompMgr)
00779         nsIComponentManager_Release(pCompMgr);
00780 
00781     if(pServMgr)
00782         nsIServiceManager_Release(pServMgr);
00783 
00784     if(nsmem)
00785         nsIMemory_Release(nsmem);
00786 
00787     /* Gecko doesn't really support being unloaded */
00788     /* if (hXPCOM) FreeLibrary(hXPCOM); */
00789 }
00790 
00791 /**********************************************************
00792  *      nsIWebBrowserChrome interface
00793  */
00794 
00795 #define NSWBCHROME_THIS(iface) DEFINE_THIS(NSContainer, WebBrowserChrome, iface)
00796 
00797 static nsresult NSAPI nsWebBrowserChrome_QueryInterface(nsIWebBrowserChrome *iface,
00798         nsIIDRef riid, nsQIResult result)
00799 {
00800     NSContainer *This = NSWBCHROME_THIS(iface);
00801 
00802     *result = NULL;
00803     if(IsEqualGUID(&IID_nsISupports, riid)) {
00804         TRACE("(%p)->(IID_nsISupports, %p)\n", This, result);
00805         *result = NSWBCHROME(This);
00806     }else if(IsEqualGUID(&IID_nsIWebBrowserChrome, riid)) {
00807         TRACE("(%p)->(IID_nsIWebBrowserChrome, %p)\n", This, result);
00808         *result = NSWBCHROME(This);
00809     }else if(IsEqualGUID(&IID_nsIContextMenuListener, riid)) {
00810         TRACE("(%p)->(IID_nsIContextMenuListener, %p)\n", This, result);
00811         *result = NSCML(This);
00812     }else if(IsEqualGUID(&IID_nsIURIContentListener, riid)) {
00813         TRACE("(%p)->(IID_nsIURIContentListener %p)\n", This, result);
00814         *result = NSURICL(This);
00815     }else if(IsEqualGUID(&IID_nsIEmbeddingSiteWindow, riid)) {
00816         TRACE("(%p)->(IID_nsIEmbeddingSiteWindow %p)\n", This, result);
00817         *result = NSEMBWNDS(This);
00818     }else if(IsEqualGUID(&IID_nsITooltipListener, riid)) {
00819         TRACE("(%p)->(IID_nsITooltipListener %p)\n", This, result);
00820         *result = NSTOOLTIP(This);
00821     }else if(IsEqualGUID(&IID_nsIInterfaceRequestor, riid)) {
00822         TRACE("(%p)->(IID_nsIInterfaceRequestor %p)\n", This, result);
00823         *result = NSIFACEREQ(This);
00824     }else if(IsEqualGUID(&IID_nsIWeakReference, riid)) {
00825         TRACE("(%p)->(IID_nsIWeakReference %p)\n", This, result);
00826         *result = NSWEAKREF(This);
00827     }else if(IsEqualGUID(&IID_nsISupportsWeakReference, riid)) {
00828         TRACE("(%p)->(IID_nsISupportsWeakReference %p)\n", This, result);
00829         *result = NSSUPWEAKREF(This);
00830     }
00831 
00832     if(*result) {
00833         nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
00834         return NS_OK;
00835     }
00836 
00837     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), result);
00838     return NS_NOINTERFACE;
00839 }
00840 
00841 static nsrefcnt NSAPI nsWebBrowserChrome_AddRef(nsIWebBrowserChrome *iface)
00842 {
00843     NSContainer *This = NSWBCHROME_THIS(iface);
00844     LONG ref = InterlockedIncrement(&This->ref);
00845 
00846     TRACE("(%p) ref=%d\n", This, ref);
00847 
00848     return ref;
00849 }
00850 
00851 static nsrefcnt NSAPI nsWebBrowserChrome_Release(nsIWebBrowserChrome *iface)
00852 {
00853     NSContainer *This = NSWBCHROME_THIS(iface);
00854     LONG ref = InterlockedDecrement(&This->ref);
00855 
00856     TRACE("(%p) ref=%d\n", This, ref);
00857 
00858     if(!ref) {
00859         if(This->parent)
00860             nsIWebBrowserChrome_Release(NSWBCHROME(This->parent));
00861         heap_free(This);
00862     }
00863 
00864     return ref;
00865 }
00866 
00867 static nsresult NSAPI nsWebBrowserChrome_SetStatus(nsIWebBrowserChrome *iface,
00868         PRUint32 statusType, const PRUnichar *status)
00869 {
00870     NSContainer *This = NSWBCHROME_THIS(iface);
00871     TRACE("(%p)->(%d %s)\n", This, statusType, debugstr_w(status));
00872     return NS_OK;
00873 }
00874 
00875 static nsresult NSAPI nsWebBrowserChrome_GetWebBrowser(nsIWebBrowserChrome *iface,
00876         nsIWebBrowser **aWebBrowser)
00877 {
00878     NSContainer *This = NSWBCHROME_THIS(iface);
00879 
00880     TRACE("(%p)->(%p)\n", This, aWebBrowser);
00881 
00882     if(!aWebBrowser)
00883         return NS_ERROR_INVALID_ARG;
00884 
00885     if(This->webbrowser)
00886         nsIWebBrowser_AddRef(This->webbrowser);
00887     *aWebBrowser = This->webbrowser;
00888     return S_OK;
00889 }
00890 
00891 static nsresult NSAPI nsWebBrowserChrome_SetWebBrowser(nsIWebBrowserChrome *iface,
00892         nsIWebBrowser *aWebBrowser)
00893 {
00894     NSContainer *This = NSWBCHROME_THIS(iface);
00895 
00896     TRACE("(%p)->(%p)\n", This, aWebBrowser);
00897 
00898     if(aWebBrowser != This->webbrowser)
00899         ERR("Wrong nsWebBrowser!\n");
00900 
00901     return NS_OK;
00902 }
00903 
00904 static nsresult NSAPI nsWebBrowserChrome_GetChromeFlags(nsIWebBrowserChrome *iface,
00905         PRUint32 *aChromeFlags)
00906 {
00907     NSContainer *This = NSWBCHROME_THIS(iface);
00908     WARN("(%p)->(%p)\n", This, aChromeFlags);
00909     return NS_ERROR_NOT_IMPLEMENTED;
00910 }
00911 
00912 static nsresult NSAPI nsWebBrowserChrome_SetChromeFlags(nsIWebBrowserChrome *iface,
00913         PRUint32 aChromeFlags)
00914 {
00915     NSContainer *This = NSWBCHROME_THIS(iface);
00916     WARN("(%p)->(%08x)\n", This, aChromeFlags);
00917     return NS_ERROR_NOT_IMPLEMENTED;
00918 }
00919 
00920 static nsresult NSAPI nsWebBrowserChrome_DestroyBrowserWindow(nsIWebBrowserChrome *iface)
00921 {
00922     NSContainer *This = NSWBCHROME_THIS(iface);
00923     TRACE("(%p)\n", This);
00924     return NS_ERROR_NOT_IMPLEMENTED;
00925 }
00926 
00927 static nsresult NSAPI nsWebBrowserChrome_SizeBrowserTo(nsIWebBrowserChrome *iface,
00928         PRInt32 aCX, PRInt32 aCY)
00929 {
00930     NSContainer *This = NSWBCHROME_THIS(iface);
00931     WARN("(%p)->(%d %d)\n", This, aCX, aCY);
00932     return NS_ERROR_NOT_IMPLEMENTED;
00933 }
00934 
00935 static nsresult NSAPI nsWebBrowserChrome_ShowAsModal(nsIWebBrowserChrome *iface)
00936 {
00937     NSContainer *This = NSWBCHROME_THIS(iface);
00938     WARN("(%p)\n", This);
00939     return NS_ERROR_NOT_IMPLEMENTED;
00940 }
00941 
00942 static nsresult NSAPI nsWebBrowserChrome_IsWindowModal(nsIWebBrowserChrome *iface, PRBool *_retval)
00943 {
00944     NSContainer *This = NSWBCHROME_THIS(iface);
00945     WARN("(%p)->(%p)\n", This, _retval);
00946     return NS_ERROR_NOT_IMPLEMENTED;
00947 }
00948 
00949 static nsresult NSAPI nsWebBrowserChrome_ExitModalEventLoop(nsIWebBrowserChrome *iface,
00950         nsresult aStatus)
00951 {
00952     NSContainer *This = NSWBCHROME_THIS(iface);
00953     WARN("(%p)->(%08x)\n", This, aStatus);
00954     return NS_ERROR_NOT_IMPLEMENTED;
00955 }
00956 
00957 #undef NSWBCHROME_THIS
00958 
00959 static const nsIWebBrowserChromeVtbl nsWebBrowserChromeVtbl = {
00960     nsWebBrowserChrome_QueryInterface,
00961     nsWebBrowserChrome_AddRef,
00962     nsWebBrowserChrome_Release,
00963     nsWebBrowserChrome_SetStatus,
00964     nsWebBrowserChrome_GetWebBrowser,
00965     nsWebBrowserChrome_SetWebBrowser,
00966     nsWebBrowserChrome_GetChromeFlags,
00967     nsWebBrowserChrome_SetChromeFlags,
00968     nsWebBrowserChrome_DestroyBrowserWindow,
00969     nsWebBrowserChrome_SizeBrowserTo,
00970     nsWebBrowserChrome_ShowAsModal,
00971     nsWebBrowserChrome_IsWindowModal,
00972     nsWebBrowserChrome_ExitModalEventLoop
00973 };
00974 
00975 /**********************************************************
00976  *      nsIContextMenuListener interface
00977  */
00978 
00979 #define NSCML_THIS(iface) DEFINE_THIS(NSContainer, ContextMenuListener, iface)
00980 
00981 static nsresult NSAPI nsContextMenuListener_QueryInterface(nsIContextMenuListener *iface,
00982         nsIIDRef riid, nsQIResult result)
00983 {
00984     NSContainer *This = NSCML_THIS(iface);
00985     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
00986 }
00987 
00988 static nsrefcnt NSAPI nsContextMenuListener_AddRef(nsIContextMenuListener *iface)
00989 {
00990     NSContainer *This = NSCML_THIS(iface);
00991     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
00992 }
00993 
00994 static nsrefcnt NSAPI nsContextMenuListener_Release(nsIContextMenuListener *iface)
00995 {
00996     NSContainer *This = NSCML_THIS(iface);
00997     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
00998 }
00999 
01000 static nsresult NSAPI nsContextMenuListener_OnShowContextMenu(nsIContextMenuListener *iface,
01001         PRUint32 aContextFlags, nsIDOMEvent *aEvent, nsIDOMNode *aNode)
01002 {
01003     NSContainer *This = NSCML_THIS(iface);
01004     nsIDOMMouseEvent *event;
01005     POINT pt;
01006     DWORD dwID = CONTEXT_MENU_DEFAULT;
01007     nsresult nsres;
01008 
01009     TRACE("(%p)->(%08x %p %p)\n", This, aContextFlags, aEvent, aNode);
01010 
01011     fire_event(This->doc->basedoc.doc_node /* FIXME */, EVENTID_CONTEXTMENU, TRUE, aNode, aEvent);
01012 
01013     nsres = nsIDOMEvent_QueryInterface(aEvent, &IID_nsIDOMMouseEvent, (void**)&event);
01014     if(NS_FAILED(nsres)) {
01015         ERR("Could not get nsIDOMMouseEvent interface: %08x\n", nsres);
01016         return nsres;
01017     }
01018 
01019     nsIDOMMouseEvent_GetScreenX(event, &pt.x);
01020     nsIDOMMouseEvent_GetScreenY(event, &pt.y);
01021     nsIDOMMouseEvent_Release(event);
01022 
01023     switch(aContextFlags) {
01024     case CONTEXT_NONE:
01025     case CONTEXT_DOCUMENT:
01026     case CONTEXT_TEXT:
01027         dwID = CONTEXT_MENU_DEFAULT;
01028         break;
01029     case CONTEXT_IMAGE:
01030     case CONTEXT_IMAGE|CONTEXT_LINK:
01031         dwID = CONTEXT_MENU_IMAGE;
01032         break;
01033     case CONTEXT_LINK:
01034         dwID = CONTEXT_MENU_ANCHOR;
01035         break;
01036     case CONTEXT_INPUT:
01037         dwID = CONTEXT_MENU_CONTROL;
01038         break;
01039     default:
01040         FIXME("aContextFlags=%08x\n", aContextFlags);
01041     };
01042 
01043     show_context_menu(This->doc, dwID, &pt, (IDispatch*)HTMLDOMNODE(get_node(This->doc->basedoc.doc_node, aNode, TRUE)));
01044 
01045     return NS_OK;
01046 }
01047 
01048 #undef NSCML_THIS
01049 
01050 static const nsIContextMenuListenerVtbl nsContextMenuListenerVtbl = {
01051     nsContextMenuListener_QueryInterface,
01052     nsContextMenuListener_AddRef,
01053     nsContextMenuListener_Release,
01054     nsContextMenuListener_OnShowContextMenu
01055 };
01056 
01057 /**********************************************************
01058  *      nsIURIContentListener interface
01059  */
01060 
01061 #define NSURICL_THIS(iface) DEFINE_THIS(NSContainer, URIContentListener, iface)
01062 
01063 static nsresult NSAPI nsURIContentListener_QueryInterface(nsIURIContentListener *iface,
01064         nsIIDRef riid, nsQIResult result)
01065 {
01066     NSContainer *This = NSURICL_THIS(iface);
01067     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01068 }
01069 
01070 static nsrefcnt NSAPI nsURIContentListener_AddRef(nsIURIContentListener *iface)
01071 {
01072     NSContainer *This = NSURICL_THIS(iface);
01073     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
01074 }
01075 
01076 static nsrefcnt NSAPI nsURIContentListener_Release(nsIURIContentListener *iface)
01077 {
01078     NSContainer *This = NSURICL_THIS(iface);
01079     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
01080 }
01081 
01082 static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener *iface,
01083                                                           nsIURI *aURI, PRBool *_retval)
01084 {
01085     NSContainer *This = NSURICL_THIS(iface);
01086     nsACString spec_str;
01087     const char *spec;
01088     nsresult nsres;
01089 
01090     nsACString_Init(&spec_str, NULL);
01091     nsIURI_GetSpec(aURI, &spec_str);
01092     nsACString_GetData(&spec_str, &spec);
01093 
01094     TRACE("(%p)->(%p(%s) %p)\n", This, aURI, debugstr_a(spec), _retval);
01095 
01096     nsACString_Finish(&spec_str);
01097 
01098     nsres = on_start_uri_open(This, aURI, _retval);
01099     if(NS_FAILED(nsres))
01100         return nsres;
01101 
01102     return !*_retval && This->content_listener
01103         ? nsIURIContentListener_OnStartURIOpen(This->content_listener, aURI, _retval)
01104         : NS_OK;
01105 }
01106 
01107 static nsresult NSAPI nsURIContentListener_DoContent(nsIURIContentListener *iface,
01108         const char *aContentType, PRBool aIsContentPreferred, nsIRequest *aRequest,
01109         nsIStreamListener **aContentHandler, PRBool *_retval)
01110 {
01111     NSContainer *This = NSURICL_THIS(iface);
01112 
01113     TRACE("(%p)->(%s %x %p %p %p)\n", This, debugstr_a(aContentType), aIsContentPreferred,
01114             aRequest, aContentHandler, _retval);
01115 
01116     return This->content_listener
01117         ? nsIURIContentListener_DoContent(This->content_listener, aContentType,
01118                   aIsContentPreferred, aRequest, aContentHandler, _retval)
01119         : NS_ERROR_NOT_IMPLEMENTED;
01120 }
01121 
01122 static nsresult NSAPI nsURIContentListener_IsPreferred(nsIURIContentListener *iface,
01123         const char *aContentType, char **aDesiredContentType, PRBool *_retval)
01124 {
01125     NSContainer *This = NSURICL_THIS(iface);
01126 
01127     TRACE("(%p)->(%s %p %p)\n", This, debugstr_a(aContentType), aDesiredContentType, _retval);
01128 
01129     /* FIXME: Should we do something here? */
01130     *_retval = TRUE; 
01131 
01132     return This->content_listener
01133         ? nsIURIContentListener_IsPreferred(This->content_listener, aContentType,
01134                   aDesiredContentType, _retval)
01135         : NS_OK;
01136 }
01137 
01138 static nsresult NSAPI nsURIContentListener_CanHandleContent(nsIURIContentListener *iface,
01139         const char *aContentType, PRBool aIsContentPreferred, char **aDesiredContentType,
01140         PRBool *_retval)
01141 {
01142     NSContainer *This = NSURICL_THIS(iface);
01143 
01144     TRACE("(%p)->(%s %x %p %p)\n", This, debugstr_a(aContentType), aIsContentPreferred,
01145             aDesiredContentType, _retval);
01146 
01147     return This->content_listener
01148         ? nsIURIContentListener_CanHandleContent(This->content_listener, aContentType,
01149                 aIsContentPreferred, aDesiredContentType, _retval)
01150         : NS_ERROR_NOT_IMPLEMENTED;
01151 }
01152 
01153 static nsresult NSAPI nsURIContentListener_GetLoadCookie(nsIURIContentListener *iface,
01154         nsISupports **aLoadCookie)
01155 {
01156     NSContainer *This = NSURICL_THIS(iface);
01157 
01158     WARN("(%p)->(%p)\n", This, aLoadCookie);
01159 
01160     return This->content_listener
01161         ? nsIURIContentListener_GetLoadCookie(This->content_listener, aLoadCookie)
01162         : NS_ERROR_NOT_IMPLEMENTED;
01163 }
01164 
01165 static nsresult NSAPI nsURIContentListener_SetLoadCookie(nsIURIContentListener *iface,
01166         nsISupports *aLoadCookie)
01167 {
01168     NSContainer *This = NSURICL_THIS(iface);
01169 
01170     WARN("(%p)->(%p)\n", This, aLoadCookie);
01171 
01172     return This->content_listener
01173         ? nsIURIContentListener_SetLoadCookie(This->content_listener, aLoadCookie)
01174         : NS_ERROR_NOT_IMPLEMENTED;
01175 }
01176 
01177 static nsresult NSAPI nsURIContentListener_GetParentContentListener(nsIURIContentListener *iface,
01178         nsIURIContentListener **aParentContentListener)
01179 {
01180     NSContainer *This = NSURICL_THIS(iface);
01181 
01182     TRACE("(%p)->(%p)\n", This, aParentContentListener);
01183 
01184     if(This->content_listener)
01185         nsIURIContentListener_AddRef(This->content_listener);
01186 
01187     *aParentContentListener = This->content_listener;
01188     return NS_OK;
01189 }
01190 
01191 static nsresult NSAPI nsURIContentListener_SetParentContentListener(nsIURIContentListener *iface,
01192         nsIURIContentListener *aParentContentListener)
01193 {
01194     NSContainer *This = NSURICL_THIS(iface);
01195 
01196     TRACE("(%p)->(%p)\n", This, aParentContentListener);
01197 
01198     if(aParentContentListener == NSURICL(This))
01199         return NS_OK;
01200 
01201     if(This->content_listener)
01202         nsIURIContentListener_Release(This->content_listener);
01203 
01204     This->content_listener = aParentContentListener;
01205     if(This->content_listener)
01206         nsIURIContentListener_AddRef(This->content_listener);
01207 
01208     return NS_OK;
01209 }
01210 
01211 #undef NSURICL_THIS
01212 
01213 static const nsIURIContentListenerVtbl nsURIContentListenerVtbl = {
01214     nsURIContentListener_QueryInterface,
01215     nsURIContentListener_AddRef,
01216     nsURIContentListener_Release,
01217     nsURIContentListener_OnStartURIOpen,
01218     nsURIContentListener_DoContent,
01219     nsURIContentListener_IsPreferred,
01220     nsURIContentListener_CanHandleContent,
01221     nsURIContentListener_GetLoadCookie,
01222     nsURIContentListener_SetLoadCookie,
01223     nsURIContentListener_GetParentContentListener,
01224     nsURIContentListener_SetParentContentListener
01225 };
01226 
01227 /**********************************************************
01228  *      nsIEmbeddinSiteWindow interface
01229  */
01230 
01231 #define NSEMBWNDS_THIS(iface) DEFINE_THIS(NSContainer, EmbeddingSiteWindow, iface)
01232 
01233 static nsresult NSAPI nsEmbeddingSiteWindow_QueryInterface(nsIEmbeddingSiteWindow *iface,
01234         nsIIDRef riid, nsQIResult result)
01235 {
01236     NSContainer *This = NSEMBWNDS_THIS(iface);
01237     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01238 }
01239 
01240 static nsrefcnt NSAPI nsEmbeddingSiteWindow_AddRef(nsIEmbeddingSiteWindow *iface)
01241 {
01242     NSContainer *This = NSEMBWNDS_THIS(iface);
01243     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
01244 }
01245 
01246 static nsrefcnt NSAPI nsEmbeddingSiteWindow_Release(nsIEmbeddingSiteWindow *iface)
01247 {
01248     NSContainer *This = NSEMBWNDS_THIS(iface);
01249     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
01250 }
01251 
01252 static nsresult NSAPI nsEmbeddingSiteWindow_SetDimensions(nsIEmbeddingSiteWindow *iface,
01253         PRUint32 flags, PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy)
01254 {
01255     NSContainer *This = NSEMBWNDS_THIS(iface);
01256     WARN("(%p)->(%08x %d %d %d %d)\n", This, flags, x, y, cx, cy);
01257     return NS_ERROR_NOT_IMPLEMENTED;
01258 }
01259 
01260 static nsresult NSAPI nsEmbeddingSiteWindow_GetDimensions(nsIEmbeddingSiteWindow *iface,
01261         PRUint32 flags, PRInt32 *x, PRInt32 *y, PRInt32 *cx, PRInt32 *cy)
01262 {
01263     NSContainer *This = NSEMBWNDS_THIS(iface);
01264     WARN("(%p)->(%08x %p %p %p %p)\n", This, flags, x, y, cx, cy);
01265     return NS_ERROR_NOT_IMPLEMENTED;
01266 }
01267 
01268 static nsresult NSAPI nsEmbeddingSiteWindow_SetFocus(nsIEmbeddingSiteWindow *iface)
01269 {
01270     NSContainer *This = NSEMBWNDS_THIS(iface);
01271 
01272     TRACE("(%p)\n", This);
01273 
01274     return nsIBaseWindow_SetFocus(This->window);
01275 }
01276 
01277 static nsresult NSAPI nsEmbeddingSiteWindow_GetVisibility(nsIEmbeddingSiteWindow *iface,
01278         PRBool *aVisibility)
01279 {
01280     NSContainer *This = NSEMBWNDS_THIS(iface);
01281 
01282     TRACE("(%p)->(%p)\n", This, aVisibility);
01283 
01284     *aVisibility = This->doc && This->doc->hwnd && IsWindowVisible(This->doc->hwnd);
01285     return NS_OK;
01286 }
01287 
01288 static nsresult NSAPI nsEmbeddingSiteWindow_SetVisibility(nsIEmbeddingSiteWindow *iface,
01289         PRBool aVisibility)
01290 {
01291     NSContainer *This = NSEMBWNDS_THIS(iface);
01292 
01293     TRACE("(%p)->(%x)\n", This, aVisibility);
01294 
01295     return NS_OK;
01296 }
01297 
01298 static nsresult NSAPI nsEmbeddingSiteWindow_GetTitle(nsIEmbeddingSiteWindow *iface,
01299         PRUnichar **aTitle)
01300 {
01301     NSContainer *This = NSEMBWNDS_THIS(iface);
01302     WARN("(%p)->(%p)\n", This, aTitle);
01303     return NS_ERROR_NOT_IMPLEMENTED;
01304 }
01305 
01306 static nsresult NSAPI nsEmbeddingSiteWindow_SetTitle(nsIEmbeddingSiteWindow *iface,
01307         const PRUnichar *aTitle)
01308 {
01309     NSContainer *This = NSEMBWNDS_THIS(iface);
01310     WARN("(%p)->(%s)\n", This, debugstr_w(aTitle));
01311     return NS_ERROR_NOT_IMPLEMENTED;
01312 }
01313 
01314 static nsresult NSAPI nsEmbeddingSiteWindow_GetSiteWindow(nsIEmbeddingSiteWindow *iface,
01315         void **aSiteWindow)
01316 {
01317     NSContainer *This = NSEMBWNDS_THIS(iface);
01318 
01319     TRACE("(%p)->(%p)\n", This, aSiteWindow);
01320 
01321     *aSiteWindow = This->hwnd;
01322     return NS_OK;
01323 }
01324 
01325 static const nsIEmbeddingSiteWindowVtbl nsEmbeddingSiteWindowVtbl = {
01326     nsEmbeddingSiteWindow_QueryInterface,
01327     nsEmbeddingSiteWindow_AddRef,
01328     nsEmbeddingSiteWindow_Release,
01329     nsEmbeddingSiteWindow_SetDimensions,
01330     nsEmbeddingSiteWindow_GetDimensions,
01331     nsEmbeddingSiteWindow_SetFocus,
01332     nsEmbeddingSiteWindow_GetVisibility,
01333     nsEmbeddingSiteWindow_SetVisibility,
01334     nsEmbeddingSiteWindow_GetTitle,
01335     nsEmbeddingSiteWindow_SetTitle,
01336     nsEmbeddingSiteWindow_GetSiteWindow
01337 };
01338 
01339 #define NSTOOLTIP_THIS(iface) DEFINE_THIS(NSContainer, TooltipListener, iface)
01340 
01341 static nsresult NSAPI nsTooltipListener_QueryInterface(nsITooltipListener *iface, nsIIDRef riid,
01342                                                        nsQIResult result)
01343 {
01344     NSContainer *This = NSTOOLTIP_THIS(iface);
01345     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01346 }
01347 
01348 static nsrefcnt NSAPI nsTooltipListener_AddRef(nsITooltipListener *iface)
01349 {
01350     NSContainer *This = NSTOOLTIP_THIS(iface);
01351     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
01352 }
01353 
01354 static nsrefcnt NSAPI nsTooltipListener_Release(nsITooltipListener *iface)
01355 {
01356     NSContainer *This = NSTOOLTIP_THIS(iface);
01357     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
01358 }
01359 
01360 static nsresult NSAPI nsTooltipListener_OnShowTooltip(nsITooltipListener *iface,
01361         PRInt32 aXCoord, PRInt32 aYCoord, const PRUnichar *aTipText)
01362 {
01363     NSContainer *This = NSTOOLTIP_THIS(iface);
01364 
01365     if (This->doc)
01366         show_tooltip(This->doc, aXCoord, aYCoord, aTipText);
01367 
01368     return NS_OK;
01369 }
01370 
01371 static nsresult NSAPI nsTooltipListener_OnHideTooltip(nsITooltipListener *iface)
01372 {
01373     NSContainer *This = NSTOOLTIP_THIS(iface);
01374 
01375     if (This->doc)
01376         hide_tooltip(This->doc);
01377 
01378     return NS_OK;
01379 }
01380 
01381 #undef NSTOOLTIM_THIS
01382 
01383 static const nsITooltipListenerVtbl nsTooltipListenerVtbl = {
01384     nsTooltipListener_QueryInterface,
01385     nsTooltipListener_AddRef,
01386     nsTooltipListener_Release,
01387     nsTooltipListener_OnShowTooltip,
01388     nsTooltipListener_OnHideTooltip
01389 };
01390 
01391 #define NSIFACEREQ_THIS(iface) DEFINE_THIS(NSContainer, InterfaceRequestor, iface)
01392 
01393 static nsresult NSAPI nsInterfaceRequestor_QueryInterface(nsIInterfaceRequestor *iface,
01394                                                           nsIIDRef riid, nsQIResult result)
01395 {
01396     NSContainer *This = NSIFACEREQ_THIS(iface);
01397     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01398 }
01399 
01400 static nsrefcnt NSAPI nsInterfaceRequestor_AddRef(nsIInterfaceRequestor *iface)
01401 {
01402     NSContainer *This = NSIFACEREQ_THIS(iface);
01403     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
01404 }
01405 
01406 static nsrefcnt NSAPI nsInterfaceRequestor_Release(nsIInterfaceRequestor *iface)
01407 {
01408     NSContainer *This = NSIFACEREQ_THIS(iface);
01409     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
01410 }
01411 
01412 static nsresult NSAPI nsInterfaceRequestor_GetInterface(nsIInterfaceRequestor *iface,
01413                                                         nsIIDRef riid, nsQIResult result)
01414 {
01415     NSContainer *This = NSIFACEREQ_THIS(iface);
01416 
01417     if(IsEqualGUID(&IID_nsIDOMWindow, riid)) {
01418         TRACE("(%p)->(IID_nsIDOMWindow %p)\n", This, result);
01419         return nsIWebBrowser_GetContentDOMWindow(This->webbrowser, (nsIDOMWindow**)result);
01420     }
01421 
01422     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01423 }
01424 
01425 #undef NSIFACEREQ_THIS
01426 
01427 static const nsIInterfaceRequestorVtbl nsInterfaceRequestorVtbl = {
01428     nsInterfaceRequestor_QueryInterface,
01429     nsInterfaceRequestor_AddRef,
01430     nsInterfaceRequestor_Release,
01431     nsInterfaceRequestor_GetInterface
01432 };
01433 
01434 #define NSWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, WeakReference, iface)
01435 
01436 static nsresult NSAPI nsWeakReference_QueryInterface(nsIWeakReference *iface,
01437         nsIIDRef riid, nsQIResult result)
01438 {
01439     NSContainer *This = NSWEAKREF_THIS(iface);
01440     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01441 }
01442 
01443 static nsrefcnt NSAPI nsWeakReference_AddRef(nsIWeakReference *iface)
01444 {
01445     NSContainer *This = NSWEAKREF_THIS(iface);
01446     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
01447 }
01448 
01449 static nsrefcnt NSAPI nsWeakReference_Release(nsIWeakReference *iface)
01450 {
01451     NSContainer *This = NSWEAKREF_THIS(iface);
01452     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
01453 }
01454 
01455 static nsresult NSAPI nsWeakReference_QueryReferent(nsIWeakReference *iface,
01456         const nsIID *riid, void **result)
01457 {
01458     NSContainer *This = NSWEAKREF_THIS(iface);
01459     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01460 }
01461 
01462 #undef NSWEAKREF_THIS
01463 
01464 static const nsIWeakReferenceVtbl nsWeakReferenceVtbl = {
01465     nsWeakReference_QueryInterface,
01466     nsWeakReference_AddRef,
01467     nsWeakReference_Release,
01468     nsWeakReference_QueryReferent
01469 };
01470 
01471 #define NSSUPWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, SupportsWeakReference, iface)
01472 
01473 static nsresult NSAPI nsSupportsWeakReference_QueryInterface(nsISupportsWeakReference *iface,
01474         nsIIDRef riid, nsQIResult result)
01475 {
01476     NSContainer *This = NSSUPWEAKREF_THIS(iface);
01477     return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
01478 }
01479 
01480 static nsrefcnt NSAPI nsSupportsWeakReference_AddRef(nsISupportsWeakReference *iface)
01481 {
01482     NSContainer *This = NSSUPWEAKREF_THIS(iface);
01483     return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
01484 }
01485 
01486 static nsrefcnt NSAPI nsSupportsWeakReference_Release(nsISupportsWeakReference *iface)
01487 {
01488     NSContainer *This = NSSUPWEAKREF_THIS(iface);
01489     return nsIWebBrowserChrome_Release(NSWBCHROME(This));
01490 }
01491 
01492 static nsresult NSAPI nsSupportsWeakReference_GetWeakReference(nsISupportsWeakReference *iface,
01493         nsIWeakReference **_retval)
01494 {
01495     NSContainer *This = NSSUPWEAKREF_THIS(iface);
01496 
01497     TRACE("(%p)->(%p)\n", This, _retval);
01498 
01499     nsIWeakReference_AddRef(NSWEAKREF(This));
01500     *_retval = NSWEAKREF(This);
01501     return NS_OK;
01502 }
01503 
01504 #undef NSWEAKREF_THIS
01505 
01506 static const nsISupportsWeakReferenceVtbl nsSupportsWeakReferenceVtbl = {
01507     nsSupportsWeakReference_QueryInterface,
01508     nsSupportsWeakReference_AddRef,
01509     nsSupportsWeakReference_Release,
01510     nsSupportsWeakReference_GetWeakReference
01511 };
01512 
01513 
01514 NSContainer *NSContainer_Create(HTMLDocumentObj *doc, NSContainer *parent)
01515 {
01516     nsIWebBrowserSetup *wbsetup;
01517     nsIScrollable *scrollable;
01518     NSContainer *ret;
01519     nsresult nsres;
01520 
01521     if(!load_gecko(TRUE))
01522         return NULL;
01523 
01524     ret = heap_alloc_zero(sizeof(NSContainer));
01525 
01526     ret->lpWebBrowserChromeVtbl      = &nsWebBrowserChromeVtbl;
01527     ret->lpContextMenuListenerVtbl   = &nsContextMenuListenerVtbl;
01528     ret->lpURIContentListenerVtbl    = &nsURIContentListenerVtbl;
01529     ret->lpEmbeddingSiteWindowVtbl   = &nsEmbeddingSiteWindowVtbl;
01530     ret->lpTooltipListenerVtbl       = &nsTooltipListenerVtbl;
01531     ret->lpInterfaceRequestorVtbl    = &nsInterfaceRequestorVtbl;
01532     ret->lpWeakReferenceVtbl         = &nsWeakReferenceVtbl;
01533     ret->lpSupportsWeakReferenceVtbl = &nsSupportsWeakReferenceVtbl;
01534 
01535     ret->doc = doc;
01536     ret->ref = 1;
01537 
01538     nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_WEBBROWSER_CONTRACTID,
01539             NULL, &IID_nsIWebBrowser, (void**)&ret->webbrowser);
01540     if(NS_FAILED(nsres)) {
01541         ERR("Creating WebBrowser failed: %08x\n", nsres);
01542         heap_free(ret);
01543         return NULL;
01544     }
01545 
01546     if(parent)
01547         nsIWebBrowserChrome_AddRef(NSWBCHROME(parent));
01548     ret->parent = parent;
01549 
01550     nsres = nsIWebBrowser_SetContainerWindow(ret->webbrowser, NSWBCHROME(ret));
01551     if(NS_FAILED(nsres))
01552         ERR("SetContainerWindow failed: %08x\n", nsres);
01553 
01554     nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIBaseWindow,
01555             (void**)&ret->window);
01556     if(NS_FAILED(nsres))
01557         ERR("Could not get nsIBaseWindow interface: %08x\n", nsres);
01558 
01559     nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIWebBrowserSetup,
01560                                          (void**)&wbsetup);
01561     if(NS_SUCCEEDED(nsres)) {
01562         nsres = nsIWebBrowserSetup_SetProperty(wbsetup, SETUP_IS_CHROME_WRAPPER, FALSE);
01563         nsIWebBrowserSetup_Release(wbsetup);
01564         if(NS_FAILED(nsres))
01565             ERR("SetProperty(SETUP_IS_CHROME_WRAPPER) failed: %08x\n", nsres);
01566     }else {
01567         ERR("Could not get nsIWebBrowserSetup interface\n");
01568     }
01569 
01570     nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIWebNavigation,
01571             (void**)&ret->navigation);
01572     if(NS_FAILED(nsres))
01573         ERR("Could not get nsIWebNavigation interface: %08x\n", nsres);
01574 
01575     nsres = nsIWebBrowserFocus_QueryInterface(ret->webbrowser, &IID_nsIWebBrowserFocus,
01576             (void**)&ret->focus);
01577     if(NS_FAILED(nsres))
01578         ERR("Could not get nsIWebBrowserFocus interface: %08x\n", nsres);
01579 
01580     if(!nscontainer_class)
01581         register_nscontainer_class();
01582 
01583     ret->hwnd = CreateWindowExW(0, wszNsContainer, NULL,
01584             WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 100, 100,
01585             GetDesktopWindow(), NULL, hInst, ret);
01586 
01587     nsres = nsIBaseWindow_InitWindow(ret->window, ret->hwnd, NULL, 0, 0, 100, 100);
01588     if(NS_SUCCEEDED(nsres)) {
01589         nsres = nsIBaseWindow_Create(ret->window);
01590         if(NS_FAILED(nsres))
01591             WARN("Creating window failed: %08x\n", nsres);
01592 
01593         nsIBaseWindow_SetVisibility(ret->window, FALSE);
01594         nsIBaseWindow_SetEnabled(ret->window, FALSE);
01595     }else {
01596         ERR("InitWindow failed: %08x\n", nsres);
01597     }
01598 
01599     nsres = nsIWebBrowser_SetParentURIContentListener(ret->webbrowser, NSURICL(ret));
01600     if(NS_FAILED(nsres))
01601         ERR("SetParentURIContentListener failed: %08x\n", nsres);
01602 
01603     nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
01604     if(NS_SUCCEEDED(nsres)) {
01605         nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable,
01606                 ScrollOrientation_Y, Scrollbar_Always);
01607         if(NS_FAILED(nsres))
01608             ERR("Could not set default Y scrollbar prefs: %08x\n", nsres);
01609 
01610         nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable,
01611                 ScrollOrientation_X, Scrollbar_Auto);
01612         if(NS_FAILED(nsres))
01613             ERR("Could not set default X scrollbar prefs: %08x\n", nsres);
01614 
01615         nsIScrollable_Release(scrollable);
01616     }else {
01617         ERR("Could not get nsIScrollable: %08x\n", nsres);
01618     }
01619 
01620     return ret;
01621 }
01622 
01623 void NSContainer_Release(NSContainer *This)
01624 {
01625     TRACE("(%p)\n", This);
01626 
01627     This->doc = NULL;
01628 
01629     ShowWindow(This->hwnd, SW_HIDE);
01630     SetParent(This->hwnd, NULL);
01631 
01632     nsIBaseWindow_SetVisibility(This->window, FALSE);
01633     nsIBaseWindow_Destroy(This->window);
01634 
01635     nsIWebBrowser_SetContainerWindow(This->webbrowser, NULL);
01636 
01637     nsIWebBrowser_Release(This->webbrowser);
01638     This->webbrowser = NULL;
01639 
01640     nsIWebNavigation_Release(This->navigation);
01641     This->navigation = NULL;
01642 
01643     nsIBaseWindow_Release(This->window);
01644     This->window = NULL;
01645 
01646     nsIWebBrowserFocus_Release(This->focus);
01647     This->focus = NULL;
01648 
01649     if(This->editor_controller) {
01650         nsIController_Release(This->editor_controller);
01651         This->editor_controller = NULL;
01652     }
01653 
01654     if(This->editor) {
01655         nsIEditor_Release(This->editor);
01656         This->editor = NULL;
01657     }
01658 
01659     if(This->content_listener) {
01660         nsIURIContentListener_Release(This->content_listener);
01661         This->content_listener = NULL;
01662     }
01663 
01664     if(This->hwnd) {
01665         DestroyWindow(This->hwnd);
01666         This->hwnd = NULL;
01667     }
01668 
01669     nsIWebBrowserChrome_Release(NSWBCHROME(This));
01670 }

Generated on Sun May 27 2012 04:25:03 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.