Add WebKitInitializer and use it in DumpRenderTree and testkjs
[WebKit-https.git] / WebKitTools / WebKitInitializer / WebKitInitializer.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "WebKitInitializer.h"
30
31 // Needed to get SetDllDirectory
32 #define _WIN32_WINNT 0x0502
33
34 #include <shlwapi.h>
35 #include <tchar.h>
36 #include <windows.h>
37
38 static TCHAR* getStringValue(HKEY key, LPCTSTR valueName)
39 {
40     DWORD type = 0;
41     DWORD bufferSize = 0;
42     if (RegQueryValueEx(key, valueName, 0, &type, 0, &bufferSize) != ERROR_SUCCESS || type != REG_SZ)
43         return 0;
44
45     TCHAR* buffer = new TCHAR[bufferSize / sizeof(TCHAR)];
46     if (RegQueryValueEx(key, 0, 0, &type, reinterpret_cast<LPBYTE>(buffer), &bufferSize) != ERROR_SUCCESS) {
47         delete [] buffer;
48         return 0;
49     }
50
51     return buffer;
52 }
53
54 static LPOLESTR getWebViewCLSID()
55 {
56     // FIXME <rdar://5505062>: Once WebKit switches to truly version-independent
57     // ProgIDs, this should just become "WebKit.WebView".
58     LPCTSTR webViewProgID = TEXT("WebKit.WebView.3");
59
60     CLSID clsid = CLSID_NULL;
61     HRESULT hr = CLSIDFromProgID(webViewProgID, &clsid);
62     if (FAILED(hr)) {
63         _ftprintf(stderr, TEXT("Failed to get CLSID for %s\n"), webViewProgID);
64         return 0;
65     }
66
67     LPOLESTR clsidString = 0;
68     if (FAILED(StringFromCLSID(clsid, &clsidString))) {
69         _ftprintf(stderr, TEXT("Failed to get string representation of CLSID for WebView\n"));
70         return 0;
71     }
72
73     return clsidString;
74 }
75
76 static TCHAR* getInstalledWebKitDirectory()
77 {
78     LPCTSTR keyPrefix = TEXT("SOFTWARE\\Classes\\CLSID\\");
79     LPCTSTR keySuffix = TEXT("\\InprocServer32");
80
81     LPOLESTR clsid = getWebViewCLSID();
82     if (!clsid)
83         return 0;
84
85     size_t keyBufferLength = _tcslen(keyPrefix) + _tcslen(clsid) + _tcslen(keySuffix) + 1;
86     TCHAR* keyString = new TCHAR[keyBufferLength];
87
88     int ret = _sntprintf_s(keyString, keyBufferLength, keyBufferLength - 1, TEXT("%s%s%s"), keyPrefix, clsid, keySuffix);
89     CoTaskMemFree(clsid);
90     if (ret == -1) {
91         _ftprintf(stderr, TEXT("Failed to construct InprocServer32 key\n"));
92         return 0;
93     }
94
95     HKEY serverKey = 0;
96     LONG error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyString, 0, KEY_READ, &serverKey);
97     delete [] keyString;
98     if (error != ERROR_SUCCESS) {
99         _ftprintf(stderr, TEXT("Failed to open registry key %s\n"), keyString);
100         return 0;
101     }
102
103     TCHAR* webKitPath = getStringValue(serverKey, 0);
104     RegCloseKey(serverKey);
105     if (!webKitPath) {
106         _ftprintf(stderr, TEXT("Couldn't retrieve value for registry key %s\n"), keyString);
107         return 0;
108     }
109
110     TCHAR* startOfFileName = PathFindFileName(webKitPath);
111     if (startOfFileName == webKitPath) {
112         _ftprintf(stderr, TEXT("Couldn't find filename from path %s\n"), webKitPath);
113         delete [] webKitPath;
114         return 0;
115     }
116
117     *startOfFileName = '\0';
118     return webKitPath;
119 }
120
121 bool initializeWebKit()
122 {
123     static bool haveInitialized;
124     static bool success;
125     if (haveInitialized)
126         return success;
127     haveInitialized = true;
128
129 #ifdef NDEBUG
130     LPCTSTR webKitDLL = TEXT("WebKit.dll");
131 #else
132     LPCTSTR webKitDLL = TEXT("WebKit_debug.dll");
133 #endif
134
135     HMODULE webKitModule = LoadLibrary(webKitDLL);
136     if (!webKitModule) {
137         _ftprintf(stderr, TEXT("LoadLibrary(%s) failed\n"), webKitDLL);
138         return false;
139     }
140
141     FARPROC dllRegisterServer = GetProcAddress(webKitModule, "DllRegisterServer");
142     if (!dllRegisterServer) {
143         _ftprintf(stderr, TEXT("GetProcAddress(\"DllRegisterServer\") failed\n"));
144         return false;
145     }
146
147     dllRegisterServer();
148
149     TCHAR* directory = getInstalledWebKitDirectory();
150     if (!directory) {
151         _ftprintf(stderr, TEXT("Couldn't determine installed WebKit directory\n"));
152         return false;
153     }
154
155     SetDllDirectory(directory);
156     delete [] directory;
157
158     success = true;
159     return success;
160 }