74372d65ae
Co-authored-by: Andy Locascio <andy@slack-corp.com>
85 lines
2.3 KiB
JavaScript
85 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
// parses a feature string that has the format used in window.open()
|
|
// - `features` input string
|
|
// - `emit` function(key, value) - called for each parsed KV
|
|
function parseFeaturesString (features, emit) {
|
|
features = `${features}`.trim();
|
|
// split the string by ','
|
|
features.split(/\s*,\s*/).forEach((feature) => {
|
|
// expected form is either a key by itself or a key/value pair in the form of
|
|
// 'key=value'
|
|
let [key, value] = feature.split(/\s*=\s*/);
|
|
if (!key) return;
|
|
|
|
// interpret the value as a boolean, if possible
|
|
value = (value === 'yes' || value === '1') ? true : (value === 'no' || value === '0') ? false : value;
|
|
|
|
// emit the parsed pair
|
|
emit(key, value);
|
|
});
|
|
}
|
|
|
|
function convertFeaturesString (features, frameName) {
|
|
const options = {};
|
|
|
|
const ints = ['x', 'y', 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'zoomFactor'];
|
|
const webPreferences = ['zoomFactor', 'nodeIntegration', 'enableRemoteModule', 'preload', 'javascript', 'contextIsolation', 'webviewTag'];
|
|
|
|
// Used to store additional features
|
|
const additionalFeatures = [];
|
|
|
|
// Parse the features
|
|
parseFeaturesString(features, function (key, value) {
|
|
if (value === undefined) {
|
|
additionalFeatures.push(key);
|
|
} else {
|
|
// Don't allow webPreferences to be set since it must be an object
|
|
// that cannot be directly overridden
|
|
if (key === 'webPreferences') return;
|
|
|
|
if (webPreferences.includes(key)) {
|
|
if (options.webPreferences == null) {
|
|
options.webPreferences = {};
|
|
}
|
|
options.webPreferences[key] = value;
|
|
} else {
|
|
options[key] = value;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (options.left) {
|
|
if (options.x == null) {
|
|
options.x = options.left;
|
|
}
|
|
}
|
|
if (options.top) {
|
|
if (options.y == null) {
|
|
options.y = options.top;
|
|
}
|
|
}
|
|
if (options.title == null) {
|
|
options.title = frameName;
|
|
}
|
|
if (options.width == null) {
|
|
options.width = 800;
|
|
}
|
|
if (options.height == null) {
|
|
options.height = 600;
|
|
}
|
|
|
|
for (const name of ints) {
|
|
if (options[name] != null) {
|
|
options[name] = parseInt(options[name], 10);
|
|
}
|
|
}
|
|
|
|
return {
|
|
options, additionalFeatures
|
|
};
|
|
}
|
|
|
|
module.exports = {
|
|
parseFeaturesString, convertFeaturesString
|
|
};
|