Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennsembed.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(®istrar); 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
1.7.6.1
|