From fb0a8f6763692a25081fd590eef1ea0850ad434a Mon Sep 17 00:00:00 2001
From: andycall <dongtiangche@outlook.com>
Date: Tue, 5 Mar 2024 16:34:59 +0800
Subject: [PATCH] feat: add default event to turn on the JavaScript GC.

---
 bridge/core/dom/events/event_target.cc    | 2 +-
 bridge/core/events/event_type_names.json5 | 3 ++-
 webf/lib/src/dom/window.dart              | 1 +
 webf/lib/src/launcher/controller.dart     | 5 +++++
 4 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/bridge/core/dom/events/event_target.cc b/bridge/core/dom/events/event_target.cc
index aabb6b440e..985f2195dd 100644
--- a/bridge/core/dom/events/event_target.cc
+++ b/bridge/core/dom/events/event_target.cc
@@ -373,7 +373,7 @@ NativeValue EventTarget::HandleDispatchEventFromDart(int32_t argc, const NativeV
   assert(event->currentTarget() != nullptr);
 
   auto* window = DynamicTo<Window>(event->target());
-  if (window != nullptr && event->type() == event_type_names::kload) {
+  if (window != nullptr && (event->type() == event_type_names::kload || event->type() == event_type_names::kgcopen)) {
     window->OnLoadEventFired();
   }
 
diff --git a/bridge/core/events/event_type_names.json5 b/bridge/core/events/event_type_names.json5
index 57ec82797c..4185ec5f53 100644
--- a/bridge/core/events/event_type_names.json5
+++ b/bridge/core/events/event_type_names.json5
@@ -223,6 +223,7 @@
     "webglcontextrestored",
     "wheel",
     "zoom",
-    "intersectionchange"
+    "intersectionchange",
+    "gcopen"
   ]
 }
diff --git a/webf/lib/src/dom/window.dart b/webf/lib/src/dom/window.dart
index 03d06dbb21..f86f92b32f 100644
--- a/webf/lib/src/dom/window.dart
+++ b/webf/lib/src/dom/window.dart
@@ -21,6 +21,7 @@ class Window extends EventTarget {
       : screen = Screen(context!.contextId, document.controller.ownerFlutterView, document.controller.view),
         super(context) {
     BindingBridge.listenEvent(this, 'load');
+    BindingBridge.listenEvent(this, 'gcopen');
   }
 
   @override
diff --git a/webf/lib/src/launcher/controller.dart b/webf/lib/src/launcher/controller.dart
index 6f811f68b4..bace909504 100644
--- a/webf/lib/src/launcher/controller.dart
+++ b/webf/lib/src/launcher/controller.dart
@@ -325,6 +325,11 @@ class WebFViewController implements WidgetsBindingObserver {
     window = Window(BindingContext(view, _contextId, pointer), document);
     _registerPlatformBrightnessChange();
 
+    // 3 seconds should be enough for page loading, make sure the JavaScript GC was opened.
+    Timer(Duration(seconds: 3), () {
+      window.dispatchEvent(Event('gcopen'));
+    });
+
     // Blur input element when new input focused.
     window.addEventListener(EVENT_CLICK, (event) async {
       if (event.target is Element) {