Usando caché de aplicaciones

  • Enlace amigable (slug) de la revisión: Recursos_offline_en_firefox
  • Título de la revisión: Recursos en modo sin conexión en Firefox
  • Id de la revisión: 13863
  • Creada:
  • Creador: inma_610
  • ¿Es la revisión actual? No
  • Comentario 23 words added, 21 words removed

Contenido de la revisión

{{ gecko_minversion_header("1.9.1") }}

Firefox 3.5 admite la especificación HTML 5 para el almacenamiento en caché sin conexión de los recursos de aplicaciones web; esto se realiza a través de la caché de aplicación: una colección de recursos que se obtienen de un manifiesto de recursos que proporciona la aplicación web.

{{ fx_minversion_note("3") }}

Terminología

Esta sección define algunos términos que resultarán útiles de conocer para la lectura de esta documentación.

manifiesto de la caché
Un manifiesto de la caché es un archivo que describe los recursos que se deberían almacenar en la caché para usarlos cuando se está desconectado.
Id. del cliente
La id. del cliente es un identificador único del cliente usado por la interfaz {{ interface("nsICacheService") }} cuando gestiona la caché de aplicación. Es una cadena opaca y se origina cuando se crea una nueva caché de aplicación.
grupo de cachés
Un grupo de cachés es un conjunto con las distintas versiones de una caché para el mismo manifiesto de la caché.
Id. de grupo
La id. de grupo es el URI de un archivo de manifiesto de la caché. Todas las cachés que comparten el mismo manifiesto están en el mismo grupo de cachés de aplicación.

La caché de aplicación

Cada manifiesto de recursos de aplicaciones web posee su propia caché de aplicación. Puesto que las aplicaciones pueden compartir recursos (e incluso el mismo URI del manifiesto), cada caché de aplicación tiene una copia independiente de cada recurso compartido. Estas cachés están versionadas, de forma que cada vez que se visita el sitio mientras se está conectado, una nueva versión de la aplicación se sincroniza con la caché de aplicación. Esta nueva versión se usará la próxima vez que se visite el sitio.

Cómo funciona la caché de aplicación

La caché de aplicación modifica el proceso de carga de un documento; los elementos de la caché de aplicación se cargan ahora directamente de la caché, sin tener acceso a la red (salvo para actualizar la copia de la aplicación web en la caché; se hace en segundo plano y no afecta al rendimiento de manera significativa).

Las cachés de aplicación también pueden volverse obsoletas. Si el manifiesto se elimina del servidor, Firefox elimina todas las cachés de aplicación que use ese manifiesto, a continuación envía un evento "obsoleto" al objeto de la caché de aplicación. A continuación el estado de la caché de aplicación pasa a OBSOLETO.

Ejemplo de flujo de trabajo

Esta sección ofrece un ejemplo del flujo de trabajo relacionado con el funcionamiento de la caché al cargar una página. Si eres un usuario final del mecanismo de almacenamiento en caché, la verdad es que no necesitas saber esto, pero resulta útil si estás desarrollando Firefox o incrustando Gecko.

Supongamos que tienes un manifiesto de la caché ubicado en http://www.foo.com/cache.manifest, que incluye dos recursos test.html y test.png. Al cargar test.html se siguen los siguientes pasos:

El canal HTTP llama al método {{ interface("nsIApplicationCacheService") }} {{ ifmethod("nsIApplicationCacheService", "chooseApplicationCache") }} para seleccionar la id. de grupo apropiada para el recurso solicitado:

appCache = nsIApplicationCacheService::ChooseApplicationCache("http://www.foo.com/test.html");

Este devuelve la caché de aplicación más reciente identificada por la id. de grupo "http://www.foo.com/cache.manifest". A continuación el canal HTTP realiza algo parecido a lo siguiente:

cacheSession = nsICacheSerivce::CreateSession(appCache.clientID, STORAGE_OFFLINE, true);
cacheEntry = cacheSession.openCacheEntry("http://www.foo.com/test.html");

Esto crea una sesión de caché y abre el recurso solicitado desde el interior de la caché. A partir de aquí carga los datos desde la cacheEntry, pero sin validarlos.

Cuando se esté cargando test.html, el docshell les indica a las cargas secundarias que usen la misma caché de aplicación que encontró la llamada a chooseApplicationCache(), de forma que ningún recurso que haya cargado test.html se cargue también desde la misma caché.

Estados de la caché de aplicación

