bcec3d5f590f11640194ba9b2dfea722ea0ca111
[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/spi/darwin/dyldSPI.h>
35 #import <wtf/text/WTFString.h>
36
37 namespace WebCore {
38
39 #if !ASSERT_MSG_DISABLED
40 static bool applicationBundleIdentifierOverrideWasQueried;
41 #endif
42
43 // The application bundle identifier gets set to the UIProcess bundle identifier by the WebProcess and
44 // the Networking upon initialization. It is unset otherwise.
45 static String& applicationBundleIdentifierOverride()
46 {
47     static NeverDestroyed<String> identifier;
48 #if !ASSERT_MSG_DISABLED
49     applicationBundleIdentifierOverrideWasQueried = true;
50 #endif
51     return identifier;
52 }
53
54 String applicationBundleIdentifier()
55 {
56     // The override only gets set in WebKit2's WebProcess and NetworkProcess. If unset, we use the main bundle identifier.
57     const auto& identifier = applicationBundleIdentifierOverride();
58     ASSERT(identifier.isNull() || RunLoop::isMain());
59     return identifier.isNull() ? String([[NSBundle mainBundle] bundleIdentifier]) : identifier;
60 }
61
62 void setApplicationBundleIdentifier(const String& bundleIdentifier)
63 {
64     ASSERT(RunLoop::isMain());
65     ASSERT_WITH_MESSAGE(!applicationBundleIdentifierOverrideWasQueried, "applicationBundleIsEqualTo() and applicationBundleStartsWith() should not be called before setApplicationBundleIdentifier()");
66     applicationBundleIdentifierOverride() = bundleIdentifier;
67 }
68
69 static Optional<uint32_t>& applicationSDKVersionOverride()
70 {
71     static NeverDestroyed<Optional<uint32_t>> version;
72     return version;
73 }
74
75 void setApplicationSDKVersion(uint32_t version)
76 {
77     applicationSDKVersionOverride() = version;
78 }
79
80 uint32_t applicationSDKVersion()
81 {
82     if (applicationSDKVersionOverride())
83         return *applicationSDKVersionOverride();
84     return dyld_get_program_sdk_version();
85 }
86
87 bool isInWebProcess()
88 {
89     static bool mainBundleIsWebProcess = [[[NSBundle mainBundle] bundleIdentifier] hasPrefix:@"com.apple.WebKit.WebContent"];
90     return mainBundleIsWebProcess;
91 }
92
93 static bool applicationBundleIsEqualTo(const String& bundleIdentifierString)
94 {
95     return applicationBundleIdentifier() == bundleIdentifierString;
96 }
97
98 #if PLATFORM(MAC)
99
100 bool MacApplication::isSafari()
101 {
102     static bool isSafari = applicationBundleIsEqualTo("com.apple.Safari"_s) || applicationBundleIsEqualTo("com.apple.SafariTechnologyPreview"_s);
103     return isSafari;
104 }
105
106 bool MacApplication::isAppleMail()
107 {
108     static bool isAppleMail = applicationBundleIsEqualTo("com.apple.mail"_s);
109     return isAppleMail;
110 }
111
112 bool MacApplication::isIBooks()
113 {
114     static bool isIBooks = applicationBundleIsEqualTo("com.apple.iBooksX"_s);
115     return isIBooks;
116 }
117
118 bool MacApplication::isITunes()
119 {
120     static bool isITunes = applicationBundleIsEqualTo("com.apple.iTunes"_s);
121     return isITunes;
122 }
123
124 bool MacApplication::isMicrosoftMessenger()
125 {
126     static bool isMicrosoftMessenger = applicationBundleIsEqualTo("com.microsoft.Messenger"_s);
127     return isMicrosoftMessenger;
128 }
129
130 bool MacApplication::isAdobeInstaller()
131 {
132     static bool isAdobeInstaller = applicationBundleIsEqualTo("com.adobe.Installers.Setup"_s);
133     return isAdobeInstaller;
134 }
135
136 bool MacApplication::isAOLInstantMessenger()
137 {
138     static bool isAOLInstantMessenger = applicationBundleIsEqualTo("com.aol.aim.desktop"_s);
139     return isAOLInstantMessenger;
140 }
141
142 bool MacApplication::isMicrosoftMyDay()
143 {
144     static bool isMicrosoftMyDay = applicationBundleIsEqualTo("com.microsoft.myday"_s);
145     return isMicrosoftMyDay;
146 }
147
148 bool MacApplication::isMicrosoftOutlook()
149 {
150     static bool isMicrosoftOutlook = applicationBundleIsEqualTo("com.microsoft.Outlook"_s);
151     return isMicrosoftOutlook;
152 }
153
154 bool MacApplication::isQuickenEssentials()
155 {
156     static bool isQuickenEssentials = applicationBundleIsEqualTo("com.intuit.QuickenEssentials"_s);
157     return isQuickenEssentials;
158 }
159
160 bool MacApplication::isAperture()
161 {
162     static bool isAperture = applicationBundleIsEqualTo("com.apple.Aperture"_s);
163     return isAperture;
164 }
165
166 bool MacApplication::isVersions()
167 {
168     static bool isVersions = applicationBundleIsEqualTo("com.blackpixel.versions"_s);
169     return isVersions;
170 }
171
172 bool MacApplication::isHRBlock()
173 {
174     static bool isHRBlock = applicationBundleIsEqualTo("com.hrblock.tax.2010"_s);
175     return isHRBlock;
176 }
177
178 bool MacApplication::isIAdProducer()
179 {
180     static bool isIAdProducer = applicationBundleIsEqualTo("com.apple.iAdProducer"_s);
181     return isIAdProducer;
182 }
183
184 bool MacApplication::isSolidStateNetworksDownloader()
185 {
186     static bool isSolidStateNetworksDownloader = applicationBundleIsEqualTo("com.solidstatenetworks.awkhost"_s);
187     return isSolidStateNetworksDownloader;
188 }
189
190 #endif // PLATFORM(MAC)
191
192 #if PLATFORM(IOS_FAMILY)
193
194 static bool applicationBundleStartsWith(const String& bundleIdentifierPrefix)
195 {
196     return applicationBundleIdentifier().startsWith(bundleIdentifierPrefix);
197 }
198
199 bool IOSApplication::isMobileMail()
200 {
201     static bool isMobileMail = applicationBundleIsEqualTo("com.apple.mobilemail"_s);
202     return isMobileMail;
203 }
204
205 bool IOSApplication::isMobileSafari()
206 {
207     static bool isMobileSafari = applicationBundleIsEqualTo("com.apple.mobilesafari"_s);
208     return isMobileSafari;
209 }
210
211 bool IOSApplication::isWebBookmarksD()
212 {
213     static bool isWebBookmarksD = applicationBundleIsEqualTo("com.apple.webbookmarksd"_s);
214     return isWebBookmarksD;
215 }
216
217 bool IOSApplication::isDumpRenderTree()
218 {
219     // We use a prefix match instead of strict equality since multiple instances of DumpRenderTree
220     // may be launched, where the bundle identifier of each instance has a unique suffix.
221     static bool isDumpRenderTree = applicationBundleIsEqualTo("org.webkit.DumpRenderTree"_s); // e.g. org.webkit.DumpRenderTree0
222     return isDumpRenderTree;
223 }
224
225 bool IOSApplication::isMobileStore()
226 {
227     static bool isMobileStore = applicationBundleIsEqualTo("com.apple.MobileStore"_s);
228     return isMobileStore;
229 }
230
231 bool IOSApplication::isSpringBoard()
232 {
233     static bool isSpringBoard = applicationBundleIsEqualTo("com.apple.springboard"_s);
234     return isSpringBoard;
235 }
236
237 bool IOSApplication::isWebApp()
238 {
239     static bool isWebApp = applicationBundleIsEqualTo("com.apple.webapp"_s);
240     return isWebApp;
241 }
242
243 // FIXME: this needs to be changed when the WebProcess is changed to an XPC service.
244 bool IOSApplication::isWebProcess()
245 {
246     return isInWebProcess();
247 }
248
249 bool IOSApplication::isIBooks()
250 {
251     static bool isIBooks = applicationBundleIsEqualTo("com.apple.iBooks"_s);
252     return isIBooks;
253 }
254
255 bool IOSApplication::isIBooksStorytime()
256 {
257     static bool isIBooksStorytime = applicationBundleIsEqualTo("com.apple.TVBooks"_s);
258     return isIBooksStorytime;
259 }
260
261 bool IOSApplication::isTheSecretSocietyHiddenMystery()
262 {
263     static bool isTheSecretSocietyHiddenMystery = applicationBundleIsEqualTo("com.g5e.secretsociety"_s);
264     return isTheSecretSocietyHiddenMystery;
265 }
266
267 bool IOSApplication::isCardiogram()
268 {
269     static bool isCardiogram = applicationBundleIsEqualTo("com.cardiogram.ios.heart"_s);
270     return isCardiogram;
271 }
272
273 bool IOSApplication::isNike()
274 {
275     static bool isNike = applicationBundleIsEqualTo("com.nike.omega"_s);
276     return isNike;
277 }
278
279 bool IOSApplication::isMoviStarPlus()
280 {
281     static bool isMoviStarPlus = applicationBundleIsEqualTo("com.prisatv.yomvi"_s);
282     return isMoviStarPlus;
283 }
284
285 bool IOSApplication::isFirefox()
286 {
287     static bool isFirefox = applicationBundleIsEqualTo("org.mozilla.ios.Firefox"_s);
288     return isFirefox;
289 }
290
291 bool IOSApplication::isAppleApplication()
292 {
293     static bool isAppleApplication = applicationBundleStartsWith("com.apple."_s);
294     return isAppleApplication;
295 }
296
297 bool IOSApplication::isEvernote()
298 {
299     static bool isEvernote = applicationBundleIsEqualTo("com.evernote.iPhone.Evernote"_s);
300     return isEvernote;
301 }
302
303 #endif
304
305 } // namespace WebCore
306
307 #endif // PLATFORM(COCOA)