Fix freetube:// protocol handling on macOS. (#669)
1. Handle open-url events. 2. Make protocol handling more robust on Win/Linux based on SO post. 3. Change 'ping' message to more descriptive 'openUrl' message. 4. Remove freetube:// protocol in main, and unify URL handling logic.
This commit is contained in:
parent
4d46fd3502
commit
6466860eb8
|
@ -25,13 +25,25 @@ const path = require('path')
|
||||||
const isDev = process.env.NODE_ENV === 'development'
|
const isDev = process.env.NODE_ENV === 'development'
|
||||||
const isDebug = process.argv.includes('--debug')
|
const isDebug = process.argv.includes('--debug')
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
let startupUrl
|
||||||
|
|
||||||
// CORS somehow gets re-enabled in Electron v9.0.4
|
// CORS somehow gets re-enabled in Electron v9.0.4
|
||||||
// This line disables it.
|
// This line disables it.
|
||||||
// This line can possible be removed if the issue is fixed upstream
|
// This line can possible be removed if the issue is fixed upstream
|
||||||
app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors')
|
app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors')
|
||||||
|
|
||||||
|
// See: https://stackoverflow.com/questions/45570589/electron-protocol-handler-not-working-on-windows
|
||||||
|
// remove so we can register each time as we run the app.
|
||||||
|
app.removeAsDefaultProtocolClient('freetube')
|
||||||
|
|
||||||
|
// If we are running a non-packaged version of the app && on windows
|
||||||
|
if (isDev && process.platform === 'win32') {
|
||||||
|
// Set the path of electron.exe and your app.
|
||||||
|
// These two additional parameters are only available on windows.
|
||||||
|
app.setAsDefaultProtocolClient('freetube', process.execPath, [path.resolve(process.argv[1])])
|
||||||
|
} else {
|
||||||
app.setAsDefaultProtocolClient('freetube')
|
app.setAsDefaultProtocolClient('freetube')
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Uncomment if needed
|
// TODO: Uncomment if needed
|
||||||
// only allow single instance of application
|
// only allow single instance of application
|
||||||
|
@ -45,7 +57,10 @@ if (!isDev) {
|
||||||
if (mainWindow.isMinimized()) mainWindow.restore()
|
if (mainWindow.isMinimized()) mainWindow.restore()
|
||||||
mainWindow.focus()
|
mainWindow.focus()
|
||||||
|
|
||||||
mainWindow.webContents.send('ping', commandLine)
|
const url = getLinkUrl(commandLine)
|
||||||
|
if (url) {
|
||||||
|
mainWindow.webContents.send('openUrl', url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -231,9 +246,8 @@ function createWindow () {
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('appReady', () => {
|
ipcMain.on('appReady', () => {
|
||||||
const param = process.argv[1]
|
if (startupUrl) {
|
||||||
if (typeof (param) !== 'undefined' && param !== null) {
|
mainWindow.webContents.send('openUrl', startupUrl)
|
||||||
mainWindow.webContents.send('ping', process.argv)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -276,6 +290,40 @@ app.on('activate', () => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback when processing a freetube:// link (macOS)
|
||||||
|
*/
|
||||||
|
app.on('open-url', (event, url) => {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
if (mainWindow && mainWindow.webContents) {
|
||||||
|
mainWindow.webContents.send('openUrl', baseUrl(url))
|
||||||
|
} else {
|
||||||
|
startupUrl = baseUrl(url)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if we were passed a freetube:// URL on process startup (linux/win)
|
||||||
|
*/
|
||||||
|
const url = getLinkUrl(process.argv)
|
||||||
|
if (url) {
|
||||||
|
startupUrl = url
|
||||||
|
}
|
||||||
|
|
||||||
|
function baseUrl(arg) {
|
||||||
|
return arg.replace('freetube://', '')
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLinkUrl(argv) {
|
||||||
|
for (const arg of argv) {
|
||||||
|
if (arg.indexOf('freetube://') !== -1) {
|
||||||
|
return baseUrl(arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Auto Updater
|
* Auto Updater
|
||||||
*
|
*
|
||||||
|
|
|
@ -93,7 +93,7 @@ export default Vue.extend({
|
||||||
console.log('User is using Electron')
|
console.log('User is using Electron')
|
||||||
this.activateKeyboardShortcuts()
|
this.activateKeyboardShortcuts()
|
||||||
this.openAllLinksExternally()
|
this.openAllLinksExternally()
|
||||||
this.enableCliPing()
|
this.enableOpenUrl()
|
||||||
this.setBoundsOnClose()
|
this.setBoundsOnClose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,12 +262,10 @@ export default Vue.extend({
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
enableCliPing: function () {
|
enableOpenUrl: function () {
|
||||||
const v = this
|
const v = this
|
||||||
electron.ipcRenderer.on('ping', function (event, message) {
|
electron.ipcRenderer.on('openUrl', function (event, url) {
|
||||||
let url = message[message.length - 1]
|
|
||||||
if (url) {
|
if (url) {
|
||||||
url = url.replace('freetube://', '')
|
|
||||||
v.$store.dispatch('getVideoIdFromUrl', url).then((result) => {
|
v.$store.dispatch('getVideoIdFromUrl', url).then((result) => {
|
||||||
if (result) {
|
if (result) {
|
||||||
v.$router.push({
|
v.$router.push({
|
||||||
|
|
Loading…
Reference in New Issue