Cada caché de aplicación tiene un estado que indica la condición actual de la caché. Las cachés que comparten el mismo URI de manifiesto comparten también el mismo estado de la caché, que puede ser uno de los siguientes:

UNCACHED
Un valor especial que indica que un objeto de la caché de aplicación no está inicializado por completo.
IDLE
La caché de aplicación no se encuentra actualmente en el proceso de actualización.
CHECKING
El manifiesto se está capturando y comprobando en busca de actualizaciones.
DOWNLOADING
Se están descargando recursos para añadirse a la caché debido a que se ha cambiado un manifiesto de recursos.
UPDATEREADY
Hay disponible una nueva versión de la caché de aplicación. Hay un evento updateready correspondiente, que se dispara en lugar del evento cached cuando se ha descargado una nueva actualización pero aún no se ha activado mediante el método swapCache().
OBSOLETE
El grupo de cachés de aplicación está ya obsoleto.

Recursos en la caché de aplicación

La caché siempre incluye al menos un recurso, identificado por el URI. Todos los recursos se ajustan a una de las siguientes categorías:

Entradas maestras
Son recursos que se han añadido a la caché porque un contexto de navegación que visitó el usuario incluyó un documento que indicaba que estaba en esta caché usando su atributo manifest.
El manifiesto
Es el propio manifiesto de recursos, cargado desde el URI especificado en el atributo manifest del elemento html de una entrada implícita. El manifiesto se descarga y procesa durante el proceso de actualización de la caché de aplicación. Las entradas implícitas deben tener el mismo esquema, host y puerto que el manifiesto.
Entradas explícitas
Son recursos listados en el manifiesto de la caché.
Entradas de reserva
Son recursos que se listaron en el manifiesto de la caché como entradas de reserva. {{ fx_minversion_inline("3") }}
Nota: los recursos pueden etiquetarse con múltiples categorías y, por lo tanto, pueden categorizarse como entradas múltiples. Por ejemplo, una entrada puede ser a la vez una entrada explícita y una entrada de reserva.

Entradas maestras

Las entradas maestras son cualquier archivo HTML que incluya una atributo {{ htmlattrxref("manifest","html") }} en su elemento {{ HTMLElement("html") }}. Por ejemplo, supongamos que tenemos el archivo HTML http://www.foo.bar/entry.html, que tiene este aspecto:

;html manifest="foo.manifest">
<h1>Entry</h1>
</html>

Si entry.html no está incluido en el manifiesto, la visita a la página entry.html provocará que entry.html se añada a la caché de aplicación como entrada maestra.

Entradas de reserva

Las entradas de reserva se usan cuando falla un intento de cargar un recurso. Por ejemplo, imagínate que hay un manifiesto de la caché ubicado en http://www.foo.bar/test.manifest con los siguientes contenidos:

CACHE MANIFEST
FALLBACK:
foo/bar/ foo.html

Cualquier solicitud a http://www.foo.bar/foo/bar/ o sus subdirectorios y contenidos provocará que una solicitud de red intente cargar el recurso solicitado. Si el intento fracasa, debido a un fallo en la red o a algún error del servidor, se cargará en su lugar los contenidos del archivo foo.html.

La lista blanca en línea

La lista blanca en línea puede contener cero o más URI de los recursos que la aplicación web necesitará para tener acceso sin conexión al servidor en vez de a la caché. Esto permite que el modelo de seguridad del navegador proteja al usuario frente a potenciales infracciones de seguridad limitando el acceso solo a los recursos aprobados.

Note: la lista blanca en línea se ignora en versiones de Firefox anteriores a 3.5.

Esto permite asegurarte de que, por ejemplo, las secuencias de comandos y otro tipo de código se carguen y ejecuten desde el servidor en lugar de la caché:

CACHE MANIFEST
NETWORK:
/api

Esto garantiza que las solicitudes para cargar recursos contenidas en el subárbol http://www.foo.bar/api/ irán siempre a la red sin intentar tener acceso a ellos desde la caché.

El manifiesto de la caché

Los archivos de manifiesto de la caché deben atenderse con el tipo MIME text/cache-manifest y todos los recursos atendidos a través de dicho tipo deben seguir la sintaxis de un manifiesto de la caché de aplicación, tal y como se define en este artículo. Los manifiestos de la caché son archivos de texto en formato UTF-8 y pueden, opcionalmente, incluir un carácter BOM. Las nuevas líneas estarán representadas por un salto de línea (U+000A), un retorno de carro (U+000D) o ambos al mismo tiempo.

