Просмотр исходного кода

Content can now send messages and background can receive

jherve 1 год назад
Родитель
Сommit
289338473c
4 измененных файлов с 17 добавлено и 2 удалено
  1. 6 1
      src/Background.purs
  2. 4 0
      src/Browser/Runtime.js
  3. 5 0
      src/Browser/Runtime.purs
  4. 2 1
      src/Content.purs

+ 6 - 1
src/Background.purs

@@ -2,8 +2,9 @@ module ExampleWebExt.Background where
 
 
 import Prelude
 import Prelude
 
 
-import Browser.Runtime (mkListener, onClickedAddListener, tabsSendMessage)
+import Browser.Runtime (mkListener, onClickedAddListener, onMessageAddListener, tabsSendMessage)
 import Effect (Effect)
 import Effect (Effect)
+import Effect.Class (class MonadEffect)
 import Effect.Class.Console (log, logShow)
 import Effect.Class.Console (log, logShow)
 
 
 main :: Effect Unit
 main :: Effect Unit
@@ -18,5 +19,9 @@ main = do
   log "[bg] starting up"
   log "[bg] starting up"
 
 
   onClickedAddListener listenerEff
   onClickedAddListener listenerEff
+  onMessageAddListener $ mkListener contentScriptMessageHandler
 
 
   log "[bg] registered"
   log "[bg] registered"
+
+contentScriptMessageHandler ∷ ∀ m (a ∷ Type). MonadEffect m ⇒ Show a ⇒ a → m Unit
+contentScriptMessageHandler m = log $ "[bg] received msg from content : " <> show m

+ 4 - 0
src/Browser/Runtime.js

@@ -9,3 +9,7 @@ export function tabsSendMessageImpl (tabId, message) {
 export function onMessageAddListenerImpl(fn) {
 export function onMessageAddListenerImpl(fn) {
   return browser.runtime.onMessage.addListener(fn);
   return browser.runtime.onMessage.addListener(fn);
 }
 }
+
+export function runtimeSendMessageImpl (message) {
+  return browser.runtime.sendMessage(message);
+}

+ 5 - 0
src/Browser/Runtime.purs

@@ -4,6 +4,7 @@ module Browser.Runtime (
   Message,
   Message,
   Listener,
   Listener,
   tabsSendMessage,
   tabsSendMessage,
+  runtimeSendMessage,
   onClickedAddListener,
   onClickedAddListener,
   onMessageAddListener,
   onMessageAddListener,
   mkListener
   mkListener
@@ -24,6 +25,7 @@ type Listener a = EffectFn1 a Unit
 foreign import onClickedAddListenerImpl :: EffectFn1 (Listener Tab) Unit
 foreign import onClickedAddListenerImpl :: EffectFn1 (Listener Tab) Unit
 foreign import tabsSendMessageImpl :: EffectFn2 TabId Message (Promise Message)
 foreign import tabsSendMessageImpl :: EffectFn2 TabId Message (Promise Message)
 foreign import onMessageAddListenerImpl :: EffectFn1 (Listener Message) Unit
 foreign import onMessageAddListenerImpl :: EffectFn1 (Listener Message) Unit
+foreign import runtimeSendMessageImpl :: EffectFn1 Message (Promise Message)
 
 
 onClickedAddListener ∷ Listener Tab → Effect Unit
 onClickedAddListener ∷ Listener Tab → Effect Unit
 onClickedAddListener = runEffectFn1 onClickedAddListenerImpl
 onClickedAddListener = runEffectFn1 onClickedAddListenerImpl
@@ -34,5 +36,8 @@ tabsSendMessage = runEffectFn2 tabsSendMessageImpl
 onMessageAddListener ∷ Listener Message → Effect Unit
 onMessageAddListener ∷ Listener Message → Effect Unit
 onMessageAddListener = runEffectFn1 onMessageAddListenerImpl
 onMessageAddListener = runEffectFn1 onMessageAddListenerImpl
 
 
+runtimeSendMessage ∷ Message → Effect (Promise Message)
+runtimeSendMessage = runEffectFn1 runtimeSendMessageImpl
+
 mkListener :: forall a. (a -> Effect Unit) -> Listener a
 mkListener :: forall a. (a -> Effect Unit) -> Listener a
 mkListener = mkEffectFn1
 mkListener = mkEffectFn1

+ 2 - 1
src/Content.purs

@@ -3,7 +3,7 @@ module ExampleWebExt.Content where
 import Prelude
 import Prelude
 
 
 import Browser.DOM (getBrowserDom)
 import Browser.DOM (getBrowserDom)
-import Browser.Runtime (mkListener, onMessageAddListener)
+import Browser.Runtime (mkListener, onMessageAddListener, runtimeSendMessage)
 import Effect (Effect)
 import Effect (Effect)
 import Effect.Class.Console (logShow)
 import Effect.Class.Console (logShow)
 import Effect.Console (log)
 import Effect.Console (log)
@@ -14,6 +14,7 @@ main = do
   log "[content] starting up"
   log "[content] starting up"
 
 
   onMessageAddListener $ mkListener messageListener
   onMessageAddListener $ mkListener messageListener
+  _ <- runtimeSendMessage "message from content"
 
 
   dom <- getBrowserDom
   dom <- getBrowserDom
   getContext dom >>= logShow
   getContext dom >>= logShow