fix: segfault when moving WebContentsView between BrowserWindows (#44613)
* fix: segfault when moving WebContentsView between BrowserWindows Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: actually enable fix Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * fixup segfault when moving WebContentsView between BrowserWindows Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
This commit is contained in:
parent
c9d026e19b
commit
2f20dbea55
3 changed files with 58 additions and 1 deletions
|
@ -124,6 +124,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,
|
||||
|
@ -257,11 +266,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -388,6 +399,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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue