Migrate from ints to unsigneds when referring to indices into strings
[WebKit-https.git] / Source / WebCore / platform / RuntimeApplicationChecks.mm
1 /*
2  * Copyright (C) 2011, 2016 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 #import <Foundation/NSBundle.h>
30 #import <wtf/NeverDestroyed.h>
31 #import <wtf/RunLoop.h>
32 #import <wtf/text/WTFString.h>
33
34 namespace WebCore {
35
36 #if !ASSERT_MSG_DISABLED
37 static bool applicationBundleIdentifierOverrideWasQueried = false;
38 #endif
39
40 // The application bundle identifier gets set to the UIProcess bundle identifier by the WebProcess and
41 // the Networking upon initialization. It is unset otherwise.
42 static String& applicationBundleIdentifierOverride()
43 {
44     static NeverDestroyed<String> identifier;
45 #if !ASSERT_MSG_DISABLED
46     applicationBundleIdentifierOverrideWasQueried = true;
47 #endif
48     return identifier;
49 }
50
51 static String applicationBundleIdentifier()
52 {
53     // The override only gets set in WebKit2's WebProcess and NetworkProcess. If unset, we use the main bundle identifier.
54     const auto& identifier = applicationBundleIdentifierOverride();
55     ASSERT(identifier.isNull() || RunLoop::isMain());
56     return identifier.isNull() ? String([[NSBundle mainBundle] bundleIdentifier]) : identifier;
57 }
58
59 void setApplicationBundleIdentifier(const String& bundleIdentifier)
60 {
61     ASSERT(RunLoop::isMain());
62     ASSERT_WITH_MESSAGE(!applicationBundleIdentifierOverrideWasQueried, "applicationBundleIsEqualTo() should not be called before setApplicationBundleIdentifier()");
63     applicationBundleIdentifierOverride() = bundleIdentifier;
64 }
65
66 static bool applicationBundleIsEqualTo(const String& bundleIdentifierString)
67 {
68     return applicationBundleIdentifier() == bundleIdentifierString;
69 }
70
71 #if PLATFORM(MAC)
72
73 bool MacApplication::isSafari()
74 {
75     static bool isSafari = applicationBundleIsEqualTo("com.apple.Safari");
76     return isSafari;
77 }
78
79 bool MacApplication::isAppleMail()
80 {
81     static bool isAppleMail = applicationBundleIsEqualTo("com.apple.mail");
82     return isAppleMail;
83 }
84
85 bool MacApplication::isIBooks()
86 {
87     static bool isIBooks = applicationBundleIsEqualTo("com.apple.iBooksX");
88     return isIBooks;
89 }
90
91 bool MacApplication::isITunes()
92 {
93     static bool isITunes = applicationBundleIsEqualTo("com.apple.iTunes");
94     return isITunes;
95 }
96
97 bool MacApplication::isMicrosoftMessenger()
98 {
99     static bool isMicrosoftMessenger = applicationBundleIsEqualTo("com.microsoft.Messenger");
100     return isMicrosoftMessenger;
101 }
102
103 bool MacApplication::isAdobeInstaller()
104 {
105     static bool isAdobeInstaller = applicationBundleIsEqualTo("com.adobe.Installers.Setup");
106     return isAdobeInstaller;
107 }
108
109 bool MacApplication::isAOLInstantMessenger()
110 {
111     static bool isAOLInstantMessenger = applicationBundleIsEqualTo("com.aol.aim.desktop");
112     return isAOLInstantMessenger;
113 }
114
115 bool MacApplication::isMicrosoftMyDay()
116 {
117     static bool isMicrosoftMyDay = applicationBundleIsEqualTo("com.microsoft.myday");
118     return isMicrosoftMyDay;
119 }
120
121 bool MacApplication::isMicrosoftOutlook()
122 {
123     static bool isMicrosoftOutlook = applicationBundleIsEqualTo("com.microsoft.Outlook");
124     return isMicrosoftOutlook;
125 }
126
127 bool MacApplication::isQuickenEssentials()
128 {
129     static bool isQuickenEssentials = applicationBundleIsEqualTo("com.intuit.QuickenEssentials");
130     return isQuickenEssentials;
131 }
132
133 bool MacApplication::isAperture()
134 {
135     static bool isAperture = applicationBundleIsEqualTo("com.apple.Aperture");
136     return isAperture;
137 }
138
139 bool MacApplication::isVersions()
140 {
141     static bool isVersions = applicationBundleIsEqualTo("com.blackpixel.versions");
142     return isVersions;
143 }
144
145 bool MacApplication::isHRBlock()
146 {
147     static bool isHRBlock = applicationBundleIsEqualTo("com.hrblock.tax.2010");
148     return isHRBlock;
149 }
150
151 bool MacApplication::isSolidStateNetworksDownloader()
152 {
153     static bool isSolidStateNetworksDownloader = applicationBundleIsEqualTo("com.solidstatenetworks.awkhost");
154     return isSolidStateNetworksDownloader;
155 }
156
157 #endif // PLATFORM(MAC)
158
159 #if PLATFORM(IOS)
160
161 bool IOSApplication::isMobileMail()
162 {
163     static bool isMobileMail = applicationBundleIsEqualTo("com.apple.mobilemail");
164     return isMobileMail;
165 }
166
167 bool IOSApplication::isMobileSafari()
168 {
169     static bool isMobileSafari = applicationBundleIsEqualTo("com.apple.mobilesafari");
170     return isMobileSafari;
171 }
172
173 bool IOSApplication::isWebBookmarksD()
174 {
175     static bool isWebBookmarksD = applicationBundleIsEqualTo("com.apple.webbookmarksd");
176     return isWebBookmarksD;
177 }
178
179 bool IOSApplication::isDumpRenderTree()
180 {
181     // We use a prefix match instead of strict equality since LayoutTestRelay may launch multiple instances of
182     // DumpRenderTree where the bundle identifier of each instance has a unique suffix.
183     static bool isDumpRenderTree = applicationBundleIsEqualTo("org.webkit.DumpRenderTree"); // e.g. org.webkit.DumpRenderTree0
184     return isDumpRenderTree;
185 }
186
187 bool IOSApplication::isMobileStore()
188 {
189     static bool isMobileStore = applicationBundleIsEqualTo("com.apple.MobileStore");
190     return isMobileStore;
191 }
192
193 bool IOSApplication::isWebApp()
194 {
195     static bool isWebApp = applicationBundleIsEqualTo("com.apple.webapp");
196     return isWebApp;
197 }
198
199 bool IOSApplication::isOkCupid()
200 {
201     static bool isOkCupid = applicationBundleIsEqualTo("com.okcupid.app");
202     return isOkCupid;
203 }
204
205 bool IOSApplication::isFacebook()
206 {
207     static bool isFacebook = applicationBundleIsEqualTo("com.facebook.Facebook");
208     return isFacebook;
209 }
210
211 bool IOSApplication::isDaijisenDictionary()
212 {
213     static bool isDaijisenDictionary = applicationBundleIsEqualTo("jp.co.shogakukan.daijisen2009i");
214     return isDaijisenDictionary;
215 }
216
217 bool IOSApplication::isNASAHD()
218 {
219     static bool isNASAHD = applicationBundleIsEqualTo("gov.nasa.NASAHD");
220     return isNASAHD;
221 }
222
223 bool IOSApplication::isTheEconomistOnIphone()
224 {
225     static bool isTheEconomistOnIphone = applicationBundleIsEqualTo("com.economist.iphone");
226     return isTheEconomistOnIphone;
227 }
228
229 // FIXME: this needs to be changed when the WebProcess is changed to an XPC service.
230 bool IOSApplication::isWebProcess()
231 {
232     static bool isWebProcess = [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.WebKit.WebContent.Development"]
233         || [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.WebKit.WebContent"]
234         || [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.WebProcess"];
235     return isWebProcess;
236 }
237
238 bool IOSApplication::isIBooks()
239 {
240     static bool isIBooks = applicationBundleIsEqualTo("com.apple.iBooks");
241     return isIBooks;
242 }
243
244 bool IOSApplication::isTheSecretSocietyHiddenMystery()
245 {
246     static bool isTheSecretSocietyHiddenMystery = applicationBundleIsEqualTo("com.g5e.secretsociety");
247     return isTheSecretSocietyHiddenMystery;
248 }
249     
250 #endif
251
252 } // namespace WebCore