blob: 5eb82e005c6896c43ca262f7e28c89009d956c1e [file] [log] [blame] [edit]
/*
* Copyright (C) 2024 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "DeprecatedGlobalValues.h"
#import "PlatformUtilities.h"
#import "Test.h"
#import <WebKit/WKFoundation.h>
#import <WebKit/WKPreferencesPrivate.h>
@interface WKPreferencesMessageHandler : NSObject <WKScriptMessageHandler>
@end
@implementation WKPreferencesMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
receivedScriptMessage = true;
scriptMessages.append(message);
}
@end
static const char* simpleHTML = R"TESTRESOURCE(
<script>
function log(text)
{
window.webkit.messageHandlers.testHandler.postMessage(text);
}
log("Loaded");
</script>
)TESTRESOURCE";
TEST(WKPreferencesPrivate, DisableRichJavaScriptFeatures)
{
RetainPtr configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
[configuration.get().preferences _disableRichJavaScriptFeatures];
RetainPtr handler = adoptNS([[WKPreferencesMessageHandler alloc] init]);
[[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
RetainPtr webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
[webView loadHTMLString:[NSString stringWithUTF8String:simpleHTML] baseURL:[NSURL URLWithString:@"https://webkit.org"]];
RetainPtr result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Loaded", result.get());
[webView evaluateJavaScript:@"canvas = document.createElement('canvas'); log(canvas.getContext('webgl') ? 'WebGL Enabled' : 'WebGL Disabled');" completionHandler:nil];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"WebGL Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.gpu ? 'WebGPU Enabled' : 'WebGPU Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"WebGPU Disabled", result.get());
[webView evaluateJavaScript:@"log(window.AudioContext ? 'Web Audio Enabled' : 'Web Audio Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Web Audio Disabled", result.get());
[webView evaluateJavaScript:@"log(window.RTCPeerConnection ? 'Web RTC Enabled' : 'Web RTC Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Web RTC Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.getGamepads ? 'Gamepad Enabled' : 'Gamepad Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Gamepad Disabled", result.get());
[webView evaluateJavaScript:@"log(window.webkitSpeechRecognition ? 'SpeechRecognition Enabled' : 'SpeechRecognition Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"SpeechRecognition Disabled", result.get());
[webView evaluateJavaScript:@"log(window.SpeechSynthesis ? 'SpeechSynthesis Enabled' : 'SpeechSynthesis Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"SpeechSynthesis Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.geolocation ? 'Geolocation Enabled' : 'Geolocation Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Geolocation Disabled", result.get());
[webView evaluateJavaScript:@"log(window.ApplePaySession ? 'ApplePay Enabled' : 'ApplePay Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"ApplePay Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.setAppBadge ? 'Badging Enabled' : 'Badging Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Badging Disabled", result.get());
[webView evaluateJavaScript:@"log(window.BarcodeDetector ? 'Shape Detection Enabled' : 'Shape Detection Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Shape Detection Disabled", result.get());
[webView evaluateJavaScript:@"log(window.screen && screen.orientation ? 'Screen Orientation Enabled' : 'Screen Orientation Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Screen Orientation Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.identity && window.DigitalCredential ? 'Digital Credentials Enabled' : 'Digital Credentials Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Digital Credentials Disabled", result.get());
[webView evaluateJavaScript:@"log(window.Notification ? 'Notifications Enabled' : 'Notifications Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Notifications Disabled", result.get());
[webView evaluateJavaScript:@"log('serviceWorker' in navigator && 'BackgroundFetch' in window ? 'Background Fetch Enabled' : 'Background Fetch Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Background Fetch Disabled", result.get());
[webView evaluateJavaScript:@"log(window.BroadcastChannel ? 'BroadcastChannel Enabled' : 'BroadcastChannel Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"BroadcastChannel Disabled", result.get());
[webView evaluateJavaScript:@"log(window.caches ? 'Cache API Enabled' : 'Cache API Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Cache API Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.contacts ? 'Contact Picker Enabled' : 'Contact Picker Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Contact Picker Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.cookieConsent ? 'Cookie Consent Enabled' : 'Cookie Consent Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Cookie Consent Disabled", result.get());
[webView evaluateJavaScript:@"log(window.cookieStore ? 'Cookie Store Enabled' : 'Cookie Store Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Cookie Store Disabled", result.get());
[webView evaluateJavaScript:@"log('serviceWorker' in navigator && window.cookieStore ? 'Cookie Store Manager Enabled' : 'Cookie Store Manager Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Cookie Store Manager Disabled", result.get());
[webView evaluateJavaScript:@"log(window.DeviceOrientationEvent && DeviceOrientationEvent.requestPermission ? 'Device Orientation Permission Enabled' : 'Device Orientation Permission Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Device Orientation Permission Disabled", result.get());
[webView evaluateJavaScript:@"log(window.indexedDB ? 'IndexedDB Enabled' : 'IndexedDB Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"IndexedDB Disabled", result.get());
[webView evaluateJavaScript:@"log(window.ManagedMediaSource ? 'Managed Media Source Enabled' : 'Managed Media Source Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Managed Media Source Disabled", result.get());
[webView evaluateJavaScript:@"log(window.MediaRecorder ? 'Media Recorder Enabled' : 'Media Recorder Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Media Recorder Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.mediaSession && navigator.mediaSession.coordinator ? 'Media Session Coordinator Enabled' : 'Media Session Coordinator Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Media Session Coordinator Disabled", result.get());
[webView evaluateJavaScript:@"log('serviceWorker' in navigator && window.Notification ? 'Notification Event Enabled' : 'Notification Event Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Notification Event Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.permissions ? 'Permissions API Enabled' : 'Permissions API Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Permissions API Disabled", result.get());
[webView evaluateJavaScript:@"log('serviceWorker' in navigator && window.PushManager ? 'Push API Enabled' : 'Push API Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Push API Disabled", result.get());
[webView evaluateJavaScript:@"log('serviceWorker' in navigator ? 'Service Worker Navigation Preload Enabled' : 'Service Worker Navigation Preload Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Service Worker Navigation Preload Disabled", result.get());
[webView evaluateJavaScript:@"log('serviceWorker' in navigator ? 'Service Workers Enabled' : 'Service Workers Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Service Workers Disabled", result.get());
[webView evaluateJavaScript:@"log(window.SharedWorker ? 'Shared Worker Enabled' : 'Shared Worker Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Shared Worker Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.credentials && navigator.credentials.create ? 'Web Authentication Enabled' : 'Web Authentication Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"Web Authentication Disabled", result.get());
[webView evaluateJavaScript:@"log(window.WebSocket ? 'WebSocket Enabled' : 'WebSocket Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"WebSocket Disabled", result.get());
[webView evaluateJavaScript:@"log(window.WebTransport ? 'WebTransport Enabled' : 'WebTransport Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"WebTransport Disabled", result.get());
[webView evaluateJavaScript:@"log(navigator.xr ? 'WebXR Enabled' : 'WebXR Disabled');" completionHandler:^(id, NSError *error) {
EXPECT_NULL(error);
}];
result = (NSString *)[getNextMessage() body];
EXPECT_WK_STREQ(@"WebXR Disabled", result.get());
}