Это расширение уже давно есть в магазине Google Chrome. После выполнения технического обновления я заметил, что следующая строка из content.js
(скрипт содержимого):
//Get top document URL (that is the same for all IFRAMEs)
var strTopURL = window.top.document.URL;
теперь выдает следующее исключение, когда на загруженной странице есть IFRAME
:
Blocked a frame with origin "https://www.youtube.com" from accessing a cross-origin frame.
Как я уже сказал, раньше это был способ получить URL-адрес верхнего документа для вашего расширения (из content script
). Итак, каков принятый способ сделать это сейчас?
PS. Опять же, я говорю о расширении Google Chrome (а не просто об обычном JS на странице).
Обновлено: Этот скрипт выполняется под content_scripts
в manifest.json
, который определен как таковой:
"content_scripts": [
{
"run_at": "document_end",
"all_frames" : true,
"match_about_blank": true,
"matches": ["http://*/*", "https://*/*"],
"js": ["content.js"]
}
],
Сценарий содержимого должен попросить ваш фоновый сценарий сделать это через обмен сообщениями:
chrome.runtime.sendMessage('getTopUrl', url => {
// use the URL here inside the callback or store in a global variable
// to use in another event callback that will be triggered in the future
console.info(url);
});
// can't use it right here - because the callback runs asynchronously
фоновый скрипт должен быть объявлен в manifest.json:
"background": {
"scripts": ["background.js"],
"persistent": false
},
Вам также потребуются определенные разрешения URL-адреса в manifest.json или разрешить все URL-адреса:
"permissions": ["<all_urls>"]
И слушатель в фоновом скрипте:
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg === 'getTopUrl') {
chrome.tabs.get(sender.tab.id, tab => sendResponse(tab.url));
// keep the message channel open for the asynchronous callback above
return true;
}
});
Хм. Это много изменений. Мне было интересно, могу ли я использовать document.referrer
вместо этого?
Кроме того, мне это не нужно для сценария background
. Я вызываю его из скрипта .js
, работающего под content_scripts
в манифесте. (Я обновлю вопрос с подробностями.)
Реферер может отсутствовать, а ваш iframe может быть глубже второго уровня. Что касается второго возражения, то я не понял, в чем проблема, не вижу ее как таковой.
Хорошо спасибо. Думаю, мне следует попробовать, если это также работает в content.js
против предложенного вами background.js
. (Если я правильно помню, они работали с разными разрешениями.)
chrome.tabs недоступен в сценарии контента, поэтому вам нужен фоновый сценарий. Я до сих пор не понимаю, почему это проблема.
Вкратце идея заключается в том, что ваш сценарий содержимого запрашивает фоновый сценарий.
Google изменил много вещей, связанных с разрешениями, и это не простое изменение.