Improve Windows default editor detection (#2631)

This commit is contained in:
Brandon Smith 2018-01-23 04:01:33 -05:00 committed by CHaBou
parent f4e32eee49
commit 16fcb2cb70

View file

@ -3,61 +3,52 @@ const {cfgPath} = require('./paths');
module.exports = () => Promise.resolve(shell.openItem(cfgPath)); module.exports = () => Promise.resolve(shell.openItem(cfgPath));
// Windows opens .js files with WScript.exe by default
// If the user hasn't set up an editor for .js files, we fallback to notepad.
if (process.platform === 'win32') { if (process.platform === 'win32') {
const Registry = require('winreg'); const Registry = require('winreg');
const {exec} = require('child_process'); const {exec} = require('child_process');
// Windows opens .js files with WScript.exe by default const getUserChoiceKey = async () => {
// If the user hasn't set up an editor for .js files, we fallback to notepad. // Load FileExts keys for .js files
const getFileExtKeys = () => const keys = await new Promise((resolve, reject) => {
new Promise((resolve, reject) => { new Registry({
Registry({
hive: Registry.HKCU, hive: Registry.HKCU,
key: '\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.js' key: '\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.js'
}).keys((error, keys) => { }).keys((error, items) => {
if (error) { if (error) {
reject(error); reject(error);
} else { } else {
resolve(keys || []); resolve(items || []);
} }
}); });
}); });
const hasDefaultSet = async () => { // Find UserChoice key
const keys = await getFileExtKeys(); const userChoice = keys.filter(k => k.key.endsWith('UserChoice'));
return userChoice[0];
};
const valueGroups = await Promise.all( const hasDefaultSet = async () => {
keys.map( let userChoice = await getUserChoiceKey();
key => if (!userChoice) return false;
new Promise((resolve, reject) => {
key.values((error, items) => { // Load key values
if (error) { let values = await new Promise((resolve, reject) => {
reject(error); userChoice.values((error, items) => {
} if (error) {
resolve(items.map(item => item.value || '') || []); reject(error);
}); }
}) resolve(items.map(item => item.value || '') || []);
) });
});
// Look for default program
const hasDefaultProgramConfigured = values.some(
value => value && typeof value === 'string' && value.endsWith('.exe') && !value.includes('WScript.exe')
); );
const values = valueGroups return hasDefaultProgramConfigured;
.reduce((allValues, groupValues) => [...allValues, ...groupValues], [])
.filter(value => value && typeof value === 'string');
// No default app set
if (values.length === 0) {
return false;
}
// WScript is in default apps list
if (values.some(value => value.includes('WScript.exe'))) {
const userDefaults = values.filter(value => value.endsWith('.exe') && !value.includes('WScript.exe'));
// WScript.exe is overidden
return userDefaults.length > 0;
}
return true;
}; };
// This mimics shell.openItem, true if it worked, false if not. // This mimics shell.openItem, true if it worked, false if not.