IFRAME Sandbox Moduna Geçiş

Apps Komut Dosyası, belirli durumlarda uygulamalar için koruyucu yalıtım sağlamak amacıyla bir güvenlik korumalı alanı kullanır. IFRAME hariç tüm korumalı alan modları artık kullanımdan kaldırıldı. Eski korumalı alan modlarını kullanan uygulamalar artık otomatik olarak yeni IFRAME modunu kullanıyor.

Daha önce HTML Hizmeti ile bu eski modları kullanan uygulamaların, aşağıdaki farklılıkları gidermek için IFRAME modunda değişiklik yapması gerekebilir:

  • Artık target="_top" veya target="_blank" özelliğini kullanarak bağlantının target özelliğini geçersiz kılmanız gerekir.
  • HTML Hizmeti tarafından sunulan HTML dosyaları <!DOCTYPE html>, <html> ve <body> etiketlerini içermelidir
  • Google yerel yükleyici kitaplığı api.js, IFRAME modunda otomatik olarak yüklenmiyor
  • İçerik yeni bir alandan sunulduğu için Picker kullanıcılarının setOrigin() çağrısı yapması gerekir
  • IE9 dahil bazı eski tarayıcılar desteklenmez
  • İçe aktarılan kaynaklar artık HTTPS kullanmalıdır
  • Form gönderimi artık varsayılan olarak engellenmiyor

Bu farklar aşağıdaki bölümlerde ayrıntılı olarak açıklanmıştır.

IFRAME modunda, bağlantı hedefi özelliğini _top veya _blank olarak ayarlamanız gerekir:

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>

Bu özelliği, kapsayıcı web sayfasının head bölümündeki <base> etiketini kullanarak da geçersiz kılabilirsiniz:

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

Üst düzey HTML etiketleri

NATIVE (ve EMULATED) korumalı alan modunda belirli HTML etiketleri otomatik olarak bir Apps Komut Dosyası .html dosyasına eklenir ancak IFRAME modu kullanıldığında bu işlem yapılmaz.

Proje sayfalarınızın IFRAME kullanılarak doğru şekilde yayınlandığından emin olmak için sayfa içeriğinizi aşağıdaki üst düzey etiketlere sarın:

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

Yerel JavaScript yükleyici kitaplığı açıkça yüklenmelidir

Yerel yükleyici kitaplığının otomatik olarak yüklenmesini temel alan komut dosyaları api.js aşağıdaki örnekte gösterildiği gibi bu kitaplığı açıkça yükleyecek şekilde değiştirilmelidir:

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

Google Picker API değişikliği

Google Picker API'yi kullanırken artık PickerBuilder'ı oluştururken setOrigin()'yi çağırmanız ve aşağıdaki örnekte gösterildiği gibi kaynağı google.script.host.origin iletmeniz gerekir:

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);
}

Çalışan tam bir örnek için Dosya açma iletişim kutuları başlıklı makaleyi inceleyin.

Tarayıcı desteği

IFRAME korumalı alan modu, HTML5'teki iframe korumalı alan özelliğini temel alır. Bu özellik, Internet Explorer 9 gibi bazı eski tarayıcılarda desteklenmez. Apps Komut Dosyası projeniz aşağıdakileri yapıyorsa bu sorun oluşabilir:

  • HtmlService kullanıyorsa ve
  • Daha önce EMULATED veya NATIVE korumalı alan kullanılmışsa

Bu uygulamaların IFRAME korumalı alan moduna taşınması, HTML5'in iframe korumalı alan özelliğini desteklemeyen bazı eski tarayıcılarda (özellikle IE9 ve önceki sürümler) artık çalışmayabilecekleri anlamına gelir.

Halihazırda IFRAME modunu isteyen veya hiç HtmlService kullanmayan uygulamalar bu sorundan etkilenmez.

İçe aktarılan kaynaklar için artık HTTPS gereklidir

HTTP kullanarak kaynak içe aktaran önceki uygulamalar, HTTPS kullanacak şekilde değiştirilmelidir.

Form gönderimi artık varsayılan olarak engellenmiyor

NATIVE altında, HTML formlarının korumalı alanda gönderilmesi ve sayfa içinde gezinmesi engellendi. Bu nedenle, geliştiriciler gönder düğmesine bir onclick işleyici ekleyebilir ve sonrasında ne olacağı konusunda endişelenmeyebilir.

Ancak IFRAME modunda HTML formlarının gönderilmesine izin verilir ve bir form öğesinde action özelliği belirtilmemişse form boş bir sayfaya gönderilir. Daha da kötüsü, iç iframe, onclick işleyicinin tamamlama şansı bulamadan boş sayfaya yönlendirir.

Çözüm, sayfanıza form öğelerinin gönderilmesini engelleyen bir JavaScript kodu eklemektir. Böylece tıklama işleyicilerinin çalışması için zaman olur:

<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>

Tam bir örneği, HtmlService kılavuzundaki İstemci ile Sunucu Arasında İletişim bölümünde bulabilirsiniz.