Commit graph

154 commits

Author SHA1 Message Date
Thomas Buckley-Houston 3cc5485c2f Merge branch 'master' of github.com:browsh-org/browsh 2018-07-11 11:55:58 +08:00
Thomas Buckley-Houston b4c9f2d4e6 Added Homebrew Tap recipe 2018-07-11 11:55:19 +08:00
Thomas Buckley-Houston 3ee9b16ea8 Prevent mouse interaction crashing app
Possibly helps everyone in #63, #73 and #94

Whether it solves the issue or not, this definitely fixes a bug.
`CurrentTab` doesn't refer to anything until the first frame is received
from the webextension, yet tthe `handleMouseEvent` function can be
triggered long before that.
2018-07-11 11:30:22 +08:00
traBpUkciP a3b8c05b60 Use Backticks to Wrap String With Slashes
Oops. Quick fix.
2018-07-11 06:22:49 +07:00
traBpUkciP 78b021f822 Add Support for 64 bit Firefox Installations (#87)
Should fix up #87 and all the other related issues. Haven't wrote any golang for a year but I think it was a pretty simple fix so I took it on; however ff someone wouldn't mind giving it a second set of eyes that would be awesome. I'm stoked to try the app out, it's looks so cool :P

Cheers
2018-07-11 06:22:49 +07:00
Emiel Wiedijk d79b8810dc Check for $GOPATH
The shell script in interfacer/contrib/setup_go.sh expands the $GOPATH
variable to download a script to $GOPATH/bin. However, if $GOPATH is not
set, that expands to /bin. If the script is run with root privileges
(accidentally), this will download a "strange" executable to /bin, which
is supposed to be for system executables. If it is run without root
privileges, it gives an (unclear) error about permissions. This commit checks
if $GOPATH exists. If it $GOPATH does not exist, it exits with error code 1.
2018-07-11 06:21:23 +07:00
Thomas Buckley-Houston 65936913cb Don't use curl's --fail in setting up Browsh
Seems to fail every time
2018-07-10 10:44:34 +08:00
Thomas Buckley-Houston 74fd11ab7b Correct link on text.brow.sh home page 2018-07-10 09:11:06 +08:00
Thomas Buckley-Houston c457210c72 Refactor disallowed domains in HTTP service 2018-07-09 19:22:51 +08:00
Thomas Buckley-Houston 90078ff6c0 Add --fail and set -e when setting up Browsh
As per @zutto's suggestion in #62

This will at least notify us when something goes wrong during a Docker
build.
2018-07-09 19:21:25 +08:00
Thomas Buckley-Houston 29132f3695 Better attempt to fix Google phishing warnings 2018-07-09 13:51:58 +08:00
Thomas Buckley-Houston 384688302e Quick fix to stop Chrome detecting phishing
Apparently Google isn't happy about
https://html.brow.sh/mail.google.com URLs.
2018-07-09 13:06:50 +08:00
Thomas Buckley-Houston ba373e9815 Change 'texttop' refs to 'browsh' 2018-07-08 17:07:10 +08:00
Thomas Buckley-Houston 160a19ece8 Add arg for HTTP server bind address
Eg; `browsh -http-server-bind 127.0.0.1`

Fixes #57
2018-07-08 15:41:13 +08:00
Thomas Buckley-Houston 26fa4cb3de Use www.brow.sh's HTML service welcome page
It's nice to see the big Browsh logo rather just some boring plain text
2018-07-08 15:33:08 +08:00
Thomas Buckley-Houston 8d8168bfc6 First implementation of bg image for HTML service 2018-07-08 13:52:33 +08:00
Thomas Buckley-Houston 2ea4eb0f8c Better ENTER key UX
This came about from using Slack's web client.

Adding the input boxes padding to the DOM box coords makes the TTY
cursor more closely reflect the actual input box. Also using keyup/down
seems more universally applicable than merely kepress
2018-07-07 18:22:17 +08:00
Thomas Buckley-Houston 7f8893fe14 Add logo to TTY startup. README updates 2018-07-06 13:17:28 +08:00
Thomas Buckley-Houston 752f34ddb3 Redirect HTTP to HTTPS 2018-06-27 17:10:48 +08:00
Thomas Buckley-Houston 16f1917ed8 Basic application-level HTTP rate limiting
Here set to 10 requests per minute. Note that the current implementation
doesn't use a shared store across instances, so in effect clients can
request on average instances-count * 10 requests per minute.
2018-06-26 15:21:10 +08:00
Thomas Buckley-Houston c0c68842f0 Added gzip compression to HTTP server 2018-06-26 13:57:52 +08:00
Thomas Buckley-Houston 2e1de9dab1 Add 10min public cache to HTTP server 2018-06-25 22:06:29 +08:00
Thomas Buckley-Houston 4f637ccddc F1 key to open help tab
Closes #38
2018-06-23 19:27:55 +08:00
Thomas Buckley-Houston 3f6211c8a4 Added robots.txt to ignore everything but / 2018-06-23 19:27:55 +08:00
Thomas Buckley-Houston 70d3f45f60 Extra loggina and README updates 2018-06-23 19:27:15 +08:00
Thomas Buckley-Houston ea53e6b467 Return help message for / request on HTTP service 2018-06-18 20:00:29 +08:00
Thomas Buckley-Houston f0467b61c5 Don't log to STDOUT during HTTP server tests 2018-06-18 19:06:05 +08:00
Thomas Buckley-Houston ffbb182678 Log to STDOUT if running as HTTP service 2018-06-18 18:04:15 +08:00
Thomas Buckley-Houston c70083958f HTTP server: Use whole URI, including query 2018-06-17 21:40:16 +08:00
Thomas Buckley-Houston 3149db4bd3 Add anchor tags to HTTP Server output
This means you can now load the raw text in a browser and the resulting
page will have basic blue links that can be clicked on that will in turn
be loaded by the HTTP service.

A significant feature, so worthy of a minor version bump to;
v1.1.0
2018-06-17 21:26:44 +08:00
Thomas Buckley-Houston c9df161eb6 Don't UPX compress OSX binaries
The current versions of UPX cause an instant crash of the Browsh binary
on OSX :/

Version 1.0.13
2018-06-13 19:37:26 +08:00
Thomas Buckley-Houston fe2ac579a4 Make releases default to published and official 2018-06-12 20:54:10 +08:00
Thomas Buckley-Houston 375a7a16b1 Didn't use glob for freebsd UPX exclusion 2018-06-12 20:47:20 +08:00
Thomas Buckley-Houston 133e176646 Don't compress *any* freebsd binaries
... including ARM ones
2018-06-12 20:37:33 +08:00
Thomas Buckley-Houston c415547c5b Added ARM architecture builds
Touches #12
2018-06-12 19:42:00 +08:00
Thomas Buckley-Houston a8ea195087 Marionette startup: catch error rather than wait
It appears that Firefox doesn't always log its Marionette startup, so
instead this commit catches the network error when Marionette is yet to
start and just retries until Marionette is ready.
2018-06-12 19:38:39 +08:00
Thomas Buckley-Houston 2577ea896b Fixes to get the Docker image building again
Firstly Firefox 60 now throws an error if its run as root inside a
user's home path. Which is great because that revelead my naivety about
using `RUN su user` in the Dockerfile. So now Firefox is running as a
non-root user inside Docker which is what was always best.

Also it turns out that the crude 3 second wait at startup hoping that
Firefox's Marionette had started listening, wasn't good enough. So now
we're actually listening for a log message to know when it's started
now.

Finally make all startup methods use a the post-webext connection state
to send the startup URL to the browser, the other methods just seemed to
flakey.

Includes version bump to 1.0.9
2018-06-12 15:40:49 +08:00
Thomas Buckley-Houston c13e8d26f6 Use absolute path to webextension.go asset
Bump to version 1.0.8
2018-06-11 16:28:00 +08:00
Thomas Buckley-Houston 47bcbbc0a6 Version 1.0.5
Adjust path in .goreleaser.yml

Boot Firefox before any tests to get any 'first launch' behaviour out of
the way.

Remove pacman build as we're using nfpm instead of fpm now.
2018-06-11 14:11:45 +08:00
Thomas Buckley-Houston 0109fa206e Move .goreleaser.yml file 2018-06-10 22:47:49 +08:00
Thomas Buckley-Houston 05c2d9f4f3 Version 1.0.2
Update Firefox version dependency to 60.0
2018-06-10 22:30:44 +08:00
Thomas Buckley-Houston 2f72159670 Goreleaser: replace fpm with nfpm 2018-06-10 21:01:25 +08:00
Thomas Buckley-Houston 98fa8014b9 Added Firefox paths for Windows and OSX
Also updated Gopkg dep versions.

And version bump to 1.0.0pre1!
2018-06-10 20:16:28 +08:00
Thomas Buckley-Houston d6406ac734 Don't forward keypresses when URL box is active
This fixes a bug where pressing return after entering a new URL would
forward the ENTER key to the DOM and sometimes trigger the focussed
result in a Google search.
2018-06-05 16:30:07 +08:00
Thomas Buckley-Houston 12c8a58868 Prevent crash when keys pressed during boot screen 2018-06-05 16:11:46 +08:00
Thomas Buckley-Houston e937f81a60 Added shortcut to toggle a mobile user agent 2018-06-05 14:40:03 +08:00
Thomas Buckley-Houston 5b575110b1 Include role="textbox" elements as an input boxes
This just about allows you to use Gmail
2018-06-04 21:29:43 +08:00
Thomas Buckley-Houston 7232ac120f Bug fix: improved line formatting
There was a long standing problem where random gaps would appear
between lines. The fix was to change a magic number that adds an extra
few pixels to the reported height of the 'em' character dimensions.
Unfortunately I don't know what this magic number actually does. It
might represent the distance between lines?
2018-06-04 17:02:15 +08:00
Thomas Buckley-Houston 02bc0aad93 Hide/Show text using seperate font
Previously we were using CSS to make the text's colour transparent.
However that proved to cause a lot of problems with pre-existing
transition animations in the host webpage. There didn't seem to be
anyway to disable the transition time for text transitioning to
transparent, without also disabling all transitions.

Also added censorship to password input boxes.
2018-06-03 19:54:38 +08:00
Thomas Buckley-Houston c8d5d09de7 First implementation of text selection
This is so you can immediately clear the URL bar upon toggling. Which
saves you holding down the backspace key if you want to ente a new URL.

Only for input boxes. And SHIFT-ARROW isn't implemented.
2018-06-03 13:12:31 +08:00
Thomas Buckley-Houston 55c70d9e5e Multiline text input boxes
No doubt a lot of this code is reinventing the wheel, after all this is
basically now a simple text editor. I'm sure there'll be a few bugs to
iron out.
2018-06-02 18:47:37 +08:00
Thomas Buckley-Houston b78abbf26f Overflow scrolling for single line input boxes
Such a basic thing, that we take it for granted. But it's actually a bit
tricky to implement.
2018-05-28 22:03:33 +08:00
Thomas Buckley-Houston 0fc39a51e6 HTTP Server service: fetches URL, returns raw text
Using the `-http-server` argument will now start Browsh in HTTP Server
mode. It will accept request like this:

  `curl brow.sh/http://news.ycombinator.com`

This will return a plain text version of the Hacker News front page,
with a width of 100 characters, with each line separated by a line
break.
2018-05-27 20:45:43 +08:00
Thomas Buckley-Houston 4b84d52ae1 Backspace goes back in history
Also:
  * Use webextension to navigate URLs instead of the DOM. This means
    that crashed pages can still be navigated away from.
  * An attempt to implement mouse dragndrop, but it doesn't work :(
2018-05-25 18:48:57 +08:00
Thomas Buckley-Houston f2d9d44268 Minor: fix unit and integration tests
Unit tests needed tab objects to be created.

Integration tests needed more max time for start up and to make sure
that the final tab doesn't get closed.
2018-05-25 15:43:22 +08:00
Thomas Buckley-Houston 938d51b692 Tabs! As we all know and love
Adding, cycling, deleting. The width of the tab handle is currently
fixed to 20. And if there are more tabs than can fit in the tab bar then
the extra ones just dissapear off to the right, but they can still be
cycled to with CTRL-Tab.

The marks the end of feature development in preperation for a version
1 release.
2018-05-24 18:45:07 +08:00
Thomas Buckley-Houston 5c7ff71c79 Input boxes, for searches, logins, writing, etc
Input boxes are currently only one line and to not properly wrap. So
textareas are also one line. TBC...

Also includes:
  * First implementation of the DOM MutationObserver. This needs to have
    an eye kept on it in case some websites trigger too mutatation
    events. For now it doesn't seem too bad. Although strangely it seems
    to stop on Youtube after about 15 seconds.
2018-05-20 21:17:33 +08:00
Thomas Buckley-Houston 9dc0f0a08f Webext: default to hiding text in webext
Text in the real browser only needs to be displayed when parsing with
the Text Builder in order to get the text's colour and z-index. Text
parsing should be done in frequently as it likely doesn't change often.
However graphics building of the current viewport is set to
automatically parse ever 250ms and it doesn't need to know anything
about text. So there's no point defaulting to having text on and hiding
it for every graphics frame.

This tweak has improved the perforance of the graphics parsing for small
frames (the same size as the viewport) from around 100ms to around 4ms!

There are still some curious and inexplicable CPU spikes when
scrolling... TBC
2018-05-08 14:07:54 +08:00
Thomas Buckley-Houston 7a8811c526 Webext can now reconnect to a re-opened TTY
Albeit it is quite slow to notice the re-opened TTY client :/
2018-05-08 13:30:08 +08:00
Thomas Buckley-Houston dd4a29f04a Send 'sub-frames' rather than the whole DOM
Firstly, this improves performance on a larger pages. But it also
prevents browser crashes a very large pages by setting a limit to how
much work is done per frame.

Also includes:
  * Thread safe cell map for simultaneously reading and writing to the
    buffered frame of TTY cells.
  * Improved webext tests so that they programmaticlly build DOM rects
    based off simple text strings.
2018-05-05 16:43:10 +08:00
Thomas Buckley-Houston ae44a18cfc Moved URL bar input and mono mode toggle to CLI
Finally fixes integration tests
2018-04-28 19:02:40 +08:00
Thomas Buckley-Houston b605965e77 Move UI building to CLI
* CLI is now prepared for supporting multiple tabs.
  * Refactored global vars into relevant files
  * Now using real types in JSON sent to CLI
  * Still doesn't fix integration tests
2018-04-28 12:18:34 +08:00
Thomas Buckley-Houston ba5ce3c58b Move frame building from webext to CLI
This offloads significant CPU load from the browser. However it's become
clear that the previous feature of parsing the entire DOM needs to have
an upper limit imposed. For instance large Wikipedia pages still cause
problematic CPU load.

This commit does not fix the broken UI so integration tests fail.
2018-04-22 22:59:00 +08:00
Thomas Buckley-Houston c0f5fcca69 Compose frames of whole DOM, for faster scrolling
Instead of mirroring the browser's viewport, as if we had a camera over
the browser, the entire DOM is now sent in the frame. This means that
the CLI itself can scroll without having to wait for updates from the
webextension screenshotter.
2018-04-18 21:11:04 +08:00
Thomas Buckley-Houston 34497c88aa Better test logging 2018-04-07 12:55:05 +08:00
Thomas Buckley-Houston 1acb178fa7 Lots of new integration tests 2018-04-07 11:35:17 +08:00
Thomas Buckley-Houston 3d0b2ec9c8 Split main browsh code into separate files 2018-04-01 17:03:21 +08:00
Thomas Buckley-Houston c0a79caf4e Refactor Browsh Go code into package
This helps with isolating the tests and refactoring the code into
separate files.
2018-04-01 16:31:25 +08:00
Thomas Buckley-Houston 101b10b0e0 Use which when deciding if Firefox binary exists 2018-02-17 16:14:10 +08:00
Thomas Buckley-Houston c9e0a9ecc4 Hack to force true colours 2018-02-17 15:06:11 +08:00
Thomas Buckley-Houston 8b042b2479 Added PAGEUP and PAGEDOWN key movement 2018-02-17 15:02:50 +08:00
Thomas Buckley-Houston 8cf3de33c3 Move integration tests to Golang CLI client
After moving to Tcell and implementing its screen diff updates, we can
no longer watch STDOUT to get frames during integration tests. Instead
we need to use Tcell's SimulationScreen and which has a GetContents()
method. This is actually also a much more robust way of being able to
see what Browsh actually outputs during testing.
2018-02-17 14:10:39 +08:00
Thomas Buckley-Houston b5a083e929 Replaced Termbox-go with Tcell
This was primarily to get native diff'ed frame rendering.
Termbox-go doesn't support true colours, thus the switch to Tcell, but
as it turns out Tcell claims to have wider platform support, so it looks
like an especially good change.

So now the CLI will only try to update the terminal screen when cells
actually change. This has some significant performant gains, especially
when using Browsh over SSH.

Also note that this required a complete change of the frame data
structure sent over the websocket. Previously it was a little
structured, but now it is just a plain 1 dimensional array of pure
strings, even the RGB components are sent as integers in strings. If I
can find a way to unmarshal mixed arrays in  Golang then it'll be worth
sending a mixed JSON array to save some compute overhead.
2018-02-14 10:33:39 +08:00
Thomas Buckley-Houston 8c999b5d54 Exclude freebsd build from UPX compression 2018-02-09 11:47:02 +08:00
Thomas Buckley-Houston 819a29c8b6 Mouse wheel scrolling
Also throttle the frame rate to 40ms/ Previously it was redrawing on
every sent STDIN event.
2018-02-09 10:06:54 +08:00
Thomas Buckley-Houston d2f74cefb8 FreeBSD builds. For @RainbowHackerHorse 2018-02-05 16:57:49 +08:00
Thomas Buckley-Houston cf6cde86f7 Added -startup-url and -time-limit args 2018-02-04 18:26:01 +08:00
Thomas Buckley-Houston fc5e72b191 Do FF's first run during docker *build*
This gets around a few problems caused by the fact that Firefox's first
ever run on a new profile is quiet different from a normal startup. Note
that this only effects Browsh in Docker.
2018-02-04 18:02:39 +08:00
Thomas Buckley-Houston c0e51e6413 Use Browsh-specific FF profile.
Also adds `-debug` flag.
2018-02-03 15:21:58 +08:00
Thomas Buckley-Houston cdab6bde93 Bugfixes to Dockerfile 2018-02-02 17:20:37 +08:00
Thomas Buckley-Houston 7117eb9965 Added screenshot feature: press ALT+P
In the endless struggle to squash a Travis-specific bug, we now have
screenshots. Currently the screenshots are of the custom block font
state, so you can't read the text. But I'm planning on changing the
default state of the page to use a normal font - such that the
frame builder needs to toggle the block font on to build a frame. This
will make it more likely that screenshots will contain actual text.
2018-02-01 17:34:25 +08:00
Thomas Buckley-Houston 74538fed0e Fix for zero-width chars in page titles
Also removes the Mozilla Cliqz disclaimer tab on first startup.
Interestingly it has a carriage return in its HTML page title, which is
of course zero-width. But also the fact that this tab can sometimes load
before the requested tab at startup is a showstopper for automated
tests.
2018-01-31 15:40:43 +08:00
Thomas Buckley-Houston 0b3ff030cd Release v0.2.3 2018-01-30 17:50:55 +08:00
Thomas Buckley-Houston 2985774859 Automate releases 2018-01-28 16:08:19 +08:00
Thomas Buckley-Houston 221aa56869 Log Firefox's core debugging console to stdout
Includes the addition of a function to set Firefox preferences at
startup.
2018-01-24 16:32:52 +08:00
Thomas Buckley-Houston 9a82182a9a Don't use --new-instance, -P when launching FF 2018-01-24 10:59:57 +08:00
Thomas Buckley-Houston 318f5c3c34 First draft of integration tests 2018-01-23 20:04:23 +08:00
Thomas Buckley-Houston b387f66c69 Launch and install webextension from client
This means that Browsh can now be entirely run just by running the CLI
binary. The client launches Firefox as a subprocess, then connects to it
via the Marionette protocol, installs the webextension and finally
triggers a new tab with, currently, the Google homepage in it.

I was trying to set this up for automated testing as well by installing
the built webextension as a temporary addon, because otherwise you need
to sign the extension everytime with a unique semantic version. However
for some reason I can't quite recreate the environment that MDN's
`web-ext` creates. The extension installs fine but fails to load the
`content.js` script, I can't find a backtrace or any other details about
the failure. So for now, we're just going to have to use `web-ext` as
seperate process and have the client connect to that. Which is what one
should do during development anyway, so it's not a huge loss.
2018-01-21 11:56:05 +08:00
Thomas Buckley-Houston 4177bff127 First draft of mouse down/up/click support 2018-01-17 11:00:37 +08:00
Thomas Buckley-Houston 97a36b68b4 First drafy of UI: tabs and URL bar 2018-01-12 21:58:32 +08:00
Thomas Buckley-Houston ad59dc3ce4 Basic up/down scrolling 2018-01-11 12:22:27 +08:00
Thomas Buckley-Houston d2aaa33963 Refactored webext background script 2018-01-10 22:54:51 +08:00
Thomas Buckley-Houston 27e0b2ddc6 First working draft of Golang interfacer
After weighing up the options it seems that Golang's termbox-go TTY
library has better support for terminals, and it's cross-platform out of
the box. So this commit is the first working version where the
interfacer launches a websocket server, makes a connection to the
webextension and listens to STDIN from the CLI, sending all input to the
webextenstion.
2018-01-07 11:21:29 +08:00
Thomas Buckley-Houston d00361f87d First draft of rewrite to Webextension and Rust
This proves that frames can be generated on Firefox using the canvas and
a Tree Walker to examine text nodes. Already with little optimisation
frames don't ever take longer than 200ms to render.

Chrome has a MediaStream of the viewport, hopefully that will prove
performant as well.

This doesn't have functioning text colour detection or text occlusion
support. But early research suggests this will possible by comparing 2
screenshots: one with and the other without rendered text.
2018-01-01 21:50:30 +08:00
Thomas Buckley-Houston 73604f1044 Don't print 'KB OFF' on every render. Prevents glitches in non-KB mode 2016-08-02 19:08:26 +05:30
Thomas Buckley-Houston 1453c01621 Keyboard mode. For terminals with no/bad mouse support.
Closes #5
2016-06-25 22:30:50 +09:00
Thomas Buckley-Houston 576821fa37 Provide CTRL+ALT+Q to cleanly exit 2016-06-03 13:31:00 +09:00
Thomas Buckley-Houston e9f5124a45 'docker run' command for remote install was wrong. 2016-05-22 18:29:58 +09:00
Thomas Buckley-Houston bea7b7c4d0 Change xdotool command for spacebar from 'Space' to 'space' 2016-05-22 09:48:05 +09:00
Thomas Buckley-Houston 09168fc8ea Just some atom-beautify to make code look better 2016-05-21 14:47:02 +09:00