Emitir una nueva solicitud solo para obtener el tipo MIME es un poco pesado, y no es confiable. Por ejemplo, si la página que se muestra actualmente es el resultado de un envío de formulario POST, la emisión de una solicitud GET
generalmente no conducirá a la misma página.
Si está desarrollando una extensión que con frecuencia necesita acceso a esta información, use la API chrome.webRequest
para rastrear las respuestas. La siguiente extensión de demostración muestra el tipo de contenido al hacer clic en el botón del navegador:
// 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;
}
}
}
Notas:
- Esta extensión sólo se muestra el resultado de pestañas que se cargan después se carga la extensión.
- Esto solo funciona en páginas http/https. ftp :, file :, filesystem :, blob :, data: no es compatible.
- Cuando el servidor no especifica ningún tipo MIME o cuando el tipo MIME es
text/plain
, Chrome vuelve a MIME sniffing a menos que se configure X-Content-Type-Options: nosniff
. En el primer caso, el tipo MIME detectado podría ser cualquier cosa. En este último caso, el tipo MIME predeterminado es text/plain
.
Para completar, aquí es un archivo manifest.json
que se puede utilizar para probar el código anterior:
{
"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",
"*://*/*"
]
}
¿Alguna vez desarrolló una extensión con esta funcionalidad? Me encantaría tener esa extensión, pero no quiero aprender cómo codificar uno para algunos usos personales. – msbg