เว็บเพจภายในแอปเนทีฟ
แอปเดสก์ท็อปที่มีเว็บเอนจินในตัวรันหน้าเว็บของมันในโพรเซสแยกที่เป็นแซนด์บ็อกซ์ กลไกเนทีฟครอบคลุมแอปแล้วหยุดอยู่ที่ขอบนั้น - หน้าต่างจึงย้ายไปยังวันที่ที่คุณขอ แต่แผงที่อยู่ข้างในไม่ย้ายตาม ส่วนนี้ปิดช่องว่างนั้น
ความล้มเหลวที่ดูเหมือนความสำเร็จ
แอป 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 บิตจึงระบุชื่อโพรเซสของเอนจินหรือบทบาทของมันไม่ได้ ช่องทางไปยังหน้าเว็บยังทำงานอยู่ รายงานเพียงแต่ระบุได้ไม่เจาะจงนักว่าอะไรที่มันระบุไม่ได้ และบอกว่าเป็นกรณีใดในสองกรณี