diff --git a/manifest.json b/manifest.json index 538691b..cfad748 100644 --- a/manifest.json +++ b/manifest.json @@ -13,9 +13,6 @@ "default_popup": "popup/popup.html", "default_icon": "images/icon_passport_48.png" }, - "background": { - "service_worker": "background.js" - }, "icons": { "16": "images/icon_passport_16.png", "48": "images/icon_passport_48.png", diff --git a/scripts/content.js b/scripts/content.js index ce5ebba..faa3f6f 100644 --- a/scripts/content.js +++ b/scripts/content.js @@ -1,13 +1,9 @@ -function log_ts(message) { - console.log(new Date().toISOString() + " " + message); -} - async function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } const pathnameRegex = /^\/\w{2}-\w{2}\/n?iv/; -const MAX_SIGNIN_ATTEMPTS = 2; +const MAX_SIGNIN_ATTEMPTS = 1; const PAGE_WAIT_TIME = 5000; let config = { @@ -19,6 +15,7 @@ let config = { }; let minute = 60; let signin_attempts = 0; +let isRunning = false; function isSignInPage() { @@ -51,49 +48,61 @@ function isNotEnglishPage() { } async function switchToEnglishPage() { - log_ts('Changing page to English'); + console.log('Changing page to English'); await chrome.storage.local.set({ "__status": "switching to English" }); window.location.href(window.location.pathname.replace(/^\/\w{2}-{2}/, '/en-us')); - delay(PAGE_WAIT_TIME); + await delay(PAGE_WAIT_TIME); // Should be on English page } async function goToSignInPage() { - log_ts('Going to sign in page') + console.log('Going to sign in page') await chrome.storage.local.set({ "__status": "going to sign in page" }); document.querySelector(".homeSelectionsContainer a[href*='/sign_in']").click(); - delay(PAGE_WAIT_TIME); + await delay(PAGE_WAIT_TIME); // Should be on sign in page } async function enterCredentials() { - if (signin_attempts == MAX_SIGNIN_ATTEMPTS) { - log_ts('Too many sign in attempts'); + if (signin_attempts >= MAX_SIGNIN_ATTEMPTS) { await chrome.storage.local.set({ "__status": "too many sign in attempts" }); return; } - log_ts('Signing in'); + console.log('Signing in'); await chrome.storage.local.set({ "__status": "signing in" }); document.getElementById("user_email").value = config.username; document.getElementById("user_password").value = config.password; - document.querySelector('[for="policy_confirmed"]').click(); + let policyConfirmed = document.querySelector('[for="policy_confirmed"]'); + if (!policyConfirmed.getElementsByTagName('input')[0].checked) { + policyConfirmed.click(); + } document.querySelector("#sign_in_form input[type=submit]").click(); signin_attempts += 1; - delay(PAGE_WAIT_TIME); - // Should be on dashboard page + await delay(PAGE_WAIT_TIME); + if (!isDashboardPage()) { + console.log('Sign in failed'); + await chrome.storage.local.set({ "__status": "sign in failed" }); + return; + } } async function checkDates() { - log_ts('checkDates start'); + console.log('checkDates start'); config.countdown = config.frequency * minute; await chrome.storage.local.set({ "__countdown": config.countdown }); - log_ts('checkDates done'); + console.log('checkDates done'); } async function runner() { + if (isRunning) { + return; + } + isRunning = true; + // console.log('runner start'); + page = window.location.pathname; let isSignIn = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/users\/sign_in/) let isLoggedOut = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv$/) @@ -102,7 +111,6 @@ async function runner() { let isConfirmation = !!page.match(/^\/[a-z]{2}-[a-z]{2}\/(n|)iv\/schedule\/\d{1,}\/appointment\/instructions$/) let isNotEnglish = (isSignIn || isLoggedOut || isDashboard || isAppointment || isConfirmation) && !page.match(/^\/en-/) - // log_ts('runner start'); let prev_config = Object.assign({}, config); let result = await new Promise(resolve => chrome.storage.local.get(null, resolve)); @@ -113,14 +121,15 @@ async function runner() { config.countdown = result['__countdown'] || 0; if (prev_config.activate === null) { - log_ts('Reading config: ' + JSON.stringify(config)); + console.log('Reading config: ' + JSON.stringify(config)); + isRunning = false; return; } let configChanged = false; for (let key in config) { if (config.hasOwnProperty(key) && config[key] !== prev_config[key]) { - log_ts(`Config change: ${key}, ${prev_config[key]} => ${config[key]}`); + console.log(`Config change: ${key}, ${prev_config[key]} => ${config[key]}`); configChanged = true; // reduce countdown if frequency is reduced @@ -134,11 +143,11 @@ async function runner() { if (key === 'activate') { if (config[key]) { - log_ts('Activating extension'); + console.log('Activating extension'); config.countdown = 5; await chrome.storage.local.set({ "__countdown": config.countdown }); } else { - log_ts('Deactivating extension'); + console.log('Deactivating extension'); // reset countdown when deactivating the extension config.countdown = 0; await chrome.storage.local.set({ "__countdown": config.countdown }); @@ -155,30 +164,34 @@ async function runner() { } if (configChanged) { // print whole config - log_ts(JSON.stringify(config)); + console.log(JSON.stringify(config)); } if (!config.activate) { + isRunning = false; return; } if (config.username === "" || config.password === "") { - log_ts('Username or password is empty'); + console.log('Username or password is empty'); await chrome.storage.local.set({ "__status": "missing credentials" }); + isRunning = false; return; } if (config.frequency <= 0) { - log_ts('Frequency is 0 or negative'); + console.log('Frequency is 0 or negative'); await chrome.storage.local.set({ "__status": "invalid frequency" }); + isRunning = false; return; } if (config.countdown > 0) { config.countdown -= 1; - log_ts(`Countdown: ${config.countdown}`); + console.log(`Countdown: ${config.countdown}`); await chrome.storage.local.set({ "__countdown": config.countdown }); await chrome.storage.local.set({ "__status": `waiting, ${config.countdown}s` }); + isRunning = false; return; } @@ -195,7 +208,8 @@ async function runner() { await checkDates(); } - // log_ts('runner done'); + // console.log('runner done'); + isRunning = false; } setInterval(runner, 1000);