Contenido externo

El modelo de seguridad de las Apps de Chrome no permite el contenido externo en los iframes ni el uso de contenido intercalado. la secuencia de comandos y eval(). Puedes anular estas restricciones, pero tu contenido externo debe aisladas de la app.

El contenido aislado no puede acceder directamente a los datos de la app ni a ninguna de las APIs. Usar origen cruzado XMLHttpRequests y mensajes posteriores para comunicar entre la página del evento y el contenido de la zona de pruebas, y acceder de forma indirecta a las APIs.

Cómo hacer referencia a recursos externos

La Política de Seguridad del Contenido que usan las apps no permite el uso de muchos tipos de URLs remotas, por lo que No pueden hacer referencia directamente a imágenes, hojas de estilo o fuentes externas de una página de la app. En cambio, puedes usar XMLHttpRequests de origen cruzado para recuperar estos recursos y, luego, publicarlos a través de URLs blob:.

Requisito del manifiesto

Para poder usar XMLHttpRequests de origen cruzado, deberás agregar un permiso para las URL remotas host:

"permissions": [
    "...",
    "https://supersweetdomainbutnotcspfriendly.com/"
  ]

XMLHttpRequest de origen cruzado

Recupera la URL remota en la app y entrega su contenido como una URL blob::

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://supersweetdomainbutnotcspfriendly.com/image.png', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  var img = document.createElement('img');
  img.src = window.URL.createObjectURL(this.response);
  document.body.appendChild(img);
};

xhr.send();

Es posible que quieras guardar estos recursos de forma local para que estén disponibles sin conexión.

Incorporar páginas web externas

La etiqueta webview te permite incorporar contenido web externo en tu app, por ejemplo, una página web . Reemplaza los iframes que dirigen a URLs remotas, que están inhabilitadas en las Apps de Chrome. Desmarcar “Me gusta” iframes, la etiqueta webview se ejecuta en un proceso independiente. Esto significa que un exploit en su interior estén aisladas y no podrán obtener privilegios elevados. Además, dado que su almacenamiento (cookies, etc.) está aislada de la app, no hay forma de que el contenido web acceda a datos de la app.

Agregar elemento de WebView

Tu elemento webview debe incluir la URL del contenido de origen y especificar sus dimensiones.

<webview src="http://news.google.com/" width="640" height="480"></webview>

Actualizar propiedades

Para cambiar dinámicamente las propiedades src, width y height de una etiqueta webview, puedes hacer lo siguiente: establece esas propiedades directamente en el objeto JavaScript o usa la función del DOM setAttribute.

document.querySelector('#mywebview').src =
    'http://blog.chromium.org/';
// or
document.querySelector('#mywebview').setAttribute(
    'src', 'http://blog.chromium.org/');

Contenido local de zona de pruebas

Las zonas de pruebas permiten que las páginas especificadas se publiquen en un origen único de zona de pruebas. Luego, estas páginas eximida de su Política de Seguridad del Contenido. Las páginas de zona de pruebas pueden usar iframes, secuencias de comandos intercaladas eval() Consulta la descripción del campo del manifiesto de sandbox.

Sin embargo, hay una desventaja: las páginas de la zona de pruebas no pueden usar Chrome.* APIs Si necesitas hacer cosas como eval(), toma esta ruta para eximirte de la CSP, pero no podrás usar cosas nuevas y geniales.

Usar secuencias de comandos intercaladas en la zona de pruebas

A continuación, se muestra una página de zona de pruebas de ejemplo que usa una secuencia de comandos intercalada y eval():

<html>
  <body>
    <h1>Woot</h1>
    <script>
      eval('console.log(\'I am an eval-ed inline script.\')');
    </script>
  </body>
</html>

Incluir zona de pruebas en el manifiesto

Debes incluir el campo sandbox en el manifiesto y enumerar las páginas de la app que se publicarán en un zona de pruebas:

"sandbox": {
  "pages": ["sandboxed.html"]
}

Abrir una página de zona de pruebas en una ventana

Al igual que cualquier otra página de la aplicación, puedes crear una ventana en la que se abra la página de la zona de pruebas. Este es un que crea dos ventanas, una para la ventana principal de la app, que no está en zona de pruebas, y otra para la página de zona de pruebas:

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('window.html', {
    'bounds': {
      'width': 400,
      'height': 400,
      'left': 0,
      'top': 0
    }
  });

  chrome.app.window.create('sandboxed.html', {
    'bounds': {
      'width': 400,
      'height': 400,
      'left': 400,
      'top': 0
    }
  });
});

La incorporación de una página de zona de pruebas en la página de una app

Las páginas de zona de pruebas también se pueden incorporar dentro de la página de otra app a través de un iframe:

<!DOCTYPE html>
<html>
<head>
</head>
  <body>
    <p>I am normal app window.</p>

    <iframe src="sandboxed.html" width="300" height="200"></iframe>
  </body>
</html>

Envía mensajes a páginas de la zona de pruebas

Hay dos partes para enviar un mensaje: debes publicar el mensaje desde la ventana o ventana del remitente, y escuche los mensajes en la página o ventana de recepción.

Publicar mensaje

Puedes usar postMessage para la comunicación entre tu app y el contenido de la zona de pruebas. Aquí hay un ejemplo secuencia de comandos en segundo plano que publica un mensaje en la página de zona de pruebas que se abre:

var myWin = null;

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('sandboxed.html', {
    'bounds': {
      'width': 400,
      'height': 400
    }
  }, function(win) {
       myWin = win;
       myWin.contentWindow.postMessage('Just wanted to say hey.', '*');
     });
});

En términos generales en la Web, es recomendable especificar el origen exacto desde el que se envía el mensaje. Las Apps de Chrome no tienen acceso al origen único del contenido de la zona de pruebas, así que solo puedes incluir todo en la lista de entidades permitidas orígenes como orígenes aceptables ("*"). Por lo general, en el extremo receptor, debes verificar el origen. pero, dado que el contenido de las Apps de Chrome está incluido, no es necesario. Para obtener más información, consulta window.postMessage.

Escucha el mensaje y responde

Este es un ejemplo de receptor de mensajes que se agrega a tu página de zona de pruebas:

var messageHandler = function(event) {
  console.log('Background script says hello.', event.data);

  // Send a reply
  event.source.postMessage(
      {'reply': 'Sandbox received: ' + event.data}, event.origin);
};

window.addEventListener('message', messageHandler);

Para obtener más detalles, consulta la muestra de la zona de pruebas.