WkWebViewを動的に生成して、YouTube上の指定ムービーを再生するAppleScriptの改良版です。とくにYouTube限定ではなく、Webコンテンツのブラウズを単体で行うための実験的なScriptです。
# AppleScriptでは、Webブラウザに命令を出せば数行のコマンドで簡単に任意のURLのWebコンテンツを表示させられますが、本ScriptはAppleScriptから他のアプリケーションを介さずに直接Cocoaの機能を呼び出して自前でWebコンテンツを表示させるものです。
NSWindow+NSSplitView+WKWebViewを作成して、Webサーバー上の内容を表示します。v3.0からの改良点は、再生中のWebコンテンツのクリアを明示的に行えるようになったことです。
スクリプトエディタ上で実行し、「OK」ボタンをクリックすると、ウィンドウがクローズし、Webコンテンツの再生も停止します(前バージョンではこれができなかった)。Script MenuおよびScript Debugger上では実行できるもののWebコンテンツ操作はできず、OKボタンも反応しません。
AppleScript Appletとして書き出して実行すると、そのままではインターネットへのアクセスが許可されていないため、表示できません。Info.plistのエントリを書き換える必要があるものと思われます。
再生中のWebコンテンツのクリアについては、US Appleが主催しているCocoa-Dev MLにFritz Andersonが2012年4月11日に投稿した、
On 11 Apr 2012, at 7:51 AM, Koen van der Drift wrote: > Is there a way to empty or clear a webview when I close the popover, > so that next time it is opened it doesn't show the previous page? I > don't want to clear the cache, because when the webview is opened for > an item that was already selected, it can be loaded from the cache. What works for me on iOS is having the UIWebView load about:blank. Maybe it works the same in Mac OS. — F
が参考になりました。Google検索しても見つからなかったのに、MLの過去ログを漁ってみたら割と簡単に発見。あらかじめMLのログをAppleScriptのロボットでテーマごとに自動フォルダ分けして整理してあったのが効きました。
あとは、実行環境がかなり限定される(Script DebuggerやScript Menuから実行すると、Webコンテンツ操作やボタンのクリックができなくなる)点をなんとかしたいところです。AppleScriptアプレットだとそのまま書き出した状態ではネットワーク接続自体ができない(Info.plist書き換えでなんとか?)とか。
Script Menuからの実行時に無反応になる件をなんとかしたいところです。個人的には、Script Menuが主力実行(ランタイム)環境だと思っているので。
AppleScript名:WebView+ボタンを作成 v3.1(URLから読み込み) |
— Created 2018-11-27 by Takaaki Naganoya — Modified 2018-12-03 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" use framework "WebKit" property |NSURL| : a reference to current application’s |NSURL| property NSString : a reference to current application’s NSString property NSScreen : a reference to current application’s NSScreen property NSButton : a reference to current application’s NSButton property NSWindow : a reference to current application’s NSWindow property NSSplitView : a reference to current application’s NSSplitView property NSTextView : a reference to current application’s NSTextView property NSScrollView : a reference to current application’s NSScrollView property WKWebView : a reference to current application’s WKWebView property WKUserScript : a reference to current application’s WKUserScript property NSURLRequest : a reference to current application’s NSURLRequest property NSMutableString : a reference to current application’s NSMutableString property NSWindowController : a reference to current application’s NSWindowController property NSTitledWindowMask : a reference to current application’s NSTitledWindowMask property NSRoundedBezelStyle : a reference to current application’s NSRoundedBezelStyle property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding property NSBackingStoreBuffered : a reference to current application’s NSBackingStoreBuffered property WKUserContentController : a reference to current application’s WKUserContentController property NSMomentaryLightButton : a reference to current application’s NSMomentaryLightButton property WKWebViewConfiguration : a reference to current application’s WKWebViewConfiguration property NSScreenSaverWindowLevel : a reference to current application’s NSScreenSaverWindowLevel property NSWindowStyleMaskResizable : a reference to current application’s NSWindowStyleMaskResizable property NSWindowStyleMaskMiniaturizable : a reference to current application’s NSWindowStyleMaskMiniaturizable property WKUserScriptInjectionTimeAtDocumentEnd : a reference to current application’s WKUserScriptInjectionTimeAtDocumentEnd property windisp : false property wController : false set aWidth to 1100 set aHeight to 700 set aTitle to "WkWebView test2" set aButtonMSG to "OK" set aURL to "https://www.youtube.com/embed/GP_tVXTYdmY?autoplay=1&hd=1" set paramObj to {aWidth, aHeight, aTitle, aURL, aButtonMSG, "600"} my performSelectorOnMainThread:"dispWebView:" withObject:(paramObj) waitUntilDone:true on dispWebView:paramObj set my windisp to false copy (paramObj as list) to {aWidth, aHeight, aTitle, tmpURL, aButtonMSG, timeOutSecs} set (my windisp) to true set aWidth to aWidth as integer set aHeight to aHeight as integer set tmpURL to tmpURL as string –WebViewをつくる set aConf to WKWebViewConfiguration’s alloc()’s init() –指定URLのJavaScriptをFetch set jsSource to my fetchJSSourceString(tmpURL) set userScript to WKUserScript’s alloc()’s initWithSource:jsSource injectionTime:(WKUserScriptInjectionTimeAtDocumentEnd) forMainFrameOnly:true set userContentController to WKUserContentController’s alloc()’s init() userContentController’s addUserScript:(userScript) aConf’s setUserContentController:userContentController set aWebView to WKWebView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight – 100)) configuration:aConf aWebView’s setNavigationDelegate:me aWebView’s setUIDelegate:me aWebView’s setTranslatesAutoresizingMaskIntoConstraints:true set bURL to |NSURL|’s URLWithString:tmpURL set aReq to NSURLRequest’s requestWithURL:bURL aWebView’s loadRequest:aReq –Webコンテンツのローディング –Buttonをつくる set bButton to (NSButton’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, 40))) bButton’s setTitle:aButtonMSG bButton’s setTarget:me bButton’s setAction:("clicked:") bButton’s setKeyEquivalent:(return) –SplitViewをつくる set aSplitV to NSSplitView’s alloc()’s initWithFrame:(current application’s NSMakeRect(0, 0, aWidth, aHeight)) aSplitV’s setVertical:false aSplitV’s addSubview:aWebView aSplitV’s addSubview:bButton aSplitV’s setNeedsDisplay:true set aWin to makeWinWithView(aSplitV, aWidth, aHeight, aTitle, 1.0) –NSWindowControllerを作ってみた set my wController to NSWindowController’s alloc() my (wController’s initWithWindow:aWin) my (wController’s showWindow:me) set aCount to (timeOutSecs as string as number) * 10 –timeout seconds * 10 repeat aCount times if (my windisp) = false then exit repeat end if delay 0.1 end repeat –Stop Web View Action set bURL to |NSURL|’s URLWithString:"about:blank" set bReq to NSURLRequest’s requestWithURL:bURL aWebView’s loadRequest:bReq my closeWin:bButton end dispWebView: –Button Clicked Event Handler on clicked:aSender set (my windisp) to false my closeWin:aSender end clicked: –make Window for Input on makeWinWithView(aView, aWinWidth, aWinHeight, aTitle, alphaV) set aScreen to NSScreen’s mainScreen() set aFrame to {{0, 0}, {aWinWidth, aWinHeight}} set aBacking to NSTitledWindowMask –NSBorderlessWindowMask set aDefer to NSWindowStyleMaskMiniaturizable — Window set aWin to NSWindow’s alloc() (aWin’s initWithContentRect:aFrame styleMask:aBacking backing:aDefer defer:false screen:aScreen) aWin’s setTitle:aTitle aWin’s setDelegate:me aWin’s setDisplaysWhenScreenProfileChanges:true aWin’s setHasShadow:true aWin’s setIgnoresMouseEvents:false aWin’s setLevel:(NSScreenSaverWindowLevel) aWin’s setOpaque:false aWin’s setAlphaValue:alphaV –append aWin’s setReleasedWhenClosed:true aWin’s |center|() — Set Custom View aWin’s setContentView:aView return aWin end makeWinWithView –close win on closeWin:aSender set tmpWindow to aSender’s |window|() repeat with n from 10 to 1 by -1 (tmpWindow’s setAlphaValue:n / 10) delay 0.02 end repeat my wController’s |close|() end closeWin: on viewDidLoad:aNotification return true end viewDidLoad: on fetchJSSourceString(aURL) set jsURL to |NSURL|’s URLWithString:aURL set jsSourceString to NSString’s stringWithContentsOfURL:jsURL encoding:(NSUTF8StringEncoding) |error|:(missing value) return jsSourceString end fetchJSSourceString |