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