From d6079782d18341d3e6eb413fb88aa460dc40c10c Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 11 Apr 2014 12:32:42 +0800 Subject: [PATCH] mac: InspectableWebContents should be destroyed before release NSWindow. Fixes atom/atom#1841. --- atom/browser/native_window.cc | 6 +++--- atom/browser/native_window.h | 3 ++- atom/browser/native_window_mac.mm | 11 ++++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index ad0977199b..95fa029bf2 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -57,12 +57,12 @@ NativeWindow::NativeWindow(content::WebContents* web_contents, base::DictionaryValue* options) : content::WebContentsObserver(web_contents), has_frame_(true), + inspectable_web_contents_( + brightray::InspectableWebContents::Create(web_contents)), is_closed_(false), node_integration_("except-iframe"), has_dialog_attached_(false), - weak_factory_(this), - inspectable_web_contents_( - brightray::InspectableWebContents::Create(web_contents)) { + weak_factory_(this) { options->GetBoolean(switches::kFrame, &has_frame_); #if defined(OS_MACOSX) diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index 27349b192e..17b06b45d6 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -251,6 +251,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, // Window icon. gfx::Image icon_; + scoped_ptr inspectable_web_contents_; + private: // Schedule a notification unresponsive event. void ScheduleUnresponsiveEvent(int ms); @@ -304,7 +306,6 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate, scoped_ptr devtools_web_contents_observer_; scoped_ptr dialog_manager_; - scoped_ptr inspectable_web_contents_; // Maps url to file path, used by the file requests sent from devtools. typedef std::map PathsMap; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 2a779dd769..2fbcb1127c 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -66,7 +66,6 @@ static const CGFloat kAtomWindowCornerRadius = 4.0; } - (void)windowWillClose:(NSNotification*)notification { - shell_->window() = nil; [self autorelease]; } @@ -177,6 +176,9 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents, [[AtomNSWindowDelegate alloc] initWithShell:this]; [window() setDelegate:delegate]; + // We will manage window's lifetime ourselves. + [window() setReleasedWhenClosed:NO]; + // Enable the NSView to accept first mouse event. bool acceptsFirstMouse = false; options->GetBoolean(switches::kAcceptFirstMouse, &acceptsFirstMouse); @@ -198,9 +200,12 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents, } NativeWindowMac::~NativeWindowMac() { + // Force InspectableWebContents to be destroyed before we destroy window, + // because it may still be observing the window at this time. + inspectable_web_contents_.reset(); + if (window()) - // Use autorelease since we may have delegates or observers at this time. - [window() autorelease]; + [window_ release]; } void NativeWindowMac::Close() {