النقل إلى وضع الحماية IFRAME

يستخدم Apps Script بيئة اختبار آمنة لتوفير عزل وقائي للتطبيقات في حالات معيّنة. تمّ الآن إيقاف جميع أوضاع وضع "الصندوق الرمّل" باستثناء IFRAME. أما التطبيقات التي تستخدم أوضاع وضع الحماية القصوى القديمة، فتستخدم الآن الوضع IFRAME الأحدث تلقائيًا.

قد تحتاج التطبيقات التي كانت تستخدم هذه الأوضاع القديمة مع خدمة HTML إلى إجراء تغييرات على وضع IFRAME، لحلّ الاختلافات التالية:

  • عليك الآن إلغاء سمة target للرابط باستخدام target="_top" أو target="_blank".
  • يجب أن تتضمّن ملفات HTML التي تعرِضها خدمة HTML علامات <!DOCTYPE html> و<html> و <body>.
  • لا يتم تحميل مكتبة أداة التحميل الأصلية من Google api.js تلقائيًا في وضع IFRAME
  • على مستخدمي Picker الاتصال بالرقم setOrigin() لأنّ المحتوى يتم عرضه من نطاق جديد.
  • بعض المتصفّحات القديمة، بما في ذلك IE9، غير متوافقة
  • يجب أن تستخدم الموارد المستورَدة الآن بروتوكول HTTPS.
  • لم يعُد يتم منع إرسال النماذج تلقائيًا

يمكنك الاطّلاع على تفاصيل هذه الاختلافات في الأقسام التالية.

في وضع IFRAME، عليك ضبط سمة رابط الهدف على _top أو _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>

يمكنك أيضًا إلغاء هذه السمة باستخدام العلامة <base> ضمن القسم head في صفحة الويب المُضمّنة:

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

علامات HTML ذات المستوى الأعلى

في وضع "منطقة اختبار" NATIVEEMULATED)، تتم إضافة علامات HTML معيّنة تلقائيًا إلى ملف ‎ .html في Apps Script، ولكن لا يحدث ذلك عند استخدام وضع IFRAME.

للتأكّد من عرض صفحات المشاريع بشكل صحيح باستخدام IFRAME، يجب تضمين محتوى الصفحة في العلامات التالية من المستوى الأعلى:

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

يجب تحميل مكتبة أداة تحميل JavaScript الأصلية بشكل صريح.

يجب تغيير النصوص البرمجية التي تعتمد على التحميل التلقائي لمكتبة أداة التحميل الأصلية api.js لتحميل هذه المكتبة بشكل صريح، كما هو موضّح في المثال التالي:

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

تغيير في واجهة برمجة التطبيقات Google Picker API

عند استخدام Google Picker API، يجب الآن استدعاء setOrigin() عند إنشاء PickerBuilder وإدخال المصدر google.script.host.origin، كما هو موضَّح في المثال التالي:

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

للاطّلاع على مثال كامل، راجِع مربّعات الحوار لفتح الملفات.

دعم المتصفح

يستند IFRAME وضع الحماية إلى ميزة وضع الحماية في إطار iframe في HTML5. لا تتوفّر هذه الميزة في بعض المتصفّحات القديمة، مثل Internet Explorer 9. يمكن أن يؤدي ذلك إلى حدوث مشكلة إذا كان مشروعك في "برمجة تطبيقات Google" يستوفي الشرطَين التاليَين:

  • يستخدم HtmlService
  • استخدام ميزة "وضع الحماية" في EMULATED أو NATIVE في السابق

عند نقل هذه التطبيقات إلى وضع "وضع الحماية في IFRAME"، قد لا تعمل على بعض المتصفحات القديمة (مثل IE9 والإصدارات الأقدم) التي لا تتيح ميزة وضع الحماية في IFRAME لإطار iframe في HTML5.

إنّ التطبيقات التي تطلب حاليًا وضع IFRAME أو لا تستخدم HtmlService على الإطلاق لن تتأثر بهذه المشكلة.

يجب الآن استخدام بروتوكول HTTPS للموارد المستورَدة

يجب تغيير التطبيقات السابقة التي استوردت الموارد باستخدام HTTP لتتحوّل إلى استخدام HTTPS بدلاً من ذلك.

لم يعُد يتم منع إرسال النماذج تلقائيًا

في إطار NATIVE، تم منع نماذج HTML من إرسال بياناتها والتنقّل في الصفحة. وبناءً على ذلك، يمكن للمطوّر ببساطة إضافة onclick معالج إلى زر الإرسال بدون القلق بشأن ما يحدث بعد ذلك.

في وضع IFRAME، يُسمح بإرسال نماذج HTML، وإذا لم يكن عنصر النموذج يحتوي على سمة action محدّدة، سيتم إرساله إلى صفحة فارغة. والأسوأ من ذلك، أنّ إطار iframe الداخلي سيعيد التوجيه إلى الصفحة الفارغة قبل أن تنتهي مهلة onclick المعالج.

يكمن الحل في إضافة رمز JavaScript إلى صفحتك يمنع عناصر النموذج من الإرسال الفعلي، حتى يتوفر لمعالجي النقرات وقت للعمل:

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

يمكن العثور على مثال كامل في دليل HtmlService التواصل بين العميل والخادم.