Compare commits

...

2 commits

Author SHA1 Message Date
Magnus Åhall
2098da3417 Implemented configurable debugging port, bumped to v2 2025-11-10 10:18:34 +01:00
Magnus Åhall
5a15824ed5 Nicer handling of dead tabs, introduced version. 2025-11-10 10:02:34 +01:00
3 changed files with 45 additions and 23 deletions

39
main.go
View file

@ -7,6 +7,7 @@ import (
"embed" "embed"
"encoding/json" "encoding/json"
"flag" "flag"
"fmt"
"html/template" "html/template"
"io" "io"
"log" "log"
@ -16,10 +17,12 @@ import (
"strings" "strings"
) )
const VERSION = "v2"
var ( var (
flagVerbose bool flagVerbose bool
flagWsURL string flagVersion bool
flagWatch string flagDebuggingPort int
//go:embed static //go:embed static
fs embed.FS fs embed.FS
@ -27,10 +30,15 @@ var (
func main() { func main() {
flag.BoolVar(&flagVerbose, "v", false, "verbose") flag.BoolVar(&flagVerbose, "v", false, "verbose")
flag.StringVar(&flagWsURL, "ws", "ws://127.0.0.1:9222", "devtools url") flag.BoolVar(&flagVersion, "version", false, "Print version and exit")
flag.StringVar(&flagWatch, "watch", "", "Files to watch") flag.IntVar(&flagDebuggingPort, "port", 9222, "Chrome debugging port")
flag.Parse() flag.Parse()
if flagVersion {
fmt.Println(VERSION)
return
}
http.HandleFunc("/", pageIndex) http.HandleFunc("/", pageIndex)
http.HandleFunc("/css/main.css", pageCSS) http.HandleFunc("/css/main.css", pageCSS)
@ -44,7 +52,7 @@ func main() {
http.ListenAndServe("[::]:5123", nil) http.ListenAndServe("[::]:5123", nil)
} }
func replaceTilde(str string) string {// {{{ func replaceTilde(str string) string { // {{{
homedir, err := os.UserHomeDir() homedir, err := os.UserHomeDir()
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -56,7 +64,7 @@ func replaceTilde(str string) string {// {{{
} }
return str return str
}// }}} } // }}}
func pageIndex(w http.ResponseWriter, r *http.Request) { // {{{ func pageIndex(w http.ResponseWriter, r *http.Request) { // {{{
var tmpl *template.Template var tmpl *template.Template
@ -70,7 +78,11 @@ func pageIndex(w http.ResponseWriter, r *http.Request) { // {{{
return return
} }
tmpl.Execute(w, sites) data := map[string]any{
"Sites": sites,
"VERSION": VERSION,
}
tmpl.Execute(w, data)
} // }}} } // }}}
func pageCSS(w http.ResponseWriter, r *http.Request) { // {{{ func pageCSS(w http.ResponseWriter, r *http.Request) { // {{{
w.Header().Add("Content-Type", "text/css") w.Header().Add("Content-Type", "text/css")
@ -85,7 +97,7 @@ func pageCSS(w http.ResponseWriter, r *http.Request) { // {{{
} // }}} } // }}}
func actionSites(w http.ResponseWriter, r *http.Request) { // {{{ func actionSites(w http.ResponseWriter, r *http.Request) { // {{{
j, _ := json.Marshal(struct { j, _ := json.Marshal(struct {
OK bool OK bool
Sites map[string]*Site Sites map[string]*Site
}{ }{
true, true,
@ -94,17 +106,17 @@ func actionSites(w http.ResponseWriter, r *http.Request) { // {{{
w.Write(j) w.Write(j)
} // }}} } // }}}
func actionBrowserStart(w http.ResponseWriter, r *http.Request) {// {{{ func actionBrowserStart(w http.ResponseWriter, r *http.Request) { // {{{
body, _ := io.ReadAll(r.Body) body, _ := io.ReadAll(r.Body)
userDataDir := replaceTilde(string(body)) userDataDir := replaceTilde(string(body))
browser := exec.Command("google-chrome", "--user-data-dir="+string(userDataDir), "--remote-debugging-port=9222") browser := exec.Command("google-chrome", "--user-data-dir="+string(userDataDir), fmt.Sprintf("--remote-debugging-port=%d", flagDebuggingPort))
err := browser.Start() err := browser.Start()
if err != nil { if err != nil {
log.Println(err) log.Println(err)
} else { } else {
go browser.Wait() go browser.Wait()
} }
}// }}} } // }}}
func actionStart(w http.ResponseWriter, r *http.Request) { // {{{ func actionStart(w http.ResponseWriter, r *http.Request) { // {{{
var req struct { var req struct {
URL string URL string
@ -127,7 +139,8 @@ func actionStart(w http.ResponseWriter, r *http.Request) { // {{{
var site Site var site Site
expandedWatch := replaceTilde(req.Watch) expandedWatch := replaceTilde(req.Watch)
site, err = NewSite(flagWsURL, req.URL, expandedWatch) wsURL := fmt.Sprintf("ws://127.0.0.1:%d", flagDebuggingPort)
site, err = NewSite(wsURL, req.URL, expandedWatch)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
} }

View file

@ -3,6 +3,12 @@ body {
margin: 32px; margin: 32px;
} }
#version {
position: absolute;
right: 16px;
top: 16px;
}
input { input {
font-size: 1em; font-size: 1em;
} }

View file

@ -44,8 +44,9 @@
for (const uuid of Object.keys(json.Sites)) { for (const uuid of Object.keys(json.Sites)) {
const site = json.Sites[uuid] const site = json.Sites[uuid]
if (site.StopLoop) { if (site.StopLoop) {
document.querySelector(`.url[data-uuid="${uuid}"]`)?.classList.add('dead') const els = document.querySelectorAll(`[data-uuid="${uuid}"]`)
document.querySelector(`.watch[data-uuid="${uuid}"]`)?.classList.add('dead') for (const el of els)
el.remove()
} }
} }
}) })
@ -64,6 +65,7 @@
</script> </script>
<body> <body>
<div id="version">{{ .VERSION }}</div>
<div class="browser"> <div class="browser">
<h1>Browser</h1> <h1>Browser</h1>
<input type="text" class="user-data-dir" placeholder="~/.local/share/chrome-dev"> <input type="text" class="user-data-dir" placeholder="~/.local/share/chrome-dev">
@ -81,14 +83,15 @@
<input type="text" class="new watch" placeholder="~/example.com/css/"> <input type="text" class="new watch" placeholder="~/example.com/css/">
<button onclick="newSite()">Start</button> <button onclick="newSite()">Start</button>
{{ range . }} {{ range .Sites }}
{{ if .StopLoop }} {{ if .StopLoop }}
{{ continue }} {{ continue }}
{{ end }} {{ end }}
<div class="line"></div> <div class="line" data-uuid="{{ .UUID }}"></div>
<div class="url {{ if .StopLoop }}dead{{ end }}" data-uuid="{{ .UUID }}">{{ .URL }}</div> <div class="url" data-uuid="{{ .UUID }}">{{ .URL }}</div>
<div class="watch {{ if .StopLoop }}dead{{ end }}" data-uuid="{{ .UUID }}">{{ .Watch }}</div> <div class="watch" data-uuid="{{ .UUID }}">{{ .Watch }}</div>
<div class="stop" onclick="stopSite('{{ .UUID }}')">{{ if not .StopLoop }}❌{{ end }}</div> <div class="stop" onclick="stopSite('{{ .UUID }}')" data-uuid="{{ .UUID }}">{{ if not .StopLoop }}❌{{
end }}</div>
{{ end }} {{ end }}
</div> </div>
<script>init()</script> <script>init()</script>