La primera línea del manifiesto de la caché debe constar de la cadena "CACHE MANIFEST" (con un único espacio U+0020 entre las dos palabras), seguido de cero o más caracteres de espacio o de tabulación. Se ignorará cualquier otro texto en la línea.

El resto del manifiesto de la caché debe constar de cero o más de las líneas siguientes:

Línea en blanco
Puedes usar líneas en blanco que consten de cero o más caracteres de espacio o de tabulación.
Comentario
Los comentarios constan de cero o más tabulaciones o espacios seguidos por un único carácter "#", seguido a su vez por cero o más caracteres de texto de comentario. Los comentarios pueden usarse solo en sus propias líneas, pero no pueden ser anexados a otras.
Encabezado de sección
Los encabezados de sección especifican qué sección del manifiesto de la caché se está manipulando. Existen tres encabezados de sección posibles:
Encabezado de sección Descripción
CACHE: Cambia a la sección explícita. Esta es la sección predeterminada.
FALLBACK: Cambia a la sección de reserva.

{{ fx_minversion_note("3") }}

NETWORK: Cambia a la sección de la lista blanca en línea.

{{ fx_minversion_note("3") }}

La línea del encabezado de sección puede incluir espacios en blanco, pero debe incluir los dos puntos (:) en el nombre de la sección.
Datos para la sección actual
El formato de las líneas de datos varía de una sección a otra. En la sección explícita, cada línea es una referencia URI o IRI válida a un recurso para almacenar en la caché. Se permiten en cada línea los espacios en blanco antes y después del URI o IRI.

Los manifiestos de la caché pueden cambiar de una sección a otra cuando se desee (de forma que cada encabezado de sección puede usarse más de una vez) y se permite que las secciones puedan estar vacías.

Nota:  los URI relativos lo son respecto al URI del manifiesto de la caché, no respecto al URI del documento que hace referencia al manifiesto.

Un ejemplo de manifiesto de la caché

Es un manifiesto de la caché sencillo para un sitio web imaginario en foo.com.

CACHE MANIFEST
# v1
# Esto es un comentario.
http://www.foo.com/index.html
http://www.foo.com/header.png
http://www.foo.com/blah/blah

En este ejemplo, no hay encabezado de sección, por lo que todas las líneas de datos deben estar en la sección explícita.

El comentario "v1" está ahí por una buena razón. Como la caché solo se actualiza cuando cambia el manifiesto, si cambias los recursos (por ejemplo, actualizando la imagen header.png con contenido nuevo), tendrás que cambiar el archivo de manifiesto con el fin de que el navegador sepa que tiene que refrescar la caché. Puedes hacer esto con cualquier modificación en el manifiesto, pero una buena forma es tener un número de versión.

Especificar un manifiesto de la caché

Para indicarle a Firefox que use el almacenamiento en la caché de la aplicación sin conexión para un determinado sitio web, este tiene que usar el atributo manifest en el elemento html, de este modo:

<html manifest="http://www.foo.com/cache-manifest">
  ...
</html>

Esto hace que la primera vez que el usuario cargue tu aplicación, Firefox muestre en la barra de notificaciones un mensaje con el texto "Este sitio web (www.example.com) está solicitando almacenar datos en su equipo para usarlos en modo desconexión". [Permitir] [Nunca para este sitio] [Ahora no]". El término "aplicaciones (habilitadas) sin conexión" hace referencia a veces a aplicaciones concretas que se les permite usar las funcionalidades sin conexión.

El proceso de actualización

  1. Cuando Firefox visita un documento que incluye un atributo manifest, envía un evento checking al objeto window.applicationCache, a continuación captura el archivo de manifiesto, siguiendo las reglas apropiadas para el almacenamiento en caché de HTTP. Si la copia del manifiesto almacenada actualmente en la caché está actualizada, el evento noupdate se envía a la applicationCache y el proceso de actualización se ha completado.
  2. Si el archivo de manifiesto no ha cambiado desde la última comprobación de actualizaciones, de nuevo el evento noupdate se envía a la applicationCache y el proceso de actualización se ha completado. Por esto, si cambias los recursos, tienes que cambiar el archivo de manifiesto para que Firefox sepa que tiene que volver a almacenar los recursos en la caché.
  3. Si el archivo de manifiesto ha cambiado, todos los archivos del manifiesto, así como los que se hayan añadido a la caché llamando a applicationCache.add(), son capturados en una caché temporal, siguiendo las reglas apropiadas de almacenamiento en caché de HTTP. Por cada archivo capturado en la caché, se envía un evento progress al objeto applicationCache. Si sucede cualquier error, se envía un evento error y la actualización se interrumpe.
  4. Una vez que todos los archivos se hayan recuperado correctamente, se mueven automáticamente a la caché real sin conexión y se envía un evento cached al objeto applicationCache.

