Progress towards building AppleWin with CMake
[WebKit-https.git] / Source / WebKit / win / WebKitDLL.cpp
1 /*
2  * Copyright (C) 2006, 2007, 2014-2015 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "WebKitDLL.h"
27
28 #if USE(CG)
29 #include <CoreGraphics/CoreGraphics.h>
30 #endif
31
32 #include "ForEachCoClass.h"
33 #include "resource.h"
34 #include "WebKit.h"
35 #include "WebKitClassFactory.h"
36 #include "WebStorageNamespaceProvider.h"
37 #include <WebCore/COMPtr.h>
38 #include <WebCore/IconDatabase.h>
39 #include <WebCore/Page.h>
40 #include <WebCore/PageGroup.h>
41 #include <WebCore/RenderThemeWin.h>
42 #include <WebCore/SharedBuffer.h>
43 #include <WebCore/WebCoreInstanceHandle.h>
44 #include <WebCore/Widget.h>
45 #include <olectl.h>
46 #include <wchar.h>
47 #include <wtf/NeverDestroyed.h>
48 #include <wtf/Vector.h>
49
50 using namespace WebCore;
51
52 ULONG gLockCount;
53 ULONG gClassCount;
54 HINSTANCE gInstance;
55
56 #define CLSID_FOR_CLASS(cls) CLSID_##cls,
57 CLSID gRegCLSIDs[] = {
58     FOR_EACH_COCLASS(CLSID_FOR_CLASS)
59 };
60 #undef CLSID_FOR_CLASS
61
62 HashCountedSet<String>& gClassNameCount()
63 {
64     static NeverDestroyed<HashCountedSet<String>> gClassNameCount;
65     return gClassNameCount.get();
66 }
67
68
69 STDAPI_(BOOL) DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID /*lpReserved*/)
70 {
71     switch (ul_reason_for_call) {
72         case DLL_PROCESS_ATTACH:
73 #if defined(_M_X64) || defined(__x86_64__)
74             // The VS2013 runtime has a bug where it mis-detects AVX-capable processors
75             // if the feature has been disabled in firmware. This causes us to crash
76             // in some of the math functions. For now, we disable those optimizations
77             // because Microsoft is not going to fix the problem in VS2013.
78             // FIXME: http://webkit.org/b/141449: Remove this workaround when we switch to VS2015+.
79             _set_FMA3_enable(0);
80 #endif
81             gLockCount = gClassCount = 0;
82             gInstance = hModule;
83             WebCore::setInstanceHandle(hModule);
84             return TRUE;
85
86         case DLL_PROCESS_DETACH:
87             WebCore::RenderThemeWin::setWebKitIsBeingUnloaded();
88             break;
89
90         case DLL_THREAD_ATTACH:
91         case DLL_THREAD_DETACH:
92             break;
93     }
94     return FALSE;
95 }
96
97 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
98 {
99     bool found = false;
100     for (size_t i = 0; i < WTF_ARRAY_LENGTH(gRegCLSIDs); ++i) {
101         if (IsEqualGUID(rclsid, gRegCLSIDs[i])) {
102             found = true;
103             break;
104         }
105     }
106     if (!found)
107         return E_FAIL;
108
109     if (!IsEqualGUID(riid, IID_IUnknown) && !IsEqualGUID(riid, IID_IClassFactory))
110         return E_NOINTERFACE;
111
112     WebKitClassFactory* factory = new WebKitClassFactory(rclsid);
113     *ppv = reinterpret_cast<LPVOID>(factory);
114     if (!factory)
115         return E_OUTOFMEMORY;
116
117     factory->AddRef();
118     return S_OK;
119 }
120
121 STDAPI DllCanUnloadNow(void)
122 {
123     if (!gClassCount && !gLockCount)
124         return S_OK;
125     
126     return S_FALSE;
127 }
128
129 // deprecated - do not use
130 STDAPI DllUnregisterServer(void)
131 {
132     return 0;
133 }
134
135 // deprecated - do not use
136 STDAPI DllRegisterServer(void)
137 {
138     return 0;
139 }
140
141 // deprecated - do not use
142 STDAPI RunAsLocalServer()
143 {
144     return 0;
145 }
146
147 // deprecated - do not use
148 STDAPI LocalServerDidDie()
149 {
150     return 0;
151 }
152
153 void shutDownWebKit()
154 {
155     WebCore::iconDatabase().close();
156     WebStorageNamespaceProvider::closeLocalStorage();
157 }
158
159 //FIXME: We should consider moving this to a new file for cross-project functionality
160 PassRefPtr<WebCore::SharedBuffer> loadResourceIntoBuffer(const char* name)
161 {
162     int idr;
163     // temporary hack to get resource id
164     if (!strcmp(name, "textAreaResizeCorner"))
165         idr = IDR_RESIZE_CORNER;
166     else if (!strcmp(name, "missingImage"))
167         idr = IDR_MISSING_IMAGE;
168     else if (!strcmp(name, "nullPlugin"))
169         idr = IDR_NULL_PLUGIN;
170     else if (!strcmp(name, "panIcon"))
171         idr = IDR_PAN_SCROLL_ICON;
172     else if (!strcmp(name, "panSouthCursor"))
173         idr = IDR_PAN_SOUTH_CURSOR;
174     else if (!strcmp(name, "panNorthCursor"))
175         idr = IDR_PAN_NORTH_CURSOR;
176     else if (!strcmp(name, "panEastCursor"))
177         idr = IDR_PAN_EAST_CURSOR;
178     else if (!strcmp(name, "panWestCursor"))
179         idr = IDR_PAN_WEST_CURSOR;
180     else if (!strcmp(name, "panSouthEastCursor"))
181         idr = IDR_PAN_SOUTH_EAST_CURSOR;
182     else if (!strcmp(name, "panSouthWestCursor"))
183         idr = IDR_PAN_SOUTH_WEST_CURSOR;
184     else if (!strcmp(name, "panNorthEastCursor"))
185         idr = IDR_PAN_NORTH_EAST_CURSOR;
186     else if (!strcmp(name, "panNorthWestCursor"))
187         idr = IDR_PAN_NORTH_WEST_CURSOR;
188     else if (!strcmp(name, "searchMagnifier"))
189         idr = IDR_SEARCH_MAGNIFIER;
190     else if (!strcmp(name, "searchMagnifierResults"))
191         idr = IDR_SEARCH_MAGNIFIER_RESULTS;
192     else if (!strcmp(name, "searchCancel"))
193         idr = IDR_SEARCH_CANCEL;
194     else if (!strcmp(name, "searchCancelPressed"))
195         idr = IDR_SEARCH_CANCEL_PRESSED;
196     else if (!strcmp(name, "zoomInCursor"))
197         idr = IDR_ZOOM_IN_CURSOR;
198     else if (!strcmp(name, "zoomOutCursor"))
199         idr = IDR_ZOOM_OUT_CURSOR;
200     else if (!strcmp(name, "verticalTextCursor"))
201         idr = IDR_VERTICAL_TEXT_CURSOR;
202     else if (!strcmp(name, "fsVideoAudioVolumeHigh"))
203         idr = IDR_FS_VIDEO_AUDIO_VOLUME_HIGH;
204     else if (!strcmp(name, "fsVideoAudioVolumeLow"))
205         idr = IDR_FS_VIDEO_AUDIO_VOLUME_LOW;
206     else if (!strcmp(name, "fsVideoExitFullscreen"))
207         idr = IDR_FS_VIDEO_EXIT_FULLSCREEN;
208     else if (!strcmp(name, "fsVideoPause"))
209         idr = IDR_FS_VIDEO_PAUSE;
210     else if (!strcmp(name, "fsVideoPlay"))
211         idr = IDR_FS_VIDEO_PLAY;
212     else
213         return 0;
214
215     HRSRC resInfo = FindResource(gInstance, MAKEINTRESOURCE(idr), L"PNG");
216     if (!resInfo)
217         return 0;
218     HANDLE res = LoadResource(gInstance, resInfo);
219     if (!res)
220         return 0;
221     void* resource = LockResource(res);
222     if (!resource)
223         return 0;
224     unsigned size = SizeofResource(gInstance, resInfo);
225
226     return WebCore::SharedBuffer::create(reinterpret_cast<const char*>(resource), size);
227 }