النقل إلى وضع الحماية 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 لبرمجة التطبيقات، ولكن لا يحدث ذلك عند استخدام الوضع IFRAME.

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

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

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

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

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

تغيير منتقي واجهة برمجة التطبيقات

عند استخدام واجهة برمجة التطبيقات للمنتقي، يجب الآن استدعاء 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 والإصدارات الأقدم) التي لا تتوافق مع ميزة وضع الحماية HTML5'.

ولن تتأثر التطبيقات التي تطلب وضع IFRAME أو لا تستخدم HtmlService على الإطلاق.

بروتوكول HTTPS مطلوب الآن للموارد التي تم استيرادها

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

لن يتم تلقائيًا منع إرسال النموذج.

تم منع نماذج HTML ذات وضع الحماية NATIVE من إرسال الصفحة والتنقّل فيها فعليًا. بالإضافة إلى ذلك، يمكن لمطوّر البرامج ببساطة إضافة معالج 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 الاتصال من عميل إلى خادم.