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

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

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

  • يجب الآن إلغاء السمة target للرابط باستخدام السمة target="_top" أو السمة target="_blank".
  • يجب أن تتضمّن ملفات HTML التي تعرضها خدمة HTML علامات <!DOCTYPE html> و<html> و <body>.
  • لا يتم تحميل مكتبة برنامج تحميل التطبيقات الأصلية من Google api.js تلقائيًا في الوضع IFRAME.
  • يحتاج المستخدمون المنتقي إلى الاتصال بـ 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> في قسم العنوان في صفحة الويب المضمّنة:

<!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 لبرمجة تطبيقات Google، إلا أنّ ذلك لا يحدث عند استخدام الوضع 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. يمكن أن يمثل ذلك مشكلة إذا كان مشروع "برمجة التطبيقات" لديك يجمع بين:

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

إنّ نقل هذه التطبيقات إلى وضع الحماية IFRAME يعني أنّها لن تعمل بعد الآن على بعض المتصفحات القديمة (خاصة IE9 والإصدارات الأقدم) التي لا تتيح ميزة وضع الحماية باستخدام إطارات 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.