diff --git a/Telegram/BUILD b/Telegram/BUILD
index ad348cdc04..56527eec83 100644
--- a/Telegram/BUILD
+++ b/Telegram/BUILD
@@ -419,6 +419,7 @@ plist_fragment(
CFBundleURLSchemes
tg
+ tonsite
diff --git a/submodules/BrowserUI/Sources/BrowserWebContent.swift b/submodules/BrowserUI/Sources/BrowserWebContent.swift
index 584fe86c42..e98dd384ff 100644
--- a/submodules/BrowserUI/Sources/BrowserWebContent.swift
+++ b/submodules/BrowserUI/Sources/BrowserWebContent.swift
@@ -10,7 +10,7 @@ import AccountContext
import WebKit
import AppBundle
-private final class IpfsSchemeHandler: NSObject, WKURLSchemeHandler {
+/*private final class IpfsSchemeHandler: NSObject, WKURLSchemeHandler {
private final class PendingTask {
let sourceTask: any WKURLSchemeTask
var urlSessionTask: URLSessionTask?
@@ -71,6 +71,81 @@ private final class IpfsSchemeHandler: NSObject, WKURLSchemeHandler {
self.pendingTasks.append(PendingTask(sourceTask: urlSchemeTask))
}
+ func webView(_ webView: WKWebView, stop urlSchemeTask: any WKURLSchemeTask) {
+ if let index = self.pendingTasks.firstIndex(where: { $0.sourceTask === urlSchemeTask }) {
+ let task = self.pendingTasks[index]
+ self.pendingTasks.remove(at: index)
+ task.cancel()
+ }
+ }
+}*/
+
+private final class TonSchemeHandler: NSObject, WKURLSchemeHandler {
+ private final class PendingTask {
+ let sourceTask: any WKURLSchemeTask
+ var urlSessionTask: URLSessionTask?
+ let isCompleted = Atomic(value: false)
+
+ init(sourceTask: any WKURLSchemeTask) {
+ self.sourceTask = sourceTask
+
+ var mappedHost: String = ""
+ if let host = sourceTask.request.url?.host {
+ mappedHost = host
+ mappedHost = mappedHost.replacingOccurrences(of: "-", with: "-h")
+ mappedHost = mappedHost.replacingOccurrences(of: ".", with: "-d")
+ }
+
+ var mappedPath = ""
+ if let path = sourceTask.request.url?.path, !path.isEmpty {
+ mappedPath = path
+ if !path.hasPrefix("/") {
+ mappedPath = "/\(mappedPath)"
+ }
+ }
+ let mappedUrl = "https://\(mappedHost).magic.org\(mappedPath)"
+ let isCompleted = self.isCompleted
+ self.urlSessionTask = URLSession.shared.dataTask(with: URLRequest(url: URL(string: mappedUrl)!), completionHandler: { data, response, error in
+ if isCompleted.swap(true) {
+ return
+ }
+
+ if let error {
+ sourceTask.didFailWithError(error)
+ } else {
+ if let response {
+ sourceTask.didReceive(response)
+ }
+ if let data {
+ sourceTask.didReceive(data)
+ }
+ sourceTask.didFinish()
+ }
+ })
+ self.urlSessionTask?.resume()
+ }
+
+ func cancel() {
+ if let urlSessionTask = self.urlSessionTask {
+ self.urlSessionTask = nil
+ if !self.isCompleted.swap(true) {
+ switch urlSessionTask.state {
+ case .running, .suspended:
+ urlSessionTask.cancel()
+ default:
+ break
+ }
+ }
+ }
+ }
+ }
+
+ private var pendingTasks: [PendingTask] = []
+
+ func webView(_ webView: WKWebView, start urlSchemeTask: any WKURLSchemeTask) {
+ self.pendingTasks.append(PendingTask(sourceTask: urlSchemeTask))
+ }
+
func webView(_ webView: WKWebView, stop urlSchemeTask: any WKURLSchemeTask) {
if let index = self.pendingTasks.firstIndex(where: { $0.sourceTask === urlSchemeTask }) {
let task = self.pendingTasks[index]
@@ -95,10 +170,7 @@ final class BrowserWebContent: UIView, BrowserContent, UIScrollViewDelegate {
init(context: AccountContext, url: String) {
let configuration = WKWebViewConfiguration()
- if context.sharedContext.immediateExperimentalUISettings.browserExperiment {
- configuration.setURLSchemeHandler(IpfsSchemeHandler(), forURLScheme: "ipns")
- configuration.setURLSchemeHandler(IpfsSchemeHandler(), forURLScheme: "ipfs")
- }
+ configuration.setURLSchemeHandler(TonSchemeHandler(), forURLScheme: "tonsite")
self.webView = WKWebView(frame: CGRect(), configuration: configuration)
self.webView.allowsLinkPreview = false
diff --git a/submodules/TelegramUI/Sources/OpenUrl.swift b/submodules/TelegramUI/Sources/OpenUrl.swift
index e6a021bbfc..c68f2866d8 100644
--- a/submodules/TelegramUI/Sources/OpenUrl.swift
+++ b/submodules/TelegramUI/Sources/OpenUrl.swift
@@ -251,16 +251,10 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|> deliverOnMainQueue).startStandalone(next: handleResolvedUrl)
}
- if context.sharedContext.immediateExperimentalUISettings.browserExperiment {
- if let scheme = parsedUrl.scheme, (scheme == "tg" || scheme == context.sharedContext.applicationBindings.appSpecificScheme) {
- if parsedUrl.host == "ipfs" {
- if let value = URL(string: "ipfs:/" + parsedUrl.path) {
- parsedUrl = value
- }
- } else if parsedUrl.host == "ton" {
- if let value = URL(string: "ton:/" + parsedUrl.path) {
- parsedUrl = value
- }
+ if let scheme = parsedUrl.scheme, (scheme == "tg" || scheme == context.sharedContext.applicationBindings.appSpecificScheme) {
+ if parsedUrl.host == "tonsite" {
+ if let value = URL(string: "tonsite:/" + parsedUrl.path) {
+ parsedUrl = value
}
}
}
@@ -1008,10 +1002,8 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
if parsedUrl.scheme == "http" || parsedUrl.scheme == "https" {
isInternetUrl = true
}
- if context.sharedContext.immediateExperimentalUISettings.browserExperiment {
- if parsedUrl.scheme == "ipfs" || parsedUrl.scheme == "ipns" || parsedUrl.scheme == "ton" {
- isInternetUrl = true
- }
+ if parsedUrl.scheme == "tonsite" {
+ isInternetUrl = true
}
if isInternetUrl {
@@ -1045,7 +1037,8 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
let _ = (settings
|> deliverOnMainQueue).startStandalone(next: { settings in
if settings.defaultWebBrowser == nil {
- if isCompact && context.sharedContext.immediateExperimentalUISettings.browserExperiment {
+ //TODO:release check !isCompact
+ if isCompact || "".isEmpty {
let controller = BrowserScreen(context: context, subject: .webPage(url: parsedUrl.absoluteString))
navigationController?.pushViewController(controller)
} else {
diff --git a/submodules/UrlHandling/Sources/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift
index fd9ace5203..9bcc4064ea 100644
--- a/submodules/UrlHandling/Sources/UrlHandling.swift
+++ b/submodules/UrlHandling/Sources/UrlHandling.swift
@@ -130,13 +130,8 @@ public func parseInternalUrl(sharedContext: SharedAccountContext, query: String)
if !pathComponents.isEmpty && !pathComponents[0].isEmpty {
let peerName: String = pathComponents[0]
- if sharedContext.immediateExperimentalUISettings.browserExperiment {
- if query.hasPrefix("ipfs/") {
- return .externalUrl(url: "ipfs://" + String(query[query.index(query.startIndex, offsetBy: "ipfs/".count)...]))
- }
- if query.hasPrefix("ton/") {
- return .externalUrl(url: "ton://" + String(query[query.index(query.startIndex, offsetBy: "ton/".count)...]))
- }
+ if query.hasPrefix("tonsite/") {
+ return .externalUrl(url: "tonsite://" + String(query[query.index(query.startIndex, offsetBy: "tonsite/".count)...]))
}
if pathComponents[0].hasPrefix("+") || pathComponents[0].hasPrefix("%20") {