Ubicación del almacenamiento y borrado de la caché sin conexión

Los datos de la caché sin conexión se almacenan a parte del perfil de Firefox, junto a la caché de disco normal:

  • Windows Vista/7: C:\Users\<username>\AppData\Local\Mozilla\Firefox\Profiles\<salt>.<profile name>\OfflineCache

Se puede inspeccionar el estado actual de la caché sin conexión en la página about:cache (debajo del encabezado "Dispositivo de la caché sin conexión").

La caché sin conexión no se borra a través de Herramientas > Limpiar historial reciente (bug 538595)
La caché sin conexión no se borra a través de Herramientas > Opciones > Avanzado > Red > Datos sin conexión > Limpiar ahora (bug 538588).
La caché sin conexión puede borrarse para cada sitio de forma individual mediante el botón "Eliminar..." en Herramientas > Opciones > Avanzado > Red > Datos sin conexión.

Consulta también borrar los datos de almacenamiento DOM.

Consulta también

{{ HTML5ArticleTOC() }}

{{ languages( { "en": "en/Offline_resources_in_Firefox", "fr": "fr/Ressources_hors_ligne_dans_Firefox", "ja": "ja/Offline_resources_in_Firefox", "pl": "pl/Zasoby_offline_w_Firefoksie", "zh-tw": "zh_tw/Offline_resources_on_Firefox" } ) }}

Fuente de la revisión

