mirror of https://github.com/keeweb/keeweb.git
93 lines
3.3 KiB
JavaScript
93 lines
3.3 KiB
JavaScript
import { Launcher } from 'comp/launcher';
|
|
|
|
const ForeMostAppScript =
|
|
'tell application "System Events"\n' +
|
|
' set frontAppName to name of first process whose frontmost is true\n' +
|
|
' set frontAppId to id of first process whose frontmost is true\n' +
|
|
'end tell\n' +
|
|
'"" & frontAppId & " " & frontAppName';
|
|
const ChromeScript =
|
|
'tell application "{}" to set appUrl to URL of active tab of front window\n' +
|
|
'tell application "{}" to set appTitle to title of active tab of front window\n' +
|
|
'return appUrl & "\n" & appTitle';
|
|
const SafariScript =
|
|
'tell application "{}" to set appUrl to URL of front document\n' +
|
|
'tell application "{}" to set appTitle to name of front document\n' +
|
|
'return appUrl & "\n" & appTitle';
|
|
const OtherAppsScript =
|
|
'tell application "System Events"\n' +
|
|
' tell process "{}"\n' +
|
|
' tell (1st window whose value of attribute "AXMain" is true)\n' +
|
|
' set windowTitle to value of attribute "AXTitle"\n' +
|
|
' end tell\n' +
|
|
' end tell\n' +
|
|
'end tell';
|
|
|
|
const AutoTypeHelper = function () {};
|
|
|
|
AutoTypeHelper.prototype.getActiveWindowInfo = function (callback) {
|
|
AutoTypeHelper.exec(ForeMostAppScript, (err, out) => {
|
|
if (err) {
|
|
return callback(err);
|
|
}
|
|
const output = out.trim();
|
|
const spaceIx = output.indexOf(' ');
|
|
let id = '',
|
|
appName = '';
|
|
if (spaceIx >= 0) {
|
|
id = output.substr(0, spaceIx);
|
|
appName = output.substr(spaceIx + 1).trim();
|
|
}
|
|
// getting urls and titles from Chrome or Safari:
|
|
// - will suit in 90% cases
|
|
// - does not require assistive access
|
|
// - allows to get url
|
|
if (['Google Chrome', 'Chromium', 'Google Chrome Canary'].indexOf(appName) >= 0) {
|
|
AutoTypeHelper.exec(ChromeScript.replace(/\{}/g, appName), (err, out) => {
|
|
if (err) {
|
|
return callback(err, { id });
|
|
}
|
|
const parts = out.split('\n');
|
|
return callback(null, {
|
|
id,
|
|
url: parts[0].trim(),
|
|
title: (parts[1] || '').trim()
|
|
});
|
|
});
|
|
} else if (['Safari', 'Webkit'].indexOf(appName) >= 0) {
|
|
AutoTypeHelper.exec(SafariScript.replace(/\{}/g, appName), (err, out) => {
|
|
if (err) {
|
|
return callback(err, { id });
|
|
}
|
|
const parts = out.split('\n');
|
|
return callback(null, {
|
|
id,
|
|
url: parts[0].trim(),
|
|
title: (parts[1] || '').trim()
|
|
});
|
|
});
|
|
} else {
|
|
// special cases are not available. this method may ask the user about assistive access
|
|
AutoTypeHelper.exec(OtherAppsScript.replace(/\{}/g, appName), (err, out) => {
|
|
if (err) {
|
|
return callback(err, { id });
|
|
}
|
|
return callback(null, {
|
|
id,
|
|
title: out.trim()
|
|
});
|
|
});
|
|
}
|
|
});
|
|
};
|
|
|
|
AutoTypeHelper.exec = function (script, callback) {
|
|
Launcher.spawn({
|
|
cmd: 'osascript',
|
|
args: ['-e', script],
|
|
complete: callback
|
|
});
|
|
};
|
|
|
|
export { AutoTypeHelper };
|