Module: wine Branch: master Commit: 077fd3891a57a3d460688ce20d1b8db50c1ac752 URL: https://source.winehq.org/git/wine.git/?a=commit;h=077fd3891a57a3d460688ce20...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Dec 9 17:04:37 2019 +0100
mshtml: Support loading Gecko from global location.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mshtml/Makefile.in | 2 ++ dlls/mshtml/nsembed.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+)
diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index 7e1d517f07..469667081e 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -65,6 +65,8 @@ C_SRCS = \ view.c \ xmlhttprequest.c
+nsembed_EXTRADEFS = -DINSTALL_DATADIR=""${datadir}"" + RC_SRCS = mshtml.rc
IDL_SRCS = \ diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index f47f727630..2122536fc5 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -54,6 +54,16 @@ WINE_DECLARE_DEBUG_CHANNEL(gecko); #define NS_STRING_CONTAINER_INIT_DEPEND 0x0002 #define NS_CSTRING_CONTAINER_INIT_DEPEND 0x0002
+#ifdef __i386__ +#define GECKO_ARCH_STRING "x86" +#elif defined(__x86_64__) +#define GECKO_ARCH_STRING "x86_64" +#else +#define GECKO_ARCH_STRING "" +#endif + +#define GECKO_DIR_NAME "wine-gecko-" GECKO_VERSION "-" GECKO_ARCH_STRING + typedef UINT32 PRUint32;
static nsresult (CDECL *NS_InitXPCOM2)(nsIServiceManager**,void*,void*); @@ -730,6 +740,56 @@ static WCHAR *find_wine_gecko_reg(void) return check_version(buffer); }
+static WCHAR *heap_strcat(const WCHAR *str1, const WCHAR *str2) +{ + size_t len1 = lstrlenW(str1); + size_t len2 = lstrlenW(str2); + WCHAR *ret = heap_alloc((len1 + len2 + 1) * sizeof(WCHAR)); + if(!ret) return NULL; + memcpy(ret, str1, len1 * sizeof(WCHAR)); + memcpy(ret + len1, str2, len2 * sizeof(WCHAR)); + ret[len1 + len2] = 0; + return ret; +} + +static WCHAR *find_wine_gecko_datadir(void) +{ + const WCHAR *data_dir; + WCHAR *path = NULL, *ret; + + if((data_dir = _wgetenv(L"WINEDATADIR"))) + path = heap_strcat(data_dir, L"\gecko\" GECKO_DIR_NAME); + else if((data_dir = _wgetenv(L"WINEBUILDDIR"))) + path = heap_strcat(data_dir, L"\..\gecko\" GECKO_DIR_NAME); + if(!path) + return NULL; + + ret = check_version(path); + heap_free(path); + return ret; +} + +static WCHAR *find_wine_gecko_unix(const char *unix_path) +{ + static WCHAR * (CDECL *p_wine_get_dos_file_name)(const char*); + WCHAR *dos_dir, *ret; + + if(!p_wine_get_dos_file_name) { + p_wine_get_dos_file_name = (void*)GetProcAddress(GetModuleHandleA("kernel32"), "wine_get_dos_file_name"); + if(!p_wine_get_dos_file_name) + return FALSE; + } + + dos_dir = p_wine_get_dos_file_name(unix_path); + if(!dos_dir) + return FALSE; + + ret = check_version(dos_dir); + + heap_free(dos_dir); + return ret; +} + static CRITICAL_SECTION cs_load_gecko; static CRITICAL_SECTION_DEBUG cs_load_gecko_dbg = { @@ -747,6 +807,11 @@ BOOL load_gecko(void)
TRACE("()\n");
+ if(!GECKO_ARCH_STRING[0]) { + FIXME("Wine Gecko is not supported on this architecture.\n"); + return FALSE; + } + /* load_gecko may be called recursively */ if(loading_thread == GetCurrentThreadId()) return pCompMgr != NULL; @@ -759,6 +824,11 @@ BOOL load_gecko(void) loading_thread = GetCurrentThreadId();
if(!(gecko_path = find_wine_gecko_reg()) + && !(gecko_path = find_wine_gecko_datadir()) + && !(gecko_path = find_wine_gecko_unix(INSTALL_DATADIR "/wine/gecko/" GECKO_DIR_NAME)) + && (!strcmp(INSTALL_DATADIR, "/usr/share") || + !(gecko_path = find_wine_gecko_unix("/usr/share/wine/gecko/" GECKO_DIR_NAME))) + && !(gecko_path = find_wine_gecko_unix("/opt/wine/gecko/" GECKO_DIR_NAME)) && install_wine_gecko()) gecko_path = find_wine_gecko_reg();