From a9f4fa0fb1da9376f854caa6032f240c5e3f8c71 Mon Sep 17 00:00:00 2001 From: "davin.ahn" Date: Sat, 28 Aug 2021 02:14:21 +0900 Subject: [PATCH 1/6] Change JavaScriptInterface bridge to be called on a background thread --- .../WKJavaScriptController.swift | 162 +++++++++--------- 1 file changed, 83 insertions(+), 79 deletions(-) diff --git a/Sources/WKJavaScriptController/WKJavaScriptController.swift b/Sources/WKJavaScriptController/WKJavaScriptController.swift index 271c372..b88defc 100644 --- a/Sources/WKJavaScriptController/WKJavaScriptController.swift +++ b/Sources/WKJavaScriptController/WKJavaScriptController.swift @@ -486,87 +486,91 @@ extension WKJavaScriptController: WKScriptMessageHandler { } let imp = method_getImplementation(method) - var result: Result! - switch bridge.argumentCount { - case 0: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation0.self)(target, bridge.nativeSelector) - } else { - unsafeBitCast(imp, to: Invocation0.self)(target, bridge.nativeSelector) - } - case 1: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation1.self)(target, bridge.nativeSelector, cast(args[0])) - } else { - unsafeBitCast(imp, to: Invocation1.self)(target, bridge.nativeSelector, cast(args[0])) - } - case 2: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation2.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1])) - } else { - unsafeBitCast(imp, to: Invocation2.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1])) - } - case 3: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation3.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2])) - } else { - unsafeBitCast(imp, to: Invocation3.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2])) - } - case 4: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation4.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3])) - } else { - unsafeBitCast(imp, to: Invocation4.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3])) - } - case 5: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation5.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4])) - } else { - unsafeBitCast(imp, to: Invocation5.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4])) - } - case 6: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation6.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5])) - } else { - unsafeBitCast(imp, to: Invocation6.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5])) - } - case 7: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation7.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6])) - } else { - unsafeBitCast(imp, to: Invocation7.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6])) - } - case 8: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation8.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7])) - } else { - unsafeBitCast(imp, to: Invocation8.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7])) - } - case 9: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation9.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8])) - } else { - unsafeBitCast(imp, to: Invocation9.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8])) + DispatchQueue.global().async { + var result: Result! + switch bridge.argumentCount { + case 0: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation0.self)(target, bridge.nativeSelector) + } else { + unsafeBitCast(imp, to: Invocation0.self)(target, bridge.nativeSelector) + } + case 1: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation1.self)(target, bridge.nativeSelector, self.cast(args[0])) + } else { + unsafeBitCast(imp, to: Invocation1.self)(target, bridge.nativeSelector, self.cast(args[0])) + } + case 2: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation2.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1])) + } else { + unsafeBitCast(imp, to: Invocation2.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1])) + } + case 3: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation3.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2])) + } else { + unsafeBitCast(imp, to: Invocation3.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2])) + } + case 4: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation4.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3])) + } else { + unsafeBitCast(imp, to: Invocation4.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3])) + } + case 5: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation5.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4])) + } else { + unsafeBitCast(imp, to: Invocation5.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4])) + } + case 6: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation6.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5])) + } else { + unsafeBitCast(imp, to: Invocation6.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5])) + } + case 7: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation7.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6])) + } else { + unsafeBitCast(imp, to: Invocation7.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6])) + } + case 8: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation8.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7])) + } else { + unsafeBitCast(imp, to: Invocation8.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7])) + } + case 9: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation9.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8])) + } else { + unsafeBitCast(imp, to: Invocation9.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8])) + } + case argumentCountLimit: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation10.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]), self.cast(args[9])) + } else { + unsafeBitCast(imp, to: Invocation10.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]), self.cast(args[9])) + } + default: + // Not called. + break } - case argumentCountLimit: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation10.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]), cast(args[9])) - } else { - unsafeBitCast(imp, to: Invocation10.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]), cast(args[9])) + + DispatchQueue.main.async { + let script = """ + (() => { + const callback = \(self.name).\(ReserveKeyword.callbackList)['\(callbackId)']; + callback.end = new Date(); + callback.resolve(\(bridge.isReturnRequired ? self.stringFrom(result) : "")); + clearTimeout(callback.timer); + })(); + """ + self.webView?.evaluateJavaScript(script, completionHandler: nil) } - default: - // Not called. - break } - - let script = """ - (() => { - const callback = \(name).\(ReserveKeyword.callbackList)['\(callbackId)']; - callback.end = new Date(); - callback.resolve(\(bridge.isReturnRequired ? stringFrom(result) : "")); - clearTimeout(callback.timer); - })(); - """ - webView?.evaluateJavaScript(script, completionHandler: nil) } } From 4ea8160eae9209166733099d60dfffdf39d382ec Mon Sep 17 00:00:00 2001 From: DavinAhn Date: Fri, 23 Dec 2022 17:05:02 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EC=99=B8=EB=B6=80=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B8=8C=EB=A6=BF=EC=A7=80=20=EC=A0=95=EB=B3=B4=EC=97=90=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=91=EA=B7=BC=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WKJavaScriptController.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/WKJavaScriptController/WKJavaScriptController.swift b/Sources/WKJavaScriptController/WKJavaScriptController.swift index b88defc..ff03419 100644 --- a/Sources/WKJavaScriptController/WKJavaScriptController.swift +++ b/Sources/WKJavaScriptController/WKJavaScriptController.swift @@ -103,16 +103,16 @@ open class WKJavaScriptController: NSObject { fileprivate weak var webView: WKWebView? - fileprivate var bridges = [MethodBridge]() + open var bridges = [MethodBridge]() fileprivate var isInjectRequired = true - fileprivate class MethodBridge { - var nativeSelector: Selector - var isExtendJsSelector: Bool // If true, use ObjC style naming. - var isReturnRequired: Bool + open class MethodBridge { + open private(set) var nativeSelector: Selector + open fileprivate(set) var isExtendJsSelector: Bool // If true, use ObjC style naming. + open fileprivate(set) var isReturnRequired: Bool - var jsSelector: String { + open var jsSelector: String { let selector = NSStringFromSelector(nativeSelector) let components = selector.components(separatedBy: ":") if components.isEmpty { @@ -136,7 +136,7 @@ open class WKJavaScriptController: NSObject { } } - var argumentCount: Int { + open var argumentCount: Int { max(NSStringFromSelector(nativeSelector).components(separatedBy: ":").count - 1, 0) } From 19f5b4338c4c4c70d3c65c0856493512397fe0cc Mon Sep 17 00:00:00 2001 From: DavinAhn Date: Fri, 23 Dec 2022 17:20:29 +0900 Subject: [PATCH 3/6] Update CHANGELOG.md --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 402cdb0..25f6175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - None. +## [2.2.0 (2022-12-23)] + +- Change `bridges` access modifier to open. + ## [2.1.0 (2021-08-28)] - Deprecation cocoapods support. @@ -126,7 +130,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - First release. -[Unreleased]: https://github.com/ridi/WKJavaScriptController/compare/2.1.0...HEAD +[Unreleased]: https://github.com/ridi/WKJavaScriptController/compare/2.2.0...HEAD +[2.2.0 (2022-12-23)]: https://github.com/ridi/WKJavaScriptController/compare/2.1.0...2.2.0 [2.1.0 (2021-08-28)]: https://github.com/ridi/WKJavaScriptController/compare/2.0.2...2.1.0 [2.0.2 (2020-02-06)]: https://github.com/ridi/WKJavaScriptController/compare/2.0.1...2.0.2 [2.0.1 (2019-03-06)]: https://github.com/ridi/WKJavaScriptController/compare/2.0.0...2.0.1 From b4d88a44113698c0f55fb3b66cc599805be5d218 Mon Sep 17 00:00:00 2001 From: DavinAhn Date: Tue, 3 Jan 2023 01:27:09 +0900 Subject: [PATCH 4/6] =?UTF-8?q?#9=20=EC=97=90=EC=84=9C=20=EC=9E=98?= =?UTF-8?q?=EB=AA=BB=20=EC=98=A4=ED=94=88=ED=95=9C=20=EC=95=A1=EC=84=B8?= =?UTF-8?q?=EC=8A=A4=20=EC=A7=80=EC=8B=9C=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/WKJavaScriptController/WKJavaScriptController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/WKJavaScriptController/WKJavaScriptController.swift b/Sources/WKJavaScriptController/WKJavaScriptController.swift index ff03419..8073a86 100644 --- a/Sources/WKJavaScriptController/WKJavaScriptController.swift +++ b/Sources/WKJavaScriptController/WKJavaScriptController.swift @@ -103,7 +103,7 @@ open class WKJavaScriptController: NSObject { fileprivate weak var webView: WKWebView? - open var bridges = [MethodBridge]() + open private(set) var bridges = [MethodBridge]() fileprivate var isInjectRequired = true From 90e1809737b1537809ba087b9d1c977f557f6807 Mon Sep 17 00:00:00 2001 From: DavinAhn Date: Tue, 3 Jan 2023 01:28:07 +0900 Subject: [PATCH 5/6] Revert "Change JavaScriptInterface bridge to be called on a background thread" This reverts commit a9f4fa0fb1da9376f854caa6032f240c5e3f8c71. --- .../WKJavaScriptController.swift | 162 +++++++++--------- 1 file changed, 79 insertions(+), 83 deletions(-) diff --git a/Sources/WKJavaScriptController/WKJavaScriptController.swift b/Sources/WKJavaScriptController/WKJavaScriptController.swift index ff03419..f5390cb 100644 --- a/Sources/WKJavaScriptController/WKJavaScriptController.swift +++ b/Sources/WKJavaScriptController/WKJavaScriptController.swift @@ -486,91 +486,87 @@ extension WKJavaScriptController: WKScriptMessageHandler { } let imp = method_getImplementation(method) - DispatchQueue.global().async { - var result: Result! - switch bridge.argumentCount { - case 0: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation0.self)(target, bridge.nativeSelector) - } else { - unsafeBitCast(imp, to: Invocation0.self)(target, bridge.nativeSelector) - } - case 1: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation1.self)(target, bridge.nativeSelector, self.cast(args[0])) - } else { - unsafeBitCast(imp, to: Invocation1.self)(target, bridge.nativeSelector, self.cast(args[0])) - } - case 2: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation2.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1])) - } else { - unsafeBitCast(imp, to: Invocation2.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1])) - } - case 3: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation3.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2])) - } else { - unsafeBitCast(imp, to: Invocation3.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2])) - } - case 4: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation4.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3])) - } else { - unsafeBitCast(imp, to: Invocation4.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3])) - } - case 5: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation5.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4])) - } else { - unsafeBitCast(imp, to: Invocation5.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4])) - } - case 6: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation6.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5])) - } else { - unsafeBitCast(imp, to: Invocation6.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5])) - } - case 7: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation7.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6])) - } else { - unsafeBitCast(imp, to: Invocation7.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6])) - } - case 8: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation8.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7])) - } else { - unsafeBitCast(imp, to: Invocation8.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7])) - } - case 9: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation9.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8])) - } else { - unsafeBitCast(imp, to: Invocation9.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8])) - } - case argumentCountLimit: - if bridge.isReturnRequired { - result = unsafeBitCast(imp, to: XInvocation10.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]), self.cast(args[9])) - } else { - unsafeBitCast(imp, to: Invocation10.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]), self.cast(args[9])) - } - default: - // Not called. - break + var result: Result! + switch bridge.argumentCount { + case 0: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation0.self)(target, bridge.nativeSelector) + } else { + unsafeBitCast(imp, to: Invocation0.self)(target, bridge.nativeSelector) } - - DispatchQueue.main.async { - let script = """ - (() => { - const callback = \(self.name).\(ReserveKeyword.callbackList)['\(callbackId)']; - callback.end = new Date(); - callback.resolve(\(bridge.isReturnRequired ? self.stringFrom(result) : "")); - clearTimeout(callback.timer); - })(); - """ - self.webView?.evaluateJavaScript(script, completionHandler: nil) + case 1: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation1.self)(target, bridge.nativeSelector, cast(args[0])) + } else { + unsafeBitCast(imp, to: Invocation1.self)(target, bridge.nativeSelector, cast(args[0])) + } + case 2: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation2.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1])) + } else { + unsafeBitCast(imp, to: Invocation2.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1])) + } + case 3: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation3.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2])) + } else { + unsafeBitCast(imp, to: Invocation3.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2])) + } + case 4: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation4.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3])) + } else { + unsafeBitCast(imp, to: Invocation4.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3])) + } + case 5: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation5.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4])) + } else { + unsafeBitCast(imp, to: Invocation5.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4])) + } + case 6: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation6.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5])) + } else { + unsafeBitCast(imp, to: Invocation6.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5])) + } + case 7: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation7.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6])) + } else { + unsafeBitCast(imp, to: Invocation7.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6])) } + case 8: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation8.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7])) + } else { + unsafeBitCast(imp, to: Invocation8.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7])) + } + case 9: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation9.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8])) + } else { + unsafeBitCast(imp, to: Invocation9.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8])) + } + case argumentCountLimit: + if bridge.isReturnRequired { + result = unsafeBitCast(imp, to: XInvocation10.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]), cast(args[9])) + } else { + unsafeBitCast(imp, to: Invocation10.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]), cast(args[9])) + } + default: + // Not called. + break } + + let script = """ + (() => { + const callback = \(name).\(ReserveKeyword.callbackList)['\(callbackId)']; + callback.end = new Date(); + callback.resolve(\(bridge.isReturnRequired ? stringFrom(result) : "")); + clearTimeout(callback.timer); + })(); + """ + webView?.evaluateJavaScript(script, completionHandler: nil) } } From c059b3e6e14d24e22d91eccb85a69943da48f26a Mon Sep 17 00:00:00 2001 From: Davin Ahn Date: Tue, 3 Jan 2023 11:35:34 +0900 Subject: [PATCH 6/6] Update CHANGELOG.md --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25f6175..48083c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - None. +## [2.2.1 (2023-01-03)] + +- Revert wrong modified for thread. + ## [2.2.0 (2022-12-23)] - Change `bridges` access modifier to open. @@ -130,7 +134,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - First release. -[Unreleased]: https://github.com/ridi/WKJavaScriptController/compare/2.2.0...HEAD +[Unreleased]: https://github.com/ridi/WKJavaScriptController/compare/2.2.1...HEAD +[2.2.1 (2023-01-03)]: https://github.com/ridi/WKJavaScriptController/compare/2.2.0...2.2.1 [2.2.0 (2022-12-23)]: https://github.com/ridi/WKJavaScriptController/compare/2.1.0...2.2.0 [2.1.0 (2021-08-28)]: https://github.com/ridi/WKJavaScriptController/compare/2.0.2...2.1.0 [2.0.2 (2020-02-06)]: https://github.com/ridi/WKJavaScriptController/compare/2.0.1...2.0.2