<p>{{ gecko_minversion_header("1.9.1") }}</p>
<p>Firefox 3.5 admite la especificación HTML 5 para el almacenamiento en caché sin conexión de los recursos de aplicaciones web; esto se realiza a través de la <em>caché de aplicación</em>: una colección de recursos que se obtienen de un <strong>manifiesto de recursos</strong> que proporciona la aplicación web.</p>
<p>{{ fx_minversion_note("3") }}</p>
<h2>Terminología</h2>
<p>Esta sección define algunos términos que resultarán útiles de conocer para la lectura de esta documentación.</p>
<dl> <dt>manifiesto de la caché</dt> <dd>Un manifiesto de la caché es un archivo que describe los recursos que se deberían almacenar en la caché para usarlos cuando se está desconectado.</dd>
</dl>
<dl> <dt>Id. del cliente</dt> <dd>La id. del cliente es un identificador único del cliente usado por la interfaz {{ interface("nsICacheService") }} cuando gestiona la caché de aplicación. Es una cadena opaca y se origina cuando se crea una nueva caché de aplicación.</dd> <dt>grupo de cachés</dt> <dd>Un grupo de cachés es un conjunto con las distintas versiones de una caché para el mismo manifiesto de la caché.</dd> <dt>Id. de grupo</dt> <dd>La id. de grupo es el URI de un archivo de manifiesto de la caché. Todas las cachés que comparten el mismo manifiesto están en el mismo grupo de cachés de aplicación.</dd>
</dl>
<h2>La caché de aplicación</h2>
<p>Cada manifiesto de recursos de aplicaciones web posee su propia caché de aplicación. Puesto que las aplicaciones pueden compartir recursos (e incluso el mismo URI del manifiesto), cada caché de aplicación tiene una copia independiente de cada recurso compartido. Estas cachés están versionadas, de forma que cada vez que se visita el sitio mientras se está conectado, una nueva versión de la aplicación se sincroniza con la caché de aplicación. Esta nueva versión se usará la próxima vez que se visite el sitio.</p>
<h3>Cómo funciona la caché de aplicación</h3>
<p>La caché de aplicación modifica el proceso de carga de un documento; los elementos de la caché de aplicación se cargan ahora directamente de la caché, sin tener acceso a la red (salvo para actualizar la copia de la aplicación web en la caché; se hace en segundo plano y no afecta al rendimiento de manera significativa).</p>
<p>Las cachés de aplicación también pueden volverse obsoletas. Si el manifiesto se elimina del servidor, Firefox elimina todas las cachés de aplicación que use ese manifiesto, a continuación envía un evento "obsoleto" al objeto de la caché de aplicación. A continuación el estado de la caché de aplicación pasa a <code>OBSOLETO</code>.</p>
<h4>Ejemplo de flujo de trabajo</h4>
<p>Esta sección ofrece un ejemplo del flujo de trabajo relacionado con el funcionamiento de la caché al cargar una página. Si eres un usuario final del mecanismo de almacenamiento en caché, la verdad es que no necesitas saber esto, pero resulta útil si estás desarrollando Firefox o incrustando Gecko.</p>
<p>Supongamos que tienes un manifiesto de la caché ubicado en <a class=" external" href="http://www.foo.com/cache.manifest" rel="freelink">http://www.foo.com/cache.manifest</a>, que incluye dos recursos <code>test.html</code> y <code>test.png</code>. Al cargar <code>test.html</code> se siguen los siguientes pasos:</p>
<p>El canal HTTP llama al método {{ interface("nsIApplicationCacheService") }} {{ ifmethod("nsIApplicationCacheService", "chooseApplicationCache") }} para seleccionar la id. de grupo apropiada para el recurso solicitado:</p>
<pre>appCache = nsIApplicationCacheService::ChooseApplicationCache("http://www.foo.com/test.html");
</pre>
<p>Este devuelve la caché de aplicación más reciente identificada por la id. de grupo "<a class=" external" href="http://www.foo.com/cache.manifest" rel="freelink">http://www.foo.com/cache.manifest</a>". A continuación el canal HTTP realiza algo parecido a lo siguiente:</p>
<pre>cacheSession = nsICacheSerivce::CreateSession(appCache.clientID, STORAGE_OFFLINE, true);
cacheEntry = cacheSession.openCacheEntry("http://www.foo.com/test.html");
</pre>
<p>Esto crea una sesión de caché y abre el recurso solicitado desde el interior de la caché. A partir de aquí carga los datos desde la <code>cacheEntry</code>, pero sin validarlos.</p>
<p>Cuando se esté cargando <code>test.html</code>, el docshell les indica a las cargas secundarias que usen la misma caché de aplicación que encontró la llamada a <code>chooseApplicationCache()</code>, de forma que ningún recurso que haya cargado <code>test.html</code> se cargue también desde la misma caché.</p>
<h3>Estados de la caché de aplicación</h3>
<p>Cada caché de aplicación tiene un <strong>estado</strong> que indica la condición actual de la caché. Las cachés que comparten el mismo URI de manifiesto comparten también el mismo estado de la caché, que puede ser uno de los siguientes:</p>
<dl> <dt><code>UNCACHED</code></dt> <dd>Un valor especial que indica que un objeto de la caché de aplicación no está inicializado por completo.</dd> <dt><code>IDLE</code></dt> <dd>La caché de aplicación no se encuentra actualmente en el proceso de actualización.</dd> <dt><code>CHECKING</code></dt> <dd>El manifiesto se está capturando y comprobando en busca de actualizaciones.</dd> <dt><code>DOWNLOADING</code></dt> <dd>Se están descargando recursos para añadirse a la caché debido a que se ha cambiado un manifiesto de recursos.</dd> <dt><code>UPDATEREADY</code></dt> <dd>Hay disponible una nueva versión de la caché de aplicación. Hay un evento <code>updateready</code> correspondiente, que se dispara en lugar del evento <code>cached</code> cuando se ha descargado una nueva actualización pero aún no se ha activado mediante el método <code>swapCache()</code>.</dd> <dt><code>OBSOLETE</code></dt> <dd>El grupo de cachés de aplicación está ya obsoleto.</dd>
</dl>
<h3>Recursos en la caché de aplicación</h3>
<p>La caché siempre incluye al menos un recurso, identificado por el URI. Todos los recursos se ajustan a una de las siguientes categorías:</p>
<dl> <dt>Entradas maestras</dt> <dd>Son recursos que se han añadido a la caché porque un contexto de navegación que visitó el usuario incluyó un documento que indicaba que estaba en esta caché usando su atributo <code>manifest</code>.</dd> <dt>El manifiesto</dt> <dd>Es el propio manifiesto de recursos, cargado desde el URI especificado en el atributo <code>manifest</code> del elemento <code>html</code> de una entrada implícita. El manifiesto se descarga y procesa durante el proceso de actualización de la caché de aplicación. Las entradas implícitas deben tener el mismo esquema, host y puerto que el manifiesto.</dd> <dt>Entradas explícitas</dt> <dd>Son recursos listados en el manifiesto de la caché.</dd> <dt>Entradas de reserva</dt> <dd>Son recursos que se listaron en el manifiesto de la caché como entradas de reserva. {{ fx_minversion_inline("3") }}</dd>
</dl>
<div class="note"><strong>Nota:</strong> los recursos pueden etiquetarse con múltiples categorías y, por lo tanto, pueden categorizarse como entradas múltiples. Por ejemplo, una entrada puede ser a la vez una entrada explícita y una entrada de reserva.</div>
<h4>Entradas maestras</h4>
<p>Las entradas maestras son cualquier archivo HTML que incluya una atributo {{ htmlattrxref("manifest","html") }} en su elemento {{ HTMLElement("html") }}. Por ejemplo, supongamos que tenemos el archivo HTML <code><a class="linkification-ext external" href="http://www.foo.bar/entry.html" title="Vinculación: http://www.foo.bar/entry.html">http://www.foo.bar/entry.html</a></code>, que tiene este aspecto:</p>
<pre>;html manifest="foo.manifest"&gt;
&lt;h1&gt;Entry&lt;/h1&gt;
&lt;/html&gt;
</pre>
<p>Si <code>entry.html</code> no está incluido en el manifiesto, la visita a la página <code>entry.html</code> provocará que <code>entry.html</code> se añada a la caché de aplicación como entrada maestra.</p>
<h4>Entradas de reserva</h4>
<p>Las entradas de reserva se usan cuando falla un intento de cargar un recurso. Por ejemplo, imagínate que hay un manifiesto de la caché ubicado en <code><a class=" external" href="http://www.foo.bar/test.manifest" rel="freelink">http://www.foo.bar/test.manifest</a></code> con los siguientes contenidos:</p>
<pre>CACHE MANIFEST
FALLBACK:
foo/bar/ foo.html
</pre>
<p>Cualquier solicitud a <code><a class=" external" href="http://www.foo.bar/foo/bar/" rel="freelink">http://www.foo.bar/foo/bar/</a></code> o sus subdirectorios y contenidos provocará que una solicitud de red intente cargar el recurso solicitado. Si el intento fracasa, debido a un fallo en la red o a algún error del servidor, se cargará en su lugar los contenidos del archivo <code>foo.html</code>.</p>
<h4>La lista blanca en línea</h4>
<p>La lista blanca en línea puede contener cero o más URI de los recursos que la aplicación web necesitará para tener acceso sin conexión al servidor en vez de a la caché. Esto permite que el modelo de seguridad del navegador proteja al usuario frente a potenciales infracciones de seguridad limitando el acceso solo a los recursos aprobados.</p>
<div class="note"><strong>Note:</strong> la lista blanca en línea se ignora en versiones de Firefox anteriores a 3.5.</div>
<p>Esto permite asegurarte de que, por ejemplo, las secuencias de comandos y otro tipo de código se carguen y ejecuten desde el servidor en lugar de la caché:</p>
<pre>CACHE MANIFEST
NETWORK:
/api
</pre>
<p>Esto garantiza que las solicitudes para cargar recursos contenidas en el subárbol <code><a class=" external" href="http://www.foo.bar/api/" rel="freelink">http://www.foo.bar/api/</a></code> irán siempre a la red sin intentar tener acceso a ellos desde la caché.</p>
<h2>El manifiesto de la caché</h2>
<p>Los archivos de manifiesto de la caché deben atenderse con el tipo MIME <code>text/cache-manifest</code> y todos los recursos atendidos a través de dicho tipo deben seguir la sintaxis de un manifiesto de la caché de aplicación, tal y como se define en este artículo. Los manifiestos de la caché son archivos de texto en formato UTF-8 y pueden, opcionalmente, incluir un carácter BOM. Las nuevas líneas estarán representadas por un salto de línea (U+000A), un retorno de carro (U+000D) o ambos al mismo tiempo.</p>
<p>La primera línea del manifiesto de la caché debe constar de la cadena "CACHE MANIFEST" (con un único espacio U+0020 entre las dos palabras), seguido de cero o más caracteres de espacio o de tabulación. Se ignorará cualquier otro texto en la línea.</p>
<p>El resto del manifiesto de la caché debe constar de cero o más de las líneas siguientes:</p>
<dl> <dt>Línea en blanco</dt> <dd>Puedes usar líneas en blanco que consten de cero o más caracteres de espacio o de tabulación.</dd> <dt>Comentario</dt> <dd>Los comentarios constan de cero o más tabulaciones o espacios seguidos por un único carácter "#", seguido a su vez por cero o más caracteres de texto de comentario. Los comentarios pueden usarse solo en sus propias líneas, pero no pueden ser anexados a otras.</dd> <dt>Encabezado de sección</dt> <dd>Los encabezados de sección especifican qué sección del manifiesto de la caché se está manipulando. Existen tres encabezados de sección posibles:</dd>
</dl>
<blockquote>
<table class="standard-table"> <tbody> <tr> <th>Encabezado de sección</th> <th>Descripción</th> </tr> <tr> <td><code>CACHE:</code></td> <td>Cambia a la sección explícita. Esta es la sección predeterminada.</td> </tr> <tr> <td><code>FALLBACK:</code></td> <td>Cambia a la sección de reserva. <p>{{ fx_minversion_note("3") }}</p> </td> </tr> <tr> <td><code>NETWORK:</code></td> <td>Cambia a la sección de la lista blanca en línea. <p>{{ fx_minversion_note("3") }}</p> </td> </tr> </tbody>
</table>
</blockquote>
<dl> <dd>La línea del encabezado de sección puede incluir espacios en blanco, pero debe incluir los dos puntos (:) en el nombre de la sección.</dd> <dt>Datos para la sección actual </dt> <dd>El formato de las líneas de datos varía de una sección a otra. En la sección explícita, cada línea es una referencia URI o IRI válida a un recurso para almacenar en la caché. Se permiten en cada línea los espacios en blanco antes y después del URI o IRI.</dd>
</dl>
<p>Los manifiestos de la caché pueden cambiar de una sección a otra cuando se desee (de forma que cada encabezado de sección puede usarse más de una vez) y se permite que las secciones puedan estar vacías.</p>
<div class="note"><strong>Nota: </strong> los URI relativos lo son respecto al URI del manifiesto de la caché, no respecto al URI del documento que hace referencia al manifiesto.</div>
<h4 name="A_sample_cache_manifest">Un ejemplo de manifiesto de la caché</h4>
<p>Es un manifiesto de la caché sencillo para un sitio web imaginario en <span class="nowiki">foo.com</span>.</p>
<pre class="eval">CACHE MANIFEST
# v1
# Esto es un comentario.
<span class="nowiki">http://www.foo.com/index.html</span>
<span class="nowiki">http://www.foo.com/header.png</span>
<span class="nowiki">http://www.foo.com/blah/blah</span>
</pre>
<p>En este ejemplo, no hay encabezado de sección, por lo que todas las líneas de datos deben estar en la sección explícita.</p>
<p>El comentario "v1" está ahí por una buena razón. Como la caché solo se actualiza cuando cambia el manifiesto, si cambias los recursos (por ejemplo, actualizando la imagen <code>header.png</code> con contenido nuevo), tendrás que cambiar el archivo de manifiesto con el fin de que el navegador sepa que tiene que refrescar la caché. Puedes hacer esto con cualquier modificación en el manifiesto, pero una buena forma es tener un número de versión.</p>
<h2>Especificar un manifiesto de la caché</h2>
<p>Para indicarle a Firefox que use el almacenamiento en la caché de la aplicación sin conexión para un determinado sitio web, este tiene que usar el atributo <code>manifest</code> en el elemento <code>html</code>, de este modo:</p>
<pre class="eval"><span class="nowiki">&lt;html manifest="http://www.foo.com/cache-manifest"&gt;</span>
  ...
