if (typeof browser === 'undefined') { browser = chrome; } /** * @description Report reasons * @type {string[]} */ const reasons = [ 'Cannot click', 'Page contains visual glitches', 'Page is blank', 'Page is laggy', 'Page is not responding', 'Popup showed up', ]; /** * @description Report dialog ID */ const reportDialogId = 'report-dialog'; /** * @description Report dialog outer HTML */ const reportDialogHtml = ` Cookie Dialog Monster ${browser.i18n.getMessage('reportDialog_bodyText')} ${browser.i18n.getMessage('reportDialog_cannotClickOption')} ${browser.i18n.getMessage('reportDialog_pageVisualGlitchOption')} ${browser.i18n.getMessage('reportDialog_blankPageOption')} ${browser.i18n.getMessage('reportDialog_laggyPageOption')} ${browser.i18n.getMessage('reportDialog_pageNotRespondingOption')} ${browser.i18n.getMessage('reportDialog_popupShowUpOption')} ${browser.i18n.getMessage('contextMenu_reportOption')?.replace('...', '')} `; /** * @description Dialog close button click handler * @param {MouseEvent} event */ function closeButtonClickHandler(event) { const dialog = document.getElementById(reportDialogId); event.preventDefault(); dialog?.remove(); } /** * @description Hide report dialog */ function hideReportDialog() { document.getElementById(reportDialogId)?.remove(); } /** * @description Dialog radio input click handler * @param {MouseEvent} event */ function radioClickHandler(event) { const dialog = document.getElementById(reportDialogId); const radios = dialog.getElementsByTagName('report-dialog-radio'); const submitButton = dialog?.getElementsByTagName('report-dialog-submit-button')[0]; for (const radio of radios) { radio.setAttribute('aria-checked', 'false'); } event.preventDefault(); event.currentTarget.setAttribute('aria-checked', 'true'); submitButton.setAttribute('aria-disabled', 'false'); submitButton.addEventListener('click', submitButtonClickHandler); } /** * @description Show report dialog */ function showReportDialog() { const parser = new DOMParser(); const result = parser.parseFromString(reportDialogHtml, 'text/html'); const dialog = result.body.firstElementChild; const closeButton = dialog.getElementsByTagName('report-dialog-close-button')[0]; const link = document.createElement('link'); const radios = dialog.getElementsByTagName('report-dialog-radio'); closeButton.addEventListener('click', closeButtonClickHandler); link.setAttribute('href', 'https://fonts.googleapis.com/css?family=Inter'); link.setAttribute('id', 'report-dialog-font'); link.setAttribute('rel', 'stylesheet'); for (const radio of radios) { radio.addEventListener('click', radioClickHandler); } dispatch({ type: 'INSERT_DIALOG_CSS' }); document.body.appendChild(dialog); dialog.showModal(); if (!document.getElementById('report-dialog-font')) { document.head.appendChild(link); } } /** * @description Dialog submit button click handler * @param {MouseEvent} event */ async function submitButtonClickHandler(event) { event.preventDefault(); const dialog = document.getElementById(reportDialogId); const formView = dialog?.getElementsByTagName('report-dialog-form-view')[0]; const issueButton = dialog?.getElementsByTagName('report-dialog-issue-button')[0]; const option = dialog?.querySelector('report-dialog-radio[aria-checked="true"]'); const reasonIndex = option?.dataset.value; const reason = Number.isNaN(reasonIndex) ? 'Unknown' : reasons[reasonIndex]; const submitView = dialog?.getElementsByTagName('report-dialog-submit-view')[0]; const userAgent = window.navigator.userAgent; const issueUrl = await dispatch({ userAgent, reason, type: 'REPORT' }); formView?.setAttribute('hidden', 'true'); issueButton?.addEventListener('click', () => window.open(issueUrl, '_blank')); submitView?.removeAttribute('hidden'); } /** * @description Listen to messages */ browser.runtime.onMessage.addListener((message) => { const isPage = window === window.top; switch (message.type) { case 'HIDE_REPORT_DIALOG': if (isPage) hideReportDialog(); break; case 'SHOW_REPORT_DIALOG': if (isPage) showReportDialog(); break; default: break; } });