diff options
Diffstat (limited to 'src/shared')
| -rw-r--r-- | src/shared/urls.js | 30 | 
1 files changed, 18 insertions, 12 deletions
| diff --git a/src/shared/urls.js b/src/shared/urls.js index 87b1a48..d6c31e6 100644 --- a/src/shared/urls.js +++ b/src/shared/urls.js @@ -3,23 +3,29 @@ const trimStart = (str) => {    return str.replace(/^\s+/, '');  }; +const SUPPORTED_PROTOCOLS = ['http:', 'https:', 'ftp:', 'mailto:']; +  const normalizeUrl = (keywords, searchSettings) => {    try { -    return new URL(keywords).href; -  } catch (e) { -    if (keywords.includes('.') && !keywords.includes(' ')) { -      return 'http://' + keywords; +    let u = new URL(keywords); +    if (SUPPORTED_PROTOCOLS.includes(u.protocol.toLowerCase())) { +      return u.href;      } -    let template = searchSettings.engines[searchSettings.default]; -    let query = keywords; +  } catch (e) { +    // fallthrough +  } +  if (keywords.includes('.') && !keywords.includes(' ')) { +    return 'http://' + keywords; +  } +  let template = searchSettings.engines[searchSettings.default]; +  let query = keywords; -    let first = trimStart(keywords).split(' ')[0]; -    if (Object.keys(searchSettings.engines).includes(first)) { -      template = searchSettings.engines[first]; -      query = trimStart(trimStart(keywords).slice(first.length)); -    } -    return template.replace('{}', encodeURIComponent(query)); +  let first = trimStart(keywords).split(' ')[0]; +  if (Object.keys(searchSettings.engines).includes(first)) { +    template = searchSettings.engines[first]; +    query = trimStart(trimStart(keywords).slice(first.length));    } +  return template.replace('{}', encodeURIComponent(query));  };  export { normalizeUrl }; | 