&lt;/html&gt;
</pre>
<p>Esto hace que la primera vez que el usuario cargue tu aplicación, Firefox muestre en la barra de notificaciones un mensaje con el texto "Este sitio web (www.example.com) está solicitando almacenar datos en su equipo para usarlos en modo desconexión". [Permitir] [Nunca para este sitio] [Ahora no]". El término "aplicaciones (habilitadas) sin conexión" hace referencia a veces a aplicaciones concretas que se les permite usar las funcionalidades sin conexión.</p>
<h2>El proceso de actualización</h2>
<ol> <li>Cuando Firefox visita un documento que incluye un atributo <code>manifest</code>, envía un evento <code>checking</code> al objeto <code><a href="/en/DOM/window.applicationCache" title="en/DOM/window.applicationCache">window.applicationCache</a></code>, a continuación captura el archivo de manifiesto, siguiendo las reglas apropiadas para el almacenamiento en caché de HTTP. Si la copia del manifiesto almacenada actualmente en la caché está actualizada, el evento <code>noupdate</code> se envía a la <code>applicationCache</code> y el proceso de actualización se ha completado.</li> Si el archivo de manifiesto no ha cambiado desde la última comprobación de actualizaciones, de nuevo el evento <code>noupdate</code> se envía a la <code>applicationCache</code> y el proceso de actualización se ha completado. Por esto, si cambias los recursos, tienes que cambiar el archivo de manifiesto para que Firefox sepa que tiene que volver a almacenar los recursos en la caché. <li>Si el archivo de manifiesto ha cambiado, todos los archivos del manifiesto, así como los que se hayan añadido a la caché llamando a <code><a href="/en/nsIDOMOfflineResourceList#add.28.29" title="en/nsIDOMOfflineResourceList#add.28.29">applicationCache.add()</a></code>, son capturados en una caché temporal, siguiendo las reglas apropiadas de almacenamiento en caché de HTTP. Por cada archivo capturado en la caché, se envía un evento <code>progress</code> al objeto <code>applicationCache</code>. Si sucede cualquier error, se envía un evento <code>error</code> y la actualización se interrumpe.</li> <li>Una vez que todos los archivos se hayan recuperado correctamente, se mueven automáticamente a la caché real sin conexión y se envía un evento <code>cached</code> al objeto <code>applicationCache</code>.</li>
</ol>
<h2>Ubicación del almacenamiento y borrado de la caché sin conexión</h2>
<p>Los datos de la caché sin conexión se almacenan a parte del perfil de Firefox, junto a la caché de disco normal:</p>
<ul> <li>Windows Vista/7: C:\Users\&lt;username&gt;\AppData\<strong>Local</strong>\Mozilla\Firefox\Profiles\&lt;salt&gt;.&lt;profile name&gt;\OfflineCache</li>
</ul>
<p>Se puede inspeccionar el estado actual de la caché sin conexión en la página about:cache (debajo del encabezado "Dispositivo de la caché sin conexión").</p>
<p>La caché sin conexión <strong>no</strong> se borra a través de Herramientas &gt; Limpiar historial reciente (<a class=" link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=538595" title="https://bugzilla.mozilla.org/show_bug.cgi?id=538595">bug 538595</a>)<br>
La caché sin conexión <strong>no</strong> se borra a través de Herramientas &gt; Opciones &gt; Avanzado &gt; Red &gt; Datos sin conexión &gt; Limpiar ahora (<a class=" link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=538588" title="https://bugzilla.mozilla.org/show_bug.cgi?id=538588">bug 538588</a>).<br>
La caché sin conexión puede borrarse para cada sitio de forma individual mediante el botón "Eliminar..." en Herramientas &gt; Opciones &gt; Avanzado &gt; Red &gt; Datos sin conexión.</p>
<p>Consulta también <a href="/en/DOM/Storage#Storage_location_and_clearing_the_data" title="en/DOM/Storage#Storage location and clearing the data">borrar los datos de almacenamiento DOM</a>.</p>
<h2>Consulta también</h2>
<ul> <li><a class="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline">Borrador de trabajo para HTML 5</a></li> <li><a class="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline" title="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline">Aplicaciones web sin conexión</a> en hacks.mozilla.org: presenta una demo de aplicación sin conexión y explica cómo funciona.</li> <li>{{ interface("nsIApplicationCache") }}</li> <li>{{ interface("nsIApplicationCacheNamespace") }}</li> <li>{{ interface("nsIApplicationCacheContainer") }}</li> <li>{{ interface("nsIApplicationCacheChannel") }}</li> <li>{{ interface("nsIApplicationCacheService") }}</li> <li>{{ interface("nsIDOMOfflineResourceList") }}</li> <li><a class="external" href="http://www.ibm.com/developerworks/web/library/wa-ffox3/">Prepárate para Firefox 3.0: una guía de desarrolladores web para la multitud de características nuevas de este popular navegador, especialmente las características de aplicación sin conexión</a> (IBM developerWorks)</li>
</ul>
<p>{{ HTML5ArticleTOC() }}</p>
<p>{{ languages( { "en": "en/Offline_resources_in_Firefox", "fr": "fr/Ressources_hors_ligne_dans_Firefox", "ja": "ja/Offline_resources_in_Firefox", "pl": "pl/Zasoby_offline_w_Firefoksie", "zh-tw": "zh_tw/Offline_resources_on_Firefox" } ) }}</p>
Revertir a esta revisión