Chrono Mock
اللغةالعربية

صفحات الويب داخل التطبيق الأصلي

يشغّل تطبيق سطح المكتب المزوَّد بمحرّك ويب مدمج صفحاته في عملية منفصلة معزولة. والآلية الأصلية تغطي التطبيق وتتوقف عند هذا الحدّ - فتنتقل النافذة إلى التاريخ الذي طلبته ولا تنتقل اللوحة داخلها. وهذا يسدّ تلك الفجوة.

الإخفاق الذي يبدو نجاحًا

كثير من تطبيقات Windows أصلية من الخارج وصفحة ويب من الداخل. شاشة إعدادات، أو لوحة معلومات، أو عرض تقرير، أو لوحة ترخيص - بُنيت مرة واحدة بـ HTML واستُضيفت في WebView2 أو Qt WebEngine بدل كتابتها مرتين.

ويشغّل المحرّك تلك الصفحات في عمليته الخاصة، وهذه العملية معزولة. والمكتبة المحقونة في التطبيق لا تدخلها. فكل ما يسأل عنه التطبيق Windows ينتقل إلى تاريخ الجلسة، وكل ما تسأل عنه الصفحة JavaScript لا ينتقل:

  • شريط العنوان والسجلات والملفات تقول 2038.
  • واللوحة داخل النافذة نفسها تقول اليوم.
  • لا خطأ ولا تحذير، ويبدو النصفان واثقين بالقدر نفسه.

وهذه هي النسخة الباهظة من هذا العطل، لأن الاختبار يبدو أنه جرى. وكان السلوك الأقدم يبلّغ عن مثل هذه الجلسة نجاحًا نظيفًا، وهذا ادّعاء لا تستطيع الأداة إثباته.

ما تفعله الجلسة بدلًا من ذلك

تشغّل الجلسة الآليتين معًا. يدخل الخطّاف الأصلي التطبيق كالمعتاد، وتُبلَغ الصفحات بالطريقة الوحيدة التي يُبلَغ بها أي شيء عملية عرض معزولة: بسؤال المحرّك نفسه.

عند الإطلاق يرث التطبيق متغيّري بيئة يطلبان من محرّكه فتح منفذ تصحيح أخطاء محلي. ويُلحقان بما يمرّره التطبيق أصلًا من مفاتيح بدل أن يحلّا محلها. ثم تراقب الجلسة عملياتها هي حتى يظهر ذلك المنفذ، وحين يظهر تنتقل كل صفحة وكل worker خلفه إلى الساعة نفسها التي يعمل بها التطبيق.

بدء واحد، وسرعة واحدة، وخط زمني واحد. وتصل أي تغييرات في السرعة أو أي قفزة إلى التطبيق وصفحاته معًا، وتعمل مؤقّتات الصفحات بإيقاع التطبيق نفسه لا بإيقاع خاص بها.

وهو مفعَّل افتراضيًا ويُعطَّل بمفتاح واحد، لا يفتح أي منفذ إطلاقًا ويترك الصفحات على الساعة الحقيقية.

# لا شيء لتضبطه - يُعثر على المحرّك إن وُجد
chrono run "C:\Program Files\YourApp\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60

# أو اترك الصفحات وشأنها، ولا تفتح أي منفذ
chrono run "C:\Program Files\YourApp\YourApp.exe" --at 2038-01-01T00:00:00 --no-embedded

ما يقوله التقرير عن الصفحات

لا تُدمج الصفحات في أرقام التطبيق نفسه. بل تُعدّ وحدات قائمة بذاتها، لأن العملية والصفحة شيئان مختلفان، وجمعهما يخترع رقمًا لا معنى له:

  • العنوان الرئيسي يعدّ الاثنين - processes: 4, contexts: 1.
  • تحصل كل صفحة على صفوفها الخاصة، مثل context 1: page Date.now (12 calls) في سطر الأوامر وpage Date.now - fake clock في جدول التدقيق بالنافذة.
  • ويُسمّى المحرّك الذي جرى الوصول إليه مع منفذه، فتستطيع توجيه DevTools الخاصة بك إلى الصفحات التي تقودها الجلسة بالضبط.

