Migration vers le mode IFRAME Sandbox

Apps Script utilise un bac à sable de sécurité pour assurer une isolation protectrice des applications dans certaines situations. Google WorkspaceTous les modes de bac à sable sont désormais abandonnés, à l'exception de IFRAME. Les applications qui utilisent d'anciens modes de bac à sable utilisent désormais automatiquement le nouveau mode IFRAME.

Les applications qui utilisaient auparavant ces anciens modes avec le service HTML devront peut-être apporter des modifications pour le mode IFRAME afin de prendre en compte les différences suivantes:

  • Vous devez désormais remplacer l'attribut target du lien à l'aide de target="_top" ou target="_blank".
  • Les fichiers HTML diffusés par le service HTML doivent inclure les balises <!DOCTYPE html>, <html> et <body>.
  • La bibliothèque de chargeur natif Google api.js ne se charge pas automatiquement en mode IFRAME
  • Les utilisateurs du sélecteur doivent appeler setOrigin(), car le contenu est diffusé à partir d'un nouveau domaine.
  • Certains anciens navigateurs, y compris IE9, ne sont pas compatibles
  • Les ressources importées doivent désormais utiliser HTTPS
  • L'envoi des formulaires n'est plus bloqué par défaut

Ces différences sont détaillées dans les sections suivantes.

En mode IFRAME, vous devez définir l'attribut de cible du lien sur _top ou _blank:

Code.js

function doGet() {
  var template = HtmlService.createTemplateFromFile('top');
  return template.evaluate();
}

top.html

<!DOCTYPE html>
<html>
 <body>
   <div>
     <a href="http://google.com" target="_top">Click Me!</a>
   </div>
 </body>
</html>

Vous pouvez également remplacer cet attribut à l'aide de la balise <base> dans la section "head" de la page Web englobante:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

Balises HTML de premier niveau

Dans le mode bac à sable NATIVE (et EMULATED), certaines balises HTML sont automatiquement ajoutées à un fichier .html Apps Script, mais cela ne se produit pas en mode IFRAME.

Pour vous assurer que les pages de votre projet sont diffusées correctement à l'aide de IFRAME, encapsulez le contenu de votre page dans les balises de niveau supérieur suivantes:

<!DOCTYPE html>
<html>
  <body>
    <!-- Add your HTML content here -->
  </body>
</html>

La bibliothèque de chargeur JavaScript native doit être chargée explicitement

Les scripts qui reposaient sur le chargement automatique de la bibliothèque de chargeur natif api.js doivent être modifiés pour charger cette bibliothèque explicitement, comme dans l'exemple suivant:

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

Modification de l'API Google Picker

Lorsque vous utilisez l'API Google Picker, vous devez désormais appeler setOrigin() lors de la création du PickerBuilder et transmettre l'origine google.script.host.origin, comme illustré dans l'exemple suivant:

function createPicker(oauthToken) {
  var picker = new google.picker.PickerBuilder()
      .addView(google.picker.ViewId.SPREADSHEETS) // Or a different ViewId
      .setOAuthToken(oauthToken)
      .setDeveloperKey(developerKey)
      .setCallback(pickerCallback)
      .setOrigin(google.script.host.origin) // Note the setOrigin
      .build();
  picker.setVisible(true);
}

Pour obtenir un exemple fonctionnel complet, consultez la section Boîtes de dialogue d'ouverture de fichier.

Prise en charge des navigateurs

Le mode bac à sable IFRAME est basé sur la fonctionnalité de bac à sable d'iFrame en HTML5. Cette fonctionnalité n'est pas disponible dans certains anciens navigateurs, comme Internet Explorer 9. Cela peut poser problème si votre projet Apps Script:

  • utilise HtmlService ;
  • avoir utilisé auparavant un bac à sable EMULATED ou NATIVE

Si vous migrez ces applications vers le mode bac à sable IFRAME, elles risquent de ne plus fonctionner sur certains navigateurs plus anciens (IE9 et versions antérieures, en particulier) qui ne sont pas compatibles avec la fonctionnalité de bac à sable d'iframe HTML5.

Ce problème ne concerne pas les applications qui demandent déjà le mode IFRAME ou qui n'utilisent pas du tout HtmlService.

Le protocole HTTPS est désormais obligatoire pour les ressources importées

Les applications précédentes qui importaient des ressources à l'aide de HTTP doivent être modifiées pour utiliser HTTPS à la place.

L'envoi des formulaires n'est plus bloqué par défaut

Sous NATIVE, le bac à sable empêchait l'envoi des formulaires HTML et la navigation sur la page. Par conséquent, un développeur peut simplement ajouter un gestionnaire onclick au bouton d'envoi et ne pas avoir à se soucier de ce qui se passe ensuite.

Toutefois, avec le mode IFRAME, les formulaires HTML sont autorisés à être envoyés. Si aucun attribut action n'est spécifié pour un élément de formulaire, il sera envoyé vers une page vide. Pire encore, l'iFrame interne redirige vers la page vide avant que le gestionnaire onclick n'ait eu le temps de se terminer.

La solution consiste à ajouter à votre page du code JavaScript qui empêche l'envoi des éléments du formulaire, afin que les gestionnaires de clics aient le temps de fonctionner:

<script>
  // Prevent forms from submitting.
  function preventFormSubmit() {
    var forms = document.querySelectorAll('form');
    for (var i = 0; i < forms.length; i++) {
      forms[i].addEventListener('submit', function(event) {
        event.preventDefault();
      });
    }
  }
  window.addEventListener('load', preventFormSubmit);
</script>

Vous trouverez un exemple complet dans le guide HtmlService Communication client-serveur.