diff --git a/extension/content-script.js b/extension/content-script.js --- a/extension/content-script.js +++ b/extension/content-script.js @@ -154,6 +154,9 @@ var pendingSeekingUpdate = 0; +var titleTagObserver = null; +var oldPageTitle = ""; + addCallback("mpris", "play", function () { playerPlay(); }); @@ -325,6 +328,33 @@ fullscreen: document.fullscreenElement !== null, canSetFullscreen: player.tagName.toLowerCase() === "video" }); + + if (!titleTagObserver) { + + // Observe changes to the tag in case it is updated after the player has started playing + let titleTag = document.querySelector("head > title"); + if (titleTag) { + oldPageTitle = titleTag.innerText; + + titleTagObserver = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + const pageTitle = mutation.target.textContent; + if (pageTitle && oldPageTitle !== pageTitle) { + sendMessage("mpris", "titlechange", { + pageTitle: pageTitle + }); + } + oldPageTitle = pageTitle; + }); + }); + + titleTagObserver.observe(titleTag, { + childList: true, // text content is technically a child node + subtree: true, + characterData: true + }); + } + } } function sendPlayerGone() { @@ -338,6 +368,11 @@ playerMetadata = {}; playerCallbacks = []; sendMessage("mpris", "gone"); + + if (titleTagObserver) { + titleTagObserver.disconnect(); + titleTagObserver = null; + } } function sendPlayerInfo(player, event, payload) { @@ -541,29 +576,6 @@ subtree: true }); - // Observe changes to the <title> tag in case it is updated after the player has started playing - var titleTag = document.querySelector("head > title"); - let oldPageTitle = ""; - if (titleTag) { - var titleObserver = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - var pageTitle = mutation.target.textContent; - if (pageTitle && oldPageTitle !== pageTitle) { - sendMessage("mpris", "titlechange", { - pageTitle: pageTitle - }); - } - oldPageTitle = pageTitle; - }); - }); - - titleObserver.observe(titleTag, { - childList: true, // text content is technically a child node - subtree: true, - characterData: true - }); - } - window.addEventListener("beforeunload", function () { // about to navigate to a different page, tell our extension that the player will be gone shortly // we listen for tab closed in the extension but we don't for navigating away as URL change doesn't