diff --git a/src/enums/browserType.enum.ts b/src/enums/deviceType.enum.ts similarity index 79% rename from src/enums/browserType.enum.ts rename to src/enums/deviceType.enum.ts index 64da6fb16b..3c00cf9ae2 100644 --- a/src/enums/browserType.enum.ts +++ b/src/enums/deviceType.enum.ts @@ -1,4 +1,4 @@ -export enum BrowserType { +export enum DeviceType { Chrome = 2, Firefox = 3, Opera = 4, diff --git a/src/models/request/deviceRequest.ts b/src/models/request/deviceRequest.ts index 0869ba25c3..7a20504380 100644 --- a/src/models/request/deviceRequest.ts +++ b/src/models/request/deviceRequest.ts @@ -1,15 +1,15 @@ -import { BrowserType } from '../../enums/browserType.enum'; +import { DeviceType } from '../../enums/deviceType.enum'; import { BrowserUtilsService } from '../../services/abstractions/browserUtils.service'; class DeviceRequest { - type: BrowserType; + type: DeviceType; name: string; identifier: string; pushToken?: string; constructor(appId: string, browserUtilsService: BrowserUtilsService) { - this.type = browserUtilsService.getBrowser(); - this.name = browserUtilsService.getBrowserString(); + this.type = browserUtilsService.getDevice(); + this.name = browserUtilsService.getDeviceString(); this.identifier = appId; this.pushToken = null; } diff --git a/src/models/response/deviceResponse.ts b/src/models/response/deviceResponse.ts index 63f69fe3b3..40b699452a 100644 --- a/src/models/response/deviceResponse.ts +++ b/src/models/response/deviceResponse.ts @@ -1,10 +1,10 @@ -import { BrowserType } from '../../enums/browserType.enum'; +import { DeviceType } from '../../enums/deviceType.enum'; class DeviceResponse { id: string; name: number; identifier: string; - type: BrowserType; + type: DeviceType; creationDate: string; constructor(response: any) { diff --git a/src/popup/app/settings/settings.component.ts b/src/popup/app/settings/settings.component.ts index d665886965..6e4c4295d5 100644 --- a/src/popup/app/settings/settings.component.ts +++ b/src/popup/app/settings/settings.component.ts @@ -1,5 +1,5 @@ import * as angular from 'angular'; -import { BrowserType } from '../../../enums/browserType.enum'; +import { DeviceType } from '../../../enums/deviceType.enum'; import { BrowserUtilsService } from '../../../services/abstractions/browserUtils.service'; import { CryptoService } from '../../../services/abstractions/crypto.service'; import { MessagingService } from '../../../services/abstractions/messaging.service'; @@ -9,17 +9,17 @@ import ConstantsService from '../../../services/constants.service'; import * as template from './settings.component.html'; const RateUrls = { - [BrowserType.Chrome]: + [DeviceType.Chrome]: 'https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews', - [BrowserType.Firefox]: + [DeviceType.Firefox]: 'https://addons.mozilla.org/en-US/firefox/addon/bitwarden-password-manager/#reviews', - [BrowserType.Opera]: + [DeviceType.Opera]: 'https://addons.opera.com/en/extensions/details/bitwarden-free-password-manager/#feedback-container', - [BrowserType.Edge]: + [DeviceType.Edge]: 'https://www.microsoft.com/store/p/bitwarden-free-password-manager/9p6kxl0svnnl', - [BrowserType.Vivaldi]: + [DeviceType.Vivaldi]: 'https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/reviews', - [BrowserType.Safari]: + [DeviceType.Safari]: 'https://itunes.com', // TODO }; @@ -147,7 +147,7 @@ export class SettingsController { rate() { this.$analytics.eventTrack('Rate Extension'); chrome.tabs.create({ - url: RateUrls[this.browserUtilsService.getBrowser()], + url: RateUrls[this.browserUtilsService.getDevice()], }); } } diff --git a/src/services/abstractions/browserUtils.service.ts b/src/services/abstractions/browserUtils.service.ts index 412dd65eae..7b92dccb22 100644 --- a/src/services/abstractions/browserUtils.service.ts +++ b/src/services/abstractions/browserUtils.service.ts @@ -1,8 +1,8 @@ -import { BrowserType } from '../../enums/browserType.enum'; +import { DeviceType } from '../../enums/deviceType.enum'; export interface BrowserUtilsService { - getBrowser(): BrowserType; - getBrowserString(): string; + getDevice(): DeviceType; + getDeviceString(): string; isFirefox(): boolean; isChrome(): boolean; isEdge(): boolean; diff --git a/src/services/api.service.ts b/src/services/api.service.ts index 494eef78b2..f372422f06 100644 --- a/src/services/api.service.ts +++ b/src/services/api.service.ts @@ -38,7 +38,7 @@ export default class ApiService { constructor(private tokenService: TokenService, browserUtilsService: BrowserUtilsService, logoutCallback: Function) { this.logoutCallback = logoutCallback; - this.deviceType = browserUtilsService.getBrowser().toString(); + this.deviceType = browserUtilsService.getDevice().toString(); } setUrls(urls: EnvironmentUrls) { diff --git a/src/services/browserUtils.service.spec.ts b/src/services/browserUtils.service.spec.ts index 957b1dbc2a..e06cd115d9 100644 --- a/src/services/browserUtils.service.spec.ts +++ b/src/services/browserUtils.service.spec.ts @@ -1,5 +1,5 @@ import BrowserUtilsService from './browserUtils.service'; -import { BrowserType } from '../enums/browserType.enum'; +import { DeviceType } from '../enums/deviceType.enum'; describe('Browser Utils Service', () => { describe('getDomain', () => { @@ -48,7 +48,7 @@ describe('Browser Utils Service', () => { }); const browserUtilsService = new BrowserUtilsService(); - expect(browserUtilsService.getBrowser()).toBe(BrowserType.Chrome); + expect(browserUtilsService.getDevice()).toBe(DeviceType.Chrome); }); it('should detect firefox', () => { @@ -58,7 +58,7 @@ describe('Browser Utils Service', () => { }); const browserUtilsService = new BrowserUtilsService(); - expect(browserUtilsService.getBrowser()).toBe(BrowserType.Firefox); + expect(browserUtilsService.getDevice()).toBe(DeviceType.Firefox); }); it('should detect opera', () => { @@ -68,7 +68,7 @@ describe('Browser Utils Service', () => { }); const browserUtilsService = new BrowserUtilsService(); - expect(browserUtilsService.getBrowser()).toBe(BrowserType.Opera); + expect(browserUtilsService.getDevice()).toBe(DeviceType.Opera); }); it('should detect edge', () => { @@ -78,7 +78,7 @@ describe('Browser Utils Service', () => { }); const browserUtilsService = new BrowserUtilsService(); - expect(browserUtilsService.getBrowser()).toBe(BrowserType.Edge); + expect(browserUtilsService.getDevice()).toBe(DeviceType.Edge); }); }); }); diff --git a/src/services/browserUtils.service.ts b/src/services/browserUtils.service.ts index d023558b0a..6b0db33783 100644 --- a/src/services/browserUtils.service.ts +++ b/src/services/browserUtils.service.ts @@ -1,14 +1,14 @@ import * as tldjs from 'tldjs'; -import { BrowserType } from '../enums/browserType.enum'; +import { DeviceType } from '../enums/deviceType.enum'; import { BrowserUtilsService as BrowserUtilsServiceInterface } from './abstractions/browserUtils.service'; const AnalyticsIds = { - [BrowserType.Chrome]: 'UA-81915606-6', - [BrowserType.Firefox]: 'UA-81915606-7', - [BrowserType.Opera]: 'UA-81915606-8', - [BrowserType.Edge]: 'UA-81915606-9', - [BrowserType.Vivaldi]: 'UA-81915606-15', - [BrowserType.Safari]: 'UA-81915606-16', + [DeviceType.Chrome]: 'UA-81915606-6', + [DeviceType.Firefox]: 'UA-81915606-7', + [DeviceType.Opera]: 'UA-81915606-8', + [DeviceType.Edge]: 'UA-81915606-9', + [DeviceType.Vivaldi]: 'UA-81915606-15', + [DeviceType.Safari]: 'UA-81915606-16', }; export default class BrowserUtilsService implements BrowserUtilsServiceInterface { @@ -49,56 +49,56 @@ export default class BrowserUtilsService implements BrowserUtilsServiceInterface return ipRegex.test(ipString); } - private browserCache: BrowserType = null; + private deviceCache: DeviceType = null; private analyticsIdCache: string = null; - getBrowser(): BrowserType { - if (this.browserCache) { - return this.browserCache; + getDevice(): DeviceType { + if (this.deviceCache) { + return this.deviceCache; } if (navigator.userAgent.indexOf('Firefox') !== -1 || navigator.userAgent.indexOf('Gecko/') !== -1) { - this.browserCache = BrowserType.Firefox; + this.deviceCache = DeviceType.Firefox; } else if ((!!(window as any).opr && !!opr.addons) || !!(window as any).opera || navigator.userAgent.indexOf(' OPR/') >= 0) { - this.browserCache = BrowserType.Opera; + this.deviceCache = DeviceType.Opera; } else if (navigator.userAgent.indexOf(' Edge/') !== -1) { - this.browserCache = BrowserType.Edge; + this.deviceCache = DeviceType.Edge; } else if (navigator.userAgent.indexOf(' Vivaldi/') !== -1) { - this.browserCache = BrowserType.Vivaldi; + this.deviceCache = DeviceType.Vivaldi; } else if ((window as any).chrome) { - this.browserCache = BrowserType.Chrome; + this.deviceCache = DeviceType.Chrome; } - return this.browserCache; + return this.deviceCache; } - getBrowserString(): string { - return BrowserType[this.getBrowser()].toLowerCase(); + getDeviceString(): string { + return DeviceType[this.getDevice()].toLowerCase(); } isFirefox(): boolean { - return this.getBrowser() === BrowserType.Firefox; + return this.getDevice() === DeviceType.Firefox; } isChrome(): boolean { - return this.getBrowser() === BrowserType.Chrome; + return this.getDevice() === DeviceType.Chrome; } isEdge(): boolean { - return this.getBrowser() === BrowserType.Edge; + return this.getDevice() === DeviceType.Edge; } isOpera(): boolean { - return this.getBrowser() === BrowserType.Opera; + return this.getDevice() === DeviceType.Opera; } isVivaldi(): boolean { - return this.getBrowser() === BrowserType.Vivaldi; + return this.getDevice() === DeviceType.Vivaldi; } isSafari(): boolean { - return this.getBrowser() === BrowserType.Safari; + return this.getDevice() === DeviceType.Safari; } analyticsId(): string { @@ -106,7 +106,7 @@ export default class BrowserUtilsService implements BrowserUtilsServiceInterface return this.analyticsIdCache; } - this.analyticsIdCache = AnalyticsIds[this.getBrowser()]; + this.analyticsIdCache = AnalyticsIds[this.getDevice()]; return this.analyticsIdCache; } @@ -215,11 +215,18 @@ export default class BrowserUtilsService implements BrowserUtilsServiceInterface isViewOpen(): boolean { const popupOpen = chrome.extension.getViews({ type: 'popup' }).length > 0; - const tabOpen = chrome.extension.getViews({ type: 'tab' }).length > 0; + if (popupOpen) { + return true; + } + const sidebarView = this.sidebarViewName(); const sidebarOpen = sidebarView != null && chrome.extension.getViews({ type: sidebarView }).length > 0; + if (sidebarOpen) { + return true; + } - return popupOpen || tabOpen || sidebarOpen; + const tabOpen = chrome.extension.getViews({ type: 'tab' }).length > 0; + return tabOpen; } private sidebarViewName(): string {