Simple example of a NSTabView to display 2 tabs of WKWebView.
The approach of the code is to make it like building block to be easy to adapt and to use in other script. The labels and views need to be the same amount. In my example I have 2 tabs that show
2 websites. ex. www.apple.com and www.google.com
The script could be running directly in Script Editor.
use framework "Foundation"
use framework "AppKit"
use scripting additions
property arguments : missing value
on run
if my NSThread's isMainThread() as boolean then
my performDialog:arguments
else
my performSelectorOnMainThread:"performDialog:" withObject:arguments waitUntilDone:true
end if
end run
on performDialog:arguments
set labels to {"Apple", "Google"}
set theWebView1 to createWebView("https://www.apple.com", 800, 600)
set theWebView2 to createWebView("https://www.google.com", 800, 600)
set theView to {theWebView1, theWebView2}
set theTabView to createTabViewWithRect(labels, 0, 10, 10, 830, 700, theView)
set subviewItems to {theTabView}
set theWindow to createWindowWithRect(subviewItems, 0, 0, 850, 750)
theWindow's setTitle:"Examples with NSTabView..."
theWindow's |center|()
theWindow's makeKeyAndOrderFront:me
end performDialog:
on createTabViewWithRect(labels, theType, x, y, width, height, views)
set labelsCount to count of labels
set tabViewSize to current application's NSMakeRect(x, y, width, height)
set theTabView to current application's NSTabView's alloc()'s initWithFrame:tabViewSize
theTabView's setTabViewType:theType
repeat with i from 1 to labelsCount
set theTabViewItem to (current application's NSTabViewItem's alloc()'s initWithIdentifier:i)
(theTabViewItem's setLabel:(item i of labels))
(theTabViewItem's setView:(item i of views))
(theTabView's addTabViewItem:theTabViewItem)
end repeat
return theTabView
end createTabViewWithRect
on createWindowWithRect(subviewItems, x, y, width, height)
set windowSize to current application's NSMakeRect(x, y, width, height)
set winStyle to (current application's NSWindowStyleMaskTitled as integer) + (current application's NSWindowStyleMaskClosable as integer)
set theWindow to current application's NSWindow's alloc()'s initWithContentRect:windowSize styleMask:winStyle backing:2 defer:true
repeat with anSubview in subviewItems
(theWindow's contentView()'s addSubview:anSubview)
end repeat
return theWindow
end createWindowWithRect
on createWebView(theURLString, width, height)
set theConfiguration to current application's WKWebViewConfiguration's alloc()'s init()
set theFetch to my fetchJSSourceString(theURLString)
set theUserScript to current application's WKUserScript's alloc()'s initWithSource:theFetch injectionTime:(current application's WKUserScriptInjectionTimeAtDocumentEnd) forMainFrameOnly:true
set theUserContentController to current application's WKUserContentController's alloc()'s init()
theUserContentController's addUserScript:theUserScript
theConfiguration's setUserContentController:theUserContentController
set webViewSize to current application's NSMakeRect(0, 0, width, height)
set webView to current application's WKWebView's alloc()'s initWithFrame:webViewSize configuration:theConfiguration
webView's setNavigationDelegate:me
webView's setUIDelegate:me
webView's setTranslatesAutoresizingMaskIntoConstraints:true
set theURL to current application's |NSURL|'s URLWithString:theURLString
set theRequest to current application's NSURLRequest's requestWithURL:theURL
webView's loadRequest:theRequest
return webView
end createWebView
on fetchJSSourceString(theURLString)
set theURL to current application's |NSURL|'s URLWithString:theURLString
set theSource to current application's NSString's stringWithContentsOfURL:theURL encoding:(current application's NSUTF8StringEncoding) |error|:(missing value)
return theSource
end fetchJSSourceString