diff --git a/myApp.js b/myApp.js index 201f9cb..1f1ba2f 100644 --- a/myApp.js +++ b/myApp.js @@ -124,6 +124,18 @@ const mb = menubar({ }, }); +const executeUnsafeJavaScript = (js) => mb.window.webContents.executeJavaScript(js); + +const setElementHtml = (selector, html) => + // This is caused by a Pretter/eslint mismatch + // eslint-disable-next-line implicit-arrow-linebreak + executeUnsafeJavaScript( + `document.querySelector("${escapeQuotes(selector)}").innerHTML = "${escapeQuotes(html).replace( + /\n/g, + '\\n', + )}"`, + ); + function openSettingsPage() { // eslint-disable-next-line no-underscore-dangle if (!mb._isVisible) { @@ -132,24 +144,16 @@ function openSettingsPage() { if (store.analytics) { visitor.pageview('/settings').send(); } - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-header-content").classList.remove("empty")', ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-header-content").innerHTML = "Settings"', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-content").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript('document.getElementById("detail-view").style.left = 0'); - mb.window.webContents.executeJavaScript('document.body.style.overflow = "hidden"'); + setElementHtml('#detail-header-content', 'Settings'); + setElementHtml('#detail-content', ''); + executeUnsafeJavaScript('document.getElementById("detail-view").style.left = 0'); + executeUnsafeJavaScript('document.body.style.overflow = "hidden"'); const lightString = "'light'"; const darkString = "'dark'"; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - 'Theme', - )}"`, - ); + setElementHtml('#detail-headline', 'Theme'); let settingsString = ''; const theme = `
Light
Dark
`; if (store.user_id && store.username) { @@ -207,19 +211,10 @@ function openSettingsPage() { } else { settingsString = theme; } - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${escapeQuotes(settingsString)}` + - '"', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("light-mode").classList.remove("active")', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("dark-mode").classList.remove("active")', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("${store.theme}-mode").classList.add("active")`, - ); + setElementHtml('#detail-content', `${settingsString}`); + executeUnsafeJavaScript('document.getElementById("light-mode").classList.remove("active")'); + executeUnsafeJavaScript('document.getElementById("dark-mode").classList.remove("active")'); + executeUnsafeJavaScript(`document.getElementById("${store.theme}-mode").classList.add("active")`); } function openAboutPage() { @@ -230,20 +225,14 @@ function openAboutPage() { if (store.analytics) { visitor.pageview('/about').send(); } - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-header-content").classList.remove("empty")', ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-header-content").innerHTML = "About GitDock ⚓️"', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-content").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript('document.getElementById("detail-view").style.left = 0'); - mb.window.webContents.executeJavaScript('document.body.style.overflow = "hidden"'); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-headline").innerHTML = "About GitDock ⚓️"', - ); + setElementHtml('#detail-header-content', 'About GitDock ⚓️'); + setElementHtml('#detail-content', ''); + executeUnsafeJavaScript('document.getElementById("detail-view").style.left = 0'); + executeUnsafeJavaScript('document.body.style.overflow = "hidden"'); + setElementHtml('#detail-headline', 'About GitDock ⚓️'); let aboutString = '

GitDock is a MacOS/Windows/Linux app that displays all your GitLab activities in one place. Instead of the GitLab typical project- or group-centric approach, it collects all your information from a user-centric perspective.

'; aboutString += @@ -253,9 +242,7 @@ function openAboutPage() { aboutString += '

If you are thinking about contributing directly, check out our contribution guidelines.

'; aboutString += `

Version ${version}

`; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${aboutString}"`, - ); + setElementHtml('#detail-content', `${aboutString}`); } function setupLinuxContextMenu(baseMenuItems) { @@ -326,16 +313,16 @@ function chooseCertificate() { }, 200); if (filepaths) { const filepath = filepaths[0].replace(/\\/g, '/'); // convert \ to / otherwise separators get lost on windows - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("custom-cert-path-button").classList.add("hidden")', ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( `document.getElementById("custom-cert-path-text").innerText="${filepath}"`, ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("custom-cert-path-text").classList.remove("hidden")', ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("custom-cert-path-reset").classList.remove("hidden")', ); } @@ -351,9 +338,7 @@ function repaintShortcuts() { shortcut += ``; } shortcut += ''; - mb.window.webContents.executeJavaScript( - `document.getElementById("shortcut").innerHTML = "${escapeQuotes(shortcut)}"`, - ); + setElementHtml('#shortcut', shortcut); } function base64URLEncode(str) { @@ -449,14 +434,12 @@ async function getUser() { avatarUrl.href += '?width=64'; } } - const userString = `
${escapeHtml( user.name, )}@${escapeHtml(user.username)}
`; - mb.window.webContents.executeJavaScript( - `document.getElementById("user").innerHTML = "${escapeQuotes(userString)}"`, - ); + setElementHtml('#user', userHtml); lastUserExecution = Date.now(); lastUserExecutionFinished = true; } else { @@ -466,11 +449,10 @@ async function getUser() { } function displayUsersProjects() { - let favoriteProjectsString = ''; + let favoriteProjectsHtml = ''; const projects = store['favorite-projects']; if (projects && projects.length > 0) { - favoriteProjectsString += - ''; } else { const projectLink = "'project-overview-link'"; - favoriteProjectsString = `
Track projects you care about 🌟
Add any project you want a directly accessible shortcut for.
`; + favoriteProjectsHtml = `
Track projects you care about 🌟
Add any project you want a directly accessible shortcut for.
`; } - mb.window.webContents.executeJavaScript( - `document.getElementById("projects").innerHTML = "${escapeQuotes(favoriteProjectsString)}"`, - ); + setElementHtml('#projects', favoriteProjectsHtml); } async function getUsersProjects() { @@ -551,16 +531,11 @@ function getBookmarks() { )}')">${removeIcon}`; }); bookmarksString += ``; - mb.window.webContents.executeJavaScript( - `document.getElementById("bookmarks").innerHTML = "${escapeQuotes(bookmarksString)}"`, - ); } else { const bookmarkLink = "'bookmark-link'"; bookmarksString = `
Add a new GitLab bookmark 🔖
Bookmarks are helpful when you have an issue/merge request you will have to come back to repeatedly.
`; - mb.window.webContents.executeJavaScript( - `document.getElementById("bookmarks").innerHTML = "${escapeQuotes(bookmarksString)}"`, - ); } + setElementHtml('#bookmarks', bookmarksString); } async function getRecentlyVisited() { @@ -638,9 +613,7 @@ async function getRecentlyVisited() { recentlyVisitedString = '

No browsers are supported on your operating system yet.

'; } - mb.window.webContents.executeJavaScript( - `document.getElementById("history").innerHTML = "${escapeQuotes(recentlyVisitedString)}"`, - ); + setElementHtml('#history', recentlyVisitedString); lastRecentlyVisitedExecution = Date.now(); lastRecentlyVisitedExecutionFinished = true; }); @@ -726,27 +699,17 @@ async function getLastPipelines(commits) { } function displayAddError(type, target, customMessage) { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( `document.getElementById("add-${type}${target}error").style.display = "block"`, ); if (customMessage) { - mb.window.webContents.executeJavaScript( - `document.getElementById("add-${type}${target}error").innerHTML = "${customMessage}"`, - ); + setElementHtml(`#add-${type}${target}error`, customMessage); } else { - mb.window.webContents.executeJavaScript( - `document.getElementById("add-${type}${target}error").innerHTML = "This is not a valid GitLab ${type} URL."`, - ); + setElementHtml(`#add-${type}${target}error`, `This is not a valid GitLab ${type} URL.`); } - mb.window.webContents.executeJavaScript( - `document.getElementById("${type}${target}add-button").disabled = false`, - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("${type}${target}link").disabled = false`, - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("${type}${target}add-button").innerHTML = "Add"`, - ); + executeUnsafeJavaScript(`document.getElementById("${type}${target}add-button").disabled = false`); + executeUnsafeJavaScript(`document.getElementById("${type}${target}link").disabled = false`); + setElementHtml(`#${type}${target}add-button`, 'Add'); } function displayPagination(keysetLinks, type) { @@ -862,20 +825,17 @@ function displayCommit(commit, project, focus = 'project') { )} ago · ${subline}${logo}`; } +function renderNoCommitsPushedYetMessage() { + setElementHtml('#commits-pagination', ''); + setElementHtml('#pipeline', '

You haven't pushed any commits yet.

'); +} + async function getCommitDetails(projectId, sha, index) { - mb.window.webContents.executeJavaScript( - 'document.getElementById("commits-count").classList.remove("empty")', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("commits-count").innerHTML = "${index}/${recentCommits.length}"`, - ); + executeUnsafeJavaScript('document.getElementById("commits-count").classList.remove("empty")'); + setElementHtml('#commits-count', `${index}/${recentCommits.length}`); const project = await GitLab.get(`projects/${projectId}`); const commit = await GitLab.get(`projects/${project.id}/repository/commits/${sha}`); - mb.window.webContents.executeJavaScript( - `document.getElementById("pipeline").innerHTML = "${escapeQuotes( - displayCommit(commit, project), - )}"`, - ); + setElementHtml('#pipeline', displayCommit(commit, project)); } async function getLastCommits(count = 20) { @@ -903,24 +863,10 @@ async function getLastCommits(count = 20) { recentCommits = committedArray; getCommitDetails(committedArray[0].project_id, committedArray[0].push_data.commit_to, 1); } else { - mb.window.webContents.executeJavaScript( - 'document.getElementById("commits-pagination").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("pipeline").innerHTML = "${escapeQuotes( - '

You haven't pushed any commits yet.

', - )}"`, - ); + renderNoCommitsPushedYetMessage(); } } else { - mb.window.webContents.executeJavaScript( - 'document.getElementById("commits-pagination").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("pipeline").innerHTML = "${escapeQuotes( - '

You haven't pushed any commits yet.

', - )}"`, - ); + renderNoCommitsPushedYetMessage(); } lastLastCommitsExecution = Date.now(); lastLastCommitsExecutionFinished = true; @@ -954,14 +900,11 @@ async function getRecentComments() { // eslint-disable no-restricted-syntax */ const moreString = "'Comments'"; recentCommentsString += ``; - mb.window.webContents.executeJavaScript( - `document.getElementById("comments").innerHTML = "${escapeQuotes(recentCommentsString)}"`, - ); + setElementHtml('#comments', recentCommentsString); } else { - mb.window.webContents.executeJavaScript( - `document.getElementById("comments").innerHTML = "${escapeQuotes( - '

You haven't written any comments yet.

', - )}"`, + setElementHtml( + '#comments', + '

You haven't written any comments yet.

', ); } lastRecentCommentsExecution = Date.now(); @@ -1120,25 +1063,11 @@ async function getProjectCommits(project, count = 20) { }); const pagination = `
Commits
1/${recentProjectCommits.length}
`; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes(pagination)}"`, - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("project-pipeline").innerHTML = "${escapeQuotes( - displayCommit(commit, project, 'author'), - )}"`, - ); + setElementHtml('#detail-headline', pagination); + setElementHtml('#project-pipeline', displayCommit(commit, project, 'author')); } else { - mb.window.webContents.executeJavaScript( - `document.getElementById("project-commits-pagination").innerHTML = "${escapeQuotes( - 'Commits', - )}"`, - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("project-pipeline").innerHTML = "${escapeQuotes( - '

No commits pushed yet.

', - )}"`, - ); + setElementHtml('#project-commits-pagination', 'Commits'); + setElementHtml('#project-pipeline', '

No commits pushed yet.

'); } } @@ -1164,19 +1093,14 @@ function changeCommit(forward, commitArray, chosenCommit) { } async function getProjectCommitDetails(projectId, sha, index) { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("project-commits-count").classList.remove("empty")', ); - mb.window.webContents.executeJavaScript( - `document.getElementById("project-commits-count").innerHTML = "${index}/${recentProjectCommits.length}"`, - ); + setElementHtml('#project-commits-count', `${index}/${recentProjectCommits.length}`); const commit = await GitLab.get(`projects/${projectId}/repository/commits/${sha}`); - mb.window.webContents.executeJavaScript( - `document.getElementById("project-pipeline").innerHTML = "${escapeQuotes( - displayCommit(commit, currentProject, 'author'), - )}"`, - ); + + setElementHtml('#project-pipeline', displayCommit(commit, currentProject, 'author')); } async function getMoreRecentlyVisited() { @@ -1193,11 +1117,11 @@ async function getMoreRecentlyVisited() { } return -1; }); - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - '', - )}"`, + setElementHtml( + '#detail-headline', + '', ); + let previousDate = 0; for (let j = 0; j < item.length; j += 1) { const { title } = item[j]; @@ -1209,18 +1133,19 @@ async function getMoreRecentlyVisited() { url.includes('/-/epics/'); const wasNotProcessed = !moreRecentlyVisitedArray.some((object) => object.title === title); const ignoredTitlePrefixes = [ - 'Not Found ', - 'New Issue ', - 'New Merge Request ', - 'New merge request ', - 'New Epic ', - 'Edit ', - 'Merge requests ', - 'Issues ', + 'Not Found', + 'New Issue', + 'New Merge Request', + 'New merge request', + 'New Epic', + 'Edit', + 'Merge Conflicts', + 'Merge requests', + 'Issues', '500 Error - GitLab', 'Checking your Browser - GitLab', ]; - const titlePrefix = (title || '').split('·')[0]; + const titlePrefix = (title || '').split('·')[0].trim(); if ( title && isHostUrl && @@ -1277,11 +1202,7 @@ async function getMoreRecentlyVisited() { } } recentlyVisitedString += ''; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${escapeQuotes( - recentlyVisitedString, - )}"`, - ); + setElementHtml('#detail-content', recentlyVisitedString); }); } @@ -1314,9 +1235,7 @@ function searchRecentlyVisited(searchterm) { )}`; }); foundString += ''; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${escapeQuotes(foundString)}"`, - ); + setElementHtml('#detail-content', foundString); } function getMoreRecentComments( @@ -1340,11 +1259,7 @@ function getMoreRecentComments( } /* eslint-enable */ recentCommentsString += `${displayPagination(keysetLinks, type)}`; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${escapeQuotes( - recentCommentsString, - )}"`, - ); + setElementHtml('#detail-content', recentCommentsString); }); } @@ -1392,9 +1307,7 @@ function getIssues( const illustration = todosAllDoneIllustration; issuesString = `
${illustration}

