Update for iOS 17.
This commit is contained in:
@@ -94,11 +94,11 @@ extension BrowserViewController: ShortcutResponder
|
|||||||
}
|
}
|
||||||
|
|
||||||
func goBack(_ sender: Any?) {
|
func goBack(_ sender: Any?) {
|
||||||
tab.webView.goBack()
|
currentTab.webView.goBack()
|
||||||
}
|
}
|
||||||
|
|
||||||
func goForward(_ sender: Any?) {
|
func goForward(_ sender: Any?) {
|
||||||
tab.webView.goForward()
|
currentTab.webView.goForward()
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTab(_ sender: Any?) {
|
func createTab(_ sender: Any?) {
|
||||||
@@ -106,24 +106,24 @@ extension BrowserViewController: ShortcutResponder
|
|||||||
}
|
}
|
||||||
|
|
||||||
func previousTab(_ sender: Any?) {
|
func previousTab(_ sender: Any?) {
|
||||||
if let tabIndex = tabController.tabs.firstIndex(of: self.tab) {
|
if let tabIndex = tabController.tabs.firstIndex(of: self.currentTab) {
|
||||||
if tabIndex - 1 >= 0 {
|
if tabIndex - 1 >= 0 {
|
||||||
self.tab = tabController.tabs[tabIndex - 1]
|
self.currentTab = tabController.tabs[tabIndex - 1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func nextTab(_ sender: Any?) {
|
func nextTab(_ sender: Any?) {
|
||||||
if let tabIndex = tabController.tabs.firstIndex(of: self.tab) {
|
if let tabIndex = tabController.tabs.firstIndex(of: self.currentTab) {
|
||||||
if tabIndex + 1 < tabController.tabs.count {
|
if tabIndex + 1 < tabController.tabs.count {
|
||||||
self.tab = tabController.tabs[tabIndex + 1]
|
self.currentTab = tabController.tabs[tabIndex + 1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func closeTab(_ sender: Any?) {
|
func closeTab(_ sender: Any?) {
|
||||||
if tabController.tabs.count > 1 {
|
if tabController.tabs.count > 1 {
|
||||||
tabController.closeTab(self.tab)
|
tabController.closeTab(self.currentTab)
|
||||||
} else {
|
} else {
|
||||||
#if targetEnvironment(macCatalyst)
|
#if targetEnvironment(macCatalyst)
|
||||||
if let originWindowScene = self.view.window?.windowScene {
|
if let originWindowScene = self.view.window?.windowScene {
|
||||||
@@ -145,11 +145,11 @@ extension BrowserViewController: ShortcutResponder
|
|||||||
}
|
}
|
||||||
|
|
||||||
override func increaseSize(_ sender: Any?) {
|
override func increaseSize(_ sender: Any?) {
|
||||||
tab.webView._viewScale += 0.10
|
currentTab.webView._viewScale += 0.10
|
||||||
}
|
}
|
||||||
|
|
||||||
override func decreaseSize(_ sender: Any?) {
|
override func decreaseSize(_ sender: Any?) {
|
||||||
tab.webView._viewScale -= 0.10
|
currentTab.webView._viewScale -= 0.10
|
||||||
}
|
}
|
||||||
|
|
||||||
func showPreferences(_ sender: Any?) {
|
func showPreferences(_ sender: Any?) {
|
||||||
@@ -171,8 +171,8 @@ extension BrowserViewController: ShortcutResponder
|
|||||||
func handleOpenURL(_ sender: Any?, forEvent event: OpenURLEvent?) {
|
func handleOpenURL(_ sender: Any?, forEvent event: OpenURLEvent?) {
|
||||||
guard let event else { return }
|
guard let event else { return }
|
||||||
|
|
||||||
if tab.url == nil {
|
if currentTab.url == nil {
|
||||||
tab.beginLoadingURL(event.url)
|
currentTab.beginLoadingURL(event.url)
|
||||||
} else {
|
} else {
|
||||||
createNewTab(withURL: event.url)
|
createNewTab(withURL: event.url)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ import WebKit
|
|||||||
extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
||||||
{
|
{
|
||||||
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
|
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
|
||||||
tab.loadError = nil
|
currentTab.loadError = nil
|
||||||
|
|
||||||
// Check to make sure we have connected to the web content process
|
// Check to make sure we have connected to the web content process
|
||||||
if !tab.bridge.webContentProcessConnected {
|
if !currentTab.bridge.webContentProcessConnected {
|
||||||
// This means we started loading a page but the web content process hasn't loaded, which means
|
// This means we started loading a page but the web content process hasn't loaded, which means
|
||||||
// scripts are not getting blocked.
|
// scripts are not getting blocked.
|
||||||
|
|
||||||
@@ -37,8 +37,8 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reset tracking this
|
// Reset tracking this
|
||||||
tab.allowedScriptOrigins.removeAll()
|
currentTab.allowedScriptOrigins.removeAll()
|
||||||
tab.blockedScriptOrigins.removeAll()
|
currentTab.blockedScriptOrigins.removeAll()
|
||||||
updateScriptBlockerButton()
|
updateScriptBlockerButton()
|
||||||
|
|
||||||
// Blur url bar if applicable
|
// Blur url bar if applicable
|
||||||
@@ -48,7 +48,7 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
|
|
||||||
if let url = webView.url {
|
if let url = webView.url {
|
||||||
// Start requesting favicon
|
// Start requesting favicon
|
||||||
tab.updateFaviconForURL(url)
|
currentTab.updateFaviconForURL(url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
// We got rugged!!!!!! Update the favicon again.
|
// We got rugged!!!!!! Update the favicon again.
|
||||||
if let url = webView.url {
|
if let url = webView.url {
|
||||||
// Start requesting favicon
|
// Start requesting favicon
|
||||||
tab.updateFaviconForURL(url)
|
currentTab.updateFaviconForURL(url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var allowJavaScript = tab.javaScriptEnabled
|
var allowJavaScript = currentTab.javaScriptEnabled
|
||||||
if !allowJavaScript, let host = navigationAction.request.url?.host {
|
if !allowJavaScript, let host = navigationAction.request.url?.host {
|
||||||
// Check origin policy
|
// Check origin policy
|
||||||
allowJavaScript = policyManager.scriptPolicy(forOrigin: host).allowsEmbeddedJavaScript()
|
allowJavaScript = policyManager.scriptPolicy(forOrigin: host).allowsEmbeddedJavaScript()
|
||||||
@@ -101,7 +101,7 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
if let url = navigationAction.request.url,
|
if let url = navigationAction.request.url,
|
||||||
let redirectedURL = Settings.shared.redirectRule(for: url)
|
let redirectedURL = Settings.shared.redirectRule(for: url)
|
||||||
{
|
{
|
||||||
tab.beginLoadingURL(redirectedURL)
|
currentTab.beginLoadingURL(redirectedURL)
|
||||||
decisionHandler(.cancel, preferences)
|
decisionHandler(.cancel, preferences)
|
||||||
} else {
|
} else {
|
||||||
decisionHandler(.allow, preferences)
|
decisionHandler(.allow, preferences)
|
||||||
@@ -109,14 +109,14 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
}
|
}
|
||||||
|
|
||||||
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
|
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
|
||||||
if webView == tab.webView {
|
if webView == currentTab.webView {
|
||||||
tab.loadError = error
|
currentTab.loadError = error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
||||||
if webView == tab.webView {
|
if webView == currentTab.webView {
|
||||||
tab.loadError = error
|
currentTab.loadError = error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +127,7 @@ extension BrowserViewController: WKNavigationDelegate, WKUIDelegate
|
|||||||
let newTab = tabController.createNewTab(url: nil, webViewConfiguration: configuration)
|
let newTab = tabController.createNewTab(url: nil, webViewConfiguration: configuration)
|
||||||
newTab.webView.load(navigationAction.request)
|
newTab.webView.load(navigationAction.request)
|
||||||
|
|
||||||
self.tab = newTab
|
self.currentTab = newTab
|
||||||
|
|
||||||
return newTab.webView
|
return newTab.webView
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ import UniformTypeIdentifiers
|
|||||||
class BrowserViewController: UIViewController
|
class BrowserViewController: UIViewController
|
||||||
{
|
{
|
||||||
let browserView = BrowserView()
|
let browserView = BrowserView()
|
||||||
var tab: Tab { didSet { didChangeTab(tab) } }
|
var currentTab: Tab { didSet { didChangeTab(currentTab) } }
|
||||||
var webView: WKWebView { tab.webView }
|
var webView: WKWebView { currentTab.webView }
|
||||||
|
|
||||||
internal let tabController = TabController()
|
internal let tabController = TabController()
|
||||||
internal let tabBarViewController: TabBarViewController
|
internal let tabBarViewController: TabBarViewController
|
||||||
@@ -42,9 +42,9 @@ class BrowserViewController: UIViewController
|
|||||||
static let longPressWindowButtonToMakeNewTab: Bool = false
|
static let longPressWindowButtonToMakeNewTab: Bool = false
|
||||||
|
|
||||||
internal var darkModeEnabled: Bool {
|
internal var darkModeEnabled: Bool {
|
||||||
get { tab.bridge.darkModeEnabled }
|
get { currentTab.bridge.darkModeEnabled }
|
||||||
set {
|
set {
|
||||||
tab.bridge.darkModeEnabled = newValue
|
currentTab.bridge.darkModeEnabled = newValue
|
||||||
toolbarController.darkModeEnabled = newValue
|
toolbarController.darkModeEnabled = newValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ class BrowserViewController: UIViewController
|
|||||||
internal var changingFocusToAutocompleteController = false
|
internal var changingFocusToAutocompleteController = false
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
self.tab = tabController.tabs.first!
|
self.currentTab = tabController.tabs.first!
|
||||||
self.tabBarViewController = TabBarViewController(tabController: tabController)
|
self.tabBarViewController = TabBarViewController(tabController: tabController)
|
||||||
super.init(nibName: nil, bundle: nil)
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ class BrowserViewController: UIViewController
|
|||||||
addChild(findOnPageController)
|
addChild(findOnPageController)
|
||||||
addChild(tabBarViewController)
|
addChild(tabBarViewController)
|
||||||
|
|
||||||
didChangeTab(tab)
|
didChangeTab(currentTab)
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
|
||||||
@@ -115,11 +115,11 @@ class BrowserViewController: UIViewController
|
|||||||
// Script button
|
// Script button
|
||||||
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { [unowned self] action in
|
toolbarController.scriptControllerIconView.addAction(UIAction(handler: { [unowned self] action in
|
||||||
let hostOrigin = self.webView.url?.host ?? ""
|
let hostOrigin = self.webView.url?.host ?? ""
|
||||||
let loadedScripts = self.tab.allowedScriptOrigins.union(self.tab.blockedScriptOrigins)
|
let loadedScripts = currentTab.allowedScriptOrigins.union(currentTab.blockedScriptOrigins)
|
||||||
let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager,
|
let scriptViewController = ScriptPolicyViewController(policyManager: self.policyManager,
|
||||||
hostOrigin: hostOrigin,
|
hostOrigin: hostOrigin,
|
||||||
loadedScripts: loadedScripts,
|
loadedScripts: loadedScripts,
|
||||||
scriptsAllowedForTab: self.tab.javaScriptEnabled)
|
scriptsAllowedForTab: currentTab.javaScriptEnabled)
|
||||||
scriptViewController.delegate = self
|
scriptViewController.delegate = self
|
||||||
|
|
||||||
let navController = UINavigationController(rootViewController: scriptViewController)
|
let navController = UINavigationController(rootViewController: scriptViewController)
|
||||||
@@ -141,7 +141,7 @@ class BrowserViewController: UIViewController
|
|||||||
tabPickerController.delegate = self
|
tabPickerController.delegate = self
|
||||||
tabPickerController.title = "Tabs"
|
tabPickerController.title = "Tabs"
|
||||||
tabPickerController.tabBarItem.image = UIImage(systemName: "rectangle.on.rectangle")
|
tabPickerController.tabBarItem.image = UIImage(systemName: "rectangle.on.rectangle")
|
||||||
tabPickerController.selectedTabIdentifier = self.tab.identifier
|
tabPickerController.selectedTabIdentifier = currentTab.identifier
|
||||||
tabPickerController.tabObserver = tabController.$tabs
|
tabPickerController.tabObserver = tabController.$tabs
|
||||||
.receive(on: RunLoop.main)
|
.receive(on: RunLoop.main)
|
||||||
.sink(receiveValue: { (newTabs: [Tab]) in
|
.sink(receiveValue: { (newTabs: [Tab]) in
|
||||||
@@ -207,7 +207,7 @@ class BrowserViewController: UIViewController
|
|||||||
|
|
||||||
// Error button
|
// Error button
|
||||||
toolbarController.urlBar.errorButton.addAction(UIAction(handler: { [unowned self] _ in
|
toolbarController.urlBar.errorButton.addAction(UIAction(handler: { [unowned self] _ in
|
||||||
let alert = UIAlertController(title: "Error", message: self.tab.loadError?.localizedDescription, preferredStyle: .actionSheet)
|
let alert = UIAlertController(title: "Error", message: currentTab.loadError?.localizedDescription, preferredStyle: .actionSheet)
|
||||||
alert.popoverPresentationController?.sourceView = self.toolbarController.urlBar.errorButton
|
alert.popoverPresentationController?.sourceView = self.toolbarController.urlBar.errorButton
|
||||||
|
|
||||||
alert.addAction(UIAlertAction(title: "Reload", style: .destructive, handler: { _ in
|
alert.addAction(UIAlertAction(title: "Reload", style: .destructive, handler: { _ in
|
||||||
@@ -240,7 +240,7 @@ class BrowserViewController: UIViewController
|
|||||||
|
|
||||||
// Font size adjust
|
// Font size adjust
|
||||||
toolbarController.urlBar.documentButton.addAction(UIAction(handler: { [unowned self] _ in
|
toolbarController.urlBar.documentButton.addAction(UIAction(handler: { [unowned self] _ in
|
||||||
let documentControls = DocumentControlViewController(darkModeEnabled: tab.bridge.darkModeEnabled)
|
let documentControls = DocumentControlViewController(darkModeEnabled: currentTab.bridge.darkModeEnabled)
|
||||||
documentControls.modalPresentationStyle = .popover
|
documentControls.modalPresentationStyle = .popover
|
||||||
documentControls.popoverPresentationController?.permittedArrowDirections = [ .down, .up ]
|
documentControls.popoverPresentationController?.permittedArrowDirections = [ .down, .up ]
|
||||||
documentControls.popoverPresentationController?.sourceView = toolbarController.urlBar.documentButton
|
documentControls.popoverPresentationController?.sourceView = toolbarController.urlBar.documentButton
|
||||||
@@ -250,17 +250,17 @@ class BrowserViewController: UIViewController
|
|||||||
numberFormatter.numberStyle = .percent
|
numberFormatter.numberStyle = .percent
|
||||||
|
|
||||||
let label = documentControls.fontSizeAdjustView.labelView
|
let label = documentControls.fontSizeAdjustView.labelView
|
||||||
label.text = numberFormatter.string(for: tab.webView._viewScale)
|
label.text = numberFormatter.string(for: currentTab.webView._viewScale)
|
||||||
|
|
||||||
// Font size adjust
|
// Font size adjust
|
||||||
documentControls.fontSizeAdjustView.decreaseSizeButton.addAction(UIAction(handler: { [unowned self] sender in
|
documentControls.fontSizeAdjustView.decreaseSizeButton.addAction(UIAction(handler: { [unowned self] sender in
|
||||||
self.decreaseSize(sender)
|
self.decreaseSize(sender)
|
||||||
label.text = numberFormatter.string(for: tab.webView._viewScale)
|
label.text = numberFormatter.string(for: currentTab.webView._viewScale)
|
||||||
}), for: .touchUpInside)
|
}), for: .touchUpInside)
|
||||||
|
|
||||||
documentControls.fontSizeAdjustView.increaseSizeButton.addAction(UIAction(handler: { [unowned self] sender in
|
documentControls.fontSizeAdjustView.increaseSizeButton.addAction(UIAction(handler: { [unowned self] sender in
|
||||||
self.increaseSize(sender)
|
self.increaseSize(sender)
|
||||||
label.text = numberFormatter.string(for: tab.webView._viewScale)
|
label.text = numberFormatter.string(for: currentTab.webView._viewScale)
|
||||||
}), for: .touchUpInside)
|
}), for: .touchUpInside)
|
||||||
|
|
||||||
// Find on page
|
// Find on page
|
||||||
@@ -348,8 +348,8 @@ class BrowserViewController: UIViewController
|
|||||||
.sink(receiveValue: { [unowned self] (activeTab: Int) in
|
.sink(receiveValue: { [unowned self] (activeTab: Int) in
|
||||||
if activeTab < tabController.tabs.count {
|
if activeTab < tabController.tabs.count {
|
||||||
let tab = tabController.tabs[activeTab]
|
let tab = tabController.tabs[activeTab]
|
||||||
if self.tab != tab {
|
if currentTab != tab {
|
||||||
self.tab = tab
|
currentTab = tab
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,6 +357,11 @@ class BrowserViewController: UIViewController
|
|||||||
self.updateTabBarVisibility()
|
self.updateTabBarVisibility()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
registerForTraitChanges([UITraitHorizontalSizeClass.self]) { [weak self] (traitEnvironment: Self, previousTraitCollection) in
|
||||||
|
guard let self else { return }
|
||||||
|
toolbarController.reconfigureButtons(for: traitCollection.horizontalSizeClass)
|
||||||
|
}
|
||||||
|
|
||||||
self.view = browserView
|
self.view = browserView
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,7 +375,7 @@ class BrowserViewController: UIViewController
|
|||||||
let shareableURL = ShareableURL(
|
let shareableURL = ShareableURL(
|
||||||
url: url,
|
url: url,
|
||||||
title: webView.title ?? url.absoluteString,
|
title: webView.title ?? url.absoluteString,
|
||||||
favicon: tab.favicon
|
favicon: currentTab.favicon
|
||||||
)
|
)
|
||||||
|
|
||||||
let activityController = UIActivityViewController(activityItems: [ shareableURL ], applicationActivities: nil)
|
let activityController = UIActivityViewController(activityItems: [ shareableURL ], applicationActivities: nil)
|
||||||
@@ -444,21 +449,21 @@ class BrowserViewController: UIViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal func showReaderWindow() {
|
internal func showReaderWindow() {
|
||||||
tab.bridge.parseDocumentForReaderMode { string in
|
currentTab.bridge.parseDocumentForReaderMode { [currentTab] string in
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if self.traitCollection.userInterfaceIdiom == .phone {
|
if self.traitCollection.userInterfaceIdiom == .phone {
|
||||||
let readableViewController = ReaderViewController(readableHTMLString: string, baseURL: self.tab.bridge.webView.url)
|
let readableViewController = ReaderViewController(readableHTMLString: string, baseURL: currentTab.bridge.webView.url)
|
||||||
readableViewController.title = self.tab.bridge.webView.title
|
readableViewController.title = currentTab.bridge.webView.title
|
||||||
readableViewController.darkModeEnabled = self.tab.bridge.darkModeEnabled
|
readableViewController.darkModeEnabled = currentTab.bridge.darkModeEnabled
|
||||||
readableViewController.delegate = self
|
readableViewController.delegate = self
|
||||||
|
|
||||||
let navigationController = UINavigationController(rootViewController: readableViewController)
|
let navigationController = UINavigationController(rootViewController: readableViewController)
|
||||||
self.present(navigationController, animated: true, completion: nil)
|
self.present(navigationController, animated: true, completion: nil)
|
||||||
} else {
|
} else {
|
||||||
let userActivity = NSUserActivity(activityType: SessionActivityType.ReaderWindow.rawValue)
|
let userActivity = NSUserActivity(activityType: SessionActivityType.ReaderWindow.rawValue)
|
||||||
userActivity.title = self.tab.title
|
userActivity.title = currentTab.title
|
||||||
userActivity.userInfo = [
|
userActivity.userInfo = [
|
||||||
ReaderUserActivityKeys.baseURL.rawValue : self.tab.bridge.webView.url ?? NSNull(),
|
ReaderUserActivityKeys.baseURL.rawValue : currentTab.bridge.webView.url ?? NSNull(),
|
||||||
ReaderUserActivityKeys.htmlString.rawValue : string,
|
ReaderUserActivityKeys.htmlString.rawValue : string,
|
||||||
]
|
]
|
||||||
let requestOptions = UIWindowScene.ActivationRequestOptions()
|
let requestOptions = UIWindowScene.ActivationRequestOptions()
|
||||||
@@ -471,8 +476,8 @@ class BrowserViewController: UIViewController
|
|||||||
|
|
||||||
internal func showHistoryWindow() {
|
internal func showHistoryWindow() {
|
||||||
let historyViewController = HistoryBrowserViewController { [unowned self] url in
|
let historyViewController = HistoryBrowserViewController { [unowned self] url in
|
||||||
if tab.url == nil {
|
if currentTab.url == nil {
|
||||||
tab.beginLoadingURL(url)
|
currentTab.beginLoadingURL(url)
|
||||||
} else {
|
} else {
|
||||||
createNewTab(withURL: url)
|
createNewTab(withURL: url)
|
||||||
}
|
}
|
||||||
@@ -503,7 +508,7 @@ class BrowserViewController: UIViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal func updateLoadProgress(forWebView webView: WKWebView) {
|
internal func updateLoadProgress(forWebView webView: WKWebView) {
|
||||||
if let loadError = tab.loadError {
|
if let loadError = currentTab.loadError {
|
||||||
toolbarController.urlBar.loadProgress = .error(error: loadError)
|
toolbarController.urlBar.loadProgress = .error(error: loadError)
|
||||||
} else if webView.estimatedProgress == 1.0 {
|
} else if webView.estimatedProgress == 1.0 {
|
||||||
toolbarController.urlBar.loadProgress = .complete
|
toolbarController.urlBar.loadProgress = .complete
|
||||||
@@ -537,9 +542,9 @@ class BrowserViewController: UIViewController
|
|||||||
tabController.activeTabIndex = activeIndex
|
tabController.activeTabIndex = activeIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
tab.delegate = self
|
currentTab.delegate = self
|
||||||
|
|
||||||
let webView = tab.webView
|
let webView = currentTab.webView
|
||||||
webView.allowsBackForwardNavigationGestures = true
|
webView.allowsBackForwardNavigationGestures = true
|
||||||
webView.navigationDelegate = self
|
webView.navigationDelegate = self
|
||||||
webView.uiDelegate = self
|
webView.uiDelegate = self
|
||||||
@@ -584,7 +589,7 @@ class BrowserViewController: UIViewController
|
|||||||
updateScriptBlockerButton()
|
updateScriptBlockerButton()
|
||||||
|
|
||||||
// Enforce dark mode setting
|
// Enforce dark mode setting
|
||||||
tab.bridge.darkModeEnabled = toolbarController.darkModeEnabled
|
currentTab.bridge.darkModeEnabled = toolbarController.darkModeEnabled
|
||||||
|
|
||||||
// Blur url bar, if applicable
|
// Blur url bar, if applicable
|
||||||
toolbarController.urlBar.textField.resignFirstResponder()
|
toolbarController.urlBar.textField.resignFirstResponder()
|
||||||
@@ -613,17 +618,10 @@ class BrowserViewController: UIViewController
|
|||||||
super.viewWillAppear(animated)
|
super.viewWillAppear(animated)
|
||||||
becomeFirstResponder()
|
becomeFirstResponder()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
|
||||||
super.traitCollectionDidChange(previousTraitCollection)
|
|
||||||
|
|
||||||
// Not sure why this doesn't happen automatically...
|
|
||||||
toolbarController.traitCollectionDidChange(previousTraitCollection)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal func updateScriptBlockerButton() {
|
internal func updateScriptBlockerButton() {
|
||||||
var numBlockedScripts: Int = tab.blockedScriptOrigins.count
|
var numBlockedScripts: Int = currentTab.blockedScriptOrigins.count
|
||||||
if tab.url != nil, tab.javaScriptEnabled == false {
|
if currentTab.url != nil, currentTab.javaScriptEnabled == false {
|
||||||
// Because the page is blocked too, notify.
|
// Because the page is blocked too, notify.
|
||||||
numBlockedScripts += 1
|
numBlockedScripts += 1
|
||||||
}
|
}
|
||||||
@@ -634,7 +632,7 @@ class BrowserViewController: UIViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
let iconView = toolbarController.scriptControllerIconView
|
let iconView = toolbarController.scriptControllerIconView
|
||||||
iconView.shieldsDown = tab.javaScriptEnabled
|
iconView.shieldsDown = currentTab.javaScriptEnabled
|
||||||
// iconView.setBlockedScriptsNumber(numBlockedScripts)
|
// iconView.setBlockedScriptsNumber(numBlockedScripts)
|
||||||
|
|
||||||
if let policy = policy {
|
if let policy = policy {
|
||||||
@@ -649,7 +647,7 @@ class BrowserViewController: UIViewController
|
|||||||
let newTab = tabController.createNewTab(url: url)
|
let newTab = tabController.createNewTab(url: url)
|
||||||
|
|
||||||
if !loadInBackground {
|
if !loadInBackground {
|
||||||
self.tab = newTab
|
currentTab = newTab
|
||||||
|
|
||||||
if url == nil && traitCollection.userInterfaceIdiom == .mac {
|
if url == nil && traitCollection.userInterfaceIdiom == .mac {
|
||||||
self.toolbarController.urlBar.textField.becomeFirstResponder()
|
self.toolbarController.urlBar.textField.becomeFirstResponder()
|
||||||
@@ -657,7 +655,7 @@ class BrowserViewController: UIViewController
|
|||||||
} else {
|
} else {
|
||||||
// Send this message to get it to load NOW, instead of waiting for it to show up
|
// Send this message to get it to load NOW, instead of waiting for it to show up
|
||||||
// in the view hierarchy.
|
// in the view hierarchy.
|
||||||
tab.webView.didMoveToWindow()
|
currentTab.webView.didMoveToWindow()
|
||||||
|
|
||||||
// Update tab bar now
|
// Update tab bar now
|
||||||
updateTabBarVisibility()
|
updateTabBarVisibility()
|
||||||
@@ -678,12 +676,12 @@ extension BrowserViewController: UIPopoverPresentationControllerDelegate
|
|||||||
extension BrowserViewController: ScriptPolicyViewControllerDelegate
|
extension BrowserViewController: ScriptPolicyViewControllerDelegate
|
||||||
{
|
{
|
||||||
func didChangeScriptPolicy() {
|
func didChangeScriptPolicy() {
|
||||||
tab.bridge.policyDataSourceDidChange()
|
currentTab.bridge.policyDataSourceDidChange()
|
||||||
webView.reload()
|
webView.reload()
|
||||||
}
|
}
|
||||||
|
|
||||||
func setScriptsEnabledForTab(_ enabled: Bool) {
|
func setScriptsEnabledForTab(_ enabled: Bool) {
|
||||||
tab.javaScriptEnabled = enabled
|
currentTab.javaScriptEnabled = enabled
|
||||||
toolbarController.scriptControllerIconView.shieldsDown = enabled
|
toolbarController.scriptControllerIconView.shieldsDown = enabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -691,7 +689,7 @@ extension BrowserViewController: ScriptPolicyViewControllerDelegate
|
|||||||
extension BrowserViewController: AutocompleteViewControllerDelegate
|
extension BrowserViewController: AutocompleteViewControllerDelegate
|
||||||
{
|
{
|
||||||
func autocompleteController(_: AutocompleteViewController, didSelectHistoryItem item: HistoryItem) {
|
func autocompleteController(_: AutocompleteViewController, didSelectHistoryItem item: HistoryItem) {
|
||||||
tab.beginLoadingURL(item.url)
|
currentTab.beginLoadingURL(item.url)
|
||||||
autocompleteViewController.view.isHidden = true
|
autocompleteViewController.view.isHidden = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -706,7 +704,7 @@ extension BrowserViewController: TabDelegate
|
|||||||
extension BrowserViewController: TabPickerViewControllerDelegate
|
extension BrowserViewController: TabPickerViewControllerDelegate
|
||||||
{
|
{
|
||||||
func tabPicker(_ picker: TabPickerViewController, createNewTabWithURL url: URL?) {
|
func tabPicker(_ picker: TabPickerViewController, createNewTabWithURL url: URL?) {
|
||||||
self.tab = tabController.createNewTab(url: url)
|
currentTab = tabController.createNewTab(url: url)
|
||||||
picker.dismiss(animated: true)
|
picker.dismiss(animated: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -725,7 +723,7 @@ extension BrowserViewController: TabPickerViewControllerDelegate
|
|||||||
|
|
||||||
guard let tab else { return }
|
guard let tab else { return }
|
||||||
|
|
||||||
self.tab = tab
|
currentTab = tab
|
||||||
picker.dismiss(animated: true, completion: nil)
|
picker.dismiss(animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -735,7 +733,7 @@ extension BrowserViewController: TabPickerViewControllerDelegate
|
|||||||
tabController.closeTab(tab)
|
tabController.closeTab(tab)
|
||||||
|
|
||||||
// Dismiss picker if current tab is closed using the picker
|
// Dismiss picker if current tab is closed using the picker
|
||||||
if tab == self.tab {
|
if tab == currentTab {
|
||||||
picker.dismiss(animated: true, completion: nil)
|
picker.dismiss(animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -769,10 +767,10 @@ extension BrowserViewController: UITextFieldDelegate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tab.beginLoadingURL(url)
|
currentTab.beginLoadingURL(url)
|
||||||
} else {
|
} else {
|
||||||
let searchURL = Settings.shared.searchProvider.provider().searchURLWithQuery(text)
|
let searchURL = Settings.shared.searchProvider.provider().searchURLWithQuery(text)
|
||||||
tab.beginLoadingURL(searchURL)
|
currentTab.beginLoadingURL(searchURL)
|
||||||
}
|
}
|
||||||
|
|
||||||
textField.resignFirstResponder()
|
textField.resignFirstResponder()
|
||||||
@@ -795,7 +793,7 @@ extension BrowserViewController: UITextFieldDelegate
|
|||||||
extension BrowserViewController: ReaderViewControllerDelegate
|
extension BrowserViewController: ReaderViewControllerDelegate
|
||||||
{
|
{
|
||||||
func readerViewController(_ reader: ReaderViewController, didRequestNavigationToURL navigationURL: URL) {
|
func readerViewController(_ reader: ReaderViewController, didRequestNavigationToURL navigationURL: URL) {
|
||||||
tab.beginLoadingURL(navigationURL)
|
currentTab.beginLoadingURL(navigationURL)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,11 @@ class GradientView: UIImageView
|
|||||||
self.init(image: nil)
|
self.init(image: nil)
|
||||||
self.direction = direction
|
self.direction = direction
|
||||||
self.colors = colors
|
self.colors = colors
|
||||||
|
|
||||||
|
registerForTraitChanges([UITraitUserInterfaceStyle.self]) { [weak self] (traitEnvironment: Self, previousTraitCollection) in
|
||||||
|
self?.image = nil
|
||||||
|
self?.setNeedsLayout()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func gradientImage(forSize size: CGSize) -> UIImage? {
|
private func gradientImage(forSize size: CGSize) -> UIImage? {
|
||||||
@@ -70,12 +75,4 @@ class GradientView: UIImageView
|
|||||||
generatedImageSize = bounds.size
|
generatedImageSize = bounds.size
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
|
||||||
super.traitCollectionDidChange(previousTraitCollection)
|
|
||||||
|
|
||||||
// Regenerate image
|
|
||||||
image = nil
|
|
||||||
setNeedsLayout()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,12 +69,14 @@ class ReliefButton: UIButton
|
|||||||
backgroundView.layer.rasterizationScale = UIScreen.main.scale
|
backgroundView.layer.rasterizationScale = UIScreen.main.scale
|
||||||
addSubview(backgroundView)
|
addSubview(backgroundView)
|
||||||
|
|
||||||
traitCollectionDidChange(nil)
|
registerForTraitChanges([UITraitUserInterfaceStyle.self], handler: handleTraitCollectionChange)
|
||||||
|
|
||||||
pointerStyleProvider = { (button, pointerEffect, pointerShape) -> UIPointerStyle? in
|
pointerStyleProvider = { (button, pointerEffect, pointerShape) -> UIPointerStyle? in
|
||||||
let preview = UITargetedPreview(view: button)
|
let preview = UITargetedPreview(view: button)
|
||||||
return UIPointerStyle(effect: .lift(preview), shape: pointerShape)
|
return UIPointerStyle(effect: .lift(preview), shape: pointerShape)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleTraitCollectionChange(self, previousCollection: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
required init?(coder: NSCoder) {
|
||||||
@@ -99,7 +101,7 @@ class ReliefButton: UIButton
|
|||||||
return inverted ? colors.reversed() : colors
|
return inverted ? colors.reversed() : colors
|
||||||
}
|
}
|
||||||
|
|
||||||
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
private func handleTraitCollectionChange(_ environment: UITraitEnvironment, previousCollection: UITraitCollection?) {
|
||||||
setBackgroundInverted(isHighlighted)
|
setBackgroundInverted(isHighlighted)
|
||||||
backgroundView.layer.borderColor = { traitCollection -> UIColor in
|
backgroundView.layer.borderColor = { traitCollection -> UIColor in
|
||||||
if traitCollection.userInterfaceStyle == .dark {
|
if traitCollection.userInterfaceStyle == .dark {
|
||||||
@@ -107,7 +109,7 @@ class ReliefButton: UIButton
|
|||||||
} else {
|
} else {
|
||||||
return .white
|
return .white
|
||||||
}
|
}
|
||||||
}(traitCollection).cgColor
|
} (traitCollection).cgColor
|
||||||
}
|
}
|
||||||
|
|
||||||
internal func setBackgroundInverted(_ inverted: Bool) {
|
internal func setBackgroundInverted(_ inverted: Bool) {
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class BrowserSceneDelegate: UIResponder, UIWindowSceneDelegate {
|
|||||||
|
|
||||||
if let urlContext = connectionOptions.urlContexts.first {
|
if let urlContext = connectionOptions.urlContexts.first {
|
||||||
let url = urlContext.url
|
let url = urlContext.url
|
||||||
browserViewController.tab.beginLoadingURL(url)
|
browserViewController.currentTab.beginLoadingURL(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if targetEnvironment(macCatalyst)
|
#if targetEnvironment(macCatalyst)
|
||||||
@@ -59,8 +59,8 @@ class BrowserSceneDelegate: UIResponder, UIWindowSceneDelegate {
|
|||||||
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
|
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
|
||||||
{
|
{
|
||||||
for urlContext in URLContexts {
|
for urlContext in URLContexts {
|
||||||
if browserViewController?.tab.url == nil {
|
if browserViewController?.currentTab.url == nil {
|
||||||
browserViewController?.tab.beginLoadingURL(urlContext.url)
|
browserViewController?.currentTab.beginLoadingURL(urlContext.url)
|
||||||
} else {
|
} else {
|
||||||
browserViewController?.createNewTab(withURL: urlContext.url)
|
browserViewController?.createNewTab(withURL: urlContext.url)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,10 +66,13 @@ class ToolbarViewController: UIViewController
|
|||||||
newTabButton.setImage(UIImage(systemName: "plus"), for: .normal)
|
newTabButton.setImage(UIImage(systemName: "plus"), for: .normal)
|
||||||
|
|
||||||
let toolbarAnimationDuration: TimeInterval = 0.3
|
let toolbarAnimationDuration: TimeInterval = 0.3
|
||||||
urlBar.textField.addAction(.init(handler: { [traitCollection, toolbarView, urlBar] _ in
|
urlBar.textField.addAction(.init(handler: { [weak self] _ in
|
||||||
if traitCollection.horizontalSizeClass == .compact {
|
guard let self, let parent else { return }
|
||||||
UIView.animate(withDuration: toolbarAnimationDuration) {
|
|
||||||
toolbarView.cancelButtonVisible = urlBar.textField.isFirstResponder
|
// xxx: Not sure why I need to refer to parent here. This view controller isn't inheriting anything.
|
||||||
|
if parent.traitCollection.horizontalSizeClass == .compact {
|
||||||
|
UIView.animate(withDuration: toolbarAnimationDuration) { [unowned self] in
|
||||||
|
self.toolbarView.cancelButtonVisible = self.urlBar.textField.isFirstResponder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}), for: [ .editingDidBegin, .editingDidEnd ])
|
}), for: [ .editingDidBegin, .editingDidEnd ])
|
||||||
@@ -78,12 +81,10 @@ class ToolbarViewController: UIViewController
|
|||||||
urlBar.textField.resignFirstResponder()
|
urlBar.textField.resignFirstResponder()
|
||||||
}), for: .touchUpInside)
|
}), for: .touchUpInside)
|
||||||
|
|
||||||
traitCollectionDidChange(nil)
|
reconfigureButtons(for: traitCollection.horizontalSizeClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
|
public func reconfigureButtons(for horizontalSizeClass: UIUserInterfaceSizeClass) {
|
||||||
super.traitCollectionDidChange(previousTraitCollection)
|
|
||||||
|
|
||||||
toolbarView.leadingButtonsView.removeAllButtonViews()
|
toolbarView.leadingButtonsView.removeAllButtonViews()
|
||||||
toolbarView.trailingButtonsView.removeAllButtonViews()
|
toolbarView.trailingButtonsView.removeAllButtonViews()
|
||||||
|
|
||||||
@@ -92,7 +93,7 @@ class ToolbarViewController: UIViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Setup toolbar based on trait collection
|
// Setup toolbar based on trait collection
|
||||||
if traitCollection.horizontalSizeClass == .compact {
|
if horizontalSizeClass == .compact {
|
||||||
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
|
toolbarView.trailingButtonsView.addButtonView(scriptControllerIconView)
|
||||||
toolbarView.trailingButtonsView.addButtonView(newTabButton)
|
toolbarView.trailingButtonsView.addButtonView(newTabButton)
|
||||||
toolbarView.trailingButtonsView.addButtonView(windowButton)
|
toolbarView.trailingButtonsView.addButtonView(windowButton)
|
||||||
|
|||||||
@@ -776,7 +776,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
SDKROOT = iphoneos.internal;
|
SDKROOT = iphoneos.internal;
|
||||||
@@ -854,7 +854,6 @@
|
|||||||
CURRENT_PROJECT_VERSION = 4;
|
CURRENT_PROJECT_VERSION = 4;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
INFOPLIST_FILE = "App/Supporting Files/Info.plist";
|
INFOPLIST_FILE = "App/Supporting Files/Info.plist";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -882,7 +881,6 @@
|
|||||||
CURRENT_PROJECT_VERSION = 4;
|
CURRENT_PROJECT_VERSION = 4;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
INFOPLIST_FILE = "App/Supporting Files/Info.plist";
|
INFOPLIST_FILE = "App/Supporting Files/Info.plist";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
|
|||||||
Reference in New Issue
Block a user