From 4b3d0b27ad902fca01c62a26534c3893619ecb8d Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Thu, 2 Apr 2020 18:00:56 -0700 Subject: [PATCH 1/3] fix: nullptr check when closing windows --- shell/browser/window_list.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/shell/browser/window_list.cc b/shell/browser/window_list.cc index 494114edd9e03..688f2577a65d8 100644 --- a/shell/browser/window_list.cc +++ b/shell/browser/window_list.cc @@ -84,16 +84,19 @@ void WindowList::CloseAllWindows() { #if defined(OS_MACOSX) std::reverse(windows.begin(), windows.end()); #endif - for (auto* const& window : windows) - if (!window->IsClosed()) + for (auto* const& window : windows) { + if (window && !window->IsClosed()) window->Close(); + } } // static void WindowList::DestroyAllWindows() { WindowVector windows = GetInstance()->windows_; - for (auto* const& window : windows) - window->CloseImmediately(); // e.g. Destroy() + for (auto* const& window : windows) { + if (window) + window->CloseImmediately(); + } } WindowList::WindowList() {} From 9817444d5faee0f64c04ecc5d3286e3e329eb232 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 7 Apr 2020 07:20:43 -0700 Subject: [PATCH 2/3] Address feedback from @zcbenz --- shell/browser/window_list.cc | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/shell/browser/window_list.cc b/shell/browser/window_list.cc index 688f2577a65d8..9a68673597b2b 100644 --- a/shell/browser/window_list.cc +++ b/shell/browser/window_list.cc @@ -10,6 +10,18 @@ #include "shell/browser/native_window.h" #include "shell/browser/window_list_observer.h" +namespace { +template +std::vector> ConvertToWeakPtrVector(std::vector raw_ptrs) { + std::vector> converted_to_weak; + for (auto* raw_ptr : raw_ptrs) { + base::WeakPtr weak = raw_ptr->GetWeakPtr(); + converted_to_weak.push_back(weak); + } + return converted_to_weak; +} +} // namespace + namespace electron { // static @@ -93,7 +105,10 @@ void WindowList::CloseAllWindows() { // static void WindowList::DestroyAllWindows() { WindowVector windows = GetInstance()->windows_; - for (auto* const& window : windows) { + std::vector> weak_windows = + ConvertToWeakPtrVector(windows); + + for (const auto& window : weak_windows) { if (window) window->CloseImmediately(); } From 1809661f723b93ca1f463be06abebbad4c022234 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 7 Apr 2020 13:31:54 -0700 Subject: [PATCH 3/3] use weakptr vector in CloseAllWindows --- shell/browser/window_list.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/shell/browser/window_list.cc b/shell/browser/window_list.cc index 9a68673597b2b..8dd4bf37745ee 100644 --- a/shell/browser/window_list.cc +++ b/shell/browser/window_list.cc @@ -14,9 +14,9 @@ namespace { template std::vector> ConvertToWeakPtrVector(std::vector raw_ptrs) { std::vector> converted_to_weak; + converted_to_weak.reserve(raw_ptrs.size()); for (auto* raw_ptr : raw_ptrs) { - base::WeakPtr weak = raw_ptr->GetWeakPtr(); - converted_to_weak.push_back(weak); + converted_to_weak.push_back(raw_ptr->GetWeakPtr()); } return converted_to_weak; } @@ -92,11 +92,12 @@ void WindowList::RemoveObserver(WindowListObserver* observer) { // static void WindowList::CloseAllWindows() { - WindowVector windows = GetInstance()->windows_; + std::vector> weak_windows = + ConvertToWeakPtrVector(GetInstance()->windows_); #if defined(OS_MACOSX) - std::reverse(windows.begin(), windows.end()); + std::reverse(weak_windows.begin(), weak_windows.end()); #endif - for (auto* const& window : windows) { + for (const auto& window : weak_windows) { if (window && !window->IsClosed()) window->Close(); } @@ -104,9 +105,8 @@ void WindowList::CloseAllWindows() { // static void WindowList::DestroyAllWindows() { - WindowVector windows = GetInstance()->windows_; std::vector> weak_windows = - ConvertToWeakPtrVector(windows); + ConvertToWeakPtrVector(GetInstance()->windows_); for (const auto& window : weak_windows) { if (window)