[iOS] Implement safe browsing in WebKit
[WebKit-https.git] / Source / WebKit / UIProcess / API / C / mac / WKContextPrivateMac.mm
1 /*
2  * Copyright (C) 2013 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 "WKContextPrivateMac.h"
28
29 #import "APIArray.h"
30 #import "APIDictionary.h"
31 #import "APINumber.h"
32 #import "APIString.h"
33 #import "PluginInfoStore.h"
34 #import "PluginInformation.h"
35 #import "StringUtilities.h"
36 #import "WKAPICast.h"
37 #import "WKPluginInformation.h"
38 #import "WKSharedAPICast.h"
39 #import "WKStringCF.h"
40 #import "WebProcessPool.h"
41 #import <WebCore/PluginBlacklist.h>
42 #import <WebCore/WebGLBlacklist.h>
43 #import <wtf/RetainPtr.h>
44
45 bool WKContextIsPlugInUpdateAvailable(WKContextRef contextRef, WKStringRef plugInBundleIdentifierRef)
46 {
47 #if PLATFORM(IOS_FAMILY)
48     return false;
49 #else
50     return WebCore::PluginBlacklist::isPluginUpdateAvailable((__bridge NSString *)adoptCF(WKStringCopyCFString(kCFAllocatorDefault, plugInBundleIdentifierRef)).get());
51 #endif
52 }
53
54 void WKContextSetPluginLoadClientPolicy(WKContextRef contextRef, WKPluginLoadClientPolicy policy, WKStringRef host, WKStringRef bundleIdentifier, WKStringRef versionString)
55 {
56 #if ENABLE(NETSCAPE_PLUGIN_API)
57     WebKit::toImpl(contextRef)->setPluginLoadClientPolicy(WebKit::toPluginLoadClientPolicy(policy), WebKit::toWTFString(host), WebKit::toWTFString(bundleIdentifier), WebKit::toWTFString(versionString));
58 #endif
59 }
60
61 void WKContextClearPluginClientPolicies(WKContextRef contextRef)
62 {
63 #if ENABLE(NETSCAPE_PLUGIN_API)
64     WebKit::toImpl(contextRef)->clearPluginClientPolicies();
65 #endif
66 }
67
68 WKDictionaryRef WKContextCopyPlugInInfoForBundleIdentifier(WKContextRef contextRef, WKStringRef plugInBundleIdentifierRef)
69 {
70 #if ENABLE(NETSCAPE_PLUGIN_API)
71     WebKit::PluginModuleInfo plugin = WebKit::toImpl(contextRef)->pluginInfoStore().findPluginWithBundleIdentifier(WebKit::toWTFString(plugInBundleIdentifierRef));
72     if (plugin.path.isNull())
73         return 0;
74
75     auto dictionary = createPluginInformationDictionary(plugin);
76     return WebKit::toAPI(&dictionary.leakRef());
77 #else
78     return 0;
79 #endif
80 }
81
82 void WKContextGetInfoForInstalledPlugIns(WKContextRef contextRef, WKContextGetInfoForInstalledPlugInsBlock block)
83 {
84 #if ENABLE(NETSCAPE_PLUGIN_API)
85     Vector<WebKit::PluginModuleInfo> plugins = WebKit::toImpl(contextRef)->pluginInfoStore().plugins();
86
87     Vector<RefPtr<API::Object>> pluginInfoDictionaries;
88     pluginInfoDictionaries.reserveInitialCapacity(plugins.size());
89
90     for (const auto& plugin: plugins)
91         pluginInfoDictionaries.uncheckedAppend(createPluginInformationDictionary(plugin));
92
93     RefPtr<API::Array> array = API::Array::create(WTFMove(pluginInfoDictionaries));
94
95     WebKit::toImpl(contextRef)->ref();
96     dispatch_async(dispatch_get_main_queue(), ^() {
97         block(WebKit::toAPI(array.get()), 0);
98     
99         WebKit::toImpl(contextRef)->deref();
100     });
101 #endif
102 }
103
104 void WKContextResetHSTSHosts(WKContextRef context)
105 {
106     return WebKit::toImpl(context)->resetHSTSHosts();
107 }
108
109 void WKContextResetHSTSHostsAddedAfterDate(WKContextRef context, double startDateIntervalSince1970)
110 {
111     return WebKit::toImpl(context)->resetHSTSHostsAddedAfterDate(startDateIntervalSince1970);
112 }
113
114 void WKContextRegisterSchemeForCustomProtocol(WKContextRef context, WKStringRef scheme)
115 {
116     WebKit::WebProcessPool::registerGlobalURLSchemeAsHavingCustomProtocolHandlers(WebKit::toWTFString(scheme));
117 }
118
119 void WKContextUnregisterSchemeForCustomProtocol(WKContextRef context, WKStringRef scheme)
120 {
121     WebKit::WebProcessPool::unregisterGlobalURLSchemeAsHavingCustomProtocolHandlers(WebKit::toWTFString(scheme));
122 }
123
124 /* DEPRECATED -  Please use constants from WKPluginInformation instead. */
125
126 WKStringRef WKPlugInInfoPathKey()
127 {
128     return WKPluginInformationPathKey();
129 }
130
131 WKStringRef WKPlugInInfoBundleIdentifierKey()
132 {
133     return WKPluginInformationBundleIdentifierKey();
134 }
135
136 WKStringRef WKPlugInInfoVersionKey()
137 {
138     return WKPluginInformationBundleVersionKey();
139 }
140
141 WKStringRef WKPlugInInfoLoadPolicyKey()
142 {
143     return WKPluginInformationDefaultLoadPolicyKey();
144 }
145
146 WKStringRef WKPlugInInfoUpdatePastLastBlockedVersionIsKnownAvailableKey()
147 {
148     return WKPluginInformationUpdatePastLastBlockedVersionIsKnownAvailableKey();
149 }
150
151 WKStringRef WKPlugInInfoIsSandboxedKey()
152 {
153     return WKPluginInformationHasSandboxProfileKey();
154 }
155
156 bool WKContextShouldBlockWebGL()
157 {
158 #if PLATFORM(MAC)
159     return WebCore::WebGLBlacklist::shouldBlockWebGL();
160 #else
161     return false;
162 #endif
163 }
164
165 bool WKContextShouldSuggestBlockWebGL()
166 {
167 #if PLATFORM(MAC)
168     return WebCore::WebGLBlacklist::shouldSuggestBlockingWebGL();
169 #else
170     return false;
171 #endif
172 }
173
174 bool WKContextHandlesSafeBrowsing()
175 {
176     return true;
177 }