Skip to content

feat: WebKit message handlers - #7

Open
buzsh wants to merge 1 commit into
mainfrom
feat-webkit-message-handlers
Open

feat: WebKit message handlers#7
buzsh wants to merge 1 commit into
mainfrom
feat-webkit-message-handlers

Conversation

@buzsh

@buzshbuzsh commented Jun 2, 2024

Copy link
Copy Markdown
Contributor

TODO

Example Syntax

declare global {interfaceWindow{webkit: {messageHandlers: {copilotMessageProcessed: {postMessage: (message: string)=>void;};copilotSidebarHidden: {postMessage: (message: string)=>void;};copilotPopupHidden: {postMessage: (message: string)=>void;};};};sendMessageToCopilot: (message: string)=>void;showCopilotSidebar: ()=>void;hideCopilotSidebar: ()=>void;showCopilotPopup: ()=>void;hideCopilotPopup: ()=>void;}}
  • Parse webkit message handlers
  • Generate separate enum for typesafe ScriptMessageHandlers
  • Generate WebView extensions for typesafe ScriptMessageHandlers
  • Generate view modifiers for typesafe ScriptMessageHandlers

Additional Ideas

  • Pass types through postMessage functions
  • Swift extensions for verifying types

Testing

  • Ensure duplicate postMessage names cannot be created

More Examples

Boolean

declare global {interfaceWindow{webkit: {messageHandlers: {copilotSidebarHidden: {postMessage: (isHidden: boolean)=>void;};};};}}// Sending a boolean messagewindow.webkit.messageHandlers.copilotSidebarHidden.postMessage(true);

func userContentController(_ userContentController:WKUserContentController, didReceive message:WKScriptMessage){if message.name =="copilotSidebarHidden"{iflet isHidden = message.body as?Bool, isHidden {
// Do something when the sidebar is hidden
}}}

Multiple Parameter Types

interfaceSidebarStatus{isHidden: boolean;timestamp: number;}declare global {interfaceWindow{webkit: {messageHandlers: {copilotSidebarHidden: {postMessage: (status: SidebarStatus)=>void;};};};}}// Sending an object messagewindow.webkit.messageHandlers.copilotSidebarHidden.postMessage({isHidden: true,timestamp: Date.now()});

func userContentController(_ userContentController:WKUserContentController, didReceive message:WKScriptMessage){if message.name =="copilotSidebarHidden"{iflet status = message.body as?[String:Any],let isHidden =status["isHidden"]as?Bool,let timestamp =status["timestamp"]as?Double{
// Do something with isHidden and timestamp
}}}

Different Method Name

declare global {interfaceWindow{webkit: {messageHandlers: {handleSidebarStatus: {sendStatus: (status: string)=>void;};};};}}// Sending a string messagewindow.webkit.messageHandlers.handleSidebarStatus.sendStatus("hidden");

func userContentController(_ userContentController:WKUserContentController, didReceive message:WKScriptMessage){if message.name =="handleSidebarStatus"{iflet status = message.body as?String, status =="hidden"{
// Do something when the sidebar status is "hidden"
}}}

Generative: interface

interfaceSidebarStatus{isHidden: boolean;progress: number;}

structSidebarStatus:Codable{letisHidden:Boolletprogress:Double}

Usage

letstatus=SidebarStatus(isHidden:true, progress:0.75)

Conversion

interfaceSidebarStatus{isHidden: boolean;progress: number;}declare global {interfaceWindow{webkit: {messageHandlers: {copilotSidebarHidden: {postMessage: (status: SidebarStatus)=>void;};};};}}// Sending an object messagewindow.webkit.messageHandlers.copilotSidebarHidden.postMessage({isHidden: true,progress: 0.75});

structSidebarStatus:Codable{letisHidden:Boolletprogress:Double}func userContentController(_ userContentController:WKUserContentController, didReceive message:WKScriptMessage){if message.name =="copilotSidebarHidden"{iflet data = message.body as?[String:Any]{do{letjsonData=tryJSONSerialization.data(withJSONObject: data, options:[])letstatus=tryJSONDecoder().decode(SidebarStatus.self, from: jsonData)
// Use the status struct
print("Sidebar is hidden: \(status.isHidden), progress: \(status.progress)")}catch{print("Failed to decode SidebarStatus: \(error)")}}}}

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@buzsh