diff --git a/e2e/specs/mattermost/back_button.test.js b/e2e/specs/mattermost/back_button.test.js new file mode 100644 index 00000000..24f41dec --- /dev/null +++ b/e2e/specs/mattermost/back_button.test.js @@ -0,0 +1,94 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +'use strict'; + +const fs = require('fs'); + +const env = require('../../modules/environment'); +const {asyncSleep} = require('../../modules/utils'); + +describe('Menu/window_menu', function desc() { + this.timeout(30000); + + const config = { + ...env.demoConfig, + teams: [ + { + name: 'community', + url: 'https://community.mattermost.com', + order: 0, + tabs: [ + { + name: 'TAB_MESSAGING', + order: 0, + isOpen: true, + }, + { + name: 'TAB_FOCALBOARD', + order: 1, + isOpen: true, + }, + { + name: 'TAB_PLAYBOOKS', + order: 2, + isOpen: true, + }, + ], + lastActiveTab: 0, + }, + ], + }; + + beforeEach(async () => { + env.cleanDataDir(); + env.createTestUserDataDir(); + env.cleanTestConfig(); + fs.writeFileSync(env.configFilePath, JSON.stringify(config)); + await asyncSleep(1000); + this.app = await env.getApp(); + this.serverMap = await env.getServerMap(this.app); + }); + + afterEach(async () => { + if (this.app) { + await this.app.close(); + } + }); + + it('MM-T2633 Back button should behave as expected', async () => { + const mainWindow = this.app.windows().find((window) => window.url().includes('index')); + const loadingScreen = this.app.windows().find((window) => window.url().includes('loadingScreen')); + await loadingScreen.waitForSelector('.LoadingScreen', {state: 'hidden'}); + const firstServer = this.serverMap[`${config.teams[0].name}___TAB_MESSAGING`].win; + + await firstServer.click('a:has-text("OneLogin")'); + let backButton = await mainWindow.waitForSelector('button:has-text("Back")'); + backButton.should.not.be.null; + let poweredByOneLogin = await firstServer.waitForSelector('a:has-text("Powered by OneLogin")'); + poweredByOneLogin.should.not.be.null; + + await backButton.click(); + let loginPrompt = await firstServer.waitForSelector('#loginId'); + loginPrompt.should.not.be.null; + await mainWindow.waitForSelector('button:has-text("Back")', {state: 'hidden'}); + + let isNewWindow = false; + this.app.on('window', () => { + isNewWindow = true; + }); + const oneLoginUrl = firstServer.url(); + await firstServer.click('a:has-text("OneLogin")'); + poweredByOneLogin = await firstServer.waitForSelector('a:has-text("Powered by OneLogin")'); + poweredByOneLogin.click(); + backButton = await mainWindow.waitForSelector('button:has-text("Back")'); + backButton.should.not.be.null; + const frameUrl = firstServer.url(); + frameUrl.should.not.equal(oneLoginUrl); + isNewWindow.should.be.false; + + await backButton.click(); + await backButton.click(); + loginPrompt = await firstServer.waitForSelector('#loginId'); + loginPrompt.should.not.be.null; + }); +}); diff --git a/package-lock.json b/package-lock.json index 629e7d84..61e05915 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,6 +80,7 @@ "jest": "27.5.1", "jest-junit": "13.1.0", "mini-css-extract-plugin": "2.6.0", + "mocha-circleci-reporter": "0.0.3", "node-gyp": "9.0.0", "npm-run-all": "4.1.5", "playwright": "1.20.2", @@ -12567,6 +12568,15 @@ "node": ">=6" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -13821,6 +13831,15 @@ "which": "^1.2.9" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -14501,6 +14520,15 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -22861,6 +22889,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -23346,6 +23385,160 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, + "node_modules/mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha-circleci-reporter": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mocha-circleci-reporter/-/mocha-circleci-reporter-0.0.3.tgz", + "integrity": "sha512-sZHmd+HH0pgQjTdk0itV2+RSOikqLo7kravRLKTmzcvyu9lA69pXd4KLAv5NMcF4c3EnSatX0iBSM4gSXFYjEw==", + "dev": true, + "dependencies": { + "mocha": "^5.1.1", + "mocha-junit-reporter": "^1.17.0" + } + }, + "node_modules/mocha-junit-reporter": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz", + "integrity": "sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.0" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha-junit-reporter/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha-junit-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha-junit-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/mocha-junit-reporter/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/mocha/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mocha/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/modify-filename": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", @@ -39123,7 +39316,7 @@ "dev": true, "requires": { "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.2.1", + "@electron/universal": "1.2.0", "@malept/flatpak-bundler": "^0.4.0", "7zip-bin": "~5.1.1", "async-exit-hook": "^2.0.1", @@ -40964,6 +41157,12 @@ "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", "dev": true }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -41937,6 +42136,12 @@ "which": "^1.2.9" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -42436,6 +42641,12 @@ } } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -48905,6 +49116,17 @@ } } }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -49298,6 +49520,138 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mocha-circleci-reporter": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mocha-circleci-reporter/-/mocha-circleci-reporter-0.0.3.tgz", + "integrity": "sha512-sZHmd+HH0pgQjTdk0itV2+RSOikqLo7kravRLKTmzcvyu9lA69pXd4KLAv5NMcF4c3EnSatX0iBSM4gSXFYjEw==", + "dev": true, + "requires": { + "mocha": "^5.1.1", + "mocha-junit-reporter": "^1.17.0" + } + }, + "mocha-junit-reporter": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz", + "integrity": "sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "modify-filename": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", diff --git a/package.json b/package.json index 5384f96d..7225e5e4 100644 --- a/package.json +++ b/package.json @@ -155,6 +155,7 @@ "jest": "27.5.1", "jest-junit": "13.1.0", "mini-css-extract-plugin": "2.6.0", + "mocha-circleci-reporter": "0.0.3", "node-gyp": "9.0.0", "npm-run-all": "4.1.5", "playwright": "1.20.2", diff --git a/src/common/utils/url.ts b/src/common/utils/url.ts index b7b23fc9..fd0defef 100644 --- a/src/common/utils/url.ts +++ b/src/common/utils/url.ts @@ -223,4 +223,5 @@ export default { isTrustedURL, isCustomLoginURL, isChannelExportUrl, + isUrlType, }; diff --git a/src/main/utils.test.js b/src/main/utils.test.js index 7626ff54..614fb2fc 100644 --- a/src/main/utils.test.js +++ b/src/main/utils.test.js @@ -97,4 +97,14 @@ describe('main/utils', () => { expect(Utils.getLocalURLString('index.html', null, true)).toStrictEqual('file:///path/to/app/dist/index.html'); }); }); + + describe('shouldHaveBackBar', () => { + it('should have back bar for custom logins', () => { + expect(Utils.shouldHaveBackBar('https://server-1.com', 'https://server-1.com/login/sso/saml')).toBe(true); + }); + + it('should not have back bar for regular login', () => { + expect(Utils.shouldHaveBackBar('https://server-1.com', 'https://server-1.com/login')).toBe(false); + }); + }); }); diff --git a/src/main/utils.ts b/src/main/utils.ts index c0676716..a96a518b 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -8,7 +8,8 @@ import {app, BrowserWindow} from 'electron'; import {Args} from 'types/args'; -import {BACK_BAR_HEIGHT, PRODUCTION, TAB_BAR_HEIGHT} from 'common/utils/constants'; +import {BACK_BAR_HEIGHT, customLoginRegexPaths, PRODUCTION, TAB_BAR_HEIGHT} from 'common/utils/constants'; +import UrlUtils from 'common/utils/url'; import Utils from 'common/utils/util'; export function shouldBeHiddenOnStartup(parsedArgv: Args) { @@ -37,6 +38,28 @@ export function getAdjustedWindowBoundaries(width: number, height: number, hasBa }; } +export function shouldHaveBackBar(serverUrl: URL | string, inputURL: URL | string) { + if (UrlUtils.isUrlType('login', serverUrl, inputURL)) { + const serverURL = UrlUtils.parseURL(serverUrl); + const subpath = serverURL ? serverURL.pathname : ''; + const parsedURL = UrlUtils.parseURL(inputURL); + if (!parsedURL) { + return false; + } + const urlPath = parsedURL.pathname; + const replacement = subpath.endsWith('/') ? '/' : ''; + const replacedPath = urlPath.replace(subpath, replacement); + for (const regexPath of customLoginRegexPaths) { + if (replacedPath.match(regexPath)) { + return true; + } + } + + return false; + } + return !UrlUtils.isTeamUrl(serverUrl, inputURL) && !UrlUtils.isAdminUrl(serverUrl, inputURL); +} + export function getLocalURLString(urlPath: string, query?: Map, isMain?: boolean) { let pathname; const processPath = isMain ? '' : '/renderer'; diff --git a/src/main/views/MattermostView.test.js b/src/main/views/MattermostView.test.js index 5f6c7fde..2cc3d007 100644 --- a/src/main/views/MattermostView.test.js +++ b/src/main/views/MattermostView.test.js @@ -9,6 +9,7 @@ import MessagingTabView from 'common/tabs/MessagingTabView'; import * as WindowManager from '../windows/windowManager'; import * as appState from '../appState'; +import Utils from '../utils'; import {MattermostView} from './MattermostView'; @@ -44,6 +45,7 @@ jest.mock('../utils', () => ({ getWindowBoundaries: jest.fn(), getLocalPreload: (file) => file, composeUserAgent: () => 'Mattermost/5.0.0', + shouldHaveBackBar: jest.fn(), })); const server = new MattermostServer('server_name', 'http://server-1.com'); @@ -280,11 +282,13 @@ describe('main/views/MattermostView', () => { }); it('should hide back button on internal url', () => { + Utils.shouldHaveBackBar.mockReturnValue(false); mattermostView.handleDidNavigate(null, 'http://server-1.com/path/to/channels'); expect(WindowManager.sendToRenderer).toHaveBeenCalledWith(TOGGLE_BACK_BUTTON, false); }); it('should show back button on external url', () => { + Utils.shouldHaveBackBar.mockReturnValue(true); mattermostView.handleDidNavigate(null, 'http://server-2.com/some/other/path'); expect(WindowManager.sendToRenderer).toHaveBeenCalledWith(TOGGLE_BACK_BUTTON, true); }); diff --git a/src/main/views/MattermostView.ts b/src/main/views/MattermostView.ts index 9d2743fc..b9e97654 100644 --- a/src/main/views/MattermostView.ts +++ b/src/main/views/MattermostView.ts @@ -26,7 +26,7 @@ import {TabView} from 'common/tabs/TabView'; import {ServerInfo} from 'main/server/serverInfo'; import ContextMenu from '../contextMenu'; -import {getWindowBoundaries, getLocalPreload, composeUserAgent} from '../utils'; +import {getWindowBoundaries, getLocalPreload, composeUserAgent, shouldHaveBackBar} from '../utils'; import WindowManager from '../windows/windowManager'; import * as appState from '../appState'; @@ -217,7 +217,7 @@ export class MattermostView extends EventEmitter { this.status = Status.WAITING_MM; this.removeLoading = setTimeout(this.setInitialized, MAX_LOADING_SCREEN_SECONDS, true); this.emit(LOAD_SUCCESS, this.tab.name, loadURL); - this.setBounds(getWindowBoundaries(this.window, !(urlUtils.isTeamUrl(this.tab.url || '', this.view.webContents.getURL()) || urlUtils.isAdminUrl(this.tab.url || '', this.view.webContents.getURL())))); + this.setBounds(getWindowBoundaries(this.window, shouldHaveBackBar(this.tab.url || '', this.view.webContents.getURL()))); }; } @@ -226,7 +226,7 @@ export class MattermostView extends EventEmitter { const request = typeof requestedVisibility === 'undefined' ? true : requestedVisibility; if (request && !this.isVisible) { this.window.addBrowserView(this.view); - this.setBounds(getWindowBoundaries(this.window, !(urlUtils.isTeamUrl(this.tab.url || '', this.view.webContents.getURL()) || urlUtils.isAdminUrl(this.tab.url || '', this.view.webContents.getURL())))); + this.setBounds(getWindowBoundaries(this.window, shouldHaveBackBar(this.tab.url || '', this.view.webContents.getURL()))); if (this.status === Status.READY) { this.focus(); } @@ -341,15 +341,14 @@ export class MattermostView extends EventEmitter { handleDidNavigate = (event: Event, url: string) => { log.debug('MattermostView.handleDidNavigate', {tabName: this.tab.name, url}); - const isUrlTeamUrl = urlUtils.isTeamUrl(this.tab.url || '', url) || urlUtils.isAdminUrl(this.tab.url || '', url); - if (isUrlTeamUrl) { - this.setBounds(getWindowBoundaries(this.window)); - WindowManager.sendToRenderer(TOGGLE_BACK_BUTTON, false); - log.info('hide back button'); - } else { + if (shouldHaveBackBar(this.tab.url || '', url)) { this.setBounds(getWindowBoundaries(this.window, true)); WindowManager.sendToRenderer(TOGGLE_BACK_BUTTON, true); log.info('show back button'); + } else { + this.setBounds(getWindowBoundaries(this.window)); + WindowManager.sendToRenderer(TOGGLE_BACK_BUTTON, false); + log.info('hide back button'); } } diff --git a/src/main/windows/windowManager.test.js b/src/main/windows/windowManager.test.js index 2ef14543..fe135d31 100644 --- a/src/main/windows/windowManager.test.js +++ b/src/main/windows/windowManager.test.js @@ -53,6 +53,7 @@ jest.mock('common/tabs/TabView', () => ({ })); jest.mock('../utils', () => ({ getAdjustedWindowBoundaries: jest.fn(), + shouldHaveBackBar: jest.fn(), })); jest.mock('../views/viewManager', () => ({ ViewManager: jest.fn(), diff --git a/src/main/windows/windowManager.ts b/src/main/windows/windowManager.ts index 279e258f..29719b08 100644 --- a/src/main/windows/windowManager.ts +++ b/src/main/windows/windowManager.ts @@ -32,7 +32,7 @@ import {SECOND} from 'common/utils/constants'; import Config from 'common/config'; import {getTabViewName, TAB_MESSAGING} from 'common/tabs/TabView'; -import {getAdjustedWindowBoundaries} from '../utils'; +import {getAdjustedWindowBoundaries, shouldHaveBackBar} from '../utils'; import {ViewManager} from '../views/viewManager'; import CriticalErrorHandler from '../CriticalErrorHandler'; @@ -194,7 +194,7 @@ export class WindowManager { const setBoundsFunction = () => { if (currentView) { - currentView.setBounds(getAdjustedWindowBoundaries(bounds.width!, bounds.height!, !(urlUtils.isTeamUrl(currentView.tab.url, currentView.view.webContents.getURL()) || urlUtils.isAdminUrl(currentView.tab.url, currentView.view.webContents.getURL())))); + currentView.setBounds(getAdjustedWindowBoundaries(bounds.width!, bounds.height!, shouldHaveBackBar(currentView.tab.url, currentView.view.webContents.getURL()))); } };