@@ -25,6 +25,20 @@ struct WebView: UIViewRepresentable {
2525 }
2626}
2727
28+
29+ //This hack to make PageWebView the first responder but the selection won't work
30+ //extension UIView {
31+ // public override func becomeFirstResponder() -> Bool {
32+ // // Actual view is instance of private class UIWebBrowserView, its parent parent view is UIWebView
33+ // if self.superview?.superview is PageWebView {
34+ // print(1)
35+ // return false
36+ // } else {
37+ // return super.becomeFirstResponder()
38+ // }
39+ // }
40+ //}
41+
2842class PageWebView : WKWebView {
2943 @Published private var selectedText = " "
3044 @Published var newUrl = " "
@@ -47,6 +61,9 @@ class PageWebView: WKWebView {
4761 document.body.onload = function() {
4862 webkit.messageHandlers.onBodyLoaded.postMessage( " txt " )
4963 }
64+ document.body.onkeydown = function(event) {
65+ webkit.messageHandlers.onKeyPress.postMessage(event.code)
66+ }
5067 """
5168
5269 init ( ) {
@@ -70,6 +87,7 @@ class PageWebView: WKWebView {
7087 contentController. add ( self , name: " onSelectionChange " )
7188 contentController. add ( self , name: " onContextMenu " )
7289 contentController. add ( self , name: " onBodyLoaded " )
90+ contentController. add ( self , name: " onKeyPress " )
7391
7492
7593 _ = $selectedText
@@ -110,6 +128,18 @@ class PageWebView: WKWebView {
110128 }
111129}
112130
131+ extension PageWebView {
132+ override public var keyCommands : [ UIKeyCommand ] ? {
133+ //Voice selected text with any key since performCommand isn't fired because PageWebView isn't the first responder.
134+ SpeechSynthesizer . speech ( )
135+ return [ . init( input: " 1 " , modifierFlags: . command, action: #selector( performCommand) ) ]
136+ }
137+
138+ @objc func performCommand( sender: UIKeyCommand ) {
139+ print ( sender)
140+ }
141+ }
142+
113143extension PageWebView : WKScriptMessageHandler {
114144 func userContentController( _ userContentController: WKUserContentController , didReceive message: WKScriptMessage ) {
115145
@@ -122,6 +152,10 @@ extension PageWebView: WKScriptMessageHandler {
122152 print ( " onContextMenu " )
123153 case " onBodyLoaded " :
124154 print ( " onBodyLoaded " )
155+ case " onKeyPress " :
156+ if let code = message. body as? String {
157+ if code == " Space " { SpeechSynthesizer . speech ( ) }
158+ }
125159 default :
126160 print ( " webkit.messageHandlers. \( message. name) .postMessage() isn't found " )
127161 }
0 commit comments