Explorar el Código

Start adding support for native messaging

jherve hace 1 año
padre
commit
77399ced6a

+ 1 - 1
extension/manifest.json

@@ -21,5 +21,5 @@
     "scripts": ["background.js"],
     "persistent": true
   },
-  "permissions": ["activeTab", "tabs", "storage"]
+  "permissions": ["activeTab", "tabs", "storage", "nativeMessaging"]
 }

+ 13 - 0
src/Background.purs

@@ -4,16 +4,26 @@ import Prelude
 
 import Browser.WebExt.BrowserAction (onClickedAddListener)
 import Browser.WebExt.Listener (mkListener)
+import Browser.WebExt.Message (Message)
+import Browser.WebExt.Port (postMessage)
+import Browser.WebExt.Port as Port
 import Browser.WebExt.Runtime (onMessageAddListener)
 import Browser.WebExt.Tabs (Tab)
+import Data.Argonaut.Core (stringify)
+import Data.Argonaut.Encode.Encoders (encodeString)
 import Effect (Effect)
 import Effect.Class (class MonadEffect)
 import Effect.Class.Console (log, logShow)
+import ExampleWebExt.NativeMessage (connectToNativeApplication)
 import ExampleWebExt.RuntimeMessage (RuntimeMessage(..), mkRuntimeMessageHandler, sendMessageToContent)
 
 main :: Effect Unit
 main = do
   log "[bg] starting up"
+  port <- connectToNativeApplication "job_search_writer"
+  Port.onMessageAddListener port $ mkListener nativeMessageHandler
+
+  postMessage port $ encodeString "hello"
 
   onClickedAddListener $ mkListener browserActionOnClickedHandler
   onMessageAddListener $ mkRuntimeMessageHandler contentScriptMessageHandler
@@ -26,3 +36,6 @@ browserActionOnClickedHandler tab = do
 
 contentScriptMessageHandler ∷ ∀ m. MonadEffect m => RuntimeMessage → m Unit
 contentScriptMessageHandler m = logShow m
+
+nativeMessageHandler ∷ ∀ m. MonadEffect m ⇒ Message → m Unit
+nativeMessageHandler m = log $ "[bg] Got message from native : " <> stringify m

+ 7 - 0
src/Browser/WebExt/Port.js

@@ -0,0 +1,7 @@
+export function postMessageImpl (port, message) {
+  return port.postMessage(message);
+}
+
+export function onMessageAddListenerImpl (port, fn) {
+  return port.onMessage.addListener(fn);
+}

+ 19 - 0
src/Browser/WebExt/Port.purs

@@ -0,0 +1,19 @@
+module Browser.WebExt.Port (Port, postMessage, onMessageAddListener) where
+
+import Prelude
+
+import Browser.WebExt.Listener (Listener)
+import Browser.WebExt.Message (Message)
+import Effect (Effect)
+import Effect.Uncurried (EffectFn2, runEffectFn2)
+
+foreign import data Port :: Type
+
+foreign import postMessageImpl :: EffectFn2 Port Message Unit
+foreign import onMessageAddListenerImpl :: EffectFn2 Port (Listener Message) Unit
+
+postMessage ∷ Port → Message → Effect Unit
+postMessage = runEffectFn2 postMessageImpl
+
+onMessageAddListener ∷ Port -> Listener Message → Effect Unit
+onMessageAddListener = runEffectFn2 onMessageAddListenerImpl

+ 4 - 0
src/Browser/WebExt/Runtime.js

@@ -5,3 +5,7 @@ export function onMessageAddListenerImpl(fn) {
 export function runtimeSendMessageImpl (message) {
   return browser.runtime.sendMessage(message);
 }
+
+export function connectNativeImpl (application) {
+  return browser.runtime.connectNative(application);
+}

+ 10 - 1
src/Browser/WebExt/Runtime.purs

@@ -1,21 +1,30 @@
 module Browser.WebExt.Runtime (
+  Application,
   sendMessage,
-  onMessageAddListener
+  onMessageAddListener,
+  connectNative
 ) where
 
 import Prelude
 
 import Browser.WebExt.Listener (Listener)
 import Browser.WebExt.Message (Message)
+import Browser.WebExt.Port (Port)
 import Effect (Effect)
 import Effect.Uncurried (EffectFn1, runEffectFn1)
 import Promise (Promise)
 
+type Application = String
+
 foreign import onMessageAddListenerImpl :: EffectFn1 (Listener Message) Unit
 foreign import runtimeSendMessageImpl :: EffectFn1 Message (Promise Message)
+foreign import connectNativeImpl :: EffectFn1 Application Port
 
 onMessageAddListener ∷ Listener Message → Effect Unit
 onMessageAddListener = runEffectFn1 onMessageAddListenerImpl
 
 sendMessage ∷ Message → Effect (Promise Message)
 sendMessage = runEffectFn1 runtimeSendMessageImpl
+
+connectNative ∷ Application → Effect Port
+connectNative = runEffectFn1 connectNativeImpl

+ 13 - 0
src/NativeMessage.purs

@@ -0,0 +1,13 @@
+module ExampleWebExt.NativeMessage where
+
+import Prelude
+
+import Browser.WebExt.Port (Port)
+import Browser.WebExt.Runtime (Application, connectNative)
+import Effect (Effect)
+
+data NativeMessage =
+  NativeMessageBackgroundInit
+
+connectToNativeApplication ∷ Application → Effect Port
+connectToNativeApplication = connectNative