Skip to content

Commit

Permalink
Merge pull request #23 from will-stone/pr/17
Browse files Browse the repository at this point in the history
Pr/17
  • Loading branch information
will-stone authored Dec 13, 2017
2 parents b2bbe7d + 1d3a302 commit 231f4b1
Show file tree
Hide file tree
Showing 11 changed files with 686 additions and 288 deletions.
1 change: 1 addition & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
semi: false
singleQuote: true
useTabs: false
24 changes: 19 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
"bugs": {
"url": "https://github.com/will-stone/browserosaurus/issues"
},
"keywords": ["Electron", "Browser chooser"],
"keywords": [
"Electron",
"Browser chooser"
],
"author": "Will Stone",
"license": "MIT",
"devDependencies": {
Expand All @@ -36,28 +39,39 @@
"dependencies": {
"about-window": "^1.7.1",
"electron-compile": "^6.4.2",
"electron-store": "^1.3.0",
"jsonpath": "^0.2.11",
"mousetrap": "^1.6.1",
"opn": "^5.1.0",
"pretty-checkbox": "^3.0.3",
"xml2json": "^0.11.0"
},
"config": {
"forge": {
"make_targets": {
"darwin": ["dmg"]
"darwin": [
"dmg"
]
},
"electronPackagerConfig": {
"packageManager": "yarn",
"icon": "src/images/icon/icon.icns",
"ignore": ["docs"],
"ignore": [
"docs"
],
"protocols": [
{
"name": "HTTP link",
"schemes": ["http", "https"]
"schemes": [
"http",
"https"
]
},
{
"name": "File",
"schemes": ["file"]
"schemes": [
"file"
]
}
]
}
Expand Down
29 changes: 15 additions & 14 deletions src/browsers.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
export default [
{ name: 'Brave', key: 'b' },
{ name: 'Chromium', key: 'c' },
{ name: 'Firefox', key: 'f' },
{ name: 'Brave', key: 'b', enabled: true },
{ name: 'Chromium', key: 'c', enabled: true },
{ name: 'Firefox', key: 'f', enabled: true },
{
name: 'FirefoxDeveloperEdition',
alias: 'Firefox Developer Edition',
key: 'd'
key: 'd',
enabled: true
},
{ name: 'FirefoxNightly', alias: 'Nightly', key: 'n' },
{ name: 'Google Chrome', key: 'g' },
{ name: 'Google Chrome Canary', key: 'y' },
{ name: 'Iridium', key: 'i' },
{ name: 'Maxthon', key: 'm' },
{ name: 'Min', key: '-' },
{ name: 'Opera', key: 'o' },
{ name: 'Safari', key: 's' },
{ name: 'TorBrowser', key: 't' },
{ name: 'Vivaldi', key: 'v' }
{ name: 'FirefoxNightly', alias: 'Nightly', key: 'n', enabled: true },
{ name: 'Google Chrome', key: 'g', enabled: true },
{ name: 'Google Chrome Canary', key: 'y', enabled: true },
{ name: 'Iridium', key: 'i', enabled: true },
{ name: 'Maxthon', key: 'm', enabled: true },
{ name: 'Min', key: '-', enabled: true },
{ name: 'Opera', key: 'o', enabled: true },
{ name: 'Safari', key: 's', enabled: true },
{ name: 'TorBrowser', key: 't', enabled: true },
{ name: 'Vivaldi', key: 'v', enabled: true }
]
146 changes: 126 additions & 20 deletions src/main.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,58 @@
import { app, BrowserWindow, Tray, Menu } from 'electron'
import { app, BrowserWindow, Tray, Menu, ipcMain } from 'electron'
import jp from 'jsonpath'
import { spawn } from 'child_process'
import parser from 'xml2json'
import openAboutWindow from 'about-window'
import Store from 'electron-store'

import browsers from './browsers'
import defaultBrowsers from './browsers'

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let pickerWindow = null
let preferencesWindow = null
let tray = null
let appIsReady = false
let installedBrowsers = []
let wantToQuit = false

const defaultConfig = { browsers: defaultBrowsers }
const userConfig = {}

const store = new Store({ defaults: defaultConfig })

const loadConfig = () => {
return new Promise(fulfill => {
userConfig['browsers'] = store.get('browsers')

let userBrowserFound

// Create clone of the default browsers
let defaultBrowsersClone = defaultConfig.browsers.slice(0)

userConfig.browsers.map((userBrowser, userBrowserId) => {
userBrowserFound = false

defaultBrowsersClone.map((defBrowser, defBrowserId) => {
if (defBrowser.name == userBrowser.name) {
defaultBrowsersClone[defBrowserId] = false
userBrowserFound = true
}
})

if (userBrowserFound === false) {
userConfig.browsers[userBrowserId] = false
}
})

userConfig.browsers = userConfig.browsers.concat(defaultBrowsersClone)
userConfig.browsers = userConfig.browsers.filter(x => x)

store.set('browsers', userConfig.browsers)

fulfill(true)
})
}

const findInstalledBrowsers = () => {
return new Promise((fulfill, reject) => {
Expand All @@ -32,10 +74,10 @@ const findInstalledBrowsers = () => {
profile,
'plist.array.dict.array[1].dict[*].string[0]'
)
const installedBrowsers = installedApps
installedBrowsers = installedApps
.map(appName => {
for (let i = 0; i < browsers.length; i++) {
const browser = browsers[i]
for (let i = 0; i < userConfig.browsers.length; i++) {
const browser = userConfig.browsers[i]
if (browser.name === appName) {
return browser
}
Expand All @@ -48,11 +90,10 @@ const findInstalledBrowsers = () => {
})
}

function createPickerWindow(numberOfBrowsers, callback) {
// Create the browser window.
function createPickerWindow(callback) {
pickerWindow = new BrowserWindow({
width: 400,
height: numberOfBrowsers * 64 + 48,
height: 64 + 48,
acceptFirstMouse: true,
alwaysOnTop: true,
icon: `${__dirname}/images/icon/icon.png`,
Expand All @@ -65,13 +106,33 @@ function createPickerWindow(numberOfBrowsers, callback) {
backgroundColor: '#111111'
})

// and load the index.html of the app.
pickerWindow.loadURL(`file://${__dirname}/index.html`)
pickerWindow.loadURL(`file://${__dirname}/picker.html`)

pickerWindow.on('blur', () => {
pickerWindow.webContents.send('close', true)
})

if (callback) {
callback()
}
}

// Menubar icon
function createTrayIcon() {
tray = new Tray(`${__dirname}/images/icon/tray_iconTemplate.png`)
tray.setPressedImage(`${__dirname}/images/icon/tray_iconHighlight.png`)

const contextMenu = Menu.buildFromTemplate([
{
label: 'Preferences',
click: function() {
togglePreferencesWindow(() => {
preferencesWindow.webContents.send(
'incomingBrowsers',
installedBrowsers
)
})
}
},
{
label: 'About',
click: function() {
Expand All @@ -83,44 +144,89 @@ function createPickerWindow(numberOfBrowsers, callback) {
{
label: 'Quit',
click: function() {
wantToQuit = true
app.quit()
}
}
])
tray.setToolTip('Browserosaurus')
tray.setContextMenu(contextMenu)
}

pickerWindow.on('blur', () => {
pickerWindow.webContents.send('close', true)
const sendUrlToRenderer = url => {
pickerWindow.center() // moves window to current screen
pickerWindow.webContents.send('incomingURL', url)
}

function createPreferencesWindow(callback) {
preferencesWindow = new BrowserWindow({
width: 400,
height: 64 + 24,
icon: `${__dirname}/images/icon/icon.png`,
resizable: false,
show: false
})

// preferencesWindow.installedBrowsers = installedBrowsers
preferencesWindow.loadURL(`file://${__dirname}/preferences.html`)
// allow window to be opened again
preferencesWindow.on('close', e => {
if (wantToQuit == false) {
e.preventDefault()
preferencesWindow.hide()
}
})

if (callback) {
callback()
}
}

const sendUrlToRenderer = url => {
pickerWindow.center() // moves window to current screen
pickerWindow.webContents.send('incomingURL', url)
function togglePreferencesWindow(callback) {
if (!preferencesWindow) {
createPreferencesWindow(callback)
} else {
// Bring to front
preferencesWindow.show()
callback()
}
}

ipcMain.on('toggle-browser', (event, { browserName, enabled }) => {
const browserIndex = userConfig.browsers.findIndex(
browser => browser.name === browserName
)

userConfig.browsers[browserIndex].enabled = enabled

store.set('browsers', userConfig.browsers)

pickerWindow.webContents.send('incomingBrowsers', installedBrowsers)
})

app.on('ready', () => {
// Prompt to set as default browser
app.setAsDefaultProtocolClient('http')

findInstalledBrowsers().then(installedBrowsers => {
createPickerWindow(installedBrowsers.length, () => {
loadConfig().then(() => {
createTrayIcon()
createPickerWindow(() => {
pickerWindow.once('ready-to-show', () => {
pickerWindow.webContents.send('installedBrowsers', installedBrowsers)
if (global.URLToOpen) {
sendUrlToRenderer(global.URLToOpen)
global.URLToOpen = null
}
appIsReady = true
// pickerWindow.webContents.openDevTools({ mode: 'detach' })
})
})
createPreferencesWindow()
findInstalledBrowsers().then(data => {
installedBrowsers = data
pickerWindow.webContents.send('incomingBrowsers', installedBrowsers)
preferencesWindow.webContents.send('incomingBrowsers', installedBrowsers)
})
})
//)
})

// Hide dock icon
Expand Down
23 changes: 21 additions & 2 deletions src/main.scss
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
@import 'node_modules/pretty-checkbox/src/pretty-checkbox.scss';

* {
box-sizing: border-box;
}

html,
body {
height: 100%;
color: white;
font-family: sans-serif;
font-size: 16px;
}
Expand All @@ -29,16 +30,22 @@ body {
padding: 0;

> li {
position: relative;
display: flex;
align-items: center;
padding: 1rem;
cursor: pointer;
border-width: 0;
outline: none;

&.active {
background-color: #126edb;
}

&.is-enabled:after {
position: absolute;
right: 1rem;
content: '';
}
}
}

Expand All @@ -56,3 +63,15 @@ body {
.browserKey {
font-weight: bold;
}

#preferences {
color: #111111;
}

#picker {
color: white;

#browserList > li {
cursor: pointer;
}
}
Loading

0 comments on commit 231f4b1

Please sign in to comment.