JavaScript في وضع الحماية

إنّ JavaScript Sandbox هي مجموعة فرعية مبسّطة من لغة JavaScript التي توفّر طريقة آمنة لتنفيذ منطق JavaScript عشوائي من النماذج المخصّصة في أداة "إدارة العلامات من Google". لتوفير بيئة تنفيذ آمنة، يتم تقييد بعض ميزات جافا سكريبت أو إزالتها. تعتمد لغة JavaScript في وضع الحماية على ECMAScript 5.1. تتوفّر بعض ميزات ECMAScript 6 مثل وظائف الأسهم وتعريفات const/let.

بيئة التنفيذ الشاملة

لا يتم تنفيذ JavaScript في وضع الحماية في بيئة التنفيذ العامة العادية مثل لغة JavaScript العادية، لذلك الكائن window وخصائصه غير متوفّرة. ويتضمّن ذلك الطُرق المحدّدة في النطاق العام، مثل encodeURI أو setTimeout، والقيم العامة، مثل location أو document، والقيم العامة التي تحدّدها النصوص البرمجية المحمَّلة. وبدلاً من ذلك، تتوفّر دالة require عمومية لجميع JavaScript في وضع الحماية التي توفّر العديد من هذه الدوال. يمكن قراءة القيم من النافذة باستخدام أداة copyFromWindow.

نظام النوع المبسَّط

تتيح JavaScript في وضع الحماية الأنواع التالية: null وundefined وstring وnumber وboolean وarray وobject وfunction. يتم إنشاء الصفائف والكائنات باستخدام البنية الحرفية ( [] {} )، ونظرًا لعدم إمكانية الوصول إلى بيئة التنفيذ العالمية القياسية، لا تتوفّر دالة الإنشاء العالمية، مثل String() وNumber(). لا توجد كلمة رئيسية واحدة (new) في JavaScript في وضع الحماية، ولا يمكن للدالات الوصول إلى الكلمة الرئيسية this. كما تمت إزالة بعض طرق النوع الأصلي. اطّلع على المكتبة القياسية للحصول على قائمة شاملة بالطرق المتوافقة مع المحتوى المدمج مع المحتوى.

تنسيق رمز النموذج المخصص

تمثل الشفرة المكتوبة لتنفيذ نموذج مخصّص نص الدالة التي سيتم تنفيذها كلما تم تنشيط العلامة أو تم تقييم المتغير. وتحتوي هذه الدالة على معلّمة بيانات فردية (data) تحتفظ بجميع القيم التي تم ضبطها في واجهة المستخدم لهذه العلامة أو مثيل المتغير، مع ضبط المفاتيح على أسماء معلمات النموذج المحدّدة في النموذج المخصّص.

نموذج لتنفيذ علامة المرشد

const sendPixel = require('sendPixel');
const encodeUri = require('encodeUri');
const encodeUriComponent = require('encodeUriComponent');

let url = encodeUri(data['url']);

if (data['useCacheBuster']) {
  const encode = require('encodeUriComponent');
  const cacheBusterQueryParam = data['cacheBusterQueryParam'] || 'gtmcb';
  const last = url.charAt(url.length - 1);
  let delimiter = '&';
  if (url.indexOf('?') < 0) {
    delimiter = '?';
  } else if (last == '?' || last == '&') {
    delimiter = '';
  }
  url += delimiter +
      encodeUriComponent(cacheBusterQueryParam) + '=' + encodeUriComponent(data['randomNumber']);
}
sendPixel(url, data['gtmOnSuccess'], data['gtmOnFailure']);