Jacek Caban : mshtml: Support loading Gecko from global location.
Alexandre Julliard
julliard at winehq.org
Mon Dec 9 16:57:39 CST 2019
Module: wine
Branch: master
Commit: 077fd3891a57a3d460688ce20d1b8db50c1ac752
URL: https://source.winehq.org/git/wine.git/?a=commit;h=077fd3891a57a3d460688ce20d1b8db50c1ac752
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Dec 9 17:04:37 2019 +0100
mshtml: Support loading Gecko from global location.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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();
More information about the wine-cvs
mailing list