//
// R S t u d i o S e r v e r S e s s i o n W e b V i e w C o n t r o l l e r . s w i f t
// w k t e s t
//
// C r e a t e d b y h r b r m s t r o n 9 / 9 / 1 9 .
// C o p y r i g h t © 2 0 1 9 B o b R u d i s . A l l r i g h t s r e s e r v e d .
//
import Cocoa
import WebKit
class RstudioServerSessionWebViewController : NSViewController , NSWindowDelegate {
var webView : WKWebView !
var popupWebView : WKWebView ?
open override func viewDidLoad ( ) {
super . viewDidLoad ( )
setupWebView ( )
}
func setupWebView ( ) {
let preferences = WKPreferences ( )
preferences . javaScriptEnabled = true
preferences . javaScriptCanOpenWindowsAutomatically = true
let configuration = WKWebViewConfiguration ( )
configuration . preferences = preferences
webView = WKWebView ( frame : view . bounds , configuration : configuration )
webView . autoresizingMask = [ . width , . height ]
webView . uiDelegate = self
webView . navigationDelegate = self
view . addSubview ( webView )
}
func loadWebView ( urlIn : String ) {
if let url = URL ( string : urlIn ) {
let urlRequest = URLRequest ( url : url )
webView . load ( urlRequest )
}
}
}
extension RstudioServerSessionWebViewController : WKUIDelegate {
func webView ( _ webView : WKWebView , runOpenPanelWith parameters : WKOpenPanelParameters , initiatedByFrame frame : WKFrameInfo , completionHandler : @ escaping ( [ URL ] ? ) -> Void ) {
let openPanel = NSOpenPanel ( )
openPanel . canChooseFiles = true
openPanel . allowsMultipleSelection = false
openPanel . canChooseDirectories = false
openPanel . canCreateDirectories = false
openPanel . beginSheetModal ( for : self . view . window ! ) { ( response ) in
if ( response = = NSApplication . ModalResponse . OK ) {
completionHandler ( [ openPanel . url ! ] )
} else {
completionHandler ( nil )
}
openPanel . close ( )
}
}
func webView ( _ webView : WKWebView , createWebViewWith configuration : WKWebViewConfiguration , for navigationAction : WKNavigationAction , windowFeatures : WKWindowFeatures ) -> WKWebView ? {
if navigationAction . targetFrame = = nil {
let u = URL ( string : navigationAction . request . url ! . absoluteString ) !
if ( ( u . urlComponents ? . path . starts ( with : " /export/ " ) ) != nil ) {
let exportWindowController = NSStoryboard ( name : " Main " , bundle : nil ) . instantiateController ( withIdentifier : " exportPopupPanel " ) as ! ExportWebViewController
let exportWV = ( exportWindowController . contentViewController as ! exportPopupViewController )
exportWV . view . window ? . title = navigationAction . request . url ! . absoluteString
exportWV . setupWebView ( configuration : configuration )
exportWV . loadWebView ( urlIn : " " )
let urlPath = navigationAction . request . url ! . absoluteString
// C h e c k f o r " / e x p o r t / "
// I f e x p o r t , t h e n g e t b r i n g u p a S a v e P a n e l a n d t h e n d o w n l o a d t h e f i l e t o t h a t l o c a t i o n
if let url = URL ( string : urlPath ) {
if ( url . path . starts ( with : " /export " ) ) {
let savePanel = NSSavePanel ( )
savePanel . canCreateDirectories = true
savePanel . nameFieldStringValue = url . queryParameters [ " name " ] !
savePanel . beginSheetModal ( for : self . view . window ! ) { ( response ) in
if ( response = = NSApplication . ModalResponse . OK ) {
download_from_studio_server ( fromRS : url . absoluteString , toFS : savePanel . url ! . absoluteString )
}
savePanel . close ( )
}
}
}
return ( exportWV . webView )
} else {
let plotWindowController = NSStoryboard ( name : " Main " , bundle : nil ) . instantiateController ( withIdentifier : " plotPopupPanel " ) as ! PlotWebViewController
let plotWV = ( plotWindowController . contentViewController as ! plotPopupViewController )
plotWV . view . window ? . title = navigationAction . request . url ! . absoluteString
plotWV . setupWebView ( configuration : configuration )
plotWindowController . showWindow ( self )
plotWV . loadWebView ( urlIn : navigationAction . request . url ! . absoluteString )
return ( plotWV . webView )
}
}
return ( nil )
}
// f u n c w e b V i e w ( _ w e b V i e w : W K W e b V i e w , c r e a t e W e b V i e w W i t h c o n f i g u r a t i o n : W K W e b V i e w C o n f i g u r a t i o n , f o r n a v i g a t i o n A c t i o n : W K N a v i g a t i o n A c t i o n , w i n d o w F e a t u r e s : W K W i n d o w F e a t u r e s ) - > W K W e b V i e w ? {
// p o p u p W e b V i e w = W K W e b V i e w ( f r a m e : v i e w . b o u n d s , c o n f i g u r a t i o n : c o n f i g u r a t i o n )
// p o p u p W e b V i e w ! . a u t o r e s i z i n g M a s k = [ . w i d t h , . h e i g h t ]
// p o p u p W e b V i e w ! . n a v i g a t i o n D e l e g a t e = s e l f
// p o p u p W e b V i e w ! . u i D e l e g a t e = s e l f
// v i e w . a d d S u b v i e w ( p o p u p W e b V i e w ! )
// r e t u r n p o p u p W e b V i e w !
// }
//
func webViewDidClose ( _ webView : WKWebView ) {
if webView = = popupWebView {
popupWebView ? . removeFromSuperview ( )
popupWebView = nil
}
}
}
extension RstudioServerSessionWebViewController : WKNavigationDelegate {
open func webView ( _ webView : WKWebView , didStartProvisionalNavigation navigation : WKNavigation ! ) {
}
func webView ( _ webView : WKWebView , didFinish navigation : WKNavigation ! ) {
}
}