aboutsummaryrefslogtreecommitdiff
path: root/web/script/player
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-27 16:27:29 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-27 16:27:29 +0100
commitefcbc7b810acfe6f84b9b114d8a5735781753ac0 (patch)
treed4663bc808b193187086dc63fe4bd3d56e753ef2 /web/script/player
parent2affa0fc842013b7ed1fd86cb8bd68f71fa6555c (diff)
downloadjellything-efcbc7b810acfe6f84b9b114d8a5735781753ac0.tar
jellything-efcbc7b810acfe6f84b9b114d8a5735781753ac0.tar.bz2
jellything-efcbc7b810acfe6f84b9b114d8a5735781753ac0.tar.zst
fix some double-free bugs in the DOM
Diffstat (limited to 'web/script/player')
-rw-r--r--web/script/player/mod.ts94
-rw-r--r--web/script/player/popup.ts3
-rw-r--r--web/script/player/sync.ts6
3 files changed, 58 insertions, 45 deletions
diff --git a/web/script/player/mod.ts b/web/script/player/mod.ts
index 9457288..c4f4473 100644
--- a/web/script/player/mod.ts
+++ b/web/script/player/mod.ts
@@ -76,21 +76,23 @@ function initialize_player(el: HTMLElement, node_id: string) {
...(kind == "audio" ? volume() : []),
- ...(player.tracks ?? [])
- .map((track, index) => ({ index, track }))
- .filter(({ track }) => get_track_kind(track.kind) == kind)
- .map(({ track, index }): HTMLElement => {
- const active = player.active_tracks.value.find(ts => ts.track_index == index) !== undefined
- const onclick = (button: HTMLElement) => {
- button.textContent = "…"
- player.set_track_enabled(index, !active)
- }
- return e("div",
- e("button", { class: "jsp-track-state", onclick }, active ? "-" : "+"), " ",
- e("span", { class: "jsp-track-name" }, track.name), " ",
- e("span", { class: "jsp-track-lang" }, track.language)
- )
- })
+ player.active_tracks.map(_ =>
+ e("div", ...(player.tracks ?? [])
+ .map((track, index) => ({ index, track }))
+ .filter(({ track }) => get_track_kind(track.kind) == kind)
+ .map(({ track, index }): HTMLElement => {
+ const active = player.active_tracks.value.find(ts => ts.track_index == index) !== undefined
+ const onclick = () => {
+ player.set_track_enabled(index, !active)
+ // TODO show loading indicator
+ }
+ return e("div",
+ e("button", { class: "jsp-track-state", onclick }, active ? "-" : "+"), " ",
+ e("span", { class: "jsp-track-name" }, track.name), " ",
+ e("span", { class: "jsp-track-lang" }, track.language)
+ )
+ })
+ ))
)
)
return button
@@ -103,38 +105,40 @@ function initialize_player(el: HTMLElement, node_id: string) {
e("h2", "Settings"),
e("div", { class: ["jsp-controlgroup", "jsp-playersync-controls"] },
e("h3", "Playersync"),
- sync_state.map(sync => sync
- ? e("div",
- e("span", "Sync enabled."),
- e("button", "Disable", {
- onclick: () => { sync_state.value?.destroy(); sync_state.value = undefined }
- }),
- e("p", "Session ID: ",
- channel_name_copy = e("input", { type: "text", disabled: true, value: sync.name }),
- e("button", "content_paste_go", {
- class: "icon",
+ sync_state.map(sync => {
+ console.log("aaaaa", sync);
+ return sync
+ ? e("div",
+ e("span", "Sync enabled."),
+ e("button", "Disable", {
+ onclick: () => { sync_state.value?.destroy(); sync_state.value = undefined }
+ }),
+ e("p", "Session ID: ",
+ channel_name_copy = e("input", { type: "text", disabled: true, value: sync.name }),
+ e("button", "content_paste_go", {
+ class: "icon",
+ onclick: () => {
+ logger.log("Session ID copied to clipboard.")
+ navigator.clipboard.writeText(channel_name_copy.value)
+ }
+ })
+ ))
+ : e("div",
+ channel_name = e("input", { type: "text", placeholder: "someroom:example.org" }),
+ e("button", "Join", {
onclick: () => {
- logger.log("Session ID copied to clipboard.")
- navigator.clipboard.writeText(channel_name_copy.value)
+ if (!channel_name.value.length) return
+ sync_state.value?.destroy()
+ sync_state.value = new Playersync(player, logger, channel_name.value)
}
- })
- ))
- : e("div",
- channel_name = e("input", { type: "text", placeholder: "someroom:example.org" }),
- e("button", "Join", {
- onclick: () => {
- if (!channel_name.value.length) return
- sync_state.value?.destroy()
- sync_state.value = new Playersync(player, logger, channel_name.value)
- }
- }), e("br"),
- e("button", "Create new session", {
- onclick: () => {
- sync_state.value?.destroy()
- sync_state.value = new Playersync(player, logger)
- }
- }))
- )
+ }), e("br"),
+ e("button", "Create new session", {
+ onclick: () => {
+ sync_state.value?.destroy()
+ sync_state.value = new Playersync(player, logger)
+ }
+ }))
+ })
)
))
return button;
diff --git a/web/script/player/popup.ts b/web/script/player/popup.ts
index d300a5c..dde7ed6 100644
--- a/web/script/player/popup.ts
+++ b/web/script/player/popup.ts
@@ -44,6 +44,9 @@ export class Popup {
const content = this.content!
content.classList.add("jsp-popup-out")
setTimeout(() => {
+ //@ts-ignore i know
+ const child_undo: undefined | (() => void) = content["jsh_undo"]
+ if (child_undo) child_undo()
this.container.removeChild(content)
}, 100)
this.content = undefined
diff --git a/web/script/player/sync.ts b/web/script/player/sync.ts
index 6f2b86f..34a46e3 100644
--- a/web/script/player/sync.ts
+++ b/web/script/player/sync.ts
@@ -1,3 +1,9 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2024 metamuffin <metamuffin.org>
+*/
+/// <reference lib="dom" />
import { Logger } from "../jshelper/src/log.ts";
import { Player } from "./player.ts"