Пользовательский скрипт Chrome срабатывает на всех страницах, несмотря на настройки @match и @include

Я использую match, чтобы ограничить мой скрипт работой только с одним доменом, но chrome запускает его во всех доменах. Я пробовал @include и @match, и он говорит: «Доступ к вашим данным на всех веб-сайтах», когда я пытаюсь установить его, и он запускает его на всех веб-сайтах.

Как я могу ограничить пользовательский скрипт одним доменом в Chrome?

Метаданные такие же, как на этой странице: http://www.chromium.org/developers/design-documents/user-scripts

Я имею в виду это:

// @match http://*.google.com/*
// @match http://www.google.com/*

person Someone    schedule 06.05.2013    source источник
comment
Вы пытаетесь установить файл zip/crx или файл .user.js?   -  person Rob W    schedule 06.05.2013
comment
я сказал пользовательский скрипт, так что это .user.js   -  person Someone    schedule 06.05.2013
comment
Chrome преобразует пользовательские скрипты в собственные расширения Chrome с шаблоном соответствия, эквивалентным <all_urls>, а затем ограничивает страницы с помощью "include_globs". Не беспокойтесь о предупреждении, оно ведет себя так, как вы ожидаете. Если вы хотите получить менее страшное предупреждение, вам нужно создать расширение Chrome из пользовательского скрипта и отредактировать часть content_scripts` файла manifest.json. См. этот ответ для шагов для создания расширения Chrome из пользовательского скрипта.   -  person Rob W    schedule 06.05.2013
comment
он ведет себя не так, как ожидалось. он запускает скрипт на всех страницах, а не на одном домене, как я сказал в вопросе.   -  person Someone    schedule 06.05.2013
comment
Покажите заголовок метаданных вашего скрипта в вопросе.   -  person Rob W    schedule 06.05.2013
comment
с метаданными проблем нет. chromium.org/developers/design-documents/user-scripts   -  person Someone    schedule 06.05.2013
comment
Ну вы так говорите, но это не так. С метаданными проблем нет, и он по-прежнему работает на всех доменах. Я отредактировал вопрос.   -  person Someone    schedule 06.05.2013
comment
Приведенный вами пример содержит http://*/*. Очевидно, что это будет работать на всех страницах. Я также проверил автоматически сгенерированный manifest.json, и он содержит ожидаемые значения. Прочитайте stackoverflow.com/a/11773654/938089, чтобы узнать, как получить и найти автоматически сгенерированный файл manifest.json. РЕДАКТИРОВАТЬ: после удаления // @matches http://*/* код работает только в Google - как и ожидалось.   -  person Rob W    schedule 06.05.2013
comment
Ну, код работает не только в Google, как ожидалось. Работает на всех доменах. И это автоматически сгенерированный манифест: pastebin.com/u9C9PXTs и, конечно же, в нем нет http://*/* в сценарии. Когда я сказал, что с метаданными проблем нет, я имел в виду, что с метаданными проблем нет.   -  person Someone    schedule 06.05.2013
comment
Я уже показывал рассматриваемые метаданные   -  person Someone    schedule 06.05.2013
comment
И это приводит к созданию pastebin.com/SH21WFAB. Если вам нужна помощь, поместите метаданные в свой вопрос. Пока вы этого не сделаете, я больше не буду отвечать на ваши комментарии, потому что это непродуктивно.   -  person Rob W    schedule 06.05.2013
comment
Я не знаю, что пытаются сказать. Я сказал, что уже показывал рассматриваемые метаданные. И да, метаданные в вопросе генерируют следующее: pastebin.com/u9C9PXTs Я не понимаю, почему он генерирует разные метаданные в ваш компьютер, но я показал вам, что он генерирует на моем компьютере. Что я могу сделать, чтобы убедить вас? Почему я должен лгать тебе?   -  person Someone    schedule 06.05.2013
comment
Вы также добавили части // ==UserScript== и // ==/UserScript== блока метаданных?   -  person Rob W    schedule 06.05.2013
comment
Да я пробовал и с ними и без них. Я также пробовал с @include   -  person Someone    schedule 06.05.2013
comment
Ок проблема решена. Мой файл был закодирован с помощью UTF8, и когда я сохранил его как ANSI, он правильно сгенерировал метаданные, и теперь он работает только с одним доменом. Я не знаю, это ошибка Chrome или нет, но она генерирует метаданные как все домены, если файл UTF8.   -  person Someone    schedule 06.05.2013
comment
Вероятно, эта ошибка: code.google.com/p/chromium/issues/ detail?id=102667 (заголовок пользовательского сценария не анализируется, если присутствует спецификация UTF8)   -  person Rob W    schedule 06.05.2013
comment
Во всяком случае, теперь нет проблем с ANSI. Спасибо за ваши старания.   -  person Someone    schedule 06.05.2013
comment
Пожалуйста, опубликуйте ответ с решением (и удалите некоторые комментарии, которые, вероятно, бесполезны для будущих читателей). Другие могут извлечь пользу из ваших выводов.   -  person Rob W    schedule 06.05.2013


Ответы (1)


Примечание: этот ответ был разработан между ОП и Робом В. Размещаю его здесь в надежде, что этот вопрос может быть полезен другим без необходимости просеивать цепочку комментариев выше.


Есть две проблемы. Во-первых, заголовок пользовательского скрипта не анализируется, если присутствует спецификация 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
Этот сценарий работает и сообщает правильно, как и ожидалось.


Сценарий UTF-8 с совпадением (UTF test, UTF.user.js) сообщает о следующих разрешениях:

UTF plus match
О разрешениях сообщается неправильно, что противоречит утверждениям @match. Также обратите внимание, что имя файла отображается в URL-кодировке вместо директивы @name. Оба эти намека на то, что что-то не так.

Хуже того, этот скрипт будет работать на всех сайтах. То есть вы увидите alert() на всех страницах, не принадлежащих Yahoo. Это явно ошибка.


Сценарий ANSI с включением (Включить, а не match.user.js) сообщает о следующих разрешениях:

ANSI plus include
Хотя это вводящий в заблуждение отчет, на самом деле сценарий работает правильно. То есть он будет срабатывать только для страниц yahoo.

Отчасти это связано с тем, как Chrome автоматически конвертирует пользовательские скрипты в расширения. Операторы @match преобразуются непосредственно в свойство matches объекта manifest.json, а операторы @include преобразуются в значения include_globs. См. Сопоставление шаблонов и шаблонов. Отчет о разрешениях отключает массив matches.

person Brock Adams    schedule 07.05.2013