ويقول التشغيل التجريبي هل ستُبلَغ الصفحات قبل أن يبدأ أي شيء. ماذا تعني الأحكام ←

ثلاثة حدود يجدر معرفتها قبل أن تبدأ

يظل منفذ تصحيح الأخطاء مفتوحًا ما دام المحرّك يعمل.

يصغي على هذا الحاسوب فقط، لكنه مفتوح أمام أي برنامج على هذا الحاسوب ما دام المحرّك يعمل، وكل ما يستطيع الوصول إليه يستطيع قيادة تلك الصفحات. وتحذّر الجلسة من ذلك في كل مرة فُتح فيها منفذ، وتسمّي المنفذ بدل أن تذكره في المطلق. وعلى جهاز مشترك أو غير موثوق، استخدم المفتاح الذي لا يفتح شيئًا.

التطبيق الذي يعمل بصلاحيات مرتفعة بعيد المنال.

المحرّك الذي يستضيفه تطبيق بصلاحيات مرتفعة يتجاهل المتغيرات التي تضبطها الجلسة، فتبقى صفحاته على الساعة الحقيقية. وهذه قاعدة المحرّك نفسه لا إعداد، ولا سبيل إلى تجاوزها من الخارج.

تُبلّغ مثل هذه الجلسة بنتيجة PARTIAL، وهذا هو الجواب الصادق.

تبقى عمليات المحرّك المساعدة واستدعاءات الوقت الأصلية لعملية العرض نفسها على الساعة الحقيقية. فالصفحات على ساعة الجلسة وبقية تلك الأسرة ليست كذلك، ولهذا يقول الحكم جزئي ويسمّي ما تُرك بدل أن يقرّب إلى نجاح.

وحدّان أصغر، يُقالان بوضوح. تقرأ الصفحات المنطقة الزمنية للجلسة كإزاحة ثابتة، فيسمّيها Intl بإزاحتها، مثل GMT+02:00، لا باسم مدينة. والمؤقّت المجدول أصلًا قبل أن تصل الجلسة إلى الصفحة يحتفظ بمعدّله القديم، كما في جلسة Chromium الخالصة - وتحذّر الجلسة بدل أن تتركك تستنتج أن شيئًا لم يحدث.

وإذا كان المحرّك مضبوطًا عبر سياسة وسائط المتصفح في السجل، فإن متغيّر الجلسة يتقدّم طوال مدتها، ويقول التقرير ذلك - لأن منفذ تصحيح الأخطاء الذي ضبطته هناك لم يكن ليُطبَّق.

إلى أي مدى اختُبر

تجريبي، بالمعنى المحدد نفسه المستخدم في غير هذا الموضع: يعمل على الأهداف التي بُني عليها، ولم يُختبر على نطاق واسع، والتدقيق المدمج هو مرجعك لا هذه الصفحة. وقد قيس يدويًا على مضيف WebView2 ومضيف Qt WebEngine في Windows بنظام 64 بت، لا بمجموعة الاختبارات الآلية. وفي تلك التشغيلات قرأت الصفحات سنة الجلسة بمعدّل الجلسة وتبعت القفزة.

وفي Windows بنظام 32 بت ثمة تفصيل يُفضَّل معرفته مسبقًا لا اكتشافه: بيئة تشغيل WebView2 بنظام 64 بت حتى حين يكون التطبيق المستضيف لها بنظام 32 بت، فلا تستطيع جلسة 32 بت تسمية عمليات المحرّك ولا أدوارها. وتبقى القناة إلى الصفحات تعمل. ويكون التقرير أقل تحديدًا فحسب بشأن ما لم يستطع تعيينه، ويقول أيًّا من الاثنين هو.

جرّبه