Do not free memory used by native window immediately.
Otherwise we would have two ways to destroy a window, making code much more complicated.
This commit is contained in:
parent
db39910455
commit
8417f158b4
2 changed files with 19 additions and 15 deletions
|
@ -97,13 +97,7 @@ void Window::WillCloseWindow(bool* prevent_default) {
|
||||||
void Window::OnWindowClosed() {
|
void Window::OnWindowClosed() {
|
||||||
Emit("closed");
|
Emit("closed");
|
||||||
|
|
||||||
if (window_) {
|
|
||||||
window_->RemoveObserver(this);
|
window_->RemoveObserver(this);
|
||||||
|
|
||||||
// Free memory when native window is closed, the delete is delayed so other
|
|
||||||
// observers would not get a invalid pointer of NativeWindow.
|
|
||||||
base::MessageLoop::current()->DeleteSoon(FROM_HERE, window_.release());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::OnWindowBlur() {
|
void Window::OnWindowBlur() {
|
||||||
|
|
|
@ -99,6 +99,10 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
|
||||||
}
|
}
|
||||||
|
|
||||||
NativeWindow::~NativeWindow() {
|
NativeWindow::~NativeWindow() {
|
||||||
|
// Make sure we have the OnRenderViewDeleted message sent even when the window
|
||||||
|
// is destroyed directly.
|
||||||
|
DestroyWebContents();
|
||||||
|
|
||||||
// It's possible that the windows gets destroyed before it's closed, in that
|
// It's possible that the windows gets destroyed before it's closed, in that
|
||||||
// case we need to ensure the OnWindowClosed message is still notified.
|
// case we need to ensure the OnWindowClosed message is still notified.
|
||||||
NotifyWindowClosed();
|
NotifyWindowClosed();
|
||||||
|
@ -298,6 +302,17 @@ void NativeWindow::CapturePage(const gfx::Rect& rect,
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::DestroyWebContents() {
|
void NativeWindow::DestroyWebContents() {
|
||||||
|
if (!inspectable_web_contents_)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The OnRenderViewDeleted is not called when the WebContents is destroyed
|
||||||
|
// directly (e.g. when closing the window), so we make sure it's always
|
||||||
|
// emitted to users by sending it before window is closed..
|
||||||
|
FOR_EACH_OBSERVER(NativeWindowObserver, observers_,
|
||||||
|
OnRenderViewDeleted(
|
||||||
|
GetWebContents()->GetRenderProcessHost()->GetID(),
|
||||||
|
GetWebContents()->GetRoutingID()));
|
||||||
|
|
||||||
inspectable_web_contents_.reset();
|
inspectable_web_contents_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,14 +366,6 @@ void NativeWindow::NotifyWindowClosed() {
|
||||||
if (is_closed_)
|
if (is_closed_)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// The OnRenderViewDeleted is not called when the WebContents is destroyed
|
|
||||||
// directly (e.g. when closing the window), so we make sure it's always
|
|
||||||
// emitted to users by sending it before window is closed..
|
|
||||||
FOR_EACH_OBSERVER(NativeWindowObserver, observers_,
|
|
||||||
OnRenderViewDeleted(
|
|
||||||
GetWebContents()->GetRenderProcessHost()->GetID(),
|
|
||||||
GetWebContents()->GetRoutingID()));
|
|
||||||
|
|
||||||
is_closed_ = true;
|
is_closed_ = true;
|
||||||
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnWindowClosed());
|
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnWindowClosed());
|
||||||
|
|
||||||
|
@ -444,6 +451,9 @@ void NativeWindow::MoveContents(content::WebContents* source,
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::CloseContents(content::WebContents* source) {
|
void NativeWindow::CloseContents(content::WebContents* source) {
|
||||||
|
// Destroy the WebContents before we close the window.
|
||||||
|
DestroyWebContents();
|
||||||
|
|
||||||
// When the web contents is gone, close the window immediately, but the
|
// When the web contents is gone, close the window immediately, but the
|
||||||
// memory will not be freed until you call delete.
|
// memory will not be freed until you call delete.
|
||||||
// In this way, it would be safe to manage windows via smart pointers. If you
|
// In this way, it would be safe to manage windows via smart pointers. If you
|
||||||
|
|
Loading…
Reference in a new issue