Porównaj commity

...

425 Commity
v0.5.0 ... main

Autor SHA1 Wiadomość Data
Lartsch 22e3be13cb
Update README.md 2023-05-15 16:56:29 +02:00
Lartsch 97f9c10872
Update README.md 2023-05-15 16:56:19 +02:00
Lartsch 053af951bc
Merge pull request #65 from wlonkly/firefox-animations
namespace animations to avoid conflicts
2023-04-06 08:51:51 +02:00
Lartsch e0fbc804cc
Update README.md 2023-04-06 08:50:56 +02:00
Lartsch 6a9028afe0
Update README.md 2023-04-06 08:50:20 +02:00
Rich Lafferty 2289637543
minify 2023-01-22 00:02:19 -04:00
Rich Lafferty 8766852c9d
namespace animations 2023-01-22 00:02:19 -04:00
Lartsch 75cd8bb25a
Merge pull request #60 from ZeroEcks/main
Fix title of menu item to prevent confusion about the name of the plugin
2023-01-14 12:35:13 +00:00
Melody 7050e7b735
Fix title of menu item to prevent confusion about the name of the plugin 2023-01-09 13:17:23 +10:00
Lartsch f42eb8fd28
Merge pull request #53 from Freeplayg/main
Add https:// hint to Home Server Domain input
2023-01-02 20:33:08 +01:00
Freeplayg 15d59f96ea 5px in outline property wasn't needed 2023-01-02 14:31:23 -05:00
Freeplayg 6889c46fc0 Add https:// hint to Home Server Domain input 2023-01-02 12:25:44 -05:00
lartsch 2522f3f05c move in if 2022-12-29 11:12:33 -05:00
lartsch 0e20ff2f98 fix toot buttons in feed views when returning from redirect in "_self" mode, bump version 2022-12-29 10:47:09 -05:00
lartsch f23e7be502 improve 429 prevention (async limit), add ua 2022-12-29 10:10:59 -05:00
lartsch 95ec910c99 remove debug change 2022-12-29 06:41:53 -05:00
lartsch b6e75774b9 fix spinner icon for some browsers (switch to svg) 2022-12-29 06:40:21 -05:00
lartsch 90ad7818f4 increase api delay a little, use new Date.now() 2022-12-29 05:22:35 -05:00
lartsch 0276c2e06a increase API delay a little 2022-12-29 05:18:04 -05:00
lartsch 8926e8ad80 add content-type check, add cross browser prefixes 2022-12-29 05:11:29 -05:00
Lartsch 80cbbdf631
Merge pull request #47 from Freeplayg/main
Firefox prefences page fixes (for now w/ a temp fix)
2022-12-29 10:57:01 +01:00
Freeplayg 79a2e068a0 Firefox prefences page fixes (w/ a temp fix)
- Fixed unreadable text in dark mode
- Temporary fix for the height, still have no idea what to really do about that
2022-12-28 20:11:10 -05:00
Lartsch 8a347f3afd
Update readme 2022-12-27 13:07:41 +01:00
Lartsch 7e56a3dc86
Update readme 2022-12-27 13:06:00 +01:00
Lartsch 5508847693
Update README.md 2022-12-25 21:28:51 +01:00
Lartsch 5f2ebeaa43
Update README.md 2022-12-25 21:26:34 +01:00
Lartsch 34a1e3964c
Update README.md 2022-12-25 21:07:36 +01:00
Lartsch 5c4f23ac75
Update README.md 2022-12-25 21:06:59 +01:00
Lartsch 7f6fd11715
Update README.md 2022-12-25 21:06:06 +01:00
Lartsch e87bd47439
Update README.md 2022-12-25 21:04:32 +01:00
lartsch 8624ca560f use closure 2022-12-25 14:47:28 -05:00
lartsch 222b6b9809 bump version 2022-12-25 14:22:47 -05:00
lartsch 999b0ded7b fix modal related stuff 2022-12-25 14:21:48 -05:00
lartsch 89f4d7d423 adjust styles, change descriptions 2022-12-25 06:45:20 -05:00
Lartsch d59b6d0ea5
Merge pull request #39 from Freeplayg/main
Fix accessability issue in extension popup
2022-12-25 12:32:07 +01:00
Lartsch df1115891d
Merge pull request #40 from MarckK/patch-1
Small edit
2022-12-24 23:45:32 +01:00
Kara de la Marck e1b24eeb11
Small edit
Thank you for this browser extension!
2022-12-24 14:28:20 -05:00
Freeplayg 1d77003d08 Fix accessability issue 2022-12-24 11:03:26 -05:00
Lartsch 6c9209ce61
Update README.md 2022-12-24 12:44:51 +01:00
Lartsch f600741d1f
Update README.md 2022-12-24 12:44:17 +01:00
Lartsch b9aa91c130
Merge pull request #37 from LeviSnoot/main
(fix)updated media
2022-12-24 12:43:50 +01:00
Lartsch b1fa9f1f94
Merge pull request #38 from Freeplayg/main
Using a loading icon instead of resolving text
2022-12-24 12:42:13 +01:00
Freeplayg 115ba5503a Using a loading icon instead of resolving text 2022-12-23 22:26:58 -05:00
Levi c734b16252 (fix)version number for new media 2022-12-23 12:44:28 +01:00
Levi dfff64b98c (fix)updated media 2022-12-23 12:42:14 +01:00
Lartsch 4bc6b568df
Merge pull request #34 from Freeplayg/main
Improvements to the modal menu
2022-12-22 10:35:18 +01:00
Lartsch ababef902c
Merge pull request #36 from Freeplayg/patch-1
Update tooltip name
2022-12-22 10:27:31 +01:00
Freeplay 6a83649c98
Update tooltip name 2022-12-21 20:48:04 -05:00
Freeplayg 712e0c08c5 .hide class wasn't needed oops 2022-12-21 20:00:12 -05:00
Freeplayg 2d9a99ead3 Also forgot to compile, oops 2022-12-21 19:25:51 -05:00
Freeplayg 2c99b76e41 Forgot about when failed, oops 2022-12-21 19:25:17 -05:00
Freeplayg e2d0ec34a6 Improvements to the modal menu 2022-12-21 19:16:52 -05:00
lartsch 3a5809d73d change "Unresolved" to an "X" to save space 2022-12-21 09:00:15 -05:00
lartsch 379b67569b move all requests to background, support polls behind CWs, add important to some CSS 2022-12-21 08:47:07 -05:00
lartsch 7d774079ef Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-21 06:09:55 -05:00
lartsch de4f1ad1dd add descriptions for deny/allow mode 2022-12-21 06:09:53 -05:00
Lartsch 1b545b7750
Update README.md 2022-12-21 11:58:30 +01:00
Lartsch 3aed3ee81c
Update README.md 2022-12-20 18:19:06 -05:00
lartsch 608e336141 re-add line for firefox 2022-12-20 18:15:11 -05:00
lartsch 85dab0ce6a add indicator in modal if when action was successful/not, always turn off specific event handler only 2022-12-20 18:10:33 -05:00
lartsch d99d7bf48c Add "Copy URL" and "Copy home URL" to modal 2022-12-20 17:58:46 -05:00
lartsch 4616f38bda Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-20 17:37:13 -05:00
lartsch 65f560b110 "padding" for options 2022-12-20 17:37:12 -05:00
Lartsch 2dbce769f0
Update README.md 2022-12-20 23:29:44 +01:00
Lartsch 42f51bd72a
Update README.md 2022-12-20 23:28:20 +01:00
Lartsch 4e296ec9dc
Update README.md 2022-12-20 23:27:47 +01:00
Lartsch 5c3a948907
Update README.md 2022-12-20 23:24:40 +01:00
lartsch 8f2450f79b remove line, re-add meta viewport 2022-12-20 17:14:06 -05:00
lartsch 4718d82610 remove blank line, commented line 2022-12-20 15:22:04 -05:00
lartsch 6ccd307c6e Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-20 15:16:20 -05:00
lartsch ff0a65943e cross-browser css prefixes 2022-12-20 15:16:18 -05:00
Lartsch 0efe348b1d
Update README.md 2022-12-20 20:15:27 +01:00
Lartsch 9321998193
Update README.md 2022-12-20 19:18:06 +01:00
Lartsch e6bee33825
Update README.md 2022-12-20 19:17:23 +01:00
lartsch 250e0b0ec0 bump version 2022-12-20 13:02:49 -05:00
lartsch 73ccc91136 fix restyled popup for mobile browsers 2022-12-20 12:59:45 -05:00
lartsch 627df5c0ed Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-20 08:47:24 -05:00
lartsch 145326f783 add cross-browser css, first fix for mobile settings 2022-12-20 08:47:23 -05:00
Lartsch 77b565e1b2
Update README.md 2022-12-20 14:06:43 +01:00
lartsch 76f0369816 update packer 2022-12-20 07:57:53 -05:00
lartsch e7bc57fea7 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-20 07:55:44 -05:00
lartsch 683de3ca4b FediAct active indicator is now a clickable icon (fixed overlaying buttons), fix deny/allowlist wrong order, change settings descriptions 2022-12-20 07:55:42 -05:00
Lartsch b95443bb90
Update README.md 2022-12-20 06:41:22 -05:00
Lartsch 279a0ca275
Update README.md 2022-12-20 06:41:10 -05:00
Lartsch eabecbd5fa
Update README.md 2022-12-20 06:33:37 -05:00
lartsch 9badcc11f1 move popup css to file, rename css files, fix popup styles after moving to separate file 2022-12-20 06:25:21 -05:00
lartsch f8ceb4c460 spelling 2022-12-20 06:14:41 -05:00
lartsch 16d55bb4f9 change bg for success indicator 2022-12-20 06:13:07 -05:00
lartsch 6634889224 change names/description 2022-12-20 05:57:40 -05:00
Lartsch d20db0faa6
Merge pull request #21 from Freeplayg/main
Improve UI of extension popup
2022-12-20 11:46:33 +01:00
Freeplayg af0922ce77 Change footer color 2022-12-20 00:59:02 -05:00
Freeplayg efec20c9c4 Fix broken text color in dark mode 2022-12-20 00:56:18 -05:00
Freeplayg d4e7d4fb98 Improve UI of extension popup 2022-12-20 00:24:58 -05:00
Lartsch d953ceb87f
Update readme 2022-12-20 01:32:08 +01:00
Lartsch 43d670445a Update readme 2022-12-20 01:29:56 +01:00
Lartsch 3626ca6258
Add security information 2022-12-20 01:27:10 +01:00
Lartsch 013d476497
Update readme 2022-12-20 01:13:21 +01:00
Lartsch 60cf9ceb7c
Update README.md 2022-12-20 01:10:25 +01:00
lartsch 9645dfb8b3 add important to some styles for v3, add support for directory__cards for v3 2022-12-19 10:04:23 -05:00
lartsch 69041eccd5 use a fixed div for fediact running + go home button (easier to maintain and does not mess up the header) 2022-12-19 08:17:13 -05:00
lartsch a26c0d2d02 always use lowercase for homeinstance 2022-12-19 07:15:18 -05:00
lartsch ddc8ac999a remove mastodon logo to have enough space 2022-12-19 06:48:32 -05:00
lartsch 3ae11ff11d Add "Go home" button for v3 + v4 2022-12-19 06:36:55 -05:00
lartsch 348e5d1a05 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-19 06:24:38 -05:00
lartsch d598921006 Add "FediAct running" indicator 2022-12-19 06:24:36 -05:00
Lartsch be17b4f2b1
Update README.md 2022-12-19 05:43:08 -05:00
lartsch 411dc65573 add isTrusted check to prevent abuse 2022-12-19 05:34:02 -05:00
Lartsch c95fe569dc
Update README.md 2022-12-19 11:11:30 +01:00
Lartsch 847d102ccd
Update README.md 2022-12-18 19:40:31 -05:00
lartsch feb4a190d8 fix wrong inject file used in manifest 2022-12-18 19:21:45 -05:00
lartsch d4553d9a2b update for new css filename 2022-12-18 19:19:15 -05:00
lartsch 5fdf6b8e10 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-18 19:17:33 -05:00
lartsch dd8d12ee93 update for new css filename 2022-12-18 19:17:31 -05:00
Lartsch 7897b103b0
Update README.md 2022-12-19 01:12:57 +01:00
lartsch 92edc61702 only enable more button on profile views if resolved 2022-12-18 18:55:29 -05:00
lartsch e8895def61 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-18 18:52:04 -05:00
lartsch 075c02fec0 add ellipsis variants for toot more button 2022-12-18 18:52:01 -05:00
Lartsch 2d1f136e32
Update README.md 2022-12-18 18:49:21 -05:00
Lartsch 1895733271
Update README.md 2022-12-18 18:48:34 -05:00
Lartsch 7888ab570a
Update README.md 2022-12-18 18:44:16 -05:00
Lartsch bfb30e4692
Update README.md 2022-12-18 18:37:09 -05:00
lartsch 4d2b765e89 move all styles to css file for firefox, rename css file 2022-12-18 18:33:04 -05:00
lartsch d9beb0a657 add "resolving" indicator, increase timeouts for bad network performance situations 2022-12-18 17:54:48 -05:00
lartsch 318b08a189 tweak timeouts, show unresolved on timeout 2022-12-18 17:40:33 -05:00
lartsch 0820562ffe add timeout to toot home resolve, decrease timeout 2022-12-18 17:28:39 -05:00
lartsch 4b53bd2328 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-18 17:19:31 -05:00
lartsch c6b1f19b98 decrease timeout 2022-12-18 17:19:28 -05:00
Lartsch 5b02bebf91
Update README.md 2022-12-18 17:17:17 -05:00
Lartsch 4c130e1c8d
Update README.md 2022-12-18 17:16:51 -05:00
Lartsch c49b105dfa
Update README.md 2022-12-18 17:16:14 -05:00
Lartsch 67336af3ef
Update README.md 2022-12-18 17:13:59 -05:00
Lartsch 35c0947fd1
Update README.md 2022-12-18 17:09:20 -05:00
Lartsch 0af4ea7c7f
Update README.md 2022-12-18 17:05:30 -05:00
lartsch ef86ed4fc5 remove two settings, add mute/block to profile view 2022-12-18 17:03:26 -05:00
lartsch 17d877da37 fix reply feature not working after introducing session detection, add block/mute/domainblock feature to toots 2022-12-18 13:02:35 -05:00
Lartsch 06524ab364
Merge pull request #14 from jsoref/edits
Miscellaneous grammatical tweaks
2022-12-18 17:21:15 +01:00
Josh Soref ffe1f53dc4
Miscellaneous grammatical tweaks 2022-12-18 02:38:04 -05:00
lartsch e746f92989 a lil' padding cant hurt 2022-12-15 11:59:52 -05:00
lartsch 886e8ccb19 add comment, bump version 2022-12-15 07:32:21 -05:00
lartsch b418357700 always fetch mutes/blocks in bg, add logic for modal (do/undo), update mutes/blocks after interaction 2022-12-15 07:29:04 -05:00
lartsch 89c45189a6 disable log 2022-12-15 06:52:28 -05:00
lartsch db1f1bdafb disable log 2022-12-15 06:52:20 -05:00
lartsch 8cf600ea10 add first version of custom "more" button modal 2022-12-15 06:51:15 -05:00
lartsch 63164a8744 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-15 04:39:46 -05:00
lartsch fa1179db58 add exclude_unreviewed=false 2022-12-15 04:39:43 -05:00
Lartsch f03474f2e1
Update README.md 2022-12-15 04:33:10 -05:00
Lartsch 753d28f437
Update readme 2022-12-15 01:59:25 +01:00
lartsch dbf1813adf start background processor earlier to react in some conditions 2022-12-14 19:30:40 -05:00
lartsch 37e680ba0e Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-14 19:23:33 -05:00
lartsch 1fab1087ca added new options, renamed options 2022-12-14 19:23:31 -05:00
Lartsch 880e37c3bc
Update README.md 2022-12-14 19:16:35 -05:00
Lartsch 472b74a9f9
Update README.md 2022-12-14 19:05:24 -05:00
Lartsch e56b55104e
Update README.md 2022-12-14 18:38:39 -05:00
Lartsch 9a086c5103
Update README.md 2022-12-14 18:38:08 -05:00
lartsch 4c7b58ccd9 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-14 17:55:28 -05:00
lartsch 323ee20f3e Add prompt with actual URL if "Show alert" is enabled 2022-12-14 17:55:27 -05:00
Lartsch a933f477de
Update README.md 2022-12-14 14:58:46 -05:00
Lartsch bdbf7d9844
Update README.md 2022-12-14 14:23:10 -05:00
lartsch c7934d7764 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-14 14:06:46 -05:00
lartsch ed042a2cbc fix the wrong buttons being highlighted in detailed status view 2022-12-14 14:06:44 -05:00
Lartsch 193fd81fe6
Update README.md 2022-12-14 17:38:01 +01:00
Lartsch 23ae56febd
Update README.md 2022-12-14 17:37:31 +01:00
Lartsch 38aea8bd54
Update README.md 2022-12-14 17:36:42 +01:00
Lartsch 21e1c9e6f5
Update README.md 2022-12-14 17:35:24 +01:00
Lartsch fc33786629
Update README.md 2022-12-14 16:35:02 +01:00
Lartsch 2321f231bf
Update README.md 2022-12-14 16:34:16 +01:00
Lartsch c8bf3de1f7
Update README.md 2022-12-14 16:33:48 +01:00
Lartsch 6f5966c12f
Update README.md 2022-12-14 16:33:06 +01:00
Lartsch 9307658da3
Update README.md 2022-12-14 15:38:18 +01:00
Lartsch d2d4432c93
Update README.md 2022-12-14 15:35:17 +01:00
Lartsch 40ff29ba61
Update README.md 2022-12-14 14:38:59 +01:00
Lartsch 73e3ce7f32
Update README.md 2022-12-14 14:38:10 +01:00
Lartsch 581512637e
Update README.md 2022-12-14 08:34:19 -05:00
Lartsch a70e78b1cb
Update README.md 2022-12-14 08:31:36 -05:00
Lartsch f91299fcc7
Update README.md 2022-12-14 08:26:48 -05:00
Lartsch 989bd1edd9
Update README.md 2022-12-14 08:25:00 -05:00
Lartsch 9239c4d94e
Update README.md 2022-12-14 08:20:15 -05:00
lartsch 2d199bf9c5 use minified again 2022-12-14 08:13:52 -05:00
lartsch 5de973252a add first support for polls 2022-12-14 08:13:27 -05:00
lartsch bf53f3a052 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-14 05:44:03 -05:00
lartsch db33da9d56 add loggedin check, fix bug with v3, improve v3 support, disable log 2022-12-14 05:44:01 -05:00
Lartsch b41091cc64
Update README.md 2022-12-14 10:50:35 +01:00
Lartsch 85e492a720
Update README.md 2022-12-13 20:27:53 -05:00
Lartsch c5b7025b9c
Update README.md 2022-12-13 20:18:10 -05:00
lartsch 21113d5003 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-13 20:14:29 -05:00
lartsch 4cb6859b24 fixed a bug with toot caching, bump version 2022-12-13 20:14:26 -05:00
Lartsch 8e2c3e8117
Update readme 2022-12-14 00:27:08 +01:00
Lartsch 24cddb94d0
Update readme 2022-12-14 00:17:47 +01:00
Lartsch 35f694d7b0
Update README.md 2022-12-13 21:30:35 +01:00
lartsch d2fb6a7e47 remove tests from main 2022-12-13 15:28:44 -05:00
Lartsch 4f5935fc12
Update README.md 2022-12-13 21:03:02 +01:00
lartsch 158e296235 adding more software checks 2022-12-13 14:19:48 -05:00
lartsch 8669587ae6 add first version of function to determine fedi software 2022-12-13 13:14:21 -05:00
lartsch d47f7e8dd6 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-13 08:30:27 -05:00
lartsch 4c8eb02408 first steps for pleroma support 2022-12-13 08:30:24 -05:00
Lartsch b53f3b541d
Update README.md 2022-12-13 13:15:19 +01:00
Lartsch bd90cb739a
Update README.md 2022-12-13 13:15:06 +01:00
Lartsch 9df0580ecb
Update readme 2022-12-13 12:22:30 +01:00
Lartsch 29b2a3eb44
Update readme 2022-12-13 12:17:55 +01:00
Lartsch 2eb92a2144
Update readme 2022-12-13 01:21:57 +01:00
Lartsch 71096aaa58
Update README.md 2022-12-12 06:47:01 -05:00
Lartsch a4a1f53e27
Update README.md 2022-12-12 06:46:32 -05:00
Lartsch 3ed84f62f6
Update README.md 2022-12-12 06:44:51 -05:00
Lartsch 4d58ede540
Update README.md 2022-12-12 06:44:15 -05:00
Lartsch 6cda68136a
Update README.md 2022-12-12 06:43:25 -05:00
Lartsch a1b104dc4c
Update README.md 2022-12-12 06:42:49 -05:00
Lartsch e6ad94f56d
Update README.md 2022-12-12 06:42:16 -05:00
Lartsch 2ead60e1ac
Update README.md 2022-12-12 06:33:13 -05:00
Lartsch c2ef9bcc0b
Update README.md 2022-12-12 06:27:52 -05:00
Lartsch 16480459de
Update README.md 2022-12-12 06:23:11 -05:00
Lartsch 44e432a495
Update README.md 2022-12-12 06:19:00 -05:00
Lartsch c63fcd09be
Update README.md 2022-12-12 06:00:24 -05:00
lartsch 300878524e bump version 2022-12-12 05:55:58 -05:00
lartsch f0625f5539 remove unused function 2022-12-12 04:43:36 -05:00
lartsch f2bb2d66a4 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-12 04:40:43 -05:00
lartsch 153709a1e0 remove ; 2022-12-12 04:40:41 -05:00
Lartsch 146277f48c
Update README.md 2022-12-12 04:37:11 -05:00
Lartsch 2cd3980b26
Update README.md 2022-12-12 04:35:41 -05:00
lartsch ff679cfcb1 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-12 04:25:43 -05:00
lartsch aed03fe157 use animation for fav button 2022-12-12 04:25:42 -05:00
Lartsch 12f6ad5957
Update README.md 2022-12-12 04:14:31 -05:00
Lartsch eb38cf87de
Update readme 2022-12-12 00:52:31 +01:00
lartsch 0de9849e13 only remove if present 2022-12-11 15:05:30 -05:00
lartsch 28861bfe9a Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-11 14:58:05 -05:00
lartsch df7def4bf8 remove unused const 2022-12-11 14:58:03 -05:00
Lartsch 37c11ad81f
Update README.md 2022-12-11 11:56:14 -05:00
lartsch 17e395b345 remove log line 2022-12-11 11:42:34 -05:00
lartsch 0ae4a47c65 update icon to webstore one 2022-12-11 11:37:14 -05:00
lartsch 4587d3273e update name in manifests 2022-12-11 11:34:37 -05:00
lartsch 478a2b1101 attempt to fix element not being detected on v3 (caching issue, el. already on page on load so domnodeappear does not work) 2022-12-11 09:55:09 -05:00
lartsch 8a5f988318 prevent uncatched error if tabs query is empty 2022-12-11 08:08:45 -05:00
lartsch 55cf4b698e make sure fetchData runs first before sending reload to content script, bump version 2022-12-11 07:48:08 -05:00
lartsch 52a912617c Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-11 06:44:02 -05:00
lartsch 8e417dd312 fixed explore page follow buttons for v3, fixed follow button not correctly initialized if follow is requested (but not yet accepted) 2022-12-11 06:44:01 -05:00
Lartsch d82e91ab24
Update README.md 2022-12-11 06:30:15 -05:00
Lartsch c5efcb503f
Update README.md 2022-12-11 06:29:59 -05:00
lartsch b5d44100d8 bump version 2022-12-11 06:22:30 -05:00
lartsch 60ed0d9193 remove log line 2022-12-11 06:20:34 -05:00
lartsch a79eb9470f extend support for mutes/blocks/domainblocks, move to background script 2022-12-11 06:19:46 -05:00
lartsch 4e769c310f Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-10 10:37:08 -05:00
lartsch 2ba1591318 enhance support for blocked users and domain blocks 2022-12-10 10:37:06 -05:00
Lartsch 33bb5a7e3d
Update README.md 2022-12-10 10:06:55 -05:00
lartsch a9bd0e2fbb add muted feature 2022-12-10 10:01:38 -05:00
lartsch ba59570af1 move failed to one statement 2022-12-10 08:17:12 -05:00
lartsch 7125cd13af spacing 2022-12-10 08:11:05 -05:00
lartsch a9294381cc Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-10 08:09:10 -05:00
lartsch ef7be033c7 move actions to one function, add more comments, bump version 2022-12-10 08:09:08 -05:00
Lartsch 2fad401b95
Update readme 2022-12-10 01:25:11 +01:00
lartsch e33a220408 more comments 2022-12-09 12:14:48 -05:00
lartsch e03d1c944a add comments 2022-12-09 12:07:13 -05:00
lartsch 8becef3986 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-09 10:34:59 -05:00
lartsch a9f30e9441 always add fallback url 2022-12-09 10:34:38 -05:00
Lartsch 7d6288af0f
Update README.md 2022-12-09 09:51:10 -05:00
Lartsch 3745497f8f
Update README.md 2022-12-09 09:45:38 -05:00
Lartsch 9ea5cf0286
Update README.md 2022-12-09 09:44:35 -05:00
Lartsch 087113252d
Update README.md 2022-12-09 09:43:03 -05:00
Lartsch 173097a840
Update README.md 2022-12-09 09:41:34 -05:00
Lartsch f0793c7615
Update README.md 2022-12-09 09:37:14 -05:00
lartsch 895f5a1f6f remove semicolons everywhere, remove log messages 2022-12-09 09:32:23 -05:00
lartsch e5779e4757 redo homeResolveString building, fix some resolving issues, improve resolving probability, bump version 2022-12-09 09:27:57 -05:00
lartsch c05c40d083 fix follow button failed to work at second or more clicks aftter latest changes, fix unresolved indicator not being displayed in some cases 2022-12-08 10:13:35 -05:00
lartsch 96b1660d51 fixes 2022-12-08 10:07:37 -05:00
lartsch cc673c36e3 remove notice since pages are now reloaded automatically 2022-12-08 09:27:26 -05:00
lartsch 7a0839ec49 remove log 2022-12-08 09:25:38 -05:00
lartsch 20fd98abb5 remove log 2022-12-08 09:25:21 -05:00
lartsch 8490a54789 add max element cache + little changes here&there 2022-12-08 09:23:58 -05:00
lartsch 7d01ebc1fc add some try/catches so no irrelevant exceptions bubble up in ext. view, move script el to head (popup), move some code inject.js to separate function, bump version 2022-12-08 05:08:14 -05:00
Lartsch 78221bb29d
Update readme 2022-12-08 01:42:29 +01:00
Lartsch 5d2f143d56
Remove unrequited settings check 2022-12-08 01:25:46 +01:00
Lartsch 8fad97e34a
Remove now unrequired mutationobserver function 2022-12-08 01:14:33 +01:00
Lartsch 060d4a140b
Increase alarm interval since token is now fetched after updating the settings 2022-12-08 01:07:33 +01:00
Lartsch 6fe7611283
Update readme 2022-12-08 00:52:06 +01:00
Lartsch 7d71e32b32
Update readme 2022-12-08 00:50:52 +01:00
lartsch 259be19793 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-07 16:18:26 -05:00
lartsch 1810d1b284 bump version 2022-12-07 16:18:24 -05:00
lartsch 8e970d48fd hotfix for follow button not adjusted to latest update 2022-12-07 16:17:49 -05:00
Lartsch 8db622cd48
Update README.md 2022-12-07 15:00:35 -05:00
Lartsch fb39185e11
Update README.md 2022-12-07 15:00:00 -05:00
Lartsch 459ada7158
Update README.md 2022-12-07 14:53:50 -05:00
Lartsch 53c2c9d668
Update README.md 2022-12-07 14:28:34 -05:00
Lartsch 38ba5a1cee
Update README.md 2022-12-07 14:28:18 -05:00
lartsch 7728a9fe36 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-07 14:16:27 -05:00
lartsch dab260f989 changed release file names 2022-12-07 14:16:25 -05:00
Lartsch d7bd152b3e
Update README.md 2022-12-07 14:09:58 -05:00
Lartsch 39e072b1b0
Update README.md 2022-12-07 14:05:40 -05:00
Lartsch b39d278ac5
Update README.md 2022-12-07 14:04:48 -05:00
Lartsch 04a2d781bd
Update README.md 2022-12-07 14:00:55 -05:00
lartsch 3af30ecaf5 redo logic for element discovery, fix some lately introduced bugs, improve performance, bump version 2022-12-07 13:49:07 -05:00
lartsch 2241983dae only select first button, add indicator for unresolved toots 2022-12-06 06:14:46 -05:00
lartsch 9e954bd92e Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-06 06:04:28 -05:00
lartsch aec4218b89 rename to fediact, fix a rare resolving case, bump version 2022-12-06 06:04:25 -05:00
Lartsch e57292f075
Update README.md 2022-12-06 04:54:05 -05:00
Lartsch 3bff8ba4b5
Update README.md 2022-12-06 04:52:15 -05:00
Lartsch dfcab51e7e
Update README.md 2022-12-05 08:53:46 -05:00
lartsch 5175c49f5d remove debug logging 2022-12-05 07:06:30 -05:00
lartsch c7377720aa Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-05 07:06:18 -05:00
lartsch 264ff49689 remove debug logging 2022-12-05 07:06:16 -05:00
Lartsch 66e3dc771b
Update README.md 2022-12-05 07:05:05 -05:00
Lartsch c7594a9d3d
Update README.md 2022-12-05 07:04:19 -05:00
Lartsch 80f1796d6e
Update README.md 2022-12-05 07:03:59 -05:00
Lartsch 383c04298d
Update README.md 2022-12-05 07:02:53 -05:00
lartsch 3332106a6f bump version 2022-12-05 07:00:37 -05:00
lartsch a7f5a1dc69 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-05 07:00:22 -05:00
lartsch 7aea2f6608 fixed a bug where the author handle was not extracted correctly 2022-12-05 07:00:19 -05:00
Lartsch cd421e5964
Update README.md 2022-12-05 06:10:17 -05:00
lartsch dbf8919a3e Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-05 06:08:35 -05:00
lartsch 9d736958b1 simplified some functions, improved performance 2022-12-05 06:07:07 -05:00
Lartsch 2a61ebe54d
Add note 2022-12-05 05:31:46 +01:00
Lartsch 7e5b20c5fa
Add usage note 2022-12-05 05:28:42 +01:00
Lartsch 297208c4ce
Update readme 2022-12-04 22:40:55 +01:00
lartsch 94d6ed8fba bump version 2022-12-04 14:32:56 -05:00
lartsch 55bce0c0ab fix dblclick triggering if another button is clicked 2022-12-04 14:00:13 -05:00
lartsch 8867b3934e added reply support for v3 instances, bump version 2022-12-04 12:38:19 -05:00
lartsch 2060fa642d Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-04 12:22:39 -05:00
lartsch af65def548 fix reply mode, fix resolveAndAction not being reset for every resolve 2022-12-04 12:22:38 -05:00
Lartsch 50348216dc
Update README.md 2022-12-04 12:06:17 -05:00
Lartsch 5db8bbec91
Update README.md 2022-12-04 12:00:46 -05:00
Lartsch 2ebe99c43f
Update README.md 2022-12-04 11:58:22 -05:00
lartsch 6dcd4de393 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-04 11:56:44 -05:00
lartsch 8084a57480 add support for replying 2022-12-04 11:56:42 -05:00
Lartsch 4b59ebf4ef
Update README.md 2022-12-04 11:31:58 -05:00
lartsch 5b4711bb1f Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-04 11:30:49 -05:00
lartsch 7abb7c0b43 add support for bookmarking, bump version 2022-12-04 11:30:47 -05:00
Lartsch db0db2951e
Update README.md 2022-12-04 10:46:07 -05:00
Lartsch 98f48c7949
Update README.md 2022-12-04 10:02:04 -05:00
Lartsch 4ba54f149a
Update 2022-12-04 09:58:34 -05:00
Lartsch 0c9eb199cb
Update README.md 2022-12-04 09:56:57 -05:00
Lartsch 7e61128e52
Update readme 2022-12-04 13:50:04 +01:00
Lartsch 0a78a9c095
Update todos 2022-12-03 18:09:54 +01:00
Lartsch a5bea05d8a
Update readme 2022-12-03 17:56:41 +01:00
Lartsch 48030ead29
Update README.md 2022-12-03 17:55:33 +01:00
Lartsch c4ad3a87c5
Fix API delay not being applied correctly 2022-12-03 17:41:04 +01:00
lartsch ae1f9436c5 add note for firefox update on android 2022-12-03 08:40:10 -05:00
lartsch 98be4e7380 add notice ins popup.html 2022-12-03 08:35:59 -05:00
lartsch d52b936efd update readme 2022-12-03 08:02:27 -05:00
lartsch c0b60456f7 silence zip output 2022-12-03 08:01:23 -05:00
lartsch 466182f2b7 bump version 2022-12-03 07:58:53 -05:00
lartsch 3c3378b444 add minify to pack.sh, minified files 2022-12-03 07:52:49 -05:00
lartsch 332c51034d add listener for settings update in background script 2022-12-03 06:04:45 -05:00
lartsch 877c074434 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-03 05:43:07 -05:00
lartsch d0e9f687c0 fix uncatched error when token cannot be found 2022-12-03 05:43:05 -05:00
Lartsch f40635b6e4
Add comments 2022-12-03 02:09:23 +01:00
Lartsch 20ac4961ce
Remove unused geturlparameter function 2022-12-03 01:59:32 +01:00
Lartsch e8b8c9ea80
Update README.md 2022-12-02 19:13:35 -05:00
Lartsch cf05af5501
Update README.md 2022-12-02 19:11:47 -05:00
Lartsch b2fa67a3b6
Update README.md 2022-12-02 19:09:46 -05:00
lartsch 70b150e3f1 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-02 18:59:41 -05:00
lartsch 92e6a51ac4 remove unused waitForEl 2022-12-02 18:59:39 -05:00
Lartsch 254909113d
Update README.md 2022-12-02 18:43:44 -05:00
Lartsch 641d7c2041
Update README.md 2022-12-02 17:52:07 -05:00
Lartsch 4056802a34
Update README.md 2022-12-02 17:51:18 -05:00
Lartsch 453e354c0e
Update README.md 2022-12-02 17:50:01 -05:00
Lartsch 194c9720f5
Update README.md 2022-12-02 17:49:01 -05:00
Lartsch f8594e0eaf
Update README.md 2022-12-02 17:45:12 -05:00
Lartsch 7854b03a9c
Update README.md 2022-12-02 17:43:48 -05:00
lartsch 64160d6a96 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-02 17:38:32 -05:00
lartsch 56b59d5dcb change media 2022-12-02 17:38:31 -05:00
Lartsch e2ac2e30f5
Update README.md 2022-12-02 17:35:50 -05:00
lartsch 2da41a9331 decrease dblclick delay 2022-12-02 17:18:11 -05:00
lartsch eafd8c7952 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-12-02 16:45:36 -05:00
lartsch 1cc0e9a6fc biggest update so far... execute actions on-site, load toot statuses on-site, single click for action, double for redirect (+action) 2022-12-02 16:45:34 -05:00
Lartsch 7ef7cffb84
Update readme 2022-11-26 04:56:25 +01:00
Lartsch 71fc1e055f
Update readme 2022-11-26 04:54:05 +01:00
Lartsch 50139edbd1
Update readme 2022-11-26 03:30:44 +01:00
Lartsch 1ff7e41978
Update readme 2022-11-26 03:30:00 +01:00
Lartsch 252e7c5a93
Update README.md 2022-11-26 03:10:09 +01:00
Lartsch a503f3d821
Update README.md 2022-11-26 03:09:53 +01:00
Lartsch 0b8ad7fe9a
Update README.md 2022-11-26 03:07:16 +01:00
lartsch 6846dc8589 fix manifest for edge? 2022-11-25 21:02:36 -05:00
lartsch 87f49cd509 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-11-25 20:56:40 -05:00
lartsch cff2b6ea62 forgot to bump version again... ugh 2022-11-25 20:56:38 -05:00
Lartsch c1a9b4eb2c
Update README.md 2022-11-26 02:54:19 +01:00
Lartsch 7bccca3ca7
Update README.md 2022-11-26 02:51:25 +01:00
Lartsch f8c624c119
Update README.md 2022-11-26 02:50:14 +01:00
lartsch f926486fc9 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-11-25 20:40:45 -05:00
lartsch 968b462bab another big update (utilize background script, remove redirect page, introduce ext. follow indicator) 2022-11-25 20:40:41 -05:00
Lartsch 93644c81d5
Update README.md 2022-11-25 10:54:50 +01:00
Lartsch 0c471a514c
Update README.md 2022-11-25 10:53:30 +01:00
Lartsch 06021449c0
Update README.md 2022-11-25 10:51:57 +01:00
Lartsch cc7c6b953f
Update README.md 2022-11-25 10:49:50 +01:00
Lartsch 7dfa755fb9
Update README.md 2022-11-24 06:12:14 -05:00
Lartsch b01a68103d
Update README.md 2022-11-23 23:18:03 +01:00
Lartsch 737ab47c31
Update README.md 2022-11-23 23:16:08 +01:00
Lartsch cf80457cb5
Update README.md 2022-11-23 23:14:05 +01:00
Lartsch a1d5d89cdd
Update README.md 2022-11-23 23:13:18 +01:00
Lartsch ef4fceae18
Update README.md 2022-11-23 17:56:16 +01:00
Lartsch 6d1568a032
Update README.md 2022-11-23 17:55:38 +01:00
Lartsch b2cf301bb9
Add files via upload 2022-11-23 11:53:37 -05:00
Lartsch 683c0aa7b1
Update README.md 2022-11-23 17:50:08 +01:00
Lartsch d59d69798f
Update README.md 2022-11-23 17:41:16 +01:00
lartsch 3bd824a931 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-11-23 11:39:42 -05:00
lartsch 6e3f83a56d Change default to open in same tab (to prevent popup restrictions) 2022-11-23 11:39:39 -05:00
Lartsch 35a3ac5312
Update README.md 2022-11-23 17:33:31 +01:00
Lartsch 387c3f0874
Update README.md 2022-11-23 17:26:45 +01:00
Lartsch 289ff279e4
Update README.md 2022-11-23 17:23:48 +01:00
Lartsch 756e29b90e
Update README.md 2022-11-23 17:17:40 +01:00
Lartsch b0e58392a8
Update README.md 2022-11-23 17:16:39 +01:00
Lartsch 1c2f5acc50
Update README.md 2022-11-23 17:16:16 +01:00
Lartsch 985363aeef
Update README.md 2022-11-23 17:15:08 +01:00
Lartsch 4f58675182
Update README.md 2022-11-23 17:13:08 +01:00
Lartsch e6562885b5
Update README.md 2022-11-23 11:05:50 -05:00
Lartsch af04913a4d
Update README.md 2022-11-23 11:04:19 -05:00
Lartsch ac44f60c14
Update README.md 2022-11-23 10:50:59 -05:00
lartsch 58e8ba2cb1 add options_ui tio support firefox android 2022-11-23 10:32:38 -05:00
lartsch 82fc473f40 Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-11-23 09:43:41 -05:00
lartsch 2e082ab196 bump version 2022-11-23 09:43:39 -05:00
Lartsch 68936ec831
Update README.md 2022-11-23 09:42:30 -05:00
lartsch 757d6a852e Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-11-23 09:30:07 -05:00
lartsch 6b7e447aac Add support for account-cards on Mastodon v3 2022-11-23 09:30:05 -05:00
Lartsch e409d2aa51
Update README.md 2022-11-23 14:34:41 +01:00
Lartsch 6fb6829fe2
Update README.md 2022-11-23 14:30:11 +01:00
Lartsch b16e0d4aed
Update README.md 2022-11-23 14:29:17 +01:00
Lartsch 0cb501a508
Update README.md 2022-11-23 12:36:57 +01:00
Lartsch 01c0552eaf
Update README.md 2022-11-23 12:36:20 +01:00
Lartsch 8029a0e34a
Update README.md 2022-11-23 11:24:31 +01:00
Lartsch 224722acd1
Update README.md 2022-11-23 09:52:42 +01:00
Lartsch dfd690635a
Update README.md 2022-11-23 09:50:26 +01:00
Lartsch 0c11a3382c
Update readme 2022-11-23 00:09:48 +01:00
Lartsch baee8ff432
Update README.md 2022-11-22 23:04:35 +01:00
Lartsch e93a8b05f3
Update README.md 2022-11-22 16:49:54 -05:00
lartsch da5d6c680b add some comments 2022-11-22 16:22:42 -05:00
lartsch 1e5ab0b9aa optimizations 2022-11-22 16:14:43 -05:00
lartsch 8e26effabb Merge branch 'main' of https://github.com/Lartsch/FediFollow-Chrome 2022-11-22 15:42:14 -05:00
lartsch 681be61e0a add pack script 2022-11-22 15:42:12 -05:00
Lartsch 224afddbfb
Update README.md 2022-11-22 14:33:35 -05:00
22 zmienionych plików z 2726 dodań i 646 usunięć

