Quellcode durchsuchen

Initial commit: communication between background and sidebar

Jocelyn Boullier vor 5 Jahren
Commit
b33f5d48e0

+ 13 - 0
.gitignore

@@ -0,0 +1,13 @@
+/bower_components/
+/node_modules/
+/.pulp-cache/
+/output/
+/generated-docs/
+/.psc-package/
+/.psc*
+/.purs*
+/.psa*
+/.spago
+/.cache
+/dist
+/tags

Datei-Diff unterdrückt, da er zu groß ist
+ 12146 - 0
extension/background.js


Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
extension/background.js.map


+ 31 - 0
extension/manifest.json

@@ -0,0 +1,31 @@
+{
+  "manifest_version": 2,
+  "name": "Pure Tabs",
+  "description": "Tree tabs extension written in PureScript",
+  "version": "0.1.0",
+  "homepage_url": "https://github.com/Kazy",
+  "browser_specific_settings": {
+    "gecko": {
+      "id": "puretabs@boullier.bzh"
+    }
+  },
+  "background": {
+    "scripts": [
+      "background.js"
+    ],
+    "persistent": true
+  },
+  "sidebar_action": {
+    "default_title": "Pure Tabs",
+    "default_panel": "sidebar.html"
+  },
+  "permissions": [
+    "<all_urls>",
+    "tabs",
+    "sessions",
+    "storage",
+    "unlimitedStorage",
+    "bookmarks",
+    "tabHide"
+  ]
+}

+ 15 - 0
extension/sidebar.html

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+
+<html>
+  <head>
+    <meta charset="utf-8">
+    <link rel="stylesheet" href="panel.css"/>
+  </head>
+
+<body>
+  <div id = "content"></div>
+  <p>This is the Sidebar</p>
+  <script src="sidebar.js"></script>
+</body>
+
+</html>

Datei-Diff unterdrückt, da er zu groß ist
+ 829 - 0
extension/sidebar.js


Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
extension/sidebar.js.map


Datei-Diff unterdrückt, da er zu groß ist
+ 7362 - 0
package-lock.json


+ 19 - 0
package.json

