diff options
author | tony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-24 21:48:08 +0000 |
---|---|---|
committer | tony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-24 21:48:08 +0000 |
commit | 6d2adbe35ab026b770c3de40cd648424f6aaadab (patch) | |
tree | f4e485571c831f0731b31ee304aa94a774840f59 | |
parent | b1c7cc42d026a073d1db2e7fa293be525e936738 (diff) | |
download | chromium_src-6d2adbe35ab026b770c3de40cd648424f6aaadab.zip chromium_src-6d2adbe35ab026b770c3de40cd648424f6aaadab.tar.gz chromium_src-6d2adbe35ab026b770c3de40cd648424f6aaadab.tar.bz2 |
Implement BrowserList::AllBrowsersClosed for Linux.
This fixes leaks caused by not calling gtk_widget_destroy on
dialog windows when we exit.
While I'm here, fix a GList leak on Linux toolkit views.
Review URL: http://codereview.chromium.org/223015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27130 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/browser_list_gtk.cc | 23 | ||||
-rw-r--r-- | chrome/chrome.gyp | 1 | ||||
-rw-r--r-- | chrome/common/temp_scaffolding_stubs.cc | 6 | ||||
-rw-r--r-- | views/window/window_gtk.cc | 4 |
4 files changed, 29 insertions, 5 deletions
diff --git a/chrome/browser/browser_list_gtk.cc b/chrome/browser/browser_list_gtk.cc new file mode 100644 index 0000000..99a66dd --- /dev/null +++ b/chrome/browser/browser_list_gtk.cc @@ -0,0 +1,23 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/browser_list.h" + +#include <gtk/gtk.h> + +void BrowserList::AllBrowsersClosed() { + // Close non-browser windows. + GList* window_list = gtk_window_list_toplevels(); + g_list_foreach(window_list, (GFunc)g_object_ref, NULL); + for (GList* i = window_list; i != NULL; i = g_list_next(i)) { + GtkWindow* window = GTK_WINDOW(i->data); + // We filter by visible widgets because there are toplevel windows that if + // we try to destroy, we crash. For example, trying to destroy the tooltip + // window or the toplevel associated with drop down windows crashes. + if (GTK_WIDGET_VISIBLE(GTK_WIDGET(window))) + gtk_widget_destroy(GTK_WIDGET(window)); + } + g_list_foreach(window_list, (GFunc)g_object_unref, NULL); + g_list_free(window_list); +} diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 80c834b..668c7a5 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -809,6 +809,7 @@ 'browser/browser_accessibility_manager.h', 'browser/browser_init.cc', 'browser/browser_init.h', + 'browser/browser_list_gtk.cc', 'browser/browser_list.cc', 'browser/browser_list.h', 'browser/browser_main.cc', diff --git a/chrome/common/temp_scaffolding_stubs.cc b/chrome/common/temp_scaffolding_stubs.cc index 9a5f2d7..2f79a93 100644 --- a/chrome/common/temp_scaffolding_stubs.cc +++ b/chrome/common/temp_scaffolding_stubs.cc @@ -8,7 +8,6 @@ #include "base/gfx/rect.h" #include "base/logging.h" -#include "chrome/browser/browser_list.h" #include "chrome/browser/first_run.h" #include "chrome/browser/rlz/rlz.h" @@ -19,6 +18,7 @@ #if defined(OS_MACOSX) #include "chrome/browser/automation/automation_provider.h" +#include "chrome/browser/browser_list.h" #include "chrome/browser/fonts_languages_window.h" #include "chrome/browser/memory_details.h" #endif @@ -216,16 +216,14 @@ void DragDownload(const DownloadItem* download, } // namespace download_util #endif -#if !defined(TOOLKIT_VIEWS) +#if defined(OS_MACOSX) void BrowserList::AllBrowsersClosed() { // TODO(port): Close any dependent windows if necessary when the last browser // window is closed. } -#endif //-------------------------------------------------------------------------- -#if defined(OS_MACOSX) bool DockInfo::GetNewWindowBounds(gfx::Rect* new_window_bounds, bool* maximize_new_window) const { // TODO(pinkerton): Implement on Mac. diff --git a/views/window/window_gtk.cc b/views/window/window_gtk.cc index 8550fe7..7e833cb 100644 --- a/views/window/window_gtk.cc +++ b/views/window/window_gtk.cc @@ -90,11 +90,13 @@ Window* Window::CreateChromeWindow(gfx::NativeWindow parent, // static void Window::CloseAllSecondaryWindows() { - for (GList* window = gtk_window_list_toplevels(); window; + GList* windows = gtk_window_list_toplevels(); + for (GList* window = windows; window; window = g_list_next(window)) { Window::CloseSecondaryWidget( WidgetGtk::GetViewForNative(GTK_WIDGET(window->data))); } + g_list_free(windows); } gfx::Rect WindowGtk::GetBounds() const { |