mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-10-29 20:10:41 -04:00
144 lines
5.0 KiB
Objective-C
144 lines
5.0 KiB
Objective-C
//
|
|
// FLEXWebViewController.m
|
|
// Flipboard
|
|
//
|
|
// Created by Ryan Olson on 6/10/14.
|
|
// Copyright (c) 2020 FLEX Team. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXWebViewController.h"
|
|
#import "FLEXUtility.h"
|
|
#import <WebKit/WebKit.h>
|
|
|
|
@interface FLEXWebViewController () <WKNavigationDelegate>
|
|
|
|
@property (nonatomic) WKWebView *webView;
|
|
@property (nonatomic) NSString *originalText;
|
|
|
|
@end
|
|
|
|
@implementation FLEXWebViewController
|
|
|
|
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
|
|
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
|
if (self) {
|
|
WKWebViewConfiguration *configuration = [WKWebViewConfiguration new];
|
|
|
|
if (@available(iOS 10.0, *)) {
|
|
configuration.dataDetectorTypes = WKDataDetectorTypeLink;
|
|
}
|
|
|
|
self.webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
|
|
self.webView.navigationDelegate = self;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithText:(NSString *)text {
|
|
self = [self initWithNibName:nil bundle:nil];
|
|
if (self) {
|
|
self.originalText = text;
|
|
|
|
NSString *html = @"<head><style>:root{ color-scheme: light dark; }</style>"
|
|
"<meta name='viewport' content='initial-scale=1.0'></head><body><pre>%@</pre></body>";
|
|
|
|
// Loading message for when input text takes a long time to escape
|
|
NSString *loadingMessage = [NSString stringWithFormat:html, @"Loading..."];
|
|
[self.webView loadHTMLString:loadingMessage baseURL:nil];
|
|
|
|
// Escape HTML on a background thread
|
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
NSString *escapedText = [FLEXUtility stringByEscapingHTMLEntitiesInString:text];
|
|
NSString *htmlString = [NSString stringWithFormat:html, escapedText];
|
|
|
|
// Update webview on the main thread
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
[self.webView loadHTMLString:htmlString baseURL:nil];
|
|
});
|
|
});
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (id)initWithURL:(NSURL *)url {
|
|
self = [self initWithNibName:nil bundle:nil];
|
|
if (self) {
|
|
NSURLRequest *request = [NSURLRequest requestWithURL:url];
|
|
[self.webView loadRequest:request];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
[self.view addSubview:self.webView];
|
|
self.webView.frame = self.view.bounds;
|
|
self.webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
|
|
|
if (self.originalText.length > 0) {
|
|
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
|
|
initWithTitle:@"Copy" style:UIBarButtonItemStylePlain target:self action:@selector(copyButtonTapped:)
|
|
];
|
|
}
|
|
}
|
|
|
|
- (void)copyButtonTapped:(id)sender {
|
|
[UIPasteboard.generalPasteboard setString:self.originalText];
|
|
}
|
|
|
|
|
|
#pragma mark - WKWebView Delegate
|
|
|
|
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
|
|
decisionHandler:(void (^)(WKNavigationActionPolicy))handler {
|
|
WKNavigationActionPolicy policy = WKNavigationActionPolicyCancel;
|
|
if (navigationAction.navigationType == WKNavigationTypeOther) {
|
|
// Allow the initial load
|
|
policy = WKNavigationActionPolicyAllow;
|
|
} else {
|
|
// For clicked links, push another web view controller onto the navigation stack
|
|
// so that hitting the back button works as expected.
|
|
// Don't allow the current web view to handle the navigation.
|
|
NSURLRequest *request = navigationAction.request;
|
|
FLEXWebViewController *webVC = [[[self class] alloc] initWithURL:request.URL];
|
|
webVC.title = request.URL.absoluteString;
|
|
[self.navigationController pushViewController:webVC animated:YES];
|
|
}
|
|
|
|
handler(policy);
|
|
}
|
|
|
|
|
|
#pragma mark - Class Helpers
|
|
|
|
+ (BOOL)supportsPathExtension:(NSString *)extension {
|
|
BOOL supported = NO;
|
|
NSSet<NSString *> *supportedExtensions = [self webViewSupportedPathExtensions];
|
|
if ([supportedExtensions containsObject:extension.lowercaseString]) {
|
|
supported = YES;
|
|
}
|
|
return supported;
|
|
}
|
|
|
|
+ (NSSet<NSString *> *)webViewSupportedPathExtensions {
|
|
static NSSet<NSString *> *pathExtensions = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
// Note that this is not exhaustive, but all these extensions should work well in the web view.
|
|
// See https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html#//apple_ref/doc/uid/TP40006482-SW7
|
|
pathExtensions = [NSSet<NSString *> setWithArray:@[
|
|
@"jpg", @"jpeg", @"png", @"gif", @"pdf", @"svg", @"tiff", @"3gp", @"3gpp", @"3g2",
|
|
@"3gp2", @"aiff", @"aif", @"aifc", @"cdda", @"amr", @"mp3", @"swa", @"mp4", @"mpeg",
|
|
@"mpg", @"mp3", @"wav", @"bwf", @"m4a", @"m4b", @"m4p", @"mov", @"qt", @"mqv", @"m4v"
|
|
]];
|
|
|
|
});
|
|
|
|
return pathExtensions;
|
|
}
|
|
|
|
@end
|