2020-10-28 04:53:39 +01:00
|
|
|
# TabFS
|
2019-02-26 05:13:58 +01:00
|
|
|
|
2020-12-12 11:36:16 +01:00
|
|
|
TabFS is a browser extension that mounts your browser tabs as a
|
|
|
|
filesystem on your computer.
|
|
|
|
|
|
|
|
Out of the box, it supports Chrome and (to a lesser extent) Firefox,
|
|
|
|
on macOS and Linux; it could probably be made to work on other
|
|
|
|
browsers like Safari and Opera that support the WebExtensions API, but
|
|
|
|
I haven't looked into it.
|
2020-10-30 08:06:12 +01:00
|
|
|
|
2020-10-30 09:00:09 +01:00
|
|
|
<img src="doc/finder.png" width="500">
|
|
|
|
|
2020-12-12 11:36:16 +01:00
|
|
|
Each of your open tabs is mapped to a folder with a bunch of files
|
|
|
|
inside it. These files directly reflect (and can control) the state of
|
|
|
|
that tab. (TODO: update as I add more)
|
2020-10-30 09:00:09 +01:00
|
|
|
|
|
|
|
<img src="doc/finder-contents.png" width="500">
|
|
|
|
|
|
|
|
This gives you a _ton_ of power, because now you can apply [all the
|
|
|
|
existing tools](https://twitter.com/rsnous/status/1018570020324962305)
|
|
|
|
on your computer that already know how to deal with files -- terminal
|
|
|
|
commands, scripting languages, etc -- and use them to control and draw
|
2020-12-12 11:36:16 +01:00
|
|
|
information out of your browser. You don't need to code up a browser
|
2020-10-30 09:00:09 +01:00
|
|
|
extension from scratch every time you want to do anything.
|
|
|
|
|
|
|
|
## Examples of stuff you can do!
|
2020-10-30 08:06:12 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
(assuming your shell is in the `fs` subdirectory of this repo)
|
2020-10-30 08:06:12 +01:00
|
|
|
|
2020-10-30 09:00:09 +01:00
|
|
|
(TODO: more of these)
|
|
|
|
|
2020-10-30 08:06:12 +01:00
|
|
|
### List the titles of all the tabs you have open
|
|
|
|
|
|
|
|
```
|
|
|
|
$ cat mnt/tabs/by-id/*/title
|
|
|
|
GitHub
|
|
|
|
Extensions
|
|
|
|
TabFS/install.sh at master · osnr/TabFS
|
|
|
|
Alternative Extension Distribution Options - Google Chrome
|
|
|
|
Web Store Hosting and Updating - Google Chrome
|
|
|
|
Home / Twitter
|
|
|
|
...
|
|
|
|
```
|
|
|
|
|
|
|
|
### Close all Stack Overflow tabs
|
|
|
|
|
2020-12-15 21:11:41 +01:00
|
|
|
```
|
|
|
|
$ rm mnt/tabs/by-title/*Stack_Overflow*
|
|
|
|
```
|
|
|
|
|
|
|
|
or (older)
|
|
|
|
|
2020-10-30 08:06:12 +01:00
|
|
|
```
|
2020-11-06 04:09:44 +01:00
|
|
|
$ echo remove | tee -a mnt/tabs/by-title/*Stack_Overflow*/control
|
2020-10-30 08:06:12 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
### Save text of all tabs to a file
|
|
|
|
|
|
|
|
```
|
|
|
|
$ cat mnt/tabs/by-id/*/text > text.txt
|
|
|
|
```
|
|
|
|
|
2020-12-14 07:02:29 +01:00
|
|
|
### TODO: Manage tabs in Emacs dired
|
|
|
|
|
|
|
|
I do this
|
|
|
|
|
2019-02-26 05:13:58 +01:00
|
|
|
## Setup
|
|
|
|
|
2020-12-15 21:11:41 +01:00
|
|
|
**disclaimer**: security, functionality, blah blah. applications may
|
|
|
|
freeze ... In some sense, the whole point of this extension is to
|
|
|
|
create a gigantic new surface area of communication between stuff
|
|
|
|
inside your browser and software on the rest of your computer.
|
2020-12-03 05:24:20 +01:00
|
|
|
|
2020-10-30 07:54:40 +01:00
|
|
|
First, install the browser extension.
|
2019-02-26 05:13:58 +01:00
|
|
|
|
2020-10-30 07:54:40 +01:00
|
|
|
Then, install the C filesystem.
|
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
### 1. Install the browser extension
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-12-12 11:36:16 +01:00
|
|
|
(I think for Opera or whatever other Chromium-based browser, you could
|
|
|
|
get it to work, but you'd need to change the native messaging path in
|
|
|
|
install.sh. Not sure about Safari. maybe Edge too? if you also got
|
|
|
|
everything to compile for Windows)
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
#### in Chrome
|
2020-10-30 07:54:40 +01:00
|
|
|
|
|
|
|
Go to the [Chrome extensions page](chrome://extensions). Enable
|
|
|
|
Developer mode (top-right corner).
|
|
|
|
|
|
|
|
Load-unpacked the `extension/` folder in this repo.
|
|
|
|
|
2020-12-03 05:24:20 +01:00
|
|
|
**Make a note of the extension ID Chrome assigns.** Mine is
|
2020-10-30 08:06:12 +01:00
|
|
|
`jimpolemfaeckpjijgapgkmolankohgj`. We'll use this later.
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
#### in Firefox
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
You'll need to install as a "temporary extension", so it'll only last
|
|
|
|
in your current FF session.
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
Go to [about:debugging#/runtime/this-firefox](about:debugging#/runtime/this-firefox).
|
|
|
|
|
|
|
|
Load Temporary Add-on...
|
|
|
|
|
|
|
|
Choose manifest.json in the extension subfolder of this repo.
|
|
|
|
|
|
|
|
### 2. Install the C filesystem
|
2019-02-26 05:13:58 +01:00
|
|
|
|
2020-10-24 07:47:59 +02:00
|
|
|
First, make sure you `git submodule update --init` to get the
|
|
|
|
`fs/cJSON` and `fs/base64` dependencies.
|
|
|
|
|
|
|
|
And make sure you have FUSE. On Linux, for example, `sudo apt install
|
|
|
|
libfuse-dev`. On macOS, get FUSE for macOS.
|
2019-02-26 05:13:58 +01:00
|
|
|
|
|
|
|
```
|
|
|
|
$ cd fs
|
|
|
|
$ mkdir mnt
|
2020-10-24 07:47:59 +02:00
|
|
|
$ make
|
2019-02-26 05:13:58 +01:00
|
|
|
```
|
|
|
|
|
2020-10-28 04:53:39 +01:00
|
|
|
Now install the native messaging host into your browser, so the
|
|
|
|
extension can launch and talk to the filesystem:
|
|
|
|
|
2020-10-30 08:06:12 +01:00
|
|
|
#### Chrome and Chromium
|
|
|
|
|
2020-12-12 11:36:16 +01:00
|
|
|
Substitute the extension ID you copied earlier for
|
|
|
|
`jimpolemfaeckpjijgapgkmolankohgj` in the command below.
|
2020-10-30 08:06:12 +01:00
|
|
|
|
|
|
|
```
|
|
|
|
$ ./install.sh chrome jimpolemfaeckpjijgapgkmolankohgj
|
|
|
|
```
|
|
|
|
|
|
|
|
or
|
|
|
|
|
2020-10-28 04:53:39 +01:00
|
|
|
```
|
2020-10-30 08:06:12 +01:00
|
|
|
$ ./install.sh chromium jimpolemfaeckpjijgapgkmolankohgj
|
2020-10-28 04:53:39 +01:00
|
|
|
```
|
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
### 3. Ready!
|
2020-10-28 04:53:39 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
Go back to `chrome://extensions` or
|
|
|
|
`about:debugging#/runtime/this-firefox` and reload the extension.
|
2020-10-28 04:53:39 +01:00
|
|
|
|
2020-10-30 07:54:40 +01:00
|
|
|
Now your browser tabs should be mounted in `fs/mnt`!
|
2020-10-28 04:53:39 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
Open the background page inspector to see the filesystem operations
|
|
|
|
stream in. (in Chrome, click "background page" next to "Inspect views"
|
|
|
|
in the extension's entry in the Chrome extensions page; in Firefox,
|
|
|
|
click "Inspect")
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:06:12 +01:00
|
|
|
<img src="doc/inspector.png" width="600">
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:06:12 +01:00
|
|
|
This console is also incredibly helpful for debugging anything that
|
|
|
|
goes wrong, which probably will happen.
|
2020-10-30 07:54:40 +01:00
|
|
|
|
2020-10-30 08:06:12 +01:00
|
|
|
(My OS and applications are pretty chatty! They do a lot of
|
|
|
|
operations, even when I don't feel like I'm actually doing anything.)
|
2019-02-26 05:13:58 +01:00
|
|
|
|
|
|
|
## Design
|
|
|
|
|
|
|
|
- `fs/`: Native FUSE filesystem, written in C
|
2020-10-30 08:06:12 +01:00
|
|
|
- [`tabfs.c`](fs/tabfs.c): Talks to FUSE, implements fs operations, talks to extension.
|
2020-12-03 05:24:20 +01:00
|
|
|
- `extension/`: Browser extension, written in JS
|
|
|
|
- [`background.js`](extension/background.js): **The most interesting
|
|
|
|
file**. Defines all the synthetic files and what browser
|
|
|
|
operations they invoke behind the scenes.
|
2019-02-26 05:13:58 +01:00
|
|
|
|
2020-10-30 08:39:21 +01:00
|
|
|
<!-- TODO: concretize this -->
|
|
|
|
|
2019-02-26 05:13:58 +01:00
|
|
|
When you, say, `cat` a file in the tab filesystem:
|
|
|
|
|
|
|
|
1. `cat` makes something like a `read` syscall,
|
|
|
|
|
|
|
|
2. which goes to the FUSE kernel module which backs that filesystem,
|
|
|
|
|
|
|
|
3. FUSE forwards it to the `tabfs_read` implementation in our
|
|
|
|
userspace filesystem in `fs/tabfs.c`,
|
|
|
|
|
|
|
|
4. then `tabfs_read` rephrases the request as a JSON string and
|
2020-10-24 07:47:59 +02:00
|
|
|
forwards it to the browser extension over 'native messaging',
|
2019-02-26 05:13:58 +01:00
|
|
|
|
|
|
|
6. our browser extension in `extension/background.js` handles the
|
|
|
|
incoming message and calls the browser APIs to construct the data
|
|
|
|
for that synthetic file;
|
|
|
|
|
2020-10-24 07:47:59 +02:00
|
|
|
7. then the data gets sent back in a JSON native message to `tabfs.c`
|
|
|
|
and and finally back to FUSE and the kernel and `cat`.
|
2019-02-26 05:13:58 +01:00
|
|
|
|
|
|
|
(very little actual work happened here, tbh. it's all just
|
|
|
|
marshalling)
|
|
|
|
|
|
|
|
TODO: make diagrams?
|
2020-10-28 04:53:39 +01:00
|
|
|
|
2020-10-28 22:14:57 +01:00
|
|
|
## license
|
|
|
|
|
|
|
|
GPLv3
|
|
|
|
|
2020-10-28 04:53:39 +01:00
|
|
|
## hmm
|
|
|
|
|
2020-12-03 05:24:20 +01:00
|
|
|
processes as files. the real process is the browser.
|
|
|
|
|
2020-12-12 11:36:16 +01:00
|
|
|
browser and Unix; the two operating systems
|
2020-12-03 05:24:20 +01:00
|
|
|
|
2020-12-12 11:36:16 +01:00
|
|
|
it's way too hard to make an extension. even 'make an extension' is a
|
|
|
|
bad framing; it suggests making an extension is a whole Thing, a whole
|
|
|
|
Project. like, why can't I just take a minute to ask my browser a
|
|
|
|
question or tell it to automate something? lightness
|
2020-10-28 04:53:39 +01:00
|
|
|
|
|
|
|
open input space -- filesystem
|
|
|
|
|
|
|
|
now you have this whole 'language', this whole toolset, to control and
|
2020-12-12 11:36:16 +01:00
|
|
|
automate your browser. there's this built-up existing capital where
|
|
|
|
lots of people already know the operations to work with files
|
2020-10-28 04:53:39 +01:00
|
|
|
|
2020-12-13 14:21:43 +01:00
|
|
|
this project is cool bc i immediately get a dataset i care about
|
|
|
|
|
2020-10-28 04:53:39 +01:00
|
|
|
OSQuery
|
|
|
|
|
|
|
|
fake filesystems talk
|
|
|
|
|
|
|
|
Screenotate
|
|
|
|
|
|
|
|
rmdir a non-empty directory
|
2020-12-01 01:01:56 +01:00
|
|
|
|