Примечание: этот ответ был разработан между ОП и Робом В. Размещаю его здесь в надежде, что этот вопрос может быть полезен другим без необходимости просеивать цепочку комментариев выше.
Есть две проблемы. Во-первых, заголовок пользовательского скрипта не анализируется, если присутствует спецификация UTF8 (ошибка Chromium 102667).
Во-вторых, при использовании @include
вместо @match
в пользовательском скрипте Chrome вводит в заблуждение, сообщая, что скрипт может «получить доступ к вашим данным на всех веб-сайтах», но на самом деле это не так. Сценарий будет работать только на тех сайтах, которые указаны в операторах include.
Рассмотрим (или создадим) эти три сценария:
Тест UTF, а не UTF.user.js (сохранить в кодировке ANSI):
// ==UserScript==
// @name Not UTF source file
// @match http://www.yahoo.com/*
// ==/UserScript==
if (location.hostname != 'www.yahoo.com')
alert ("This script should not run on "+location.hostname+"!");
Тест UTF, это UTF.user.js (сохранить в кодировке UTF-8, включая спецификацию):
// ==UserScript==
// @name Is UTF source file
// @match http://www.yahoo.com/*
// ==/UserScript==
if (location.hostname != 'www.yahoo.com')
alert ("This script should not run on "+location.hostname+"!");
Включить, а не match.user.js (сохранить в кодировке ANSI):
// ==UserScript==
// @name Use include, not match
// @include http://www.yahoo.com/*
// ==/UserScript==
if (location.hostname != 'www.yahoo.com')
alert ("This script should not run on "+location.hostname+"!");
Обратите внимание, что все 3 скрипта представляют собой один и тот же код. Отличаются только @name
и/или формат файла и/или @include
по сравнению с @match
.
Сценарий ANSI с совпадением (тест UTF, а не UTF.user.js) сообщает об этих разрешениях:
![ANSI plus match](https://i.stack.imgur.com/ZH5vd.gif)
Этот сценарий работает и сообщает правильно, как и ожидалось.
Сценарий UTF-8 с совпадением (UTF test, UTF.user.js) сообщает о следующих разрешениях:
![UTF plus match](https://i.stack.imgur.com/Zj06X.gif)
О разрешениях сообщается неправильно, что противоречит утверждениям @match
. Также обратите внимание, что имя файла отображается в URL-кодировке вместо директивы @name
. Оба эти намека на то, что что-то не так.
Хуже того, этот скрипт будет работать на всех сайтах. То есть вы увидите alert()
на всех страницах, не принадлежащих Yahoo. Это явно ошибка.
Сценарий ANSI с включением (Включить, а не match.user.js) сообщает о следующих разрешениях:
![ANSI plus include](https://i.stack.imgur.com/4O9YJ.gif)
Хотя это вводящий в заблуждение отчет, на самом деле сценарий работает правильно. То есть он будет срабатывать только для страниц yahoo.
Отчасти это связано с тем, как Chrome автоматически конвертирует пользовательские скрипты в расширения. Операторы @match
преобразуются непосредственно в свойство matches
объекта manifest.json
, а операторы @include
преобразуются в значения include_globs
. См. Сопоставление шаблонов и шаблонов. Отчет о разрешениях отключает массив matches
.
person
Brock Adams
schedule
07.05.2013
.user.js
? - person Rob W   schedule 06.05.2013<all_urls>
, а затем ограничивает страницы с помощью"include_globs"
. Не беспокойтесь о предупреждении, оно ведет себя так, как вы ожидаете. Если вы хотите получить менее страшное предупреждение, вам нужно создать расширение Chrome из пользовательского скрипта и отредактировать часть content_scripts` файлаmanifest.json
. См. этот ответ для шагов для создания расширения Chrome из пользовательского скрипта. - person Rob W   schedule 06.05.2013http://*/*
. Очевидно, что это будет работать на всех страницах. Я также проверил автоматически сгенерированныйmanifest.json
, и он содержит ожидаемые значения. Прочитайте stackoverflow.com/a/11773654/938089, чтобы узнать, как получить и найти автоматически сгенерированный файлmanifest.json
. РЕДАКТИРОВАТЬ: после удаления// @matches http://*/*
код работает только в Google - как и ожидалось. - person Rob W   schedule 06.05.2013// ==UserScript==
и// ==/UserScript==
блока метаданных? - person Rob W   schedule 06.05.2013