a8d2202d29714b9046ec9a07a807e824c6993705
[WebKit-https.git] / Source / WebCore / platform / cocoa / RuntimeApplicationChecksCocoa.mm
1 /*
2  * Copyright (C) 2011-2017 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "RuntimeApplicationChecks.h"
28
29 #if PLATFORM(COCOA)
30
31 #import <Foundation/NSBundle.h>
32 #import <wtf/NeverDestroyed.h>
33 #import <wtf/RunLoop.h>
34 #import <wtf/text/WTFString.h>
35
36 namespace WebCore {
37
38 #if !ASSERT_MSG_DISABLED
39 static bool applicationBundleIdentifierOverrideWasQueried;
40 #endif
41
42 // The application bundle identifier gets set to the UIProcess bundle identifier by the WebProcess and
43 // the Networking upon initialization. It is unset otherwise.
44 static String& applicationBundleIdentifierOverride()
45 {
46     static NeverDestroyed<String> identifier;
47 #if !ASSERT_MSG_DISABLED
48     applicationBundleIdentifierOverrideWasQueried = true;
49 #endif
50     return identifier;
51 }
52
53 String applicationBundleIdentifier()
54 {
55     // The override only gets set in WebKit2's WebProcess and NetworkProcess. If unset, we use the main bundle identifier.
56     const auto& identifier = applicationBundleIdentifierOverride();
57     ASSERT(identifier.isNull() || RunLoop::isMain());
58     return identifier.isNull() ? String([[NSBundle mainBundle] bundleIdentifier]) : identifier;
59 }
60
61 void setApplicationBundleIdentifier(const String& bundleIdentifier)
62 {
63     ASSERT(RunLoop::isMain());
64     ASSERT_WITH_MESSAGE(!applicationBundleIdentifierOverrideWasQueried, "applicationBundleIsEqualTo() should not be called before setApplicationBundleIdentifier()");
65     applicationBundleIdentifierOverride() = bundleIdentifier;
66 }
67
68 static bool applicationBundleIsEqualTo(const String& bundleIdentifierString)
69 {
70     return applicationBundleIdentifier() == bundleIdentifierString;
71 }
72
73 #if PLATFORM(MAC)
74
75 bool MacApplication::isSafari()
76 {
77     static bool isSafari = applicationBundleIsEqualTo("com.apple.Safari");
78     return isSafari;
79 }
80
81 bool MacApplication::isAppleMail()
82 {
83     static bool isAppleMail = applicationBundleIsEqualTo("com.apple.mail");
84     return isAppleMail;
85 }
86
87 bool MacApplication::isIBooks()
88 {
89     static bool isIBooks = applicationBundleIsEqualTo("com.apple.iBooksX");
90     return isIBooks;
91 }
92
93 bool MacApplication::isITunes()
94 {
95     static bool isITunes = applicationBundleIsEqualTo("com.apple.iTunes");
96     return isITunes;
97 }
98
99 bool MacApplication::isMicrosoftMessenger()
100 {
101     static bool isMicrosoftMessenger = applicationBundleIsEqualTo("com.microsoft.Messenger");
102     return isMicrosoftMessenger;
103 }
104
105 bool MacApplication::isAdobeInstaller()
106 {
107     static bool isAdobeInstaller = applicationBundleIsEqualTo("com.adobe.Installers.Setup");
108     return isAdobeInstaller;
109 }
110
111 bool MacApplication::isAOLInstantMessenger()
112 {
113     static bool isAOLInstantMessenger = applicationBundleIsEqualTo("com.aol.aim.desktop");
114     return isAOLInstantMessenger;
115 }
116
117 bool MacApplication::isMicrosoftMyDay()
118 {
119     static bool isMicrosoftMyDay = applicationBundleIsEqualTo("com.microsoft.myday");
120     return isMicrosoftMyDay;
121 }
122
123 bool MacApplication::isMicrosoftOutlook()
124 {
125     static bool isMicrosoftOutlook = applicationBundleIsEqualTo("com.microsoft.Outlook");
126     return isMicrosoftOutlook;
127 }
128
129 bool MacApplication::isQuickenEssentials()
130 {
131     static bool isQuickenEssentials = applicationBundleIsEqualTo("com.intuit.QuickenEssentials");
132     return isQuickenEssentials;
133 }
134
135 bool MacApplication::isAperture()
136 {
137     static bool isAperture = applicationBundleIsEqualTo("com.apple.Aperture");
138     return isAperture;
139 }
140
141 bool MacApplication::isVersions()
142 {
143     static bool isVersions = applicationBundleIsEqualTo("com.blackpixel.versions");
144     return isVersions;
145 }
146
147 bool MacApplication::isHRBlock()
148 {
149     static bool isHRBlock = applicationBundleIsEqualTo("com.hrblock.tax.2010");
150     return isHRBlock;
151 }
152
153 bool MacApplication::isIAdProducer()
154 {
155     static bool isIAdProducer = applicationBundleIsEqualTo("com.apple.iAdProducer");
156     return isIAdProducer;
157 }
158
159 bool MacApplication::isSolidStateNetworksDownloader()
160 {
161     static bool isSolidStateNetworksDownloader = applicationBundleIsEqualTo("com.solidstatenetworks.awkhost");
162     return isSolidStateNetworksDownloader;
163 }
164
165 bool MacApplication::isDumpRenderTree()
166 {
167     return [[[NSProcessInfo processInfo] processName] isEqualToString:@"DumpRenderTree"];
168 }
169
170 #endif // PLATFORM(MAC)
171
172 #if PLATFORM(IOS)
173
174 bool IOSApplication::isMobileMail()
175 {
176     static bool isMobileMail = applicationBundleIsEqualTo("com.apple.mobilemail");
177     return isMobileMail;
178 }
179
180 bool IOSApplication::isMobileSafari()
181 {
182     static bool isMobileSafari = applicationBundleIsEqualTo("com.apple.mobilesafari");
183     return isMobileSafari;
184 }
185
186 bool IOSApplication::isWebBookmarksD()
187 {
188     static bool isWebBookmarksD = applicationBundleIsEqualTo("com.apple.webbookmarksd");
189     return isWebBookmarksD;
190 }
191
192 bool IOSApplication::isDumpRenderTree()
193 {
194     // We use a prefix match instead of strict equality since multiple instances of DumpRenderTree
195     // may be launched, where the bundle identifier of each instance has a unique suffix.
196     static bool isDumpRenderTree = applicationBundleIsEqualTo("org.webkit.DumpRenderTree"); // e.g. org.webkit.DumpRenderTree0
197     return isDumpRenderTree;
198 }
199
200 bool IOSApplication::isMobileStore()
201 {
202     static bool isMobileStore = applicationBundleIsEqualTo("com.apple.MobileStore");
203     return isMobileStore;
204 }
205
206 bool IOSApplication::isWebApp()
207 {
208     static bool isWebApp = applicationBundleIsEqualTo("com.apple.webapp");
209     return isWebApp;
210 }
211
212 bool IOSApplication::isOkCupid()
213 {
214     static bool isOkCupid = applicationBundleIsEqualTo("com.okcupid.app");
215     return isOkCupid;
216 }
217
218 bool IOSApplication::isFacebook()
219 {
220     static bool isFacebook = applicationBundleIsEqualTo("com.facebook.Facebook");
221     return isFacebook;
222 }
223
224 bool IOSApplication::isDaijisenDictionary()
225 {
226     static bool isDaijisenDictionary = applicationBundleIsEqualTo("jp.co.shogakukan.daijisen2009i");
227     return isDaijisenDictionary;
228 }
229
230 bool IOSApplication::isNASAHD()
231 {
232     static bool isNASAHD = applicationBundleIsEqualTo("gov.nasa.NASAHD");
233     return isNASAHD;
234 }
235
236 bool IOSApplication::isTheEconomistOnIphone()
237 {
238     static bool isTheEconomistOnIphone = applicationBundleIsEqualTo("com.economist.iphone");
239     return isTheEconomistOnIphone;
240 }
241
242 // FIXME: this needs to be changed when the WebProcess is changed to an XPC service.
243 bool IOSApplication::isWebProcess()
244 {
245     static bool isWebProcess = [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.WebKit.WebContent.Development"]
246         || [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.WebKit.WebContent"]
247         || [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.WebProcess"];
248     return isWebProcess;
249 }
250
251 bool IOSApplication::isIBooks()
252 {
253     static bool isIBooks = applicationBundleIsEqualTo("com.apple.iBooks");
254     return isIBooks;
255 }
256
257 bool IOSApplication::isTheSecretSocietyHiddenMystery()
258 {
259     static bool isTheSecretSocietyHiddenMystery = applicationBundleIsEqualTo("com.g5e.secretsociety");
260     return isTheSecretSocietyHiddenMystery;
261 }
262
263 #endif
264
265 } // namespace WebCore
266
267 #endif // PLATFORM(COCOA)