Chrome 27: расширение новой вкладки не может украсть фокус у омнибокса
С Chrome 27 кажется, что расширения, которые перекрывают новую вкладку Chrome, не могут отвлечь внимание от омнибокса Chrome, как это было в предыдущих версиях Chrome.
Есть ли новый способ фокусировки поля ввода на странице новой вкладки, или эта функция полностью отключена?:(
Чтобы проверить это, создайте папку расширения с тремя файлами:
1. manifest.json:
{
"name": "Focus Test",
"version": "0",
"minimum_chrome_version": "27",
"chrome_url_overrides": {
"newtab": "newTab.html"
},
"manifest_version": 2
}
2. focus.js:
document.getElementById('foo').focus();
3. newTab.html:
<html>
<body>
<input id="foo" type="text" />
<script type="text/javascript" src="focus.js"></script>
</body>
</html>
Затем, когда вы загружаете расширение и открываете новую вкладку, поле ввода не фокусируется на странице новой вкладки.
Я также попытался добавить autofocus
приписать input
поле, но тоже не повезло. Новая вкладка расширения не может отвлечь внимание от омнибокса Chrome.
Есть идеи? Это ошибка или новая "фича"?
4 ответа
Согласно документации расширения Chrome,
Не полагайтесь на страницу с фокусом клавиатуры. Адресная строка всегда получает фокус в первую очередь, когда пользователь создает новую вкладку.
Смотрите ссылку здесь: переопределить страницы
Этот ответ адаптирован из /questions/19040673/ne-mogu-ustanovit-fokus-dlya-vvoda-v-rasshirenii-chrome/19040681#19040681.
Это было протестировано как с Manifest V2, так и с V3.
Протестировано в Google Chrome 99.0.4844.51 64-бит (Windows 10).
- Заменить содержимое
focus.js
с:
if (location.search !== "?x") {
location.search = "?x";
throw new Error; // load everything on the next page;
// stop execution on this page
}
- Добавить
autofocus
атрибут к. - Перейдите на страницу расширений в Chrome и нажмите кнопку. Выберите папку вашего расширения.
- Откройте новую вкладку. Вы можете увидеть модальный диалог, читающий
Change back to Google?
. НажмитеKeep it
чтобы сохранить пользовательскую страницу новой вкладки.
Встроенный Javascript — только манифест V2
Если вы встраиваете Javascript в HTML-файл, вам потребуется выполнить несколько дополнительных действий:
- После добавления встроенного кода Javascript в HTML-файл откройте DevTools (
F12
key) и наблюдайте за выводом ошибки в консоли. Пример вывода, который вы должны увидеть:
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem:".
Either the 'unsafe-inline' keyword, a hash ('sha256-MK0Gypb4mkZTI11eCOtWT+mGYcJNpN5zccvhfeaRb6E='), or a nonce ('nonce-...') is required to enable inline execution.
- Выберите и скопируйте этот хэш.
- Добавьте строку, чтобы разрешить запуск JS, вставив только что скопированный хэш между одинарными кавычками. Например:
"content_security_policy": "script-src 'self' 'sha256-MK0Gypb4mkZTI11eCOtWT+mGYcJNpN5zccvhfeaRb6E='"
- Снова перейдите на страницу расширений. Удалите расширение, а затем снова добавьте его с помощью
Load unpacked
кнопка. - Откройте новую вкладку. Теперь ваше расширение должно автоматически сфокусироваться на
<input>
.
Обратите внимание, что встраивание работает только с Manifest V2; Manifest V3 возвращает сообщение об ошибке при попытке загрузить расширение (даже с правильно сформированным объектом в
manifest.json
, чтобы заменить Manifest V2
"content_security_policy"
нить):
Failed to load extension
File C:\path\to\extension
Error 'content_security_policy.extension_pages': Insecure CSP value "'sha256-...'" in directive 'script-src'.
Could not load manifest.
Вот решение для манифеста v3
chrome.tabs.onCreated.addListener((tab) => {
if (tab.pendingUrl === 'chrome://newtab/') {
chrome.tabs.remove(tab.id)
chrome.tabs.create({
url: '/index.html',
})
}
})
Я видел довольно старый блог , который условно обновляет новую вкладку. Однако простое обновление вкладки не меняет фокус. Пришлось закрыть отложенную вкладку и открыть новую.
Минусы: уродливое хром-расширение://akfdobdepdedlohhjdalbeadhkbelajj/index.html в адресной строке.
У меня есть дешевая работа, которая позволяет украсть фокус из адресной строки. Это не для всех. Я действительно использую это, потому что я хочу так же плохо управлять фокусом новой вкладки в своем собственном решении для новой вкладки:
<script>
alert('Use enter key to cancel this alert and then I will control your focus');
document.getElementById('...AckerAppleIsCrafty...').focus()
</script>
СЛУЧАЙ ИСПОЛЬЗОВАНИЯ: я создал собственную настраиваемую вкладку HTML Chrome, в которой есть поисковый ввод, который выполняет пользовательский поиск в моей истории и добавляет в закладки то, что мне нравится.
Обналичить меня, сосредоточившись снаружи, как насчет этого?