Могу ли я безопасно полагаться на то, что имя хоста будет неопределенным только для локальных файлов (т. Е. Для перехода к локальному файлу)? - PullRequest
0 голосов
/ 10 ноября 2019

Я создаю веб-расширение, которое запускается на каждой странице, но работает только в определенных контекстах. Вот метод isSupported ():

// return a boolean value that is true if the domain/page is supported, element name matches
// supported types, and content is marked as spell checkable
function isSupported (node, hostname) {
  const supportedNodeNames = ['TEXTAREA', 'DIV']
  const supportedDomains = ['mail.google.com', 'github.com']

  if (node.spellcheck && node.isContentEditable) {
    if (node.nodeName === 'TEXTAREA') {
      return true
    }

    if (supportedNodeNames.contains(node.nodeName) && supportedDomains.contains(hostname)) {
      return true
    }
  }

  return false
}

Этот код, к сожалению, мешает запуску расширения на моей локальной тестовой странице, т. Е. Когда URI равен file:///home/username/github/multi-dict/test_page/test-page.html

Можно ли безопасно положиться наwindow.location.hostname будучи неопределенным * и позволить расширению работать, когда оно есть? Я проверил документы в MDN и спецификации , но мне было не совсем понятно, в каких именно контекстах имя хоста будет неопределенным.

Заранее спасибо!

* На самом деле это пустая строка, оставленная в исходном описании для контекста чтения / ответа. Итак, вопрос в том, могу ли я смело полагаться на то, что window.location.hostname будет пустым только для локального файла, открытого браузером, - локальный веб-сервер не работает.

1 Ответ

1 голос
/ 10 ноября 2019

hostname определяется как строка ( MDN , spec ), поэтому оно не может иметь значение undefined. Это пустая строка (""), а не undefined, в каждом браузере, который я пробовал (Chrome, Firefox, IE, Edge). Если вы думаете, что в некоторых браузерах это undefined, вы можете просто сделать ложную проверку:

if (location.hostname) {
    // It has a non-blank value
} else {
    // Its value is falsy (probably "", perhaps undefined)
}

Но я не думаю, что это когда-либо undefined. Из spec :

Получатель атрибута имени хоста должен выполнить следующие шаги:

  1. Если этот Location релевантный объект Documentне является нулевым, и его источник не совпадает с origin-доменом с источником объекта настроек входа, а затем выдает DOMException «SecurityError».

  2. Если хост этого Location URL-адреса объекта равен null, возвращает пустую строку.

  3. Возвращает этот Location URL-адрес объекта host, сериализованный.

(мой акцент)

Хост локальных URL-адресов null, поэтому применяется выделенная часть шага 2.

...