|
@@ -122,6 +122,15 @@ struct Converter<views::FlexAllocationOrder> {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+template <>
|
|
|
+struct Converter<electron::api::View> {
|
|
|
+ static bool FromV8(v8::Isolate* isolate,
|
|
|
+ v8::Local<v8::Value> val,
|
|
|
+ electron::api::View* out) {
|
|
|
+ return gin::ConvertFromV8(isolate, val, &out);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
template <>
|
|
|
struct Converter<views::SizeBound> {
|
|
|
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
|
|
@@ -254,11 +263,13 @@ void View::RemoveChildView(gin::Handle<View> child) {
|
|
|
#if BUILDFLAG(IS_MAC)
|
|
|
ScopedCAActionDisabler disable_animations;
|
|
|
#endif
|
|
|
+ // Remove from child_views first so that OnChildViewRemoved doesn't try to
|
|
|
+ // remove it again
|
|
|
+ child_views_.erase(it);
|
|
|
// It's possible for the child's view to be invalid here
|
|
|
// if the child's webContents was closed or destroyed.
|
|
|
if (child->view())
|
|
|
view_->RemoveChildView(child->view());
|
|
|
- child_views_.erase(it);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -352,6 +363,19 @@ void View::OnViewIsDeleting(views::View* observed_view) {
|
|
|
view_ = nullptr;
|
|
|
}
|
|
|
|
|
|
+void View::OnChildViewRemoved(views::View* observed_view, views::View* child) {
|
|
|
+ v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
|
|
|
+ auto it = std::ranges::find_if(
|
|
|
+ child_views_, [&](const v8::Global<v8::Object>& child_view) {
|
|
|
+ View current_view;
|
|
|
+ gin::ConvertFromV8(isolate, child_view.Get(isolate), ¤t_view);
|
|
|
+ return current_view.view()->GetID() == child->GetID();
|
|
|
+ });
|
|
|
+ if (it != child_views_.end()) {
|
|
|
+ child_views_.erase(it);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// static
|
|
|
gin_helper::WrappableBase* View::New(gin::Arguments* args) {
|
|
|
View* view = new View();
|