diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23da5b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +web-ext-artifacts \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4b07f77 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# BC100 Autofill \ No newline at end of file diff --git a/content_script.js b/content_script.js index b0acd01..ff72c91 100644 --- a/content_script.js +++ b/content_script.js @@ -1,55 +1,42 @@ +"use strict"; // Put all the javascript code here, that you want to execute after page load. let bcFilled = false; let bdayFilled = false; -let clickThroughForms = false; +let currentStage; -function clickContinue() { - if (bdayFilled && bcFilled) { - document.querySelector('.fahrgastrechte-bahn-card-auswahl button.fahrgastrechte-continue-button')?.dispatchEvent(new Event('click')); +function executeStage(node) { + if (node.nodeType === 1) { + if (currentStage === undefined) { + currentStage = stages.shift(); + } + if (currentStage.match(node)) { + console.log(currentStage.name, "matched"); + console.log(currentStage.name, currentStage.execute(node) ? "executed" : "execution failed"); + if (stages.length > 0) { + currentStage = stages.shift(); + } else { + observer.disconnect(); + } + } else { + console.log(currentStage.name, "did not match"); + } } } + 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); - } - } - }) + mutation.addedNodes.forEach(executeStage); } } - clickContinue(); } - +let clickThroughForms; 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 }) @@ -58,25 +45,98 @@ const addObserver = () => { addObserver(); -async function fillBcnum() { - let bcNumberInput = document.querySelector('input[name=fahrgastrechte-bahn-card-nummer]'); +const startClaim = { + name: "startClaim", + match: node => node.classList.contains("antrag-starten"), + execute: node => { + const startenButton = node.querySelector('button.test-antrag-starten-button'); + if (startenButton instanceof HTMLButtonElement) { + startenButton.dispatchEvent(new Event('click', { bubbles: true })); + return true; + } + return false; + } +} + +function fillBcnum(bcNumberInput) { 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; + return true; } }) + return false; } -async function fillBday() { - let birthdayInput = document.querySelector('input[name=fahrgastrechte-bahn-card-auswahl-geburts-datum'); +function fillBday(birthdayInput) { browser.storage.sync.get('bday').then(v => { - bDay = v.bday || null; + const bDay = v.bday || null; if (bDay !== null && bDay !== "") { birthdayInput.value = bDay; birthdayInput.dispatchEvent(new Event('input', { bubbles: true })); bdayFilled = true; + return true; } }) -} \ No newline at end of file + return false; +} + +const fillData = { + name: "fillData", + match: node => node.classList.contains("fahrgastrechte-bahn-card-auswahl"), + execute: node => { + let bcNumField, bdayField; + node.querySelectorAll('input').forEach(e => { + if (e.name === "fahrgastrechte-bahn-card-nummer") { + bcNumField = e; + } else if (e.name === "fahrgastrechte-bahn-card-auswahl-geburts-datum") { + bdayField = e; + } + }) + fillBcnum(bcNumField); + fillBday(bdayField); + return true; + } +} + +const clickContinue = { + name: "clickContinue", + match: () => true, + execute: e => { + const continueButton = document.querySelector('.fahrgastrechte-bahn-card-auswahl button.fahrgastrechte-continue-button'); + if (continueButton instanceof Element) { + continueButton.dispatchEvent(new Event('click')); + return true; + } + return false; + } + +} + +const iWasDelayed = { + name: "iWasDelayed", + match: node => node.classList.contains("antrags-typ-auswahl") && clickThroughForms, + execute: node => { + const delay = node.querySelector('input#antragstyp-verspaetung'); + if (delay instanceof HTMLInputElement) { + delay.dispatchEvent(new Event('change')); + return true; + } + return false; + } +} + +const moreThan60Minutes = { + name: "moreThan60Minutes", + match: node => node.classList.contains("verspaetungs-auswahl") && clickThroughForms, + execute: node => node.querySelector('#verspaetungstyp-mehr-als-stunde').dispatchEvent(new Event('change')) +} +const continueToForm = { + name: "continueToForm", + match: node => node.classList.contains("verspaetung-bestaetigung") && clickThroughForms, + execute: node => node.querySelector('button.fahrgastrechte-continue-button').dispatchEvent(new Event('click', { bubbles: true })) +} +let stages = [ + startClaim, fillData, clickContinue, iWasDelayed, moreThan60Minutes, continueToForm +]; diff --git a/manifest.json b/manifest.json index 5e4ef88..c7a2455 100644 --- a/manifest.json +++ b/manifest.json @@ -2,14 +2,16 @@ "manifest_version": 2, "name": "BC100 Autofill", "description": "Autofills your BahnCard 100 number and birthday into the passenger rights claim form.", - "version": "0.0.1", + "version": "0.0.2", "icons": { "64": "icons/icon.png" }, "content_scripts": [ { "matches": [ - "https://www.bahn.de/buchung/fahrgastrechte?einstiegtyp=BC100" + "https://www.bahn.de/buchung/fahrgastrechte?einstiegtyp=BC100", + "https://www.bahn.de/buchung/fahrgastrechte?lang=*&einstiegtyp=BC100", + "https://int.bahn.de/*/buchung/fahrgastrechte?einstiegtyp=BC100" ], "js": [ "content_script.js" diff --git a/options/index.html b/options/index.html index e7f730b..a3892d0 100644 --- a/options/index.html +++ b/options/index.html @@ -8,21 +8,25 @@
- +