4
.gitignore vendored
Wyświetl plik

@ -1,2 +1,2 @@
firefox/firefox.zip
chrome.zip
*.zip
NOTES.md

214
README.md
Wyświetl plik

@ -1,98 +1,156 @@
# FediFollow (Beta)
A Chrome/Firefox extension that simplifies following and post interactions on other Mastodon instances than your own by intelligently redirecting you to your instance and utilizing the local API to resolve the content.
> **Note**
> LOOKING FOR AN ACTIVE MAINTAINER TO TAKE CARE OF THIS PROJECT!
> FediAct requires some major updates/rewriting to resolve issues, increase performance/reliability and to be easier to maintain, for which I do not have time currently. Please leave a message/issue.
Should work for all updated Chromium browsers, updated Firefox, as well as Kiwi browser on Android. Currently only Mastodon 3 + 4 in different flavors are supported as far as I tested. Support for other Fediverse software / versions / flavors might be added in the future. Feel free to create pull requests / issues. This is my first proper browser extension so please bear with my awful JS skills.
# FediAct (v0.9.8)
A Chrome/Firefox extension that simplifies follow and post interactions on Mastodon servers other than your own.
**Important**: Your data will never leave your machine by using this addon.
**Features**:
- Supports Mastodon v3 + v4 (some features v4 only)
- Follow, boost, bookmark, reply, fav, vote polls and mute/block on external servers while only being logged in to your home server
- Show following state and toot state (boosted, faved, bookmarked, voted) on external servers
- Single click to execute action only, double click to redirect to content on home server
- Reply button on external servers always redirects to home server and enters reply-mode
- Hide muted content on external servers if enabled
- Needs nothing more than your home server domain to work
* [Installation](#installation)
* [Setup](#setup)
* [Screenshots / GIFs](#screenshots--gifs)
* [How it works](#how-it-works)
* [Todos / Planned features](#todos--planned-features)
## Navigation
- [Installation](#installation)
- [Setup](#setup)
- [FAQ](#faq)
- [Screenshots / GIFs](#screenshots--gifs)
- [Manual installation](#manual-installation)
- [Install in Firefox for Android](#install-in-firefox-for-android)
- [Additional notes](#additional-notes)
- [Todos / Planned features](#todos--planned-features)
- [Contributing](#contributing)
## Installation
Right now, this needs to be installed in debugging / developer mode. Soon it will be available on Chrome Webstore / Firefox addon store.
1. Download the [latest release](https://github.com/Lartsch/FediFollow-Chrome/releases/latest) for your browser (chrome or firefox)
[link-chrome]: https://chrome.google.com/webstore/detail/fediact/lmpcajpkjcclkjbliapfjfolocffednm 'Version published on Chrome Web Store'
[link-firefox]: https://addons.mozilla.org/en-US/firefox/addon/fediact/ 'Version published on Mozilla Add-ons'
[<img src="https://raw.githubusercontent.com/alrra/browser-logos/90fdf03c/src/chrome/chrome.svg" width="48" alt="Chrome" valign="middle">][link-chrome] [<img valign="middle" src="https://img.shields.io/chrome-web-store/v/lmpcajpkjcclkjbliapfjfolocffednm.svg?label=%20">&nbsp;&nbsp;Chrome Webstore][link-chrome]
All up-to-date Chromium browsers, including Kiwi and Yandex browsers on Android
[<img src="https://raw.githubusercontent.com/alrra/browser-logos/90fdf03c/src/firefox/firefox.svg" width="48" alt="Firefox" valign="middle">][link-firefox] [<img valign="middle" src="https://img.shields.io/amo/v/fediact.svg?label=%20%20">&nbsp;&nbsp;Mozilla Addon Store][link-firefox]
Up-to-date Firefox (v107+), including Firefox Nightly on Android
**Please note:**
- If webstore release is outdated, use the [manual installation method](#manual-installation) to install the latest version
- Special installation steps for [Firefox on Android](#install-in-firefox-for-android)
- Chrome store updates take 1-2 days longer
- If you like this addon, please consider donating: [paypal.me/lartsch](https://paypal.me/lartsch)
## Setup
1. Make sure you are logged in to your home server
2. Click the extension icon or open its settings page
3. Set your home server domain (required)
4. Check out the other settings (optional)
5. Click the "Save" button to save
If you have set your home server correctly, you can now interact on other Mastodon servers.
**Please note:**
- If FediAct is running, a small icon will be displayed in the bottom right corner
- Also, it is indicated while content is resolving or when it could not be resolved
- Performance depends on your home server and the external server you are browsing (read more [below](#additional-notes))
- Some toots can't be resolved to your home (e.g. when searching the post manually wouldn't work either)
- It's NOT recommended to disable the API delay (servers use rate limiting and might block your IP)
## FAQ
**Why does it need permission for all websites?**
> The addon needs to determine whether or not the site you are currently browsing is a Mastodon server. For that to work, it requires access to all sites. Otherwise, each existing Mastodon server would have to be explicitly added.
**Can I use this on Android?**
> Yes! There are three options that I am aware of: Kiwi Browser, Yandex Browser and Firefox Nightly (see [below](#install-in-firefox-for-android))
**Can I use this on iOS?**
> Currently not in a reliable way, but:
> - It's possible that Orion Browser can soon be used (see issue [#16](https://github.com/Lartsch/FediAct/issues/16))
> - There are plans for Safari support (see issue [#17](https://github.com/Lartsch/FediAct/issues/17))
**Can you add feature XY?**
> Feel free to create an issue here on GitHub and I will look into it.
**Is this safe to use?**
> This project is open source. Anyone with some programming knowledge can check out the source code, either here on GitHub or by extracting the addon file from the addon stores. You can also make improvements.
> Considering the implementation, I am not aware of any risks. Efforts were made to prevent servers from abusing this addon to perform actions on the user's behalf. It does not require your username or password. All data is stored in your browser locally, with the API token being the only sensitive data. This token is **only** sent to your home server. No other data ever leaves your device. All requests are made from the background script, out-of-scope for websites you visit.
## Screenshots / GIFs
v0.9.8
<details>
<summary>Extension popup / settings</summary>
<img src="https://github.com/lartsch/FediAct/blob/main/img/settings.png?raw=true">
</details>
<details>
<summary>Showcase</summary>
<img src="https://github.com/lartsch/FediAct/blob/main/img/showcase.gif?raw=true">
</details>
## Manual installation
1. Download the [latest GitHub release](https://github.com/Lartsch/FediAct/releases/latest) for your browser (Chrome or Firefox)
### Chrome
2. Unzip the downloaded file somewhere
3. Go to your Chrome extension page (URL: chrome://extensions) and enable developer mode
4. Click the "Load unpacked" button and then select the unzipped folder (should be "fedifollow-X.X.X-chrome")
4. Click the "Load unpacked" button and then select the unzipped folder
Note: Some Chromium browsers allow you to directly load a .zip file - you can use it if available
### Firefox
2. Open the debugging page (URL: about:debugging)
3. Select "This Firefox"
4. Click the "Load Temporary Add-on" button and then select the downloaded Firefox ZIP file
## Setup
**You might need to allow popups if your browser asks for it.**
### Install in Firefox for Android
For a while now, Firefox on Android has only allowed installing from a [curated list](https://addons.mozilla.org/en-US/android/search/?promoted=recommended&sort=random&type=extension) of addons, preventing installation of anything else. The following instructions will guide you through installing it from the webstore anyway.
- Required: Click the extension icon to set your Mastodon instance
- Only set the domain name (like "infosec.exchange") without http/https or URL)
- Optional: Change whether to redirect in current or new tab
- Optional: Change the mode (all sites except those on blacklist (default) / no sites but those on whitelist)
- Optional: Add domain names to the blacklist/whitelist textarea, one per line, for ex.
```
mastodon.social
bbq.snoot.com
```
- Required: Hit "Submit" to update your settings
**Requirements:**
- Firefox [**Nightly**](https://play.google.com/store/apps/details?id=org.mozilla.fenix) for Android
**Steps:**
1. In Firefox, go to Settings > About Firefox Nightly
2. Click the Firefox logo 5 times to enable Developer options
3. Go back to Settings > Custom Add-on Collection
4. Enter the following data:
- ID: 17665294
- Name: FediAct
5. Click OK, Firefox will close - reopen it
6. FediAct will now be available in the Add-ons menu of Firefox Nightly
> **Note**
> 1. Currently supports different flavours of Mastodon 3 + 4
> 2. The whitelist mode can be useful if you do not want the extension to run basic checks on every site (since it needs to determine if it is a Mastodon site). Not sure if the blacklist feature is good for anything but I still included it.
> 3. It can have several reasons why a redirection/instance might not work:
> - You are not logged in to your home instance
> - There are instances that use custom layouts/flavours (additional identifiers need to be added to extension)
> - Instance chose to hide the follow button when not logged in (not supported yet)
> - It's not a Mastodon instance (not supported yet)
> - Element identifiers might change over time (extension needs to be updated)
>
> So please be aware, that this extension can fail in some cases. Feel free to submit pull requests / issues.
To update the addon instantly, simply remove and re-install it. I don't know if or when auto-update triggers in Firefox.
I included all of the default add-ons in the custom collection, so you will not miss out on any of those. Of course, you can create [your own collection](https://support.mozilla.org/en-US/kb/how-use-collections-addonsmozillaorg) as well.
## Screenshots / GIFs
![Extension Popup](https://github.com/lartsch/FediFollow-Chrome/blob/main/img/screenshot1.PNG?raw=true)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
![Follow Redirect](https://github.com/lartsch/FediFollow-Chrome/blob/main/img/follow-interaction.gif?raw=true)
![Follow Redirect](https://github.com/lartsch/FediFollow-Chrome/blob/main/img/post-interaction.gif?raw=true)
## How it works
Some basic explanations how the addon works...
### General
- Addon performs basic checks on the URL and site content to determine if and what scripts to run
- On external instances, depending on the interaction, a search string is built for the content you wish to interact with
- You are then redirected to your local instance with the search string as value for an URL parameter that the addon checks for
- If the home instance is opened with this parameter...
- Your authorization token is extracted from the DOM
- Then the parameter value is used to perform a search for it with the search API endpoint (with resolving, so auth is needed)
- If a match for a user or post was found, you are then redirected to the content
- Using the search API gives best compatibility for resolving content (for ex. Toot IDs differ on instances for the same toot)
### Follow interactions
- Addon uses a list of DOM identifiers of follow buttons (for different views / flavors)
- All default actions for clicking the button are prevented
- Addon extracts the handle and handle domain from the profile view
- The handle domain is then searched for with the external instance's search API endpoint (without resolving, so no authorization needed)
- This is to ensure we grab the correct instance URL for this user, since it can differ from the domain handle (also, the domain handle does not always resolve)
- If all worked out, we build our search string and redirect to your home instance with the value as URL parameter then continue as explained in "General"
### Post interactions
- Addon uses a list of allowed URLs and DOM identifiers for interaction buttons
- It then grabs the Toot ID using different methods, depending on the Mastodon version / flavor
- The Toot ID is then searched for using the external instance's status API
- This gives us the actual URL of the post on its home instance for using as the search string (even if the post is from another external instance than the external instance it is viewed on)
- If all worked out, we build our search string and redirect to your home instance with the value as URL parameter then continue as explained in "General"
## Additional notes
1. Support for other Fedi software is planned
2. There are several reasons why resolving/interacting might not work including:
- Not being logged in to your home server
- Element identifiers have changed / the server uses an unsupported flavour
- The external server you are browsing or the originating server of a toot is not Mastodon
- Your home server has strong rate limiting and limited your IP
- Your home server / the external server / the original server of a toot have defederated / are moderated
- The toot has not yet federated to your home instace (follow the account and toots should start federating)
- The server you are browsing does not use 302 redirects for external toots
- The network conditions of your home server or the external server are bad (slow speed)
- That a toot is set to unlisted on its original server may play a role
3. There can be delays because API calls have to be made and it is tries to avoid error 429 (too many requests). Especially if a page has many toots or you are scrolling through a feed really fast.
4. If the extension fails to resolve content, the affected buttons will behave as if the extension weren't active (popup modal) and a notice ("Unresolved") is added to the toot
5. If "Collect errors" is enabled (Chrome), there can be uncatched errors being displayed for FediAct. This is not relevant to functionality.
## Todos / Planned features
- Add support for post interactions (DONE)
- Support executing the intended action after redirect
- Add support for other implementations (Plemora, GNU Social, ...)
- Publish to Chrome Webstore (IN PROGRESS)
- Publish to Firefox addon store (IN PROGRESS)
- Find additional layouts/flavours to add identifiers for
- Support for profiles views with follow button disabled
- Add support for Firefox (DONE)
- Fix some rare cases where an instance runs on a subdomain but the handle uses the domain without subdomain (need to get the handle directly from the profile instead of URL + domain name) (DONE)
- Add support for whitelist/blacklist (DONE)
- Add feature to indicate if you are already following a user when browsing his profile on another instance (this requires calls to the home instance, will look into it soon)
- Review if permissions in current manifest are actually needed like that (DONE)
- If I find myself to be bored, probably more
Check out the [GitHub project](https://github.com/users/Lartsch/projects/2) to see planned features and todos. They are sorted from most important to least important.
## Contributing
Feel free to create [issues](https://github.com/Lartsch/FediAct/issues) for bugs and feature suggestions. Even better: Create pull requests for whatever improvements you can make! :)
## Thanks to...
@raikasdev because I stole his fix for cross-browser storage API support
- @raikasdev because I stole his fix for cross-browser storage API support
- @rosemarydotworld because I customized and use his awesome jQuery.DOMNodeAppear where MutationObservers and delegation failed
- All the direct [contributors](https://github.com/Lartsch/FediAct/graphs/contributors) to this repository!

Wyświetl plik

@ -1,27 +1,45 @@
{
"name": "FediFollow",
"version": "0.5.0",
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediFollow-Chrome for more.",
"name": "FediAct",
"version": "0.9.8.7",
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediAct for more.",
"manifest_version": 2,
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["src/lib/jquery-3.6.1.min.js","src/inject.js"],
"run_at": "document_start"
}
{
"matches": [
"*://*/*"
],
"js": [
"src/lib/jquery-3.6.1.min.js",
"src/inject.min.js"
],
"css": [
"src/content_styles.min.css"
],
"run_at": "document_start"
}
],
"background": {
"scripts": [
"src/background.min.js"
],
"persistent": false
},
"permissions": [
"storage",
"storage",
"alarms",
"tabs",
"https://*/*",
"http://*/*"
],
"browser_action":
{
"default_popup": "src/popup.html",
"default_icon": "src/icon/48.png",
"default_title": "FediFollow settings"
"options_ui": {
"page": "src/popup.html"
},
"browser_action": {
"default_popup": "src/popup.html",
"default_icon": "src/icon/48.png",
"default_title": "FediAct settings"
},
"icons": {
"48": "src/icon/48.png"
}
}
}

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 4.8 MiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 5.8 MiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 17 KiB

BIN
img/settings.png 100644

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 15 KiB

BIN
img/showcase.gif 100644

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.4 MiB

Wyświetl plik

@ -1,27 +1,42 @@
{
"name": "FediFollow",
"version": "0.5.0",
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediFollow-Chrome for more.",
"name": "FediAct",
"version": "0.9.8.7",
"description": "Simplifies interactions on other Mastodon instances than your own. Visit https://github.com/lartsch/FediAct for more.",
"manifest_version": 3,
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["src/lib/jquery-3.6.1.min.js","src/inject.js"],
"run_at": "document_start"
}
{
"matches": [
"*://*/*"
],
"js": [
"src/lib/jquery-3.6.1.min.js",
"src/inject.min.js"
],
"css": [
"src/content_styles.min.css"
],
"run_at": "document_start"
}
],
"background": {
"service_worker": "src/background.min.js"
},
"permissions": [
"storage"
"storage",
"alarms",
"tabs"
],
"host_permissions": [
"https://*/*",
"http://*/*"
],
"action":
{
"default_popup": "src/popup.html",
"default_icon": "src/icon/48.png",
"default_title": "FediFollow settings"
"options_ui": {
"page": "src/popup.html"
},
"action": {
"default_popup": "src/popup.html",
"default_icon": "src/icon/48.png",
"default_title": "FediAct settings"
},
"icons": {
"48": "src/icon/48.png"

13
pack.sh 100755
Wyświetl plik

@ -0,0 +1,13 @@
# RUN FROM MAIN DIR
# USE ./pack.sh <VERSION>
# NOTE: requires uglifyjs and uglifycss in PATH
# remove all minified files (excluding lib folder) and zip files
find . -type d -name lib -prune -o -type f -name "*.min.js" -o -type f -name "*.min.css" -o -type f -name "*.zip" | grep -v "/lib" | tr '\n' '\0' | xargs -r0 rm
# minify all js files, excluding lib folder (and mangle toplevel without browser, chrome variable scopes)
find . -type d -name lib -prune -o -type f -name "*.js" -exec bash -c 'uglifyjs $1 --compress -m toplevel,reserved=["chrome","browser"] -o "$(echo $1 | rev | cut -f 2- -d '.' | rev).min.js"' _ {} \;
# minify all css files, excluding lib folder
find . -type d -name lib -prune -o -type f -name "*.css" -exec bash -c 'uglifycss $1 > "$(echo $1 | rev | cut -f 2- -d '.' | rev).min.css"' _ {} \;
# zip release files
zip -r "fediact-$1-chrome.zip" ./ -x "firefox/*" -x "img/*" -x ".git/*" -x "README.md" -x "NOTES.md" -x ".gitignore" -x "pack.sh" -x "LICENSE" -x "src/background.js" -x "src/inject.js" -x "src/popup.js" -x "src/content_styles.css" -x "src/popup_styles.css" 1>/dev/null
cd firefox && zip -r "../fediact-$1-firefox.zip" ./ -x "src/background.js" -x "src/inject.js" -x "src/popup.js" -x "src/content_styles.css" -x "src/popup_styles.css" 1>/dev/null

252
src/background.js 100644
Wyświetl plik

@ -0,0 +1,252 @@
var browser, chrome, settings
const enableConsoleLog = false
const logPrepend = "[FediAct]"
const tokenInterval = 1 // minutes
const mutesApi = "/api/v1/mutes"
const blocksApi = "/api/v1/blocks"
const domainBlocksApi = "/api/v1/domain_blocks"
const timeout = 15000
const tokenRegex = /"access_token":".*?",/gm
// required settings keys with defauls
const settingsDefaults = {
fediact_homeinstance: null,
fediact_token: null
}
// wrapper to prepend to log messages
function log(text) {
if (enableConsoleLog) {
console.log(logPrepend + ' ' + text)
}
}
// get redirect url (it will be the url on the toot authors home instance)
async function resolveExternalTootHome(url) {
return new Promise(async function(resolve) {
try {
const controller = new AbortController()
const timeoutId = setTimeout(() => {
log("Timed out")
controller.abort()
}, timeout)
var res = await fetch(url, {method: 'HEAD', signal: controller.signal})
clearTimeout(timeoutId)
if (res.redirected) {
resolve(res.url)
} else {
resolve(false)
}
} catch(e) {
log(e)
resolve(false)
}
})
}
// get redirect url (it will be the url on the toot authors home instance)
async function generalRequest(data) {
return new Promise(async function(resolve) {
try {
const controller = new AbortController()
const timeoutId = setTimeout(() => {
log("Timed out")
controller.abort()
}, timeout)
if (data[3]) {
// json body provided, post as body to target
data[2]["User-Agent"] = "FediAct Service"
data[2]["Content-Type"] = "application/json"
var res = await fetch(data[1], {
method: data[0],
signal: controller.signal,
// if json body is provided, there is also header data
headers: data[2],
body: JSON.stringify(data[3])
})
} else if (data[2]) {
// header data provided
data[2]["User-Agent"] = "FediAct Service"
var res = await fetch(data[1], {
method: data[0],
signal: controller.signal,
headers: data[2]
})
} else {
var res = await fetch(data[1], {
method: data[0],
signal: controller.signal,
headers: {"User-Agent": "FediAct Service"}
})
}
clearTimeout(timeoutId)
if (res.status >= 200 && res.status < 300 ) {
const contentType = res.headers.get("content-type")
if (contentType && contentType.indexOf("application/json") !== -1) {
var restext = await res.text()
resolve(restext)
} else {
resolve(false)
}
} else {
resolve(false)
}
} catch(e) {
log(e)
resolve(false)
}
})
}
// fetch API token here (will use logged in session automatically)
async function fetchBearerToken() {
return new Promise(async function(resolve) {
var url = "https://" + settings.fediact_homeinstance
try {
var res = await fetch(url)
var text = await res.text()
} catch(e) {
log(e)
resolve(false)
return
}
if (text) {
// dom parser is not available in background workers, so we use regex to parse the html....
// for some reason, regex groups do also not seem to work in chrome background workers... the following is ugly but should work fine
var content = text.match(tokenRegex)
if (content) {
var indexOne = content[0].search(/"access_token":"/)
var indexTwo = content[0].search(/",/)
if (indexOne > -1 && indexTwo > -1) {
indexOne = indexOne + 16
var token = content[0].substring(indexOne, indexTwo)
if (token.length > 16) {
settings.fediact_token = token
resolve(true)
return
}
}
}
}
// reset token for inject.js to know
settings.fediact_token = null
log("Token could not be found.")
resolve(false)
})
}
// grab all accounts/instances that are muted/blocked by the user
// this is only done here in the bg script so we have data available on load of pages without first performing 3 (!) requests
// otherwise this would lead to problems with element detection / low performance (espcially v3 instances)
// mutes/blocks are updated in content script on page context changes and after performing mutes/block actions
function fetchMutesAndBlocks() {
return new Promise(async function(resolve) {
try {
// set empty initially
[settings.fediact_mutes, settings.fediact_blocks, settings.fediact_domainblocks] = [[],[],[]]
var [mutes, blocks, domainblocks] = await Promise.all([
fetch("https://" + settings.fediact_homeinstance + mutesApi, {headers: {"Authorization": "Bearer "+settings.fediact_token}}).then((response) => response.json()),
fetch("https://" + settings.fediact_homeinstance + blocksApi, {headers: {"Authorization": "Bearer "+settings.fediact_token}}).then((response) => response.json()),
fetch("https://" + settings.fediact_homeinstance + domainBlocksApi, {headers: {"Authorization": "Bearer "+settings.fediact_token}}).then((response) => response.json())
])
if (mutes.length) {
settings.fediact_mutes.push(...mutes.map(acc => acc.acct))
}
if (blocks.length) {
settings.fediact_blocks.push(...blocks.map(acc => acc.acct))
}
if (domainblocks.length) {
settings.fediact_domainblocks = domainblocks
}
resolve(true)
} catch {
resolve(false)
}
})
}
async function fetchData(token, mutesblocks) {
return new Promise(async function(resolve) {
var resolved = false
try {
settings = await (browser || chrome).storage.local.get(settingsDefaults)
if (settings.fediact_homeinstance) {
if (token || mutesblocks) {
if (token || !(settings.fediact_token)) {
await fetchBearerToken()
}
if (mutesblocks) {
await fetchMutesAndBlocks()
}
try {
await (browser || chrome).storage.local.set(settings)
resolved = true
} catch {
log(e)
}
}
} else {
log("Home instance not set")
}
} catch(e) {
log(e)
}
resolve(resolved)
})
}
async function reloadListeningScripts() {
chrome.tabs.query({}, async function(tabs) {
for (var i=0; i<tabs.length; ++i) {
try {
chrome.tabs.sendMessage(tabs[i].id, {updatedfedisettings: true})
} catch(e) {
// all non-listening tabs will throw an error, we can ignore it
continue
}
}
})
}
// fetch api token right after install (mostly for debugging, when the ext. is reloaded)
chrome.runtime.onInstalled.addListener(function(){fetchData(true, true)})
// and also every 3 minutes
chrome.alarms.create('refresh', { periodInMinutes: tokenInterval })
chrome.alarms.onAlarm.addListener(function(){fetchData(true, true)})
// different listeners for inter-script communication
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
// the content script gave us an url to perform a 302 redirect with
if(request.externaltoot) {
resolveExternalTootHome(request.externaltoot).then(sendResponse)
return true
}
// the content script gave us an url to perform a 302 redirect with
if(request.requestdata) {
generalRequest(request.requestdata).then(sendResponse)
return true
}
// immediately fetch api token after settings are updated
if (request.updatedsettings) {
fetchData(true, true).then(reloadListeningScripts)
return true
}
if (request.updatemutedblocked) {
fetchData(false, true).then(sendResponse)
return true
}
// when the content script starts to process on a site, listen for tab changes (url)
if (request.running) {
chrome.tabs.onUpdated.addListener(async function(tabId, changeInfo, tab) {
// chrome tabs api does not support listener filters here
// if the tabId of the update event is the same like the tabId that started the listener in the first place AND when the update event is an URL
if (tabId === sender.tab.id && changeInfo.url) {
// ... then let the content script know about the change
try {
await chrome.tabs.sendMessage(tabId, {urlchanged: changeInfo.url})
} catch(e) {
log(e)
}
}
})
}
})

1
src/background.min.js vendored 100644
Wyświetl plik

@ -0,0 +1 @@
var browser,chrome,c;const a=!1,n="[FediAct]",t=1,i="/api/v1/mutes",s="/api/v1/blocks",o="/api/v1/domain_blocks",r=15e3,d=/"access_token":".*?",/gm,u={fediact_homeinstance:null,fediact_token:null};function h(t){a&&console.log(n+" "+t)}async function f(i){return new Promise(async function(e){try{const n=new AbortController;var t=setTimeout(()=>{h("Timed out"),n.abort()},r),a=await fetch(i,{method:"HEAD",signal:n.signal});clearTimeout(t),a.redirected?e(a.url):e(!1)}catch(t){h(t),e(!1)}})}async function l(c){return new Promise(async function(e){try{const i=new AbortController;var t,a,n=setTimeout(()=>{h("Timed out"),i.abort()},r);t=c[3]?(c[2]["User-Agent"]="FediAct Service",c[2]["Content-Type"]="application/json",await fetch(c[1],{method:c[0],signal:i.signal,headers:c[2],body:JSON.stringify(c[3])})):c[2]?(c[2]["User-Agent"]="FediAct Service",await fetch(c[1],{method:c[0],signal:i.signal,headers:c[2]})):await fetch(c[1],{method:c[0],signal:i.signal,headers:{"User-Agent":"FediAct Service"}}),clearTimeout(n),200<=t.status&&t.status<300&&(a=t.headers.get("content-type"))&&-1!==a.indexOf("application/json")?e(await t.text()):e(!1)}catch(t){h(t),e(!1)}})}async function m(){return new Promise(async function(e){var t="https://"+c.fediact_homeinstance;try{var a=await(await fetch(t)).text()}catch(t){return h(t),void e(!1)}if(a){t=a.match(d);if(t){var a=t[0].search(/"access_token":"/),n=t[0].search(/",/);if(-1<a&&-1<n){t=t[0].substring(a+=16,n);if(16<t.length)return c.fediact_token=t,void e(!0)}}}c.fediact_token=null,h("Token could not be found."),e(!1)})}function g(){return new Promise(async function(t){try{[c.fediact_mutes,c.fediact_blocks,c.fediact_domainblocks]=[[],[],[]];var[e,a,n]=await Promise.all([fetch("https://"+c.fediact_homeinstance+i,{headers:{Authorization:"Bearer "+c.fediact_token}}).then(t=>t.json()),fetch("https://"+c.fediact_homeinstance+s,{headers:{Authorization:"Bearer "+c.fediact_token}}).then(t=>t.json()),fetch("https://"+c.fediact_homeinstance+o,{headers:{Authorization:"Bearer "+c.fediact_token}}).then(t=>t.json())]);e.length&&c.fediact_mutes.push(...e.map(t=>t.acct)),a.length&&c.fediact_blocks.push(...a.map(t=>t.acct)),n.length&&(c.fediact_domainblocks=n),t(!0)}catch{t(!1)}})}async function y(n,i){return new Promise(async function(t){var a=!1;try{if((c=await(browser||chrome).storage.local.get(u)).fediact_homeinstance){if(n||i){!n&&c.fediact_token||await m(),i&&await g();try{await(browser||chrome).storage.local.set(c),a=!0}catch{h(e)}}}else h("Home instance not set")}catch(t){h(t)}t(a)})}async function p(){chrome.tabs.query({},async function(t){for(var e=0;e<t.length;++e)try{chrome.tabs.sendMessage(t[e].id,{updatedfedisettings:!0})}catch(t){continue}})}chrome.runtime.onInstalled.addListener(function(){y(!0,!0)}),chrome.alarms.create("refresh",{periodInMinutes:t}),chrome.alarms.onAlarm.addListener(function(){y(!0,!0)}),chrome.runtime.onMessage.addListener((t,n,e)=>t.externaltoot?(f(t.externaltoot).then(e),!0):t.requestdata?(l(t.requestdata).then(e),!0):t.updatedsettings?(y(!0,!0).then(p),!0):t.updatemutedblocked?(y(!1,!0).then(e),!0):void(t.running&&chrome.tabs.onUpdated.addListener(async function(t,e,a){if(t===n.tab.id&&e.url)try{await chrome.tabs.sendMessage(t,{urlchanged:e.url})}catch(t){h(t)}})));

Wyświetl plik

@ -0,0 +1,299 @@
/*
Normal stylings
*/
:root { /* Modal Vars */
--bg: #eee;
--fg: #494949;
--border: rgba(120,120,130,0.3);
--hover: rgba(100,100,130,0.2);
--confirmation: rgb(38, 133, 0);
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #24262d;
--fg: white;
}
}
/* Styles for the mute/block modal popup */
.fediactmodal {
position: fixed;
z-index: 99999;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0,0,0,0.4);
margin: 0;
padding: 0;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 1rem;
-webkit-animation: fa_fadeIn .2s;
animation: fa_fadeIn .2s;
}
.fediactmodalinner {
background-color: var(--bg);
border: 1px solid var(--border);
width: 80%;
max-width: 300px;
margin: auto;
padding: .4em;
border-radius: 8px;
-webkit-animation: fa_scaleInSmall .2s;
animation: fa_scaleInSmall .2s;
}
.fediactmodalitem {
position: relative;
display: block;
padding: .7em;
border-radius: 6px;
cursor: pointer;
-webkit-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: background-color .4s;
-o-transition: background-color .4s;
transition: background-color .4s;
}
.fediactmodalitem:hover, .fediactmodalitem:focus-within {
background-color: var(--hover);
}
.fediactmodallink {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
cursor: pointer;
text-decoration: none;
color: var(--fg);
margin: -.7em;
padding: .7em;
border-radius: inherit;
-webkit-box-shadow: inset 0 0 0 var(--confirmation);
box-shadow: inset 0 0 0 var(--confirmation);
-webkit-transition: padding .2s, color .2s, -webkit-box-shadow .2s cubic-bezier(.2,.2,0,1);
transition: padding .2s, color .2s, -webkit-box-shadow .2s cubic-bezier(.2,.2,0,1);
-o-transition: padding .2s, color .2s, box-shadow .2s cubic-bezier(.2,.2,0,1);
transition: padding .2s, color .2s, box-shadow .2s cubic-bezier(.2,.2,0,1);
transition: padding .2s, color .2s, box-shadow .2s cubic-bezier(.2,.2,0,1), -webkit-box-shadow .2s cubic-bezier(.2,.2,0,1);
}
.fediactmodallink span:not(:first-of-type) {
position: absolute;
right: .7em;
font-size: .8em;
padding: .2em .4em;
border-radius: 4px;
background-color: white;
color: var(--confirmation);
-webkit-animation: fa_scaleInFadeSmall .2s;
animation: fa_scaleInFadeSmall .2s;
}
.fediactmodallink.activated {
-webkit-box-shadow: inset 300px 0 0 var(--confirmation);
box-shadow: inset 300px 0 0 var(--confirmation);
color: white;
font-weight: 600;
}
/* Styles for "resolving..." indicator */
.fediactprocessing {
display: inline-block;
height: 1.2em;
width: 1.2em;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHdpZHRoPSI0MHB4IiBoZWlnaHQ9IjQwcHgiIHZpZXdCb3g9IjAgMCA0MCA0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEuNDE0MjE7IiB4PSIwcHgiIHk9IjBweCI+CiAgICA8ZGVmcz4KICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwhW0NEQVRBWwogICAgICAgICAgICBALXdlYmtpdC1rZXlmcmFtZXMgc3BpbiB7CiAgICAgICAgICAgICAgZnJvbSB7CiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTM1OWRlZykKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQGtleWZyYW1lcyBzcGluIHsKICAgICAgICAgICAgICBmcm9tIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRvIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0zNTlkZWcpCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN2ZyB7CiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7CiAgICAgICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogc3BpbiAxLjVzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICAgICAgICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBzcGluIDEuNXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgICB9CiAgICAgICAgXV0+PC9zdHlsZT4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJvdXRlciI+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCwwQzIyLjIwNTgsMCAyMy45OTM5LDEuNzg4MTMgMjMuOTkzOSwzLjk5MzlDMjMuOTkzOSw2LjE5OTY4IDIyLjIwNTgsNy45ODc4MSAyMCw3Ljk4NzgxQzE3Ljc5NDIsNy45ODc4MSAxNi4wMDYxLDYuMTk5NjggMTYuMDA2MSwzLjk5MzlDMTYuMDA2MSwxLjc4ODEzIDE3Ljc5NDIsMCAyMCwwWiIgc3R5bGU9ImZpbGw6YmxhY2s7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNNS44NTc4Niw1Ljg1Nzg2QzcuNDE3NTgsNC4yOTgxNSA5Ljk0NjM4LDQuMjk4MTUgMTEuNTA2MSw1Ljg1Nzg2QzEzLjA2NTgsNy40MTc1OCAxMy4wNjU4LDkuOTQ2MzggMTEuNTA2MSwxMS41MDYxQzkuOTQ2MzgsMTMuMDY1OCA3LjQxNzU4LDEzLjA2NTggNS44NTc4NiwxMS41MDYxQzQuMjk4MTUsOS45NDYzOCA0LjI5ODE1LDcuNDE3NTggNS44NTc4Niw1Ljg1Nzg2WiIgc3R5bGU9ImZpbGw6cmdiKDIxMCwyMTAsMjEwKTsiLz4KICAgICAgICA8L2c+CiAgICAgICAgPGc+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMCwzMi4wMTIyQzIyLjIwNTgsMzIuMDEyMiAyMy45OTM5LDMzLjgwMDMgMjMuOTkzOSwzNi4wMDYxQzIzLjk5MzksMzguMjExOSAyMi4yMDU4LDQwIDIwLDQwQzE3Ljc5NDIsNDAgMTYuMDA2MSwzOC4yMTE5IDE2LjAwNjEsMzYuMDA2MUMxNi4wMDYxLDMzLjgwMDMgMTcuNzk0MiwzMi4wMTIyIDIwLDMyLjAxMjJaIiBzdHlsZT0iZmlsbDpyZ2IoMTMwLDEzMCwxMzApOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTI4LjQ5MzksMjguNDkzOUMzMC4wNTM2LDI2LjkzNDIgMzIuNTgyNCwyNi45MzQyIDM0LjE0MjEsMjguNDkzOUMzNS43MDE5LDMwLjA1MzYgMzUuNzAxOSwzMi41ODI0IDM0LjE0MjEsMzQuMTQyMUMzMi41ODI0LDM1LjcwMTkgMzAuMDUzNiwzNS43MDE5IDI4LjQ5MzksMzQuMTQyMUMyNi45MzQyLDMyLjU4MjQgMjYuOTM0MiwzMC4wNTM2IDI4LjQ5MzksMjguNDkzOVoiIHN0eWxlPSJmaWxsOnJnYigxMDEsMTAxLDEwMSk7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNMy45OTM5LDE2LjAwNjFDNi4xOTk2OCwxNi4wMDYxIDcuOTg3ODEsMTcuNzk0MiA3Ljk4NzgxLDIwQzcuOTg3ODEsMjIuMjA1OCA2LjE5OTY4LDIzLjk5MzkgMy45OTM5LDIzLjk5MzlDMS43ODgxMywyMy45OTM5IDAsMjIuMjA1OCAwLDIwQzAsMTcuNzk0MiAxLjc4ODEzLDE2LjAwNjEgMy45OTM5LDE2LjAwNjFaIiBzdHlsZT0iZmlsbDpyZ2IoMTg3LDE4NywxODcpOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTUuODU3ODYsMjguNDkzOUM3LjQxNzU4LDI2LjkzNDIgOS45NDYzOCwyNi45MzQyIDExLjUwNjEsMjguNDkzOUMxMy4wNjU4LDMwLjA1MzYgMTMuMDY1OCwzMi41ODI0IDExLjUwNjEsMzQuMTQyMUM5Ljk0NjM4LDM1LjcwMTkgNy40MTc1OCwzNS43MDE5IDUuODU3ODYsMzQuMTQyMUM0LjI5ODE1LDMyLjU4MjQgNC4yOTgxNSwzMC4wNTM2IDUuODU3ODYsMjguNDkzOVoiIHN0eWxlPSJmaWxsOnJnYigxNjQsMTY0LDE2NCk7Ii8+CiAgICAgICAgPC9nPgogICAgICAgIDxnPgogICAgICAgICAgICA8cGF0aCBkPSJNMzYuMDA2MSwxNi4wMDYxQzM4LjIxMTksMTYuMDA2MSA0MCwxNy43OTQyIDQwLDIwQzQwLDIyLjIwNTggMzguMjExOSwyMy45OTM5IDM2LjAwNjEsMjMuOTkzOUMzMy44MDAzLDIzLjk5MzkgMzIuMDEyMiwyMi4yMDU4IDMyLjAxMjIsMjBDMzIuMDEyMiwxNy43OTQyIDMzLjgwMDMsMTYuMDA2MSAzNi4wMDYxLDE2LjAwNjFaIiBzdHlsZT0iZmlsbDpyZ2IoNzQsNzQsNzQpOyIvPgogICAgICAgIDwvZz4KICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGggZD0iTTI4LjQ5MzksNS44NTc4NkMzMC4wNTM2LDQuMjk4MTUgMzIuNTgyNCw0LjI5ODE1IDM0LjE0MjEsNS44NTc4NkMzNS43MDE5LDcuNDE3NTggMzUuNzAxOSw5Ljk0NjM4IDM0LjE0MjEsMTEuNTA2MUMzMi41ODI0LDEzLjA2NTggMzAuMDUzNiwxMy4wNjU4IDI4LjQ5MzksMTEuNTA2MUMyNi45MzQyLDkuOTQ2MzggMjYuOTM0Miw3LjQxNzU4IDI4LjQ5MzksNS44NTc4NloiIHN0eWxlPSJmaWxsOnJnYig1MCw1MCw1MCk7Ii8+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K') no-repeat center center;
background-size: 1em 1em;
padding-left: 10px; /* for instances where action bar is not full width */
padding-right: 10px;
}
/* Styles for unresolved indicator */
.fediactunresolved {
display: inline-block;
height: 1.2em;
width: 1.2em;
color: orange;
font-weight: bold;
padding-right: 10px;
padding-left: 10px
}
/* Styles for after a poll was voted */
.fediactvoted {
font-style: italic;
}
.fediactvoted > a {
font-weight: bold !important;
color: orange !important;
}
/* Inserted in the bottom right of any external instance where FediAct is running */
.fediacticon {
height: 32px;
width: 32px;
position: fixed;
z-index: 99998;
bottom: 50px;
right: 20px;
background: url('data:image/png;base64,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');
background-size: 32px 32px;
cursor: pointer;
}
.fediactsettings_onsite {
position: fixed;
z-index: 99998;
left: 0;
top: 0;
width: 100%;
height: 100%;
overflow: auto;
background-color: rgba(0,0,0,0.4);
margin: 0;
padding: 0;
display: none;
}
.fediactsettings_onsite .fediactsettings_onsite_inner {
position: absolute;
bottom: 15px;
right: 15px;
padding: 10px 15px;
background: white;
border-radius: 5px;
}
.fediactsettings_onsite .fediactsettings_onsite_inner a {
color: blue !important;
}
/* keyframes fa_*/
@-webkit-keyframes fa_fadeIn {
from {
-webkit-filter: opacity(0);
filter: opacity(0);
}
}
@keyframes fa_fadeIn {
from {
-webkit-filter: opacity(0);
filter: opacity(0);
}
}
@-webkit-keyframes fa_fadeOut {
to {
-webkit-filter: opacity(0);
filter: opacity(0);
}
}
@keyframes fa_fadeOut {
to {
-webkit-filter: opacity(0);
filter: opacity(0);
}
}
@-webkit-keyframes fa_scaleInSmall {
from {
-webkit-transform: scale(.98);
transform: scale(.98);
}
}
@keyframes fa_scaleInSmall {
from {
-webkit-transform: scale(.98);
transform: scale(.98);
}
}
@-webkit-keyframes fa_scaleInFadeSmall {
from {
-webkit-transform: scale(.98);
transform: scale(.98);
-webkit-filter: opacity(0);
filter: opacity(0);
}
}
@keyframes fa_scaleInFadeSmall {
from {
-webkit-transform: scale(.98);
transform: scale(.98);
-webkit-filter: opacity(0);
filter: opacity(0);
}
}
/*
We insert these styles for the DOMNodeAppeared function as separate stylesheet (see manifest) to fix
Firefox blocking script-inserted <style> elements due to the site's CSP (long time bug)
*/
@-moz-keyframes fa_nodeInserted {
from {
opacity: 1;
} to {
opacity: 1;
}
}
@-webkit-keyframes fa_nodeInserted {
from {
opacity: 1;
} to {
opacity: 1;
}
}
@-ms-keyframes fa_nodeInserted {
from {
opacity: 1;
} to {
opacity: 1;
}
}
@-o-keyframes fa_nodeInserted {
from {
opacity: 1;
} to {
opacity: 1;
}
}
@keyframes fa_nodeInserted {
from {
opacity: 1;
} to {
opacity: 1;
}
}
div.status,
div.detailed-status,
div.detailed-status__action-bar,
div.account__header button.logo-button,
div.account__header button.button--follow,
div.public-account-header a.logo-button,
div.account-card a.logo-button,
div.directory-card a.icon-button,
div.detailed-status a.logo-button,
button.remote-button,
script#initial-state {
-webkit-animation-name: fa_nodeInserted !important;
-webkit-animation-duration: 0.001s !important;
-ms-animation-name: fa_nodeInserted !important;
-ms-animation-duration: 0.001s !important;
-moz-animation-name: fa_nodeInserted !important;
-moz-animation-duration: 0.001s !important;
-o-animation-name: fa_nodeInserted !important;
-o-animation-duration: 0.001s !important;
animation-name: fa_nodeInserted !important;
animation-duration: 0.001s !important;
}

1
src/content_styles.min.css vendored 100644

File diff suppressed because one or more lines are too long

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 2.0 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.4 KiB

Plik diff jest za duży Load Diff

1
src/inject.min.js vendored 100644

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -1,47 +1,129 @@
<!DOCTYPE html>
<html>
<head>
<style>
.hide {
display: none;
}
</style>
<link rel="stylesheet" href="chrome://browser/content/extension.css">
<meta name="color-scheme" content="dark light">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="lib/jquery-3.6.1.min.js"></script>
<script src="popup.min.js"></script>
<link rel="stylesheet" href="popup_styles.min.css">
</head>
<body>
<div id="mhi-wrapper">
<div id="mhi-containers">
<form id="fedifollow-settings">
<label for="homeinstance">Home instance (make sure you are logged in):</label><br>
<input type="text" id="homeinstance" name="homeinstance" placeholder="mastodon.social"><br>
<label for="alert">Alert on redirect:</label><br>
<input type="checkbox" id="alert" name="alert"><br>
<label for="alert">Auto-action:</label><br>
<input type="checkbox" id="autoaction" name="autoaction"><br>
<label for="target">Open in:</label><br>
<select name="target" id="target" selected="_blank">
<option id="target_blank" value="_blank">New tab</option>
<option id="target_self" value="_self">Same tab</option>
</select><br>
<label for="mode">Mode:</label><br>
<select name="mode" id="mode" selected="blacklist">
<option id="blacklist" value="blacklist">All (with blacklist)</option>
<option id="whitelist" value="whitelist">Whitelist</option>
</select><br>
<div class="hide" id="blacklist_input">
<label for="blacklist_content">Blacklist (one per line):</label><br>
<textarea id="blacklist_content" name="blacklist_content" placeholder="mastodon.social&#10;infosec.exchange"></textarea><br>
<div id="mhi-wrapper">
<div id="mhi-containers">
<form id="fediact-settings">
<div class="scroller">
<fieldset aria-labelledby="homeServerDomainLabel">
<div class="row">
<label for="homeinstance">
<legend id="homeServerDomainLabel"><h1>Home Server Domain</h1></legend>
<span>
Make sure you are logged in to your home server
</span>
</label>
<div class="text-input-container">
<span>https://</span>
<input type="text" id="homeinstance" name="homeinstance" placeholder="example.social">
</div>
</div>
</fieldset>
<fieldset>
<legend>Redirect Settings</legend>
<div class="row">
<label for="redirects">Enable
<span>
Redirect on double click and reply
</span>
</label>
<input type="checkbox" id="redirects" name="redirects">
</div>
<div class="row">
<label for="alert">Prompt
<span>
Show confirmation dialog before redirecting
</span>
</label>
<input type="checkbox" id="alert" name="alert">
</div>
<div class="row">
<label for="target">Open in...</label>
<select name="target" id="target" selected="_blank">
<option id="target_blank" value="_blank">New tab&nbsp;</option>
<option id="target_self" value="_self">Same tab&nbsp;</option>
</select>
</div>
</fieldset>
<fieldset>
<legend>Other Settings</legend>
<div class="row">
<label for="autoaction">Actions
<span>
Enable follow, boost, etc. on other servers
</span>
</label>
<input type="checkbox" id="autoaction" name="autoaction">
</div>
<div class="row">
<label for="hidemuted">Hide muted/blocked
<span>
Can fail / decrease performance in some cases
</span>
</label>
<input type="checkbox" id="hidemuted" name="hidemuted">
</div>
<div class="row">
<label for="delay">API delay
<span>
Only allow one API request every 500ms
</span>
</label>
<input type="checkbox" id="delay" name="delay">
</div>
</fieldset>
<fieldset>
<legend>Mode</legend>
<div class="row">
<label for="runifloggedin">Ignore sessions
<span>
Run FediAct on instances where I'm logged in
</span>
</label>
<input type="checkbox" id="runifloggedin" name="runifloggedin">
</div>
</fieldset>
<fieldset>
<legend>Filtered servers</legend>
<div class="row">
<label for="mode">Mode
<span class="hide" id="allowlabel">
Only run on the following domains...
</span>
<span class="hide" id="denylabel">
Run on all domains except the following...
</span>
</label>
<select name="mode" id="mode" selected="blacklist">
<option id="blacklist" value="blacklist">Denylist&nbsp;</option>
<option id="whitelist" value="whitelist">Allowlist&nbsp;</option>
</select>
</div>
<div class="row">
<div class="hide textarea-container" id="blacklist_input">
<textarea id="blacklist_content" name="blacklist_content" placeholder="example.social&#10;example2.social"></textarea>
</div>
<div class="hide textarea-container" id="whitelist_input">
<textarea id="whitelist_content" name="whitelist_content" placeholder="example.social&#10;example2.social"></textarea>
</div>
</div>
</fieldset>
</div>
<div class="footer">
<input type="submit" value="Save">
<span id="indicator" style="display:none">Settings saved!</span>
<span><a target="_blank" href="https://github.com/lartsch/FediAct">More info / help on Github</a></span>
</div>
<div class="hide" id="whitelist_input">
<label for="whitelist_content">Whitelist (one per line):</label><br>
<textarea id="whitelist_content" name="whitelist_content" placeholder="mastodon.social&#10;infosec.exchange"></textarea><br>
</div><br>
<input type="submit" value="Submit">
<span id="indicator" style="display:none">Settings saved!</span>
<br><br><span>Made by <a target="_blank" href="https://github.com/lartsch">github.com/lartsch</a></span>
</form>
</div>
</div>
<script src="lib/jquery-3.6.1.min.js"></script>
<script src="popup.js"></script>
</body>
</html>

Wyświetl plik

@ -1,86 +1,129 @@
// settings keys with defauls
var settings = {
fedifollow_homeinstance: null,
fedifollow_alert: false,
fedifollow_mode: "blacklist",
fedifollow_whitelist: null,
fedifollow_blacklist: null,
fedifollow_target: "_blank",
fedifollow_autoaction: true
// required settings keys with defauls
const settingsDefaults = {
fediact_homeinstance: null,
fediact_alert: false,
fediact_mode: "blacklist",
fediact_whitelist: null,
fediact_blacklist: null,
fediact_target: "_self",
fediact_autoaction: true,
fediact_redirects: true,
fediact_enabledelay: true,
fediact_hidemuted: false,
fediact_runifloggedin: false,
}
// fix for cross-browser storage api compatibility
var browser, chrome;
var browser, chrome, settings
const enableConsoleLog = true
const logPrepend = "[FediAct]"
function onError(error){
console.error(`[FediFollow] Error: ${error}`)
// wrapper to prepend to log messages
function log(text) {
if (enableConsoleLog) {
console.log(logPrepend + ' ' + text)
}
}
// this performs loading the settings into the popup, reacting to changes and saving changes
function popupTasks(settings) {
function popupTasks() {
// function to show confirmation when settings were updated successfully
function showConfirmation() {
$("span#indicator").show();
$("span#indicator").show()
setTimeout(function() {
$("span#indicator").hide();
}, 1500);
$("span#indicator").hide()
}, 1500)
}
function updateSettings(){
// get all current values and write them to the local storage
async function updateSettings(){
// update settings values
settings.fedifollow_homeinstance = $("input#homeinstance").val().trim();
settings.fedifollow_alert = $("input#alert").is(':checked');
settings.fedifollow_mode = $("select#mode").val();
settings.fedifollow_whitelist = $("textarea#whitelist_content").val();
settings.fedifollow_blacklist = $("textarea#blacklist_content").val();
settings.fedifollow_target = $("select#target").val();
settings.fedifollow_autoaction = $("input#autoaction").is(':checked');
settings.fediact_homeinstance = $("input#homeinstance").val().trim().toLowerCase()
settings.fediact_alert = $("input#alert").is(':checked')
settings.fediact_mode = $("select#mode").val()
settings.fediact_whitelist = $("textarea#whitelist_content").val()
settings.fediact_blacklist = $("textarea#blacklist_content").val()
settings.fediact_target = $("select#target").val()
settings.fediact_autoaction = $("input#autoaction").is(':checked')
settings.fediact_redirects = $("input#redirects").is(':checked')
settings.fediact_enabledelay = $("input#delay").is(':checked')
settings.fediact_hidemuted = $("input#hidemuted").is(':checked')
settings.fediact_runifloggedin = $("input#runifloggedin").is(':checked')
// write to storage
const waitForSaved = (browser || chrome).storage.local.set(settings);
try {
await (browser || chrome).storage.local.set(settings)
} catch {
log(e)
return false
}
// show saved indicator after successful save
waitForSaved.then(showConfirmation(), onError);
showConfirmation()
}
// restore form based on loaded settings
function restoreForm() {
// set all default/configured values and show fields accordingly
$("input#homeinstance").val(settings.fedifollow_homeinstance);
$("textarea#blacklist_content").val(settings.fedifollow_blacklist);
$("textarea#whitelist_content").val(settings.fedifollow_whitelist);
$("select#mode").val(settings.fedifollow_mode);
$("select#target").val(settings.fedifollow_target);
$("input#alert").prop('checked', settings.fedifollow_alert);
$("input#autoaction").prop('checked', settings.fedifollow_autoaction);
$("input#homeinstance").val(settings.fediact_homeinstance)
$("textarea#blacklist_content").val(settings.fediact_blacklist)
$("textarea#whitelist_content").val(settings.fediact_whitelist)
$("select#mode").val(settings.fediact_mode)
$("select#target").val(settings.fediact_target)
$("input#alert").prop('checked', settings.fediact_alert)
$("input#autoaction").prop('checked', settings.fediact_autoaction)
$("input#redirects").prop('checked', settings.fediact_redirects)
$("input#delay").prop('checked', settings.fediact_enabledelay)
$("input#hidemuted").prop('checked', settings.fediact_hidemuted)
$("input#runifloggedin").prop('checked', settings.fediact_runifloggedin)
// both containers are hidden by default
if ($("select#mode").val() == "whitelist") {
$("div#whitelist_input").show();
$("div#whitelist_input").removeClass("hide")
$("span#allowlabel").removeClass("hide")
} else {
$("div#blacklist_input").show();
$("div#blacklist_input").removeClass("hide")
$("span#denylabel").removeClass("hide")
}
// check changes of the select to update whitelist/blacklist input
$("select#mode").change(function() {
if ($("select#mode").val() == "whitelist") {
$("div#blacklist_input").hide();
$("div#whitelist_input").show();
$("div#blacklist_input").addClass("hide")
$("span#denylabel").addClass("hide")
$("div#whitelist_input").removeClass("hide")
$("span#allowlabel").removeClass("hide")
} else {
$("div#whitelist_input").hide();
$("div#blacklist_input").show();
$("div#whitelist_input").addClass("hide")
$("span#allowlabel").addClass("hide")
$("div#blacklist_input").removeClass("hide")
$("span#denylabel").removeClass("hide")
}
});
})
}
$(document).ready(function() {
// restore the form values
restoreForm();
restoreForm()
// perform storage actions on form submit
$("form#fedifollow-settings").on('submit', function(e){
$("form#fediact-settings").on('submit', async function(e){
// prevent default
e.preventDefault();
e.preventDefault()
// update settings
updateSettings();
});
});
updateSettings()
try {
await chrome.runtime.sendMessage({updatedsettings: true})
} catch(e) {
log(e)
}
})
})
}
(browser || chrome).storage.local.get(settings).then(popupTasks, onError);
async function loadAndRun() {
try {
settings = await (browser || chrome).storage.local.get(settingsDefaults)
} catch(e) {
log(e)
return false
}
if (settings) {
popupTasks()
}
}
loadAndRun()

1
src/popup.min.js vendored 100644
Wyświetl plik

@ -0,0 +1 @@
const t={fediact_homeinstance:null,fediact_alert:!1,fediact_mode:"blacklist",fediact_whitelist:null,fediact_blacklist:null,fediact_target:"_self",fediact_autoaction:!0,fediact_redirects:!0,fediact_enabledelay:!0,fediact_hidemuted:!1,fediact_runifloggedin:!1};var browser,chrome,i;const a=!0,c="[FediAct]";function d(e){a&&console.log(c+" "+e)}function l(){async function t(){i.fediact_homeinstance=$("input#homeinstance").val().trim().toLowerCase(),i.fediact_alert=$("input#alert").is(":checked"),i.fediact_mode=$("select#mode").val(),i.fediact_whitelist=$("textarea#whitelist_content").val(),i.fediact_blacklist=$("textarea#blacklist_content").val(),i.fediact_target=$("select#target").val(),i.fediact_autoaction=$("input#autoaction").is(":checked"),i.fediact_redirects=$("input#redirects").is(":checked"),i.fediact_enabledelay=$("input#delay").is(":checked"),i.fediact_hidemuted=$("input#hidemuted").is(":checked"),i.fediact_runifloggedin=$("input#runifloggedin").is(":checked");try{await(browser||chrome).storage.local.set(i)}catch{return d(e),!1}$("span#indicator").show(),setTimeout(function(){$("span#indicator").hide()},1500)}$(document).ready(function(){$("input#homeinstance").val(i.fediact_homeinstance),$("textarea#blacklist_content").val(i.fediact_blacklist),$("textarea#whitelist_content").val(i.fediact_whitelist),$("select#mode").val(i.fediact_mode),$("select#target").val(i.fediact_target),$("input#alert").prop("checked",i.fediact_alert),$("input#autoaction").prop("checked",i.fediact_autoaction),$("input#redirects").prop("checked",i.fediact_redirects),$("input#delay").prop("checked",i.fediact_enabledelay),$("input#hidemuted").prop("checked",i.fediact_hidemuted),$("input#runifloggedin").prop("checked",i.fediact_runifloggedin),("whitelist"==$("select#mode").val()?($("div#whitelist_input").removeClass("hide"),$("span#allowlabel")):($("div#blacklist_input").removeClass("hide"),$("span#denylabel"))).removeClass("hide"),$("select#mode").change(function(){("whitelist"==$("select#mode").val()?($("div#blacklist_input").addClass("hide"),$("span#denylabel").addClass("hide"),$("div#whitelist_input").removeClass("hide"),$("span#allowlabel")):($("div#whitelist_input").addClass("hide"),$("span#allowlabel").addClass("hide"),$("div#blacklist_input").removeClass("hide"),$("span#denylabel"))).removeClass("hide")}),$("form#fediact-settings").on("submit",async function(e){e.preventDefault(),t();try{await chrome.runtime.sendMessage({updatedsettings:!0})}catch(e){d(e)}})})}async function n(){try{i=await(browser||chrome).storage.local.get(t)}catch(e){return d(e),!1}i&&l()}n();

Wyświetl plik

@ -0,0 +1,227 @@
html, body {
margin: 0;
height: var(--popup-height);
min-width: 300px;
max-height: 900px;
}
html {
--highlight: rgba(130,130,150,0.1);
--confirmation: rgb(38, 133, 0);
--hover: rgba(120,120,130,0.15);
--border: rgba(120,120,130,0.3);
--border-2: rgba(130,130,150,0.3);
--radius: 12px;
--popup-height: 450px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
height: 100%;
}
body {
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
min-height: var(--popup-height);
}
.hide {
display: none;
}
h1 {
font-size: 1em;
margin-block: .2em;
}
h2 {
font-size: 1em;
}
#mhi-wrapper, #mhi-containers {
display: contents;
}
form {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
height: 100%;
}
.scroller {
height: 0;
overflow-y: auto;
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
padding: 10px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
fieldset {
all: unset;
display: block;
}
legend {
all: unset;
}
fieldset > legend, summary {
margin-inline: .6em;
padding-top: .6em;
margin-bottom: .4em;
font-weight: 700;
}
.row {
background-color: var(--highlight);
padding: .8em;
-webkit-box-sizing: border-box;
box-sizing: border-box;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin-bottom: 2px;
position: relative;
gap: .4em;
-webkit-transition: background-color .1s;
-o-transition: background-color .1s;
transition: background-color .1s;
}
.row:hover, .row:focus-within {
background: var(--hover);
}
.row:first-of-type {
border-top-left-radius: var(--radius);
border-top-right-radius: var(--radius);
}
.row:last-of-type {
border-bottom-left-radius: var(--radius);
border-bottom-right-radius: var(--radius);
}
label {
width: 0;
-webkit-box-flex: 9999;
-ms-flex-positive: 9999;
flex-grow: 9999;
}
label::before { /* Make entire .row clickable */
content: "";
position: absolute;
inset: 0;
}
label span {
display: block;
font-size: .9em;
opacity: .7;
margin-top: .2em;
}
.text-input-container {
width: 100%;
display: flex;
border: 1px solid var(--border);
border-radius: calc(var(--radius) / 2);
overflow: hidden;
}
.text-input-container span {
padding: .7em;
background-color: var(--highlight);
}
.text-input-container input {
border: 0 !important;
border-radius: 0 !important;
outline: 0;
}
.text-input-container:focus-within {
outline: auto; /* This is the browser's default focus outline */
}
input, textarea, select {
border: 1px solid var(--border);
padding: .7em;
border-radius: calc(var(--radius) / 2);
font-size: inherit;
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
-webkit-box-sizing: border-box;
box-sizing: border-box;
position: relative;
z-index: 2;
}
.textarea-container {
width: calc(100% - .14em);
border-radius: inherit;
}
textarea {
resize: vertical;
width: 100%;
}
select {
margin-block: -.8em;
padding-block: .4em;
border: 0;
background: none;
text-align: right;
}
.footer {
padding: 10px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: justify;
-ms-flex-pack: justify;
justify-content: space-between;
border-top: 1px dashed var(--border-2);
position: relative;
background-color: var(--highlight);
-webkit-box-shadow: 0 0 24px rgba(0,0,0,0.1);
box-shadow: 0 0 24px rgba(0,0,0,0.1);
}
[type="submit"] {
-webkit-box-flex: 0;
-ms-flex-positive: 0;
flex-grow: 0;
padding-inline: 2em;
}
[type="submit"]:not(:hover):not(:focus) {
background: none;
}
.footer span {
width: 0;
-webkit-box-flex: 1;
-ms-flex-positive: 1;
flex-grow: 1;
text-align: right;
padding-inline: 1em;
}
.footer a {
opacity: .7;
text-underline-offset: .2em;
color: inherit;
}
#indicator {
-webkit-box-ordinal-group: 0;
-ms-flex-order: -1;
order: -1;
width: calc(100% + 20px);
font-weight: 600;
padding: .7em;
margin: -10px;
margin-bottom: 8px;
background-color: var(--confirmation);
text-align: center;
color: white;
}
@media (prefers-color-scheme: dark) {
body {
color: white;
background-color: #1c1b22;
}
}

1
src/popup_styles.min.css vendored 100644
Wyświetl plik

@ -0,0 +1 @@
html,body{margin:0;height:var(--popup-height);min-width:300px;max-height:900px}html{--highlight:rgba(130,130,150,0.1);--confirmation:#268500;--hover:rgba(120,120,130,0.15);--border:rgba(120,120,130,0.3);--border-2:rgba(130,130,150,0.3);--radius:12px;--popup-height:450px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%}body{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;min-height:var(--popup-height)}.hide{display:none}h1{font-size:1em;margin-block:.2em}h2{font-size:1em}#mhi-wrapper,#mhi-containers{display:contents}form{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%}.scroller{height:0;overflow-y:auto;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:10px;-webkit-box-sizing:border-box;box-sizing:border-box}fieldset{all:unset;display:block}legend{all:unset}fieldset>legend,summary{margin-inline:.6em;padding-top:.6em;margin-bottom:.4em;font-weight:700}.row{background-color:var(--highlight);padding:.8em;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:2px;position:relative;gap:.4em;-webkit-transition:background-color .1s;-o-transition:background-color .1s;transition:background-color .1s}.row:hover,.row:focus-within{background:var(--hover)}.row:first-of-type{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.row:last-of-type{border-bottom-left-radius:var(--radius);border-bottom-right-radius:var(--radius)}label{width:0;-webkit-box-flex:9999;-ms-flex-positive:9999;flex-grow:9999}label::before{content:"";position:absolute;inset:0}label span{display:block;font-size:.9em;opacity:.7;margin-top:.2em}.text-input-container{width:100%;display:flex;border:1px solid var(--border);border-radius:calc(var(--radius) / 2);overflow:hidden}.text-input-container span{padding:.7em;background-color:var(--highlight)}.text-input-container input{border:0 !important;border-radius:0 !important;outline:0}.text-input-container:focus-within{outline:auto}input,textarea,select{border:1px solid var(--border);padding:.7em;border-radius:calc(var(--radius) / 2);font-size:inherit;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;z-index:2}.textarea-container{width:calc(100% - .14em);border-radius:inherit}textarea{resize:vertical;width:100%}select{margin-block:-.8em;padding-block:.4em;border:0;background:0;text-align:right}.footer{padding:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-top:1px dashed var(--border-2);position:relative;background-color:var(--highlight);-webkit-box-shadow:0 0 24px rgba(0,0,0,0.1);box-shadow:0 0 24px rgba(0,0,0,0.1)}[type="submit"]{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-inline:2em}[type="submit"]:not(:hover):not(:focus){background:0}.footer span{width:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:right;padding-inline:1em}.footer a{opacity:.7;text-underline-offset:.2em;color:inherit}#indicator{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1;width:calc(100% + 20px);font-weight:600;padding:.7em;margin:-10px;margin-bottom:8px;background-color:var(--confirmation);text-align:center;color:white}@media(prefers-color-scheme:dark){body{color:white;background-color:#1c1b22}}