No issues with the specified criteria.

`; } - mb.window.webContents.executeJavaScript( - `document.getElementById("${id}").innerHTML = "${escapeQuotes(issuesString)}"`, - ); + setElementHtml(`#${id}`, issuesString); }); } @@ -1432,9 +1345,7 @@ function getMRs( const illustration = todosAllDoneIllustration; mrsString = `
${illustration}

No merge requests with the specified criteria.

`; } - mb.window.webContents.executeJavaScript( - `document.getElementById("${id}").innerHTML = "${escapeQuotes(mrsString)}"`, - ); + setElementHtml(`#${id}`, mrsString); }); } @@ -1477,9 +1388,7 @@ function getTodos( const illustration = todosAllDoneIllustration; todosString = `
${illustration}

Take the day off, you have no To-Dos!

`; } - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${escapeQuotes(todosString)}"`, - ); + setElementHtml('#detail-content', todosString); }); } @@ -1492,9 +1401,7 @@ function setupEmptyProjectPage() { emptyPage += '
Merge requests
'; emptyPage += '
'; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-content").innerHTML = "${escapeQuotes(emptyPage)}"`, - ); + setElementHtml('#detail-content', emptyPage); } function displayProjectPage(project) { @@ -1504,19 +1411,21 @@ function displayProjectPage(project) { } else { logo = `
${project.name.charAt(0).toUpperCase()}
`; } - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-header-content").classList.remove("empty")', ); - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-header-content").innerHTML = "${escapeQuotes( - '
', - )}${escapeQuotes(logo)}${escapeQuotes('')}${escapeHtml( - project.name, - )}${escapeQuotes('')}${escapeHtml( - project.namespace.name, - )}${escapeQuotes('
`)}"`, + setElementHtml( + '#detail-header-content', + `
+ ${logo} + ${escapeHtml(project.name)} + + ${escapeHtml(project.namespace.name)} + +
+ `, ); } @@ -1550,11 +1459,7 @@ async function getProjectIssues(project) { projectIssuesString = ''; projectIssuesString += ``; } - mb.window.webContents.executeJavaScript( - `document.getElementById("project-recent-issues").innerHTML = "${escapeQuotes( - projectIssuesString, - )}"`, - ); + setElementHtml('#project-recent-issues', projectIssuesString); } async function getProjectMRs(project) { @@ -1588,9 +1493,7 @@ async function getProjectMRs(project) { projectMRsString = ''; projectMRsString += ``; } - mb.window.webContents.executeJavaScript( - `document.getElementById("project-recent-mrs").innerHTML = "${escapeQuotes(projectMRsString)}"`, - ); + setElementHtml('#project-recent-mrs', projectMRsString); } function addBookmark(link) { @@ -1603,15 +1506,9 @@ function addBookmark(link) { } const spinner = ''; - mb.window.webContents.executeJavaScript( - 'document.getElementById("bookmark-add-button").disabled = "disabled"', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("bookmark-link").disabled = "disabled"', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("bookmark-add-button").innerHTML = "${escapeQuotes(spinner)} Add"`, - ); + executeUnsafeJavaScript('document.getElementById("bookmark-add-button").disabled = "disabled"'); + executeUnsafeJavaScript('document.getElementById("bookmark-link").disabled = "disabled"'); + setElementHtml('#bookmark-add-button', `${spinner} Add`); if (GitLab.urlHasValidHost(link)) { GitLab.parseUrl(link) .then((bookmark) => { @@ -1652,17 +1549,13 @@ function addProject(link, target) { } const spinner = ''; - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( `document.getElementById("project${newTarget}add-button").disabled = "disabled"`, ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( `document.getElementById("project${newTarget}link").disabled = "disabled"`, ); - mb.window.webContents.executeJavaScript( - `document.getElementById("project${newTarget}add-button").innerHTML = "${escapeQuotes( - spinner, - )} Add"`, - ); + setElementHtml(`#project${newTarget}add-button`, `${spinner} Add`); if (GitLab.urlHasValidHost(link)) { GitLab.parseUrl(link) .then((object) => { @@ -1721,15 +1614,9 @@ function addShortcut(link) { store.shortcuts = store.shortcuts.concat(tempArray); const spinner = ''; - mb.window.webContents.executeJavaScript( - 'document.getElementById("shortcut-add-button").disabled = "disabled"', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("shortcut-link").disabled = "disabled"', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("shortcut-add-button").innerHTML = "${escapeQuotes(spinner)} Add"`, - ); + executeUnsafeJavaScript('document.getElementById("shortcut-add-button").disabled = "disabled"'); + executeUnsafeJavaScript('document.getElementById("shortcut-link").disabled = "disabled"'); + setElementHtml('#shortcut-add-button', `${spinner} Add`); setupCommandPalette(); repaintShortcuts(); } @@ -1737,42 +1624,28 @@ function addShortcut(link) { function startBookmarkDialog() { const bookmarkLink = "'bookmark-link'"; const bookmarkInput = `
`; - mb.window.webContents.executeJavaScript( - 'document.getElementById("add-bookmark-dialog").classList.add("opened")', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("add-bookmark-dialog").innerHTML = "${escapeQuotes(bookmarkInput)}"`, - ); - mb.window.webContents.executeJavaScript('window.scrollBy(0, 14)'); - mb.window.webContents.executeJavaScript('document.getElementById("bookmark-link").focus()'); + executeUnsafeJavaScript('document.getElementById("add-bookmark-dialog").classList.add("opened")'); + setElementHtml('#add-bookmark-dialog', bookmarkInput); + executeUnsafeJavaScript('window.scrollBy(0, 14)'); + executeUnsafeJavaScript('document.getElementById("bookmark-link").focus()'); } function startProjectDialog() { const projectLink = "'project-settings-link'"; const projectInput = `
`; - mb.window.webContents.executeJavaScript( - 'document.getElementById("add-project-dialog").classList.add("opened")', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("add-project-dialog").innerHTML = "${escapeQuotes(projectInput)}"`, - ); - mb.window.webContents.executeJavaScript('window.scrollBy(0, 14)'); - mb.window.webContents.executeJavaScript( - 'document.getElementById("project-settings-link").focus()', - ); + executeUnsafeJavaScript('document.getElementById("add-project-dialog").classList.add("opened")'); + setElementHtml('#add-project-dialog', projectInput); + executeUnsafeJavaScript('window.scrollBy(0, 14)'); + executeUnsafeJavaScript('document.getElementById("project-settings-link").focus()'); } function startShortcutDialog() { const shortcutLink = "'shortcut-link'"; const shortcutInput = `
`; - mb.window.webContents.executeJavaScript( - 'document.getElementById("add-shortcut-dialog").classList.add("opened")', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("add-shortcut-dialog").innerHTML = "${escapeQuotes(shortcutInput)}"`, - ); - mb.window.webContents.executeJavaScript('window.scrollBy(0, 14)'); - mb.window.webContents.executeJavaScript('document.getElementById("shortcut-link").focus()'); + executeUnsafeJavaScript('document.getElementById("add-shortcut-dialog").classList.add("opened")'); + setElementHtml('#add-shortcut-dialog', shortcutInput); + executeUnsafeJavaScript('window.scrollBy(0, 14)'); + executeUnsafeJavaScript('document.getElementById("shortcut-link").focus()'); } function displaySkeleton(count, pagination = false, id = 'detail-content') { @@ -1787,32 +1660,20 @@ function displaySkeleton(count, pagination = false, id = 'detail-content') { '
  • '; } skeletonString += ''; - mb.window.webContents.executeJavaScript( - `document.getElementById("${id}").innerHTML = "${escapeQuotes(skeletonString)}"`, - ); + setElementHtml(`#${id}`, skeletonString); } function changeTheme(option = 'light', manual = false) { store.theme = option; if (option === 'light') { - mb.window.webContents.executeJavaScript( - 'document.documentElement.setAttribute("data-theme", "light");', - ); + executeUnsafeJavaScript('document.documentElement.setAttribute("data-theme", "light");'); } else if (option === 'dark') { - mb.window.webContents.executeJavaScript( - 'document.documentElement.setAttribute("data-theme", "dark");', - ); + executeUnsafeJavaScript('document.documentElement.setAttribute("data-theme", "dark");'); } if (manual) { - mb.window.webContents.executeJavaScript( - 'document.getElementById("light-mode").classList.remove("active")', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("dark-mode").classList.remove("active")', - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("${option}-mode").classList.add("active")`, - ); + executeUnsafeJavaScript('document.getElementById("light-mode").classList.remove("active")'); + executeUnsafeJavaScript('document.getElementById("dark-mode").classList.remove("active")'); + executeUnsafeJavaScript(`document.getElementById("${option}-mode").classList.add("active")`); } } @@ -1876,20 +1737,15 @@ if (store.access_token && store.user_id && store.username) { } ipcMain.on('detail-page', (event, arg) => { - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-headline").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-content").innerHTML = ""', - ); + setElementHtml('#detail-headline', ''); + setElementHtml('#detail-content', ''); if (arg.page === 'Project') { if (store.analytics) { visitor.pageview('/project').send(); } - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - `
    Commits
    `, - )}"`, + setElementHtml( + '#detail-headline', + `
    Commits
    `, ); setupEmptyProjectPage(); const project = JSON.parse(arg.object); @@ -1899,12 +1755,10 @@ ipcMain.on('detail-page', (event, arg) => { getProjectIssues(project); getProjectMRs(project); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-header-content").classList.remove("empty")', ); - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-header-content").innerHTML = "${arg.page}"`, - ); + setElementHtml('#detail-header-content', arg.page); if (arg.page === 'Issues') { if (store.analytics) { visitor.pageview('/my-issues').send(); @@ -1912,14 +1766,16 @@ ipcMain.on('detail-page', (event, arg) => { const issuesQuerySelect = `
    Assigned
    `; const issuesStateSelect = `
    Open
    `; const issuesSortSelect = `
    Sort by recently created
    `; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - '', - )}${arg.page}${escapeQuotes('
    ')}${escapeQuotes( - issuesQuerySelect, - )}${escapeQuotes(issuesStateSelect)}${escapeQuotes(issuesSortSelect)}
    "`, + setElementHtml( + '#detail-headline', + `${arg.page} +
    + ${issuesQuerySelect} + ${issuesStateSelect} + ${issuesSortSelect} +
    `, ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-headline").classList.add("with-overflow")', ); displaySkeleton(numberOfIssues); @@ -1935,14 +1791,16 @@ ipcMain.on('detail-page', (event, arg) => { mrsQuerySelect += ``; const mrsStateSelect = `
    Open
    `; const mrsSortSelect = `
    Sort by recently created
    `; - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - '', - )}${arg.page}${escapeQuotes('
    ')}${escapeQuotes( - mrsQuerySelect, - )}${escapeQuotes(mrsStateSelect)}${escapeQuotes(mrsSortSelect)}
    "`, + setElementHtml( + '#detail-headline', + `${arg.page} +
    + ${mrsQuerySelect} + ${mrsStateSelect} + ${mrsSortSelect} +
    `, ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-headline").classList.add("with-overflow")', ); displaySkeleton(numberOfMRs); @@ -1951,17 +1809,14 @@ ipcMain.on('detail-page', (event, arg) => { if (store.analytics) { visitor.pageview('/my-to-do-list').send(); } - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - '', - )}${arg.page}"`, - ); - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-header-content").innerHTML = "${arg.page}${escapeQuotes( - '`, - )}"`, + setElementHtml('#detail-headline', `${arg.page}`); + setElementHtml( + '#detail-header-content', + `${arg.page}`, ); displaySkeleton(numberOfTodos); getTodos(); @@ -1975,11 +1830,7 @@ ipcMain.on('detail-page', (event, arg) => { if (store.analytics) { visitor.pageview('/my-comments').send(); } - mb.window.webContents.executeJavaScript( - `document.getElementById("detail-headline").innerHTML = "${escapeQuotes( - '', - )}${arg.page}"`, - ); + setElementHtml('#detail-headline', `${arg.page}`); displaySkeleton(numberOfComments); getMoreRecentComments(); } @@ -1995,18 +1846,12 @@ ipcMain.on('sub-detail-page', (event, arg) => { let openChecked = ' checked'; let allChanged = ''; const project = JSON.parse(arg.project); - mb.window.webContents.executeJavaScript( - 'document.getElementById("sub-detail-headline").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("sub-detail-content").innerHTML = ""', - ); - mb.window.webContents.executeJavaScript( + setElementHtml('#sub-detail-headline', ''); + setElementHtml('#sub-detail-content', ''); + executeUnsafeJavaScript( 'document.getElementById("sub-detail-header-content").classList.remove("empty")', ); - mb.window.webContents.executeJavaScript( - `document.getElementById("sub-detail-header-content").innerHTML = "${arg.page}"`, - ); + setElementHtml('#sub-detail-header-content', arg.page); if (arg.page === 'Issues') { if (store.analytics) { visitor.pageview('/project/issues').send(); @@ -2021,14 +1866,16 @@ ipcMain.on('sub-detail-page', (event, arg) => { const issuesQuerySelect = `
    All
    `; const issuesStateSelect = `
    ${activeState}
    `; const issuesSortSelect = `
    Sort by recently created
    `; - mb.window.webContents.executeJavaScript( - `document.getElementById("sub-detail-headline").innerHTML = "${escapeQuotes( - '', - )}${arg.page}${escapeQuotes('
    ')}${escapeQuotes( - issuesQuerySelect, - )}${escapeQuotes(issuesStateSelect)}${escapeQuotes(issuesSortSelect)}
    "`, + setElementHtml( + '#sub-detail-headline', + `${arg.page} +
    + ${issuesQuerySelect} + ${issuesStateSelect} + ${issuesSortSelect} +
    `, ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("sub-detail-headline").classList.add("with-overflow")', ); displaySkeleton(numberOfIssues, undefined, 'sub-detail-content'); @@ -2050,14 +1897,16 @@ ipcMain.on('sub-detail-page', (event, arg) => { const mrsQuerySelect = `
    All
    `; const mrsStateSelect = `
    ${activeState}
    `; const mrsSortSelect = `
    Sort by recently created
    `; - mb.window.webContents.executeJavaScript( - `document.getElementById("sub-detail-headline").innerHTML = "${escapeQuotes( - '', - )}${arg.page}${escapeQuotes('
    ')}${escapeQuotes( - mrsQuerySelect, - )}${escapeQuotes(mrsStateSelect)}${escapeQuotes(mrsSortSelect)}
    "`, + setElementHtml( + '#sub-detail-headline', + `${arg.page} +
    + ${mrsQuerySelect} + ${mrsStateSelect} + ${mrsSortSelect} +
    `, ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("sub-detail-headline").classList.add("with-overflow")', ); displaySkeleton(numberOfMRs, undefined, 'sub-detail-content'); @@ -2082,15 +1931,13 @@ ipcMain.on('go-to-overview', () => { getRecentComments(); displayUsersProjects(); getBookmarks(); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-headline").classList.remove("with-overflow")', ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("detail-header-content").classList.add("empty")', ); - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-header-content").innerHTML = ""', - ); + setElementHtml('#detail-header-content', ''); activeIssuesQueryOption = 'assigned_to_me'; activeIssuesStateOption = 'opened'; activeIssuesSortOption = 'created_at'; @@ -2120,48 +1967,42 @@ ipcMain.on('switch-issues', (event, arg) => { if (arg.type === 'query' && arg.label !== activeIssuesQueryOption) { activeIssuesQueryOption = arg.label; displaySkeleton(numberOfIssues, undefined, id); - mb.window.webContents.executeJavaScript( - `document.getElementById("issues-query-active").innerHTML = "${arg.text}"`, - ); + setElementHtml('#issues-query-active', arg.text); if ( (isOnSubPage === false && arg.label !== 'assigned_to_me') || (isOnSubPage === true && arg.label !== 'all') ) { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("issues-query-active").classList.add("changed")', ); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("issues-query-active").classList.remove("changed")', ); } } else if (arg.type === 'state' && arg.label !== activeIssuesStateOption) { activeIssuesStateOption = arg.label; displaySkeleton(numberOfIssues, undefined, id); - mb.window.webContents.executeJavaScript( - `document.getElementById("issues-state-active").innerHTML = "${arg.text}"`, - ); + setElementHtml('#issues-state-active', arg.text); if (arg.label !== 'opened') { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("issues-state-active").classList.add("changed")', ); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("issues-state-active").classList.remove("changed")', ); } } else if (arg.type === 'sort' && arg.label !== activeIssuesSortOption) { activeIssuesSortOption = arg.label; displaySkeleton(numberOfIssues, undefined, id); - mb.window.webContents.executeJavaScript( - `document.getElementById("issues-sort-active").innerHTML = "${arg.text}"`, - ); + setElementHtml('#issues-sort-active', arg.text); if (arg.label !== 'created_at') { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("issues-sort-active").classList.add("changed")', ); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("issues-sort-active").classList.remove("changed")', ); } @@ -2183,15 +2024,13 @@ ipcMain.on('switch-mrs', (event, arg) => { if (arg.type === 'query' && arg.label !== activeMRsQueryOption) { activeMRsQueryOption = arg.label; displaySkeleton(numberOfMRs, undefined, id); - mb.window.webContents.executeJavaScript( - `document.getElementById("mrs-query-active").innerHTML = "${arg.text}"`, - ); + setElementHtml('#mrs-query-active', arg.text); if (arg.label !== 'all') { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("mrs-query-active").classList.add("changed")', ); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("mrs-query-active").classList.remove("changed")', ); } @@ -2199,30 +2038,26 @@ ipcMain.on('switch-mrs', (event, arg) => { if (arg.type === 'state' && arg.label !== activeMRsStateOption) { activeMRsStateOption = arg.label; displaySkeleton(numberOfMRs, undefined, id); - mb.window.webContents.executeJavaScript( - `document.getElementById("mrs-state-active").innerHTML = "${arg.text}"`, - ); + setElementHtml('#mrs-state-active', arg.text); if (arg.label !== 'opened') { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("mrs-state-active").classList.add("changed")', ); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("mrs-state-active").classList.remove("changed")', ); } } else if (arg.type === 'sort' && arg.label !== activeMRsSortOption) { activeMRsSortOption = arg.label; displaySkeleton(numberOfMRs, undefined, id); - mb.window.webContents.executeJavaScript( - `document.getElementById("mrs-sort-active").innerHTML = "${arg.text}"`, - ); + setElementHtml('#mrs-sort-active', arg.text); if (arg.label !== 'created_at') { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("mrs-sort-active").classList.add("changed")', ); } else { - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript( 'document.getElementById("mrs-sort-active").classList.remove("changed")', ); } @@ -2264,9 +2099,7 @@ ipcMain.on('switch-page', (event, arg) => { }); ipcMain.on('search-recent', (event, arg) => { - mb.window.webContents.executeJavaScript( - 'document.getElementById("detail-content").innerHTML = ""', - ); + setElementHtml('#detail-content', ''); searchRecentlyVisited(arg); }); @@ -2278,10 +2111,9 @@ ipcMain.on('change-commit', (event, arg) => { visitor.event('Navigate my commits', 'previous').send(); } } - mb.window.webContents.executeJavaScript( - `document.getElementById("pipeline").innerHTML = "${escapeQuotes( - '
    ', - )}"`, + setElementHtml( + '#pipeline', + '
    ', ); const nextCommit = changeCommit(arg, recentCommits, currentCommit); currentCommit = nextCommit; @@ -2296,10 +2128,9 @@ ipcMain.on('change-project-commit', (event, arg) => { visitor.event('Navigate project commits', 'previous').send(); } } - mb.window.webContents.executeJavaScript( - `document.getElementById("project-pipeline").innerHTML = "${escapeQuotes( - '
    ', - )}"`, + setElementHtml( + '#project-pipeline', + '
    ', ); const nextCommit = changeCommit(arg, recentProjectCommits, currentProjectCommit); currentProjectCommit = nextCommit; @@ -2417,10 +2248,8 @@ ipcMain.on('choose-certificate', () => { }); ipcMain.on('reset-certificate', () => { - mb.window.webContents.executeJavaScript( - 'document.getElementById("custom-cert-path-text").innerText=""', - ); - mb.window.webContents.executeJavaScript( + executeUnsafeJavaScript('document.getElementById("custom-cert-path-text").innerText=""'); + executeUnsafeJavaScript( 'document.getElementById("custom-cert-path-text").classList.add("hidden")', ); chooseCertificate();