172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/owned_widget_gtk.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <gtk/gtk.h>
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenOwnedWidgetGtk::~OwnedWidgetGtk() {
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Destroy();
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid OwnedWidgetGtk::Own(GtkWidget* widget) {
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!widget)
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!widget_);
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // We want to make sure that Own() was called properly, right after the
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // widget was created. There should be a floating reference.
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(g_object_is_floating(widget));
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sink the floating reference, we should now own this reference.
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  g_object_ref_sink(widget);
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  widget_ = widget;
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid OwnedWidgetGtk::Destroy() {
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!widget_)
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GtkWidget* widget = widget_;
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  widget_ = NULL;
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  gtk_widget_destroy(widget);
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK(!g_object_is_floating(widget));
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // NOTE: Assumes some implementation details about glib internals.
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DCHECK_EQ(G_OBJECT(widget)->ref_count, 1U);
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  g_object_unref(widget);
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
42