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ı Google Workspacekullanır. IFRAME hariç tüm korumalı alan modları sonlandı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 modu için değişiklikler yapması gerekebilir:

  • Şimdi target="_top" veya target="_blank" 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 yayınlandığı için seçici kullanıcılarının setOrigin() yöntemini çağırması gerekir
  • IE9 gibi 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 farklılıklar 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, ilgili web sayfasının başlık bölümünde yer alan <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 Apps Komut Dosyası .html dosyasına eklenir. Ancak IFRAME modu kullanılırken bu durum yaşanmaz.

Proje sayfalarınızın IFRAME kullanılarak doğru şekilde sunulduğundan emin olmak için sayfa içeriğinizi aşağıdaki üst düzey etiketlerle sarmalayın:

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

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

api.js yerel yükleyici kitaplığının otomatik olarak yüklenmesini kullanan komut dosyaları, bu kitaplığı açıkça yüklemek için aşağıdaki örnekte olduğu gibi 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() yöntemini çağırmanız ve aşağıdaki örnekte gösterildiği gibi google.script.host.origin kaynağında aktarmanız 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);
}

Tam çalışan bir örnek için Dosya açma iletişim kutuları konusuna bakın.

Tarayıcı desteği

IFRAME korumalı alan modu, HTML5'teki iframe korumalı alanı özelliğine dayanır. Bu özellik, Internet Explorer 9 gibi bazı eski tarayıcılarda desteklenmez. Bu, Apps Komut Dosyası projenizde aşağıdakilerin her ikisi de geçerliyse sorun olabilir:

  • HtmlService kullanır ve
  • daha önce kullanılan EMULATED veya NATIVE korumalı alanı

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

Halihazırda IFRAME modu isteğinde bulunan veya HtmlService hiç kullanmayan uygulamalar bu sorundan etkilenmez.

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

Kaynakları HTTP kullanarak içe aktaran önceki uygulamalar, bunun yerine HTTPS kullanacak şekilde değiştirilmelidir.

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

NATIVE korumalı alan altında, HTML formlarının sayfada gerçekten gönderilmesi ve sayfada gezinmesi engellendi. Bu nedenle, geliştirici gönder düğmesine bir onclick işleyicisi ekleyerek daha sonra ne olduğu konusunda endişelenmelerine gerek kalmaz.

Ancak IFRAME modunda HTML formlarının gönderilmesine izin verilir ve bir form öğesinde action özelliği belirtilmemişse boş bir sayfaya gönderilir. Daha da kötüsü, onclick işleyici bitirme fırsatı bulmadan iç iframe boş sayfaya yönlendirme yapar.

Bunun çözümü, form öğelerinin gerçekten gönderilmesini engelleyen JavaScript kodunu sayfanıza eklemektir. Böylece, tıklama işleyicilerin çalışması için zaman kalır:

<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 İstemciden Sunucuya İletişim adlı htmlService kılavuzunda bulabilirsiniz.