Files
Attractor/SBrowserProcessBundle/SBRProcessPlugin.m

108 lines
4.0 KiB
Mathematica
Raw Normal View History

//
// SBRProcessPlugin.m
// SBrowserProcessBundle
//
// Created by James Magahern on 7/22/20.
//
#import "SBRProcessPlugin.h"
#import "SBRWebProcessDelegate.h"
#import "SBRWebProcessProxy.h"
#import <WebKit/_WKRemoteObjectInterface.h>
#import <WebKit/_WKRemoteObjectRegistry.h>
#import <WebKit/WKWebProcessPlugInBrowserContextController.h>
#import <WebKit/WKWebProcessPlugInBrowserContextControllerPrivate.h>
#import <WebKit/WKWebProcessPlugInLoadDelegate.h>
@interface SBRProcessPlugin () <WKWebProcessPlugInLoadDelegate, SBRWebProcessProxy>
@property (nonatomic, strong) id<SBRWebProcessDelegate> processDelegate;
2021-10-21 11:05:40 -07:00
@property (nonatomic, assign) BOOL allScriptsAllowed;
2021-10-21 11:05:40 -07:00
@property (nonatomic, strong) NSMutableSet<NSString *> *allowedResourceOrigins;
@property (nonatomic, strong) NSDictionary<NSString *, NSNumber *> *policyTypeByOrigin;
@end
@implementation SBRProcessPlugin
+ (void)initialize
{
[super initialize];
NSLog(@"SBRProcessPlugin Initialized");
}
#pragma mark <SBRWebProcessProxy>
- (void)hello
{
NSLog(@"SBRProcessPlugin: Helloooooo");
}
2020-07-24 19:26:35 -07:00
- (void)syncAllowedResourceOrigins:(NSArray<NSString *> *)allowedOrigins
{
2020-07-24 19:26:35 -07:00
_allowedResourceOrigins = [NSMutableSet setWithArray:allowedOrigins];
}
2021-10-21 11:05:40 -07:00
- (void)syncPolicyTypes:(NSDictionary<NSString *,NSNumber *> *)policyTypes
{
_policyTypeByOrigin = policyTypes;
}
- (void)setAllScriptsAllowed:(BOOL)allScriptsAllowed
{
_allScriptsAllowed = allScriptsAllowed;
}
#pragma mark <WKWebProcessPlugIn>
- (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController initializeWithObject:(id)initializationObject
{
_allowedResourceOrigins = [[plugInController parameters] valueForKey:SBRGetAllowedOriginsKey()];
_allScriptsAllowed = [[[plugInController parameters] valueForKey:SBRGetAllScriptsAllowedKey()] boolValue];
NSLog(@"SBRProcessPlugin: %lu origins allowed, all scripts allowed: %@ ", (unsigned long)_allowedResourceOrigins.count, _allScriptsAllowed ? @"YES" : @"NO");
}
- (void)webProcessPlugIn:(WKWebProcessPlugInController *)plugInController didCreateBrowserContextController:(WKWebProcessPlugInBrowserContextController *)browserContextController
{
_WKRemoteObjectInterface *proxyInterface = [_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(SBRWebProcessProxy)];
[browserContextController._remoteObjectRegistry registerExportedObject:self interface:proxyInterface];
_WKRemoteObjectInterface *eventListenerInterface = [_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(SBRWebProcessDelegate)];
self.processDelegate = [browserContextController._remoteObjectRegistry remoteObjectProxyWithInterface:eventListenerInterface];
browserContextController.loadDelegate = self;
[[self processDelegate] webProcessDidConnect];
}
#pragma mark <WKWebProcessPlugInLoadDelegate>
- (NSURLRequest *)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller frame:(WKWebProcessPlugInFrame *)frame willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse
{
NSLog(@"SBRProcessPlugin: Sending request: %@", request);
if (_allowedResourceOrigins == nil) {
NSLog(@"Allowed resource origins should not be nil!!!!");
}
NSURL *requestURL = [request URL];
NSString *originString = [requestURL host];
NSString *requestExtension = [requestURL pathExtension];
if (requestExtension.length > 0 && [requestExtension isEqualToString:@"js"]) {
if ([self allScriptsAllowed] || [_allowedResourceOrigins containsObject:originString]) {
NSLog(@"SBRProcessPlugin: Allowing whitelisted requestURL: %@", requestURL);
[[self processDelegate] webProcessDidAllowScriptWithOrigin:originString];
} else {
NSLog(@"SBRProcessPlugin: Blocking requestURL: %@", requestURL);
[[self processDelegate] webProcessDidBlockScriptWithOrigin:originString];
request = nil;
}
}
return request;
}
@end