Выдача нового запроса только для получения типа MIME немного сложна и ненадежна. Например, если отображаемая в данный момент страница является результатом отправки формы POST, то запрос GET
обычно не приводит к той же странице.
Если вы разрабатываете расширение, которому часто требуется доступ к этой информации, используйте API chrome.webRequest
для отслеживания ответов. Следующее демо-расширение отображает тип контента после нажатия кнопки браузера:
// background.js
var tabToMimeType = {};
chrome.webRequest.onHeadersReceived.addListener(function(details) {
if (details.tabId !== -1) {
var header = getHeaderFromHeaders(details.responseHeaders, 'content-type');
// If the header is set, use its value. Otherwise, use undefined.
tabToMimeType[details.tabId] = header && header.value.split(';', 1)[0];
}
}, {
urls: ['*://*/*'],
types: ['main_frame']
}, ['responseHeaders']);
chrome.browserAction.onClicked.addListener(function(tab) {
alert('Tab with URL ' + tab.url + ' has MIME-type ' + tabToMimeType[tab.id]);
});
function getHeaderFromHeaders(headers, headerName) {
for (var i = 0; i < headers.length; ++i) {
var header = headers[i];
if (header.name.toLowerCase() === headerName) {
return header;
}
}
}
Примечания:
- Это расширение показывает результат только для вкладок, которые загружены после расширение загружено.
- Это работает только на страницах http / https. ftp :, file :, filesystem :, blob :, data: не поддерживается.
- Когда сервер не указывает MIME-тип или когда MIME-тип равен
text/plain
, Chrome возвращается к MIME сниффинг , если не установлен X-Content-Type-Options: nosniff
. В первом случае обнаруженный MIME-тип может быть любым. В последнем случае MIME-тип по умолчанию - text/plain
.
Для полноты вот файл manifest.json
, который можно использовать для проверки предыдущего кода:
{
"name": "Click button to see MIME",
"version": "1",
"manifest_version": 2,
"background": {
"scripts": ["background.js"],
"persistent": true
},
"browser_action": {
"default_title": "Show MIME"
},
"permissions": [
"webRequest",
"activeTab",
"*://*/*"
]
}