commit 8d34088021b1c29d69baed941e4705d575dfb074 Author: iw0 Date: Fri Oct 13 20:48:11 2023 +0200 initial commit diff --git a/content_script.js b/content_script.js new file mode 100644 index 0000000..b0acd01 --- /dev/null +++ b/content_script.js @@ -0,0 +1,82 @@ +// Put all the javascript code here, that you want to execute after page load. + +let bcFilled = false; +let bdayFilled = false; +let clickThroughForms = false; + +function clickContinue() { + if (bdayFilled && bcFilled) { + document.querySelector('.fahrgastrechte-bahn-card-auswahl button.fahrgastrechte-continue-button')?.dispatchEvent(new Event('click')); + } +} + +function processMutations(mutationList, observer) { + for (const mutation of mutationList) { + if (mutation.type === "childList") { + mutation.addedNodes.forEach(node => { + if (node.nodeType === 1) { + if (node.classList.contains("antrag-starten")) { + node.querySelector('button.test-antrag-starten-button').dispatchEvent(new Event('click', { bubbles: true })); + } + else if (node.classList.contains("fahrgastrechte-bahn-card-auswahl")) { + node.querySelectorAll('input').forEach(e => { + if (e.name === "fahrgastrechte-bahn-card-nummer") { + fillBcnum().then(clickContinue); + } else if (e.name === "fahrgastrechte-bahn-card-auswahl-geburts-datum") { + fillBday().then(clickContinue); + } + }) + } + if (clickThroughForms) { + if (node.classList.contains("antrags-typ-auswahl")) { + node.querySelector('input#antragstyp-verspaetung').dispatchEvent(new Event('change')); + } else if (node.classList.contains("verspaetungs-auswahl")) { + node.querySelector('#verspaetungstyp-mehr-als-stunde').dispatchEvent(new Event('change')); + } else if (node.classList.contains("verspaetung-bestaetigung")) { + node.querySelector('button.fahrgastrechte-continue-button').dispatchEvent(new Event('click', { bubbles: true })); + } + } else { + console.log(node); + } + } + }) + } + } + clickContinue(); +} + +let observer = new MutationObserver(processMutations); +const addObserver = () => { + browser.storage.sync.get('autocontinue').then(v => { + clickThroughForms = !!v.autocontinue; + }).then(() => { + observer.observe(document.body, { + childList: true, subtree: true + }) + }) +}; + +addObserver(); + +async function fillBcnum() { + let bcNumberInput = document.querySelector('input[name=fahrgastrechte-bahn-card-nummer]'); + browser.storage.sync.get('bcnum').then(v => { + let bcNum = v.bcnum || null; + if (bcNum !== null && bcNum !== "") { + bcNumberInput.value = bcNum; + bcNumberInput.dispatchEvent(new Event('input', { bubbles: true })); + bcFilled = true; + } + }) +} +async function fillBday() { + let birthdayInput = document.querySelector('input[name=fahrgastrechte-bahn-card-auswahl-geburts-datum'); + browser.storage.sync.get('bday').then(v => { + bDay = v.bday || null; + if (bDay !== null && bDay !== "") { + birthdayInput.value = bDay; + birthdayInput.dispatchEvent(new Event('input', { bubbles: true })); + bdayFilled = true; + } + }) +} \ No newline at end of file diff --git a/icons/icon.png b/icons/icon.png new file mode 100644 index 0000000..063cfa8 Binary files /dev/null and b/icons/icon.png differ diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..5e4ef88 --- /dev/null +++ b/manifest.json @@ -0,0 +1,30 @@ +{ + "manifest_version": 2, + "name": "BC100 Autofill", + "description": "Autofills your BahnCard 100 number and birthday into the passenger rights claim form.", + "version": "0.0.1", + "icons": { + "64": "icons/icon.png" + }, + "content_scripts": [ + { + "matches": [ + "https://www.bahn.de/buchung/fahrgastrechte?einstiegtyp=BC100" + ], + "js": [ + "content_script.js" + ] + } + ], + "permissions": [ + "storage" + ], + "options_ui": { + "page": "options/index.html" + }, + "browser_specific_settings": { + "gecko": { + "id": "bc100-autofill@iw0.name" + } + } +} \ No newline at end of file diff --git a/options/index.html b/options/index.html new file mode 100644 index 0000000..e7f730b --- /dev/null +++ b/options/index.html @@ -0,0 +1,28 @@ + + + + + + + + + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + + + \ No newline at end of file diff --git a/options/script.js b/options/script.js new file mode 100644 index 0000000..b3b8a22 --- /dev/null +++ b/options/script.js @@ -0,0 +1,29 @@ +async function saveOptions(e) { + console.log("Saving options."); + e.preventDefault(); + let bcNum = document.querySelector("#bcnum").value; + let bDay = document.querySelector('#birthday').value; + let autoContinue = document.querySelector('#autocontinue').checked; + let options = { + bcnum: bcNum, + bday: bDay, + autocontinue: autoContinue + }; + await browser.storage.sync.set(options); + console.log("Saved!"); +} + +async function restoreOptions() { + // We do not save user data in managed storage. + // let res = await browser.storage.managed.get('colour'); + // document.querySelector("#managed-colour").innerText = res.colour; + + settings = await browser.storage.sync.get(); + console.log(settings); + document.querySelector("#bcnum").value = settings.bcnum || ""; + document.querySelector("#birthday").value = settings.bday || ""; + document.querySelector("#autocontinue").checked = settings.autocontinue || false; +} + +document.addEventListener('DOMContentLoaded', restoreOptions); +document.querySelector("form").addEventListener("submit", saveOptions); \ No newline at end of file diff --git a/options/style.css b/options/style.css new file mode 100644 index 0000000..001d5c5 --- /dev/null +++ b/options/style.css @@ -0,0 +1,3 @@ +h1 { + font-style: italic; +}