mirror of
				https://github.com/SoPat712/YTLitePlus.git
				synced 2025-10-30 20:34:03 -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
 | 