@@ -0,0 +1,19 @@
+{
+  "name": "puretabs",
+  "version": "0.1.0",
+  "description": "Tree tabs extension written in PureScript",
+  "directories": {
+    "test": "test"
+  },
+  "scripts": {
+    "parcel": "parcel",
+    "dev": "spago build --watch & parcel watch src/background.js -d extension/",
+    "build": "spago build && parcel build src/background.js -d extension/",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "devDependencies": {
+    "parcel": "^1.12.4"
+  }
+}

+ 128 - 0
packages.dhall

@@ -0,0 +1,128 @@
+{-
+Welcome to your new Dhall package-set!
+
+Below are instructions for how to edit this file for most use
+cases, so that you don't need to know Dhall to use it.
+
+## Warning: Don't Move This Top-Level Comment!
+
+Due to how `dhall format` currently works, this comment's
+instructions cannot appear near corresponding sections below
+because `dhall format` will delete the comment. However,
+it will not delete a top-level comment like this one.
+
+## Use Cases
+
+Most will want to do one or both of these options:
+1. Override/Patch a package's dependency
+2. Add a package not already in the default package set
+
+This file will continue to work whether you use one or both options.
+Instructions for each option are explained below.
+
+### Overriding/Patching a package
+
+Purpose:
+- Change a package's dependency to a newer/older release than the
+    default package set's release
+- Use your own modified version of some dependency that may
+    include new API, changed API, removed API by
+    using your custom git repo of the library rather than
+    the package set's repo
+
+Syntax:
+Replace the overrides' "{=}" (an empty record) with the following idea
+The "//" or "⫽" means "merge these two records and
+  when they have the same value, use the one on the right:"
+-------------------------------
+let overrides =
+  { packageName =
+      upstream.packageName // { updateEntity1 = "new value", updateEntity2 = "new value" }
+  , packageName =
+      upstream.packageName // { version = "v4.0.0" }
+  , packageName =
+      upstream.packageName // { repo = "https://www.example.com/path/to/new/repo.git" }
+  }
+-------------------------------
+
+Example:
+-------------------------------
+let overrides =
+  { halogen =
+      upstream.halogen // { version = "master" }
+  , halogen-vdom =
+      upstream.halogen-vdom // { version = "v4.0.0" }
+  }
+-------------------------------
+
+### Additions
+
+Purpose:
+- Add packages that aren't already included in the default package set
+
+Syntax:
+Replace the additions' "{=}" (an empty record) with the following idea:
+-------------------------------
+let additions =
+  { package-name =
+       { dependencies =
+           [ "dependency1"
+           , "dependency2"
+           ]
+       , repo =
+           "https://example.com/path/to/git/repo.git"
+       , version =
+           "tag ('v4.0.0') or branch ('master')"
+       }
+  , package-name =
+       { dependencies =
+           [ "dependency1"
+           , "dependency2"
+           ]
+       , repo =
+           "https://example.com/path/to/git/repo.git"
+       , version =
+           "tag ('v4.0.0') or branch ('master')"
+       }
+  , etc.
+  }
+-------------------------------
+
+Example:
+-------------------------------
+let additions =
+  { benchotron =
+      { dependencies =
+          [ "arrays"
+          , "exists"
+          , "profunctor"
+          , "strings"
+          , "quickcheck"
+          , "lcg"
+          , "transformers"
+          , "foldable-traversable"
+          , "exceptions"
+          , "node-fs"
+          , "node-buffer"
+          , "node-readline"
+          , "datetime"
+          , "now"
+          ]
+      , repo =
+          "https://github.com/hdgarrood/purescript-benchotron.git"
+      , version =
+          "v7.0.0"
+      }
+  }
+-------------------------------
+-}
+
+
+let upstream =
+      https://github.com/purescript/package-sets/releases/download/psc-0.13.6-20200309/packages.dhall sha256:9221987b4e7ea99ccd0efbe056f7bebc872cd92e0058efe5baa181d73359e7b3
+
+let overrides = {=}
+
+let additions = {=}
+
+in  upstream // overrides // additions

+ 10 - 0
spago.dhall

@@ -0,0 +1,10 @@
+{-
+Welcome to a Spago project!
+You can edit this file as you like.
+-}
+{ name = "my-project"
+, dependencies =
+  [ "console", "effect", "lists", "numbers", "psci-support", "refs", "st" ]
+, packages = ./packages.dhall
+, sources = [ "src/**/*.purs", "test/**/*.purs" ]
+}

+ 45 - 0
src/Background.purs

@@ -0,0 +1,45 @@
+module PureTabs.Background where
+
+import Data.List
+
+import Browser.Runtime as Runtime
+import Browser.Tabs (Tab)
+import Browser.Tabs.OnCreated as OnCreated
+import Data.Foldable (for_)
+import Data.Monoid ((<>))
+import Data.Number.Format (toString)
+import Effect (Effect)
+import Effect.Console (log)
+import Effect.Ref as Ref
+import Prelude (Unit, bind, ($), discard)
+
+type Ports = Ref.Ref (List Runtime.Port)
+
+main :: Effect Unit
+main = do
+  log "started background"
+  ports <- Ref.new Nil
+
+  Runtime.onConnectAddListener $ onConnect ports
+
+  listener <- OnCreated.mkListener $ sendCreatedTab ports
+  OnCreated.addListener listener
+
+  where
+        logTabId :: Tab -> Effect Unit
+        logTabId tab = do 
+           log $ toString tab.id
+
+        sendCreatedTab :: Ports -> Tab -> Effect Unit
+        sendCreatedTab portsRef tab = do
+           log $ "(bg) tab created" <> tabId
+           ports <- Ref.read portsRef
+           for_ ports (\p -> Runtime.postMessage p tabId)
+
+            where
+                  tabId = toString tab.id
+
+        onConnect :: Ports -> Runtime.Port -> Effect Unit
+        onConnect ref port = do 
+           log "new connect"
+           Ref.modify_ (\ports -> port : ports) ref

+ 29 - 0
src/Browser/Runtime.js

@@ -0,0 +1,29 @@
+"use strict";
+
+exports.connect = function () {
+    return browser.runtime.connect({name: name});
+}
+
+exports.postMessage = function (port) {
+  return function (message) {
+    return function () {
+      port.postMessage(message);
+    }
+  }
+}
+
+exports.onConnectAddListener = function (fn) {
+  return function () {
+    return browser.runtime.onConnect.addListener(p => {
+      fn(p)();
+    })
+  }
+}
+
+exports.onMessageAddListener = function (port) {
+  return function (fn) {
+    return function () {
+      return port.onMessage.addListener(m => fn(m)());
+    }
+  }
+}

+ 14 - 0
src/Browser/Runtime.purs

@@ -0,0 +1,14 @@
+module Browser.Runtime (Port, connect, onConnectAddListener, postMessage, onMessageAddListener) where
+
+import Prelude (Unit)
+import Effect (Effect)
+  
+foreign import data Port :: Type
+
+foreign import connect :: Effect Port
+
+foreign import onConnectAddListener :: (Port -> Effect Unit) -> Effect Unit
+
+foreign import postMessage :: Port -> String -> Effect Unit
+
+foreign import onMessageAddListener :: Port -> (String -> Effect Unit) -> Effect Unit

+ 23 - 0
src/Browser/Tabs.purs

@@ -0,0 +1,23 @@
+module Browser.Tabs (Tab(..)) where
+
+type Tab = {
+  active :: Boolean,
+  attention :: Boolean,
+  audible :: Boolean,
+  discarded :: Boolean,
+  favIconUrl :: String,
+  height :: Number,
+  hidden :: Boolean,
+  id :: Number,
+  incognito :: Boolean,
+  index :: Number,
+  isArticle :: Boolean,
+  pinned :: Boolean,
+  status :: String, -- create an enum for that
+  successorTabId :: Number,
+  title :: String,
+  url :: String,
+  width :: Number,
+  windowId :: Number
+}
+

+ 21 - 0
src/Browser/Tabs/OnCreated.js

@@ -0,0 +1,21 @@
+"use stricts";
+
+exports.mkListener = function (fn) {
+  return function () {
+    return function (event) {
+      return fn(event)();
+    }
+  }
+};
+
+exports.addListener = function (listener) {
+  return function () {
+    browser.tabs.onCreated.addListener(listener);
+  }
+}
+
+exports.removeListener = function (listener) {
+  return function () {
+    return browser.tabs.onCreated.removeListener(listener);
+  }
+}

+ 20 - 0
src/Browser/Tabs/OnCreated.purs

@@ -0,0 +1,20 @@
+module Browser.Tabs.OnCreated (Listener, ListenerRef, mkListener, addListener, removeListener) where
+
+import Prelude
+import Effect (Effect)
+import Browser.Tabs (Tab)
+
+
+foreign import data ListenerRef :: Type
+
+type Listener = (Tab -> Effect Unit)
+
+
+foreign import mkListener
+  :: Listener -> Effect ListenerRef
+
+foreign import addListener
+  :: ListenerRef -> Effect Unit
+
+foreign import removeListener
+  :: ListenerRef -> Effect Unit

+ 17 - 0
src/Sidebar.purs

@@ -0,0 +1,17 @@
+module PureTabs.Sidebar where
+
+import Browser.Runtime as Runtime
+import Data.Monoid ((<>))
+import Effect (Effect)
+import Effect.Console (log)
+import Prelude (Unit, bind, ($), discard)
+
+main :: Effect Unit
+main = do 
+  log "started sidebar"
+  port <- Runtime.connect
+  Runtime.onMessageAddListener port onMsg
+
+  where
+        onMsg m = do 
+           log $ "(sb) tab created: " <> m

+ 7 - 0
src/background.js

@@ -0,0 +1,7 @@
+var Background = require("../output/PureTabs.Background");
+
+function main() {
+  Background.main();
+}
+
+main();

+ 7 - 0
src/sidebar.js

@@ -0,0 +1,7 @@
+var Sidebar = require("../output/PureTabs.Sidebar");
+
+function main() {
+  Sidebar.main();
+}
+
+main();

+ 11 - 0
test/Main.purs

@@ -0,0 +1,11 @@
+module Test.Main where
+
+import Prelude
+
+import Effect (Effect)
+import Effect.Class.Console (log)
+
+main :: Effect Unit
+main = do
+  log "🍝"
+  log "You should add some tests."