From nobody@FreeBSD.org  Sat May 15 17:21:23 2010
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 366E11065674
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 15 May 2010 17:21:23 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 253B28FC13
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 15 May 2010 17:21:23 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o4FHLMQx071983
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 15 May 2010 17:21:22 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id o4FHLMOr071982;
	Sat, 15 May 2010 17:21:22 GMT
	(envelope-from nobody)
Message-Id: <201005151721.o4FHLMOr071982@www.freebsd.org>
Date: Sat, 15 May 2010 17:21:22 GMT
From: Martin Birgmeier <martin.birgmeier@aon.at>
To: freebsd-gnats-submit@FreeBSD.org
Subject: firefox 3.5.9 crashes when closing a tab
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         146619
>Category:       ports
>Synopsis:       firefox 3.5.9 crashes when closing a tab
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    beat
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat May 15 17:30:07 UTC 2010
>Closed-Date:    Tue May 18 14:19:11 UTC 2010
>Last-Modified:  Tue May 18 14:20:04 UTC 2010
>Originator:     Martin Birgmeier
>Release:        7.3
>Organization:
MBi at home
>Environment:
FreeBSD atpcdvvc.xyzzy 7.3-RELEASE FreeBSD 7.3-RELEASE #0: Sun Mar 21 20:44:13 CET 2010     root@atpcdvvc.xyzzy:/usr/VOL/OBJ/FreeBSD/RELENG_7_3_0_RELEASE/src/sys/XYZZY_SMP_NA  i386
>Description:
Since my last update of ports yesterday, when closing one of multiple open tabs in firefox 3.5.9, the browser crashes with the following console message:

The program 'firefox-bin' received an X Window System error.
This probably reflects a bug in the program.
The error was 'RenderBadPicture (invalid Picture parameter)'.
  (Details: serial 123298 error_code 157 request_code 147 minor_code 7)
  (Note to programmers: normally, X errors are reported asynchronously;
   that is, you will receive the error a while after causing it.
   To debug your program, run it with the --sync command line
   option to change this behavior. You can then get a meaningful
   backtrace from your debugger if you break on the gdk_x_error() function.)

Interestingly, this seems to happen only if the tab has been open for more than a few seconds, but then the crash is quite repeatable.
>How-To-Repeat:
Open multiple tabs in firefox 3.5.9 (firefox-3.5.9,1), wait a while, then open one tab.
>Fix:
Downgrading cairo-1.8.10_1,1 to cairo-1.8.8_1,1 seems to have solved the problem.

>Release-Note:
>Audit-Trail:

From: Martin Birgmeier <Martin.Birgmeier@aon.at>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/146619: firefox 3.5.9 crashes when closing a tab
Date: Sat, 15 May 2010 20:01:06 +0200

 It's probably got something to do with 
 https://bugzilla.mozilla.org/show_bug.cgi?id=522635
Responsible-Changed-From-To: freebsd-ports-bugs->beat 
Responsible-Changed-By: beat 
Responsible-Changed-When: Mon May 17 08:46:26 UTC 2010 
Responsible-Changed-Why:  
I'll take it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146619 

From: Beat Gaetzi <beat@FreeBSD.org>
To: bug-followup@FreeBSD.org, martin.birgmeier@aon.at
Cc:  
Subject: Re: ports/146619: firefox 3.5.9 crashes when closing a tab
Date: Mon, 17 May 2010 11:30:39 +0200

 This is a multi-part message in MIME format.
 --------------090706010105080009080509
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 
 Hi Martin,
 
 I think it is related to the given Mozilla bug. Could you please move
 the attached file to the www/firefox35/files directory and rebuild Firefox.
 
 Thanks,
 Beat
 
 --------------090706010105080009080509
 Content-Type: text/plain;
  name="patch-bugzilla-bug-522635"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="patch-bugzilla-bug-522635"
 
 diff --git a/widget/src/gtk2/Makefile.in b/widget/src/gtk2/Makefile.in
 index 0df722e..39654b1 100644
 --- widget/src/gtk2/Makefile.in
 +++ widget/src/gtk2/Makefile.in
 @@ -78,7 +78,6 @@ endif
  
  CSRCS		= \
  		mozcontainer.c \
 -		mozdrawingarea.c \
  		keysym2ucs.c \
  		nsPrintdGTK.c \
  		$(NULL)
 @@ -152,7 +151,6 @@ endif
  EXPORTS		= \
                  nsGTKToolkit.h \
  		nsIImageToPixbuf.h \
 -		mozdrawingarea.h \
  		mozcontainer.h \
  		$(NULL)
  
 diff --git a/widget/src/gtk2/mozcontainer.c b/widget/src/gtk2/mozcontainer.c
 index 71b425f..89731a3 100644
 --- widget/src/gtk2/mozcontainer.c
 +++ widget/src/gtk2/mozcontainer.c
 @@ -294,8 +294,15 @@ moz_container_realize (GtkWidget *widget)
  
      /* create the shell window */
  
 -    attributes.event_mask = gtk_widget_get_events (widget);
 -    attributes.event_mask |=  (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK);
 +    attributes.event_mask = (gtk_widget_get_events (widget) |
 +                             GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK |
 +                             GDK_VISIBILITY_NOTIFY_MASK |
 +                             GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
 +                             GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
 +#ifdef HAVE_GTK_MOTION_HINTS
 +                             GDK_POINTER_MOTION_HINT_MASK |
 +#endif
 +                             GDK_POINTER_MOTION_MASK);
      attributes.x = widget->allocation.x;
      attributes.y = widget->allocation.y;
      attributes.width = widget->allocation.width;
 diff --git a/widget/src/gtk2/mozcontainer.h b/widget/src/gtk2/mozcontainer.h
 index 8f1d2f0..51850ea 100644
 --- widget/src/gtk2/mozcontainer.h
 +++ widget/src/gtk2/mozcontainer.h
 @@ -40,6 +40,7 @@
  #define __MOZ_CONTAINER_H__
  
  #include <gtk/gtkcontainer.h>
 +#include <gtk/gtkversion.h>
  
  #ifdef __cplusplus
  extern "C" {
 @@ -83,6 +84,11 @@ extern "C" {
  #define IS_MOZ_CONTAINER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), MOZ_CONTAINER_TYPE))
  #define MOZ_CONAINTER_GET_CLASS(obj)  (GTK_CHECK_GET_CLASS ((obj), MOZ_CONTAINER_TYPE, MozContainerClass))
  
 +#if (GTK_CHECK_VERSION(2, 12, 0) || \
 +    (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON)))
 +#define HAVE_GTK_MOTION_HINTS
 +#endif
 +
  typedef struct _MozContainer      MozContainer;
  typedef struct _MozContainerClass MozContainerClass;
  
 diff --git a/widget/src/gtk2/mozdrawingarea.c b/widget/src/gtk2/mozdrawingarea.c
 deleted file mode 100644
 index 5b7cf99..0000000
 --- widget/src/gtk2/mozdrawingarea.c
 +++ /dev/null
 @@ -1,241 +0,0 @@
 -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 -/* vim:expandtab:shiftwidth=4:tabstop=4:
 - */
 -/* ***** BEGIN LICENSE BLOCK *****
 - * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 - *
 - * The contents of this file are subject to the Mozilla Public License Version
 - * 1.1 (the "License"); you may not use this file except in compliance with
 - * the License. You may obtain a copy of the License at
 - * http://www.mozilla.org/MPL/
 - *
 - * Software distributed under the License is distributed on an "AS IS" basis,
 - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 - * for the specific language governing rights and limitations under the
 - * License.
 - *
 - * The Original Code is mozilla.org code.
 - *
 - * The Initial Developer of the Original Code is Christopher Blizzard
 - * <blizzard@mozilla.org>.  Portions created by the Initial Developer
 - * are Copyright (C) 2001 the Initial Developer. All Rights Reserved.
 - *
 - * Contributor(s):
 - *
 - * Alternatively, the contents of this file may be used under the terms of
 - * either the GNU General Public License Version 2 or later (the "GPL"), or
 - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 - * in which case the provisions of the GPL or the LGPL are applicable instead
 - * of those above. If you wish to allow use of your version of this file only
 - * under the terms of either the GPL or the LGPL, and not to allow others to
 - * use your version of this file under the terms of the MPL, indicate your
 - * decision by deleting the provisions above and replace them with the notice
 - * and other provisions required by the GPL or the LGPL. If you do not delete
 - * the provisions above, a recipient may use your version of this file under
 - * the terms of any one of the MPL, the GPL or the LGPL.
 - *
 - * ***** END LICENSE BLOCK ***** */
 -
 -#include "mozdrawingarea.h"
 -
 -/* init methods */
 -static void moz_drawingarea_class_init          (MozDrawingareaClass *klass);
 -static void moz_drawingarea_init                (MozDrawingarea *drawingarea);
 -
 -/* static methods */
 -static void moz_drawingarea_create_windows      (MozDrawingarea *drawingarea,
 -                                                 GdkWindow *parent,
 -                                                 GtkWidget *widget,
 -                                                 GdkVisual *visual);
 -
 -static void moz_drawingarea_finalize            (GObject *object);
 -
 -static GObjectClass *parent_class = NULL;
 -
 -GtkType
 -moz_drawingarea_get_type(void)
 -{
 -    static GtkType moz_drawingarea_type = 0;
 -
 -   if (!moz_drawingarea_type) {
 -       static GTypeInfo moz_drawingarea_info = {
 -           sizeof(MozDrawingareaClass), /* class size */
 -           NULL, /* base_init */
 -           NULL, /* base_finalize */
 -           (GClassInitFunc) moz_drawingarea_class_init, /* class_init */
 -           NULL, /* class_destroy */
 -           NULL, /* class_data */
 -           sizeof(MozDrawingarea), /* instance_size */
 -           0, /* n_preallocs */
 -           (GInstanceInitFunc) moz_drawingarea_init, /* instance_init */
 -           NULL, /* value_table */
 -       };
 -       moz_drawingarea_type =
 -           g_type_register_static (G_TYPE_OBJECT,
 -                                   "MozDrawingarea",
 -                                   &moz_drawingarea_info, 0);
 -   }
 -
 -   return moz_drawingarea_type;
 -}
 -
 -MozDrawingarea *
 -moz_drawingarea_new (MozDrawingarea *parent, MozContainer *widget_parent,
 -                     GdkVisual *visual)
 -{
 -    MozDrawingarea *drawingarea;
 -
 -    drawingarea = g_object_new(MOZ_DRAWINGAREA_TYPE, NULL);
 -
 -    if (!parent)
 -        moz_drawingarea_create_windows(drawingarea,
 -                                       GTK_WIDGET(widget_parent)->window,
 -                                       GTK_WIDGET(widget_parent),
 -                                       visual);
 -    else
 -        moz_drawingarea_create_windows(drawingarea,
 -                                       parent->inner_window, 
 -                                       GTK_WIDGET(widget_parent),
 -                                       visual);
 -
 -    return drawingarea;
 -}
 -
 -void
 -moz_drawingarea_class_init (MozDrawingareaClass *klass)
 -{
 -    GObjectClass *object_class = G_OBJECT_CLASS (klass);
 -
 -    object_class->finalize = moz_drawingarea_finalize;
 -
 -    parent_class = g_type_class_peek_parent(klass);
 -}
 -
 -void
 -moz_drawingarea_init (MozDrawingarea *drawingarea)
 -{
 -
 -}
 -
 -void
 -moz_drawingarea_reparent (MozDrawingarea *drawingarea, GdkWindow *aNewParent)
 -{
 -    gdk_window_reparent(drawingarea->clip_window,
 -                        aNewParent, 0, 0);
 -}
 -
 -void
 -moz_drawingarea_create_windows (MozDrawingarea *drawingarea, GdkWindow *parent,
 -                                GtkWidget *widget, GdkVisual *visual)
 -{
 -    GdkWindowAttr attributes;
 -    gint          attributes_mask = 0;
 -
 -    /* create the clipping window */
 -    attributes.event_mask = 0;
 -    attributes.x = 0;
 -    attributes.y = 0;
 -    attributes.width = 1;
 -    attributes.height = 1;
 -    attributes.wclass = GDK_INPUT_OUTPUT;
 -    attributes.window_type = GDK_WINDOW_CHILD;
 -    if (!visual) {
 -        attributes.visual = gtk_widget_get_visual (widget);
 -        attributes.colormap = gtk_widget_get_colormap (widget);
 -    } else {
 -        attributes.visual = visual;
 -        attributes.colormap = gdk_colormap_new(visual, 0);
 -    }
 -
 -    attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP |
 -        GDK_WA_X | GDK_WA_Y;
 -
 -    drawingarea->clip_window = gdk_window_new (parent, &attributes,
 -                                               attributes_mask);
 -    gdk_window_set_user_data(drawingarea->clip_window, widget);
 -
 -    /* set the default pixmap to None so that you don't end up with the
 -       gtk default which is BlackPixel. */
 -    gdk_window_set_back_pixmap(drawingarea->clip_window, NULL, FALSE);
 -
 -    attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK |
 -                             GDK_VISIBILITY_NOTIFY_MASK |
 -                             GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
 -                             GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
 -#ifdef HAVE_GTK_MOTION_HINTS
 -                             GDK_POINTER_MOTION_HINT_MASK |
 -#endif
 -                             GDK_POINTER_MOTION_MASK);
 -    /* create the inner window */
 -    drawingarea->inner_window = gdk_window_new (drawingarea->clip_window,
 -                                                &attributes, attributes_mask);
 -    gdk_window_set_user_data(drawingarea->inner_window, widget);
 -
 -    /* set the default pixmap to None so that you don't end up with the
 -       gtk default which is BlackPixel. */
 -    gdk_window_set_back_pixmap(drawingarea->inner_window, NULL, FALSE);
 -
 -    if (visual) {
 -        g_object_unref(attributes.colormap);
 -    }
 -}
 -
 -void
 -moz_drawingarea_finalize (GObject *object)
 -{
 -    MozDrawingarea *drawingarea;
 -    gpointer user_data;
 -
 -    g_return_if_fail(IS_MOZ_DRAWINGAREA(object));
 -
 -    drawingarea = MOZ_DRAWINGAREA(object);
 -
 -    gdk_window_destroy(drawingarea->inner_window);
 -    gdk_window_destroy(drawingarea->clip_window);
 -
 -    (* parent_class->finalize) (object);
 -}
 -
 -void
 -moz_drawingarea_move (MozDrawingarea *drawingarea,
 -                      gint x, gint y)
 -{
 -    gdk_window_move(drawingarea->clip_window, x, y);
 -}
 -
 -void
 -moz_drawingarea_resize (MozDrawingarea *drawingarea,
 -                        gint width, gint height)
 -{
 -    gdk_window_resize(drawingarea->clip_window, width, height);
 -    gdk_window_resize(drawingarea->inner_window, width, height);
 -}
 -
 -void
 -moz_drawingarea_move_resize (MozDrawingarea *drawingarea,
 -                             gint x, gint y, gint width, gint height)
 -{
 -    gdk_window_resize(drawingarea->inner_window, width, height);
 -    gdk_window_move_resize(drawingarea->clip_window, x, y, width, height);
 -}
 -
 -void
 -moz_drawingarea_set_visibility (MozDrawingarea *drawingarea,
 -                                gboolean visibility)
 -{
 -    if (visibility) {
 -        gdk_window_show_unraised(drawingarea->inner_window);
 -        gdk_window_show_unraised(drawingarea->clip_window);
 -    }
 -    else    {
 -        gdk_window_hide(drawingarea->clip_window);
 -        gdk_window_hide(drawingarea->inner_window);
 -    }
 -}
 -
 -void
 -moz_drawingarea_scroll (MozDrawingarea *drawingarea,
 -                        gint x, gint y)
 -{
 -    gdk_window_scroll(drawingarea->inner_window, x, y);
 -}
 diff --git a/widget/src/gtk2/mozdrawingarea.h b/widget/src/gtk2/mozdrawingarea.h
 deleted file mode 100644
 index bdcc6d3..0000000
 --- widget/src/gtk2/mozdrawingarea.h
 +++ /dev/null
 @@ -1,101 +0,0 @@
 -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 -/* vim:expandtab:shiftwidth=4:tabstop=4:
 - */
 -/* ***** BEGIN LICENSE BLOCK *****
 - * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 - *
 - * The contents of this file are subject to the Mozilla Public License Version
 - * 1.1 (the "License"); you may not use this file except in compliance with
 - * the License. You may obtain a copy of the License at
 - * http://www.mozilla.org/MPL/
 - *
 - * Software distributed under the License is distributed on an "AS IS" basis,
 - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 - * for the specific language governing rights and limitations under the
 - * License.
 - *
 - * The Original Code is mozilla.org code.
 - *
 - * The Initial Developer of the Original Code is Christopher Blizzard
 - * <blizzard@mozilla.org>.  Portions created by the Initial Developer
 - * are Copyright (C) 2001 the Initial Developer. All Rights Reserved.
 - *
 - * Contributor(s):
 - *
 - * Alternatively, the contents of this file may be used under the terms of
 - * either the GNU General Public License Version 2 or later (the "GPL"), or
 - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 - * in which case the provisions of the GPL or the LGPL are applicable instead
 - * of those above. If you wish to allow use of your version of this file only
 - * under the terms of either the GPL or the LGPL, and not to allow others to
 - * use your version of this file under the terms of the MPL, indicate your
 - * decision by deleting the provisions above and replace them with the notice
 - * and other provisions required by the GPL or the LGPL. If you do not delete
 - * the provisions above, a recipient may use your version of this file under
 - * the terms of any one of the MPL, the GPL or the LGPL.
 - *
 - * ***** END LICENSE BLOCK ***** */
 -
 -#ifndef __MOZ_DRAWINGAREA_H__
 -#define __MOZ_DRAWINGAREA_H__
 -
 -#include <gdk/gdkwindow.h>
 -#include <gtk/gtkversion.h>
 -#include "mozcontainer.h"
 -
 -#ifdef __cplusplus
 -extern "C" {
 -#endif /* __cplusplus */
 -
 -#define MOZ_DRAWINGAREA_TYPE            (moz_drawingarea_get_type())
 -#define MOZ_DRAWINGAREA(obj)            (GTK_CHECK_CAST((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingarea))
 -#define MOZ_DRAWINGAREA_CLASS(klass)    (GTK_CHECK_CLASS_CAST((klass), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass))
 -#define IS_MOZ_DRAWINGAREA(obj)         (GTK_CHECK_TYPE((obj), MOZ_DRAWINGAREA_TYPE))
 -#define IS_MOZ_DRAWINGAREA_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), MOZ_DRAWINGAREA_TYPE))
 -#define MOZ_DRAWINGAREA_GET_CLASS(obj)  (GTK_CHECK_GET_CLASS((obj), MOZ_DRAWINGAREA_TYPE, MozDrawingareaClass))
 -
 -#if (GTK_CHECK_VERSION(2, 12, 0) || \
 -    (GTK_CHECK_VERSION(2, 10, 0) && defined(MOZ_PLATFORM_HILDON)))
 -#define HAVE_GTK_MOTION_HINTS
 -#endif
 -
 -typedef struct _MozDrawingarea      MozDrawingarea;
 -typedef struct _MozDrawingareaClass MozDrawingareaClass;
 -
 -struct _MozDrawingarea
 -{
 -    GObject         parent_instance;
 -    /* AFAIK this clip_window (and thus this whole class) exists solely to
 -     * make gdk_window_scroll() smooth for nsIWidget::Scroll(). */
 -    GdkWindow      *clip_window;
 -    GdkWindow      *inner_window;
 -};
 -
 -struct _MozDrawingareaClass
 -{
 -    GObjectClass parent_class;
 -};
 -
 -GtkType         moz_drawingarea_get_type       (void);
 -MozDrawingarea *moz_drawingarea_new            (MozDrawingarea *parent,
 -                                                MozContainer *widget_parent,
 -                                                GdkVisual *visual);
 -void            moz_drawingarea_reparent       (MozDrawingarea *drawingarea,
 -                                                GdkWindow *aNewParent);
 -void            moz_drawingarea_move           (MozDrawingarea *drawingarea,
 -                                                gint x, gint y);
 -void            moz_drawingarea_resize         (MozDrawingarea *drawingarea,
 -                                                gint width, gint height);
 -void            moz_drawingarea_move_resize    (MozDrawingarea *drawingarea,
 -                                                gint x, gint y,
 -                                                gint width, gint height);
 -void            moz_drawingarea_set_visibility (MozDrawingarea *drawingarea,
 -                                                gboolean visibility);
 -void            moz_drawingarea_scroll         (MozDrawingarea *drawingarea,
 -                                                gint x, gint y);
 -
 -#ifdef __cplusplus
 -}
 -#endif /* __cplusplus */
 -
 -#endif /* __MOZ_DRAWINGAREA_H__ */
 diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp
 index b9cca02..b00bcdf 100644
 --- widget/src/gtk2/nsWindow.cpp
 +++ widget/src/gtk2/nsWindow.cpp
 @@ -368,7 +368,7 @@ nsWindow::nsWindow()
      mPreferredWidth   = 0;
      mPreferredHeight  = 0;
      mContainer           = nsnull;
 -    mDrawingarea         = nsnull;
 +    mGdkWindow           = nsnull;
      mShell               = nsnull;
      mWindowGroup         = nsnull;
      mContainerGotFocus   = PR_FALSE;
 @@ -673,9 +673,7 @@ CheckDestroyInvisibleContainer()
  
  // Change the containing GtkWidget on a sub-hierarchy of GdkWindows belonging
  // to aOldWidget and rooted at aWindow, and reparent any child GtkWidgets of
 -// the GdkWindow hierarchy.  If aNewWidget is NULL, the reference to
 -// aOldWidget is removed from its GdkWindows, and child GtkWidgets are
 -// destroyed.
 +// the GdkWindow hierarchy to aNewWidget.
  static void
  SetWidgetForHierarchy(GdkWindow *aWindow,
                        GtkWidget *aOldWidget,
 @@ -694,13 +692,7 @@ SetWidgetForHierarchy(GdkWindow *aWindow,
  
          // This window belongs to a child widget, which will no longer be a
          // child of aOldWidget.
 -        if (aNewWidget) {
 -            gtk_widget_reparent(widget, aNewWidget);
 -        } else {
 -            // aNewWidget == NULL indicates that the window is about to be
 -            // destroyed.
 -            gtk_widget_destroy(widget);
 -        }
 +        gtk_widget_reparent(widget, aNewWidget);
  
          return;
      }
 @@ -714,6 +706,30 @@ SetWidgetForHierarchy(GdkWindow *aWindow,
      gdk_window_set_user_data(aWindow, aNewWidget);
  }
  
 +// Walk the list of child windows and call destroy on them.
 +void
 +nsWindow::DestroyChildWindows()
 +{
 +    if (!mGdkWindow)
 +        return;
 +
 +    while (GList *children = gdk_window_peek_children(mGdkWindow)) {
 +        GdkWindow *child = GDK_WINDOW(children->data);
 +        nsWindow *kid = get_window_for_gdk_window(child);
 +        if (kid) {
 +            kid->Destroy();
 +        } else {
 +            // This child is not an nsWindow.
 +            // Destroy the child GtkWidget.
 +            gpointer data;
 +            gdk_window_get_user_data(child, &data);
 +            if (GTK_IS_WIDGET(data)) {
 +                gtk_widget_destroy(static_cast<GtkWidget*>(data));
 +            }
 +        }
 +    }
 +}
 +
  NS_IMETHODIMP
  nsWindow::Destroy(void)
  {
 @@ -751,15 +767,6 @@ nsWindow::Destroy(void)
  
      NativeShow(PR_FALSE);
  
 -    // walk the list of children and call destroy on them.  Have to be
 -    // careful, though -- calling destroy on a kid may actually remove
 -    // it from our child list, losing its sibling links.
 -    for (nsIWidget* kid = mFirstChild; kid; ) {
 -        nsIWidget* next = kid->GetNextSibling();
 -        kid->Destroy();
 -        kid = next;
 -    }
 -
  #ifdef USE_XIM
      IMEDestroyContext();
  #endif
 @@ -796,35 +803,26 @@ nsWindow::Destroy(void)
          gtk_widget_destroy(mShell);
          mShell = nsnull;
          mContainer = nsnull;
 +        NS_ABORT_IF_FALSE(!mGdkWindow,
 +                          "mGdkWindow should be NULL when mContainer is destroyed");
      }
      else if (mContainer) {
          gtk_widget_destroy(GTK_WIDGET(mContainer));
          mContainer = nsnull;
 +        NS_ABORT_IF_FALSE(!mGdkWindow,
 +                          "mGdkWindow should be NULL when mContainer is destroyed");
      }
 -    else if (owningWidget) {
 -        // Remove references from GdkWindows back to their container
 -        // widget while the GdkWindow hierarchy is still available.
 -        // (OnContainerUnrealize does this when the MozContainer widget is
 -        // destroyed.)
 -        SetWidgetForHierarchy(mDrawingarea->clip_window, owningWidget, NULL);
 -    }
 -
 -    if (mDrawingarea) {
 -        g_object_set_data(G_OBJECT(mDrawingarea->clip_window),
 -                          "nsWindow", NULL);
 -        g_object_set_data(G_OBJECT(mDrawingarea->inner_window),
 -                          "nsWindow", NULL);
 -
 -        g_object_set_data(G_OBJECT(mDrawingarea->clip_window),
 -                          "mozdrawingarea", NULL);
 -        g_object_set_data(G_OBJECT(mDrawingarea->inner_window),
 -                          "mozdrawingarea", NULL);
 -
 -        NS_ASSERTION(!get_gtk_widget_for_gdk_window(mDrawingarea->inner_window),
 -                     "widget reference not removed");
 +    else if (mGdkWindow) {
 +        // Destroy child windows to ensure that their mThebesSurfaces are
 +        // released and to remove references from GdkWindows back to their
 +        // container widget.  (OnContainerUnrealize() does this when the
 +        // MozContainer widget is destroyed.)
 +        DestroyChildWindows();
  
 -        g_object_unref(mDrawingarea);
 -        mDrawingarea = nsnull;
 +        gdk_window_set_user_data(mGdkWindow, NULL);
 +        g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL);
 +        gdk_window_destroy(mGdkWindow);
 +        mGdkWindow = nsnull;
      }
  
      if (gInvisibleContainer && owningWidget == gInvisibleContainer) {
 @@ -851,7 +849,7 @@ nsWindow::GetParent(void)
  NS_IMETHODIMP
  nsWindow::SetParent(nsIWidget *aNewParent)
  {
 -    if (mContainer || !mDrawingarea || !mParent) {
 +    if (mContainer || !mGdkWindow || !mParent) {
          NS_NOTREACHED("nsWindow::SetParent - reparenting a non-child window");
          return NS_ERROR_NOT_IMPLEMENTED;
      }
 @@ -866,12 +864,12 @@ nsWindow::SetParent(nsIWidget *aNewParent)
      if (!oldContainer) {
          // The GdkWindows have been destroyed so there is nothing else to
          // reparent.
 -        NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed,
 +        NS_ABORT_IF_FALSE(GDK_WINDOW_OBJECT(mGdkWindow)->destroyed,
                            "live GdkWindow with no widget");
          return NS_OK;
      }
  
 -    NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed,
 +    NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(mGdkWindow)->destroyed,
                        "destroyed GdkWindow with widget");
  
      GdkWindow* newParentWindow = NULL;
 @@ -901,11 +899,10 @@ nsWindow::SetParent(nsIWidget *aNewParent)
          if (newContainer != oldContainer) {
              NS_ABORT_IF_FALSE(!GDK_WINDOW_OBJECT(newParentWindow)->destroyed,
                                "destroyed GdkWindow with widget");
 -            SetWidgetForHierarchy(mDrawingarea->clip_window, oldContainer,
 -                                  newContainer);
 +            SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer);
          }
  
 -        moz_drawingarea_reparent(mDrawingarea, newParentWindow);
 +        gdk_window_reparent(mGdkWindow, newParentWindow, 0, 0);
      }
  
      return NS_OK;
 @@ -1216,8 +1213,8 @@ nsWindow::Move(PRInt32 aX, PRInt32 aY)
      if (mIsTopLevel) {
          gtk_window_move(GTK_WINDOW(mShell), aX, aY);
      }
 -    else if (mDrawingarea) {
 -        moz_drawingarea_move(mDrawingarea, aX, aY);
 +    else if (mGdkWindow) {
 +        gdk_window_move(mGdkWindow, aX, aY);
      }
  
      return NS_OK;
 @@ -1244,19 +1241,19 @@ nsWindow::SetZIndex(PRInt32 aZIndex)
  
      NS_ASSERTION(!mContainer, "Expected Mozilla child widget");
  
 -    // We skip the nsWindows that don't have mDrawingareas.
 +    // We skip the nsWindows that don't have mGdkWindows.
      // These are probably in the process of being destroyed.
  
      if (!GetNextSibling()) {
          // We're to be on top.
 -        if (mDrawingarea)
 -            gdk_window_raise(mDrawingarea->clip_window);
 +        if (mGdkWindow)
 +            gdk_window_raise(mGdkWindow);
      } else {
          // All the siblings before us need to be below our widget. 
          for (nsWindow* w = this; w;
               w = static_cast<nsWindow*>(w->GetPrevSibling())) {
 -            if (w->mDrawingarea)
 -                gdk_window_lower(w->mDrawingarea->clip_window);
 +            if (w->mGdkWindow)
 +                gdk_window_lower(w->mGdkWindow);
          }
      }
      return NS_OK;
 @@ -1500,7 +1497,7 @@ nsWindow::SetCursor(nsCursor aCursor)
  {
      // if we're not the toplevel window pass up the cursor request to
      // the toplevel window to handle it.
 -    if (!mContainer && mDrawingarea) {
 +    if (!mContainer && mGdkWindow) {
          nsWindow *window = GetContainerWindow();
          if (!window)
              return NS_ERROR_FAILURE;
 @@ -1583,7 +1580,7 @@ nsWindow::SetCursor(imgIContainer* aCursor,
  {
      // if we're not the toplevel window pass up the cursor request to
      // the toplevel window to handle it.
 -    if (!mContainer && mDrawingarea) {
 +    if (!mContainer && mGdkWindow) {
          nsWindow *window = GetContainerWindow();
          if (!window)
              return NS_ERROR_FAILURE;
 @@ -1710,10 +1707,10 @@ nsWindow::Validate()
  {
      // Get the update for this window and, well, just drop it on the
      // floor.
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NS_OK;
  
 -    GdkRegion *region = gdk_window_get_update_area(mDrawingarea->inner_window);
 +    GdkRegion *region = gdk_window_get_update_area(mGdkWindow);
  
      if (region)
          gdk_region_destroy(region);
 @@ -1724,6 +1721,9 @@ nsWindow::Validate()
  NS_IMETHODIMP
  nsWindow::Invalidate(PRBool aIsSynchronous)
  {
 +    if (!mGdkWindow)
 +        return NS_OK;
 +
      GdkRectangle rect;
  
      rect.x = mBounds.x;
 @@ -1734,13 +1734,9 @@ nsWindow::Invalidate(PRBool aIsSynchronous)
      LOGDRAW(("Invalidate (all) [%p]: %d %d %d %d\n", (void *)this,
               rect.x, rect.y, rect.width, rect.height));
  
 -    if (!mDrawingarea)
 -        return NS_OK;
 -
 -    gdk_window_invalidate_rect(mDrawingarea->inner_window,
 -                               &rect, FALSE);
 +    gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE);
      if (aIsSynchronous)
 -        gdk_window_process_updates(mDrawingarea->inner_window, FALSE);
 +        gdk_window_process_updates(mGdkWindow, FALSE);
  
      return NS_OK;
  }
 @@ -1749,6 +1745,9 @@ NS_IMETHODIMP
  nsWindow::Invalidate(const nsRect &aRect,
                       PRBool        aIsSynchronous)
  {
 +    if (!mGdkWindow)
 +        return NS_OK;
 +
      GdkRectangle rect;
  
      rect.x = aRect.x;
 @@ -1759,13 +1758,9 @@ nsWindow::Invalidate(const nsRect &aRect,
      LOGDRAW(("Invalidate (rect) [%p]: %d %d %d %d (sync: %d)\n", (void *)this,
               rect.x, rect.y, rect.width, rect.height, aIsSynchronous));
  
 -    if (!mDrawingarea)
 -        return NS_OK;
 -
 -    gdk_window_invalidate_rect(mDrawingarea->inner_window,
 -                               &rect, FALSE);
 +    gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE);
      if (aIsSynchronous)
 -        gdk_window_process_updates(mDrawingarea->inner_window, FALSE);
 +        gdk_window_process_updates(mGdkWindow, FALSE);
  
      return NS_OK;
  }
 @@ -1777,7 +1772,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion,
      GdkRegion *region = nsnull;
      aRegion->GetNativeRegion((void *&)region);
  
 -    if (region && mDrawingarea) {
 +    if (region && mGdkWindow) {
          GdkRectangle rect;
          gdk_region_get_clipbox(region, &rect);
  
 @@ -1785,7 +1780,7 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion,
                   (void *)this,
                   rect.x, rect.y, rect.width, rect.height, aIsSynchronous));
  
 -        gdk_window_invalidate_region(mDrawingarea->inner_window,
 +        gdk_window_invalidate_region(mGdkWindow,
                                       region, FALSE);
      }
      else {
 @@ -1799,10 +1794,10 @@ nsWindow::InvalidateRegion(const nsIRegion* aRegion,
  NS_IMETHODIMP
  nsWindow::Update()
  {
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NS_OK;
  
 -    gdk_window_process_updates(mDrawingarea->inner_window, FALSE);
 +    gdk_window_process_updates(mGdkWindow, FALSE);
      return NS_OK;
  }
  
 @@ -1817,7 +1812,7 @@ nsWindow::Scroll(PRInt32  aDx,
                   PRInt32  aDy,
                   nsRect  *aClipRect)
  {
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NS_OK;
  
      D_DEBUG_AT( ns_Window, "%s( %4d,%4d )\n", __FUNCTION__, aDx, aDy );
 @@ -1827,7 +1822,7 @@ nsWindow::Scroll(PRInt32  aDx,
                       aClipRect->x, aClipRect->y, aClipRect->width, aClipRect->height );
      }
  
 -    moz_drawingarea_scroll(mDrawingarea, aDx, aDy);
 +    gdk_window_scroll(mGdkWindow, aDx, aDy);
  
      // Update bounds on our child windows
      for (nsIWidget* kid = mFirstChild; kid; kid = kid->GetNextSibling()) {
 @@ -1847,10 +1842,10 @@ NS_IMETHODIMP
  nsWindow::ScrollWidgets(PRInt32 aDx,
                          PRInt32 aDy)
  {
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NS_OK;
  
 -    moz_drawingarea_scroll(mDrawingarea, aDx, aDy);
 +    gdk_window_scroll(mGdkWindow, aDx, aDy);
      return NS_OK;
  }
  
 @@ -1868,10 +1863,10 @@ nsWindow::GetNativeData(PRUint32 aDataType)
      switch (aDataType) {
      case NS_NATIVE_WINDOW:
      case NS_NATIVE_WIDGET: {
 -        if (!mDrawingarea)
 +        if (!mGdkWindow)
              return nsnull;
  
 -        return mDrawingarea->inner_window;
 +        return mGdkWindow;
          break;
      }
  
 @@ -1991,8 +1986,8 @@ nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect)
                                     &x, &y);
          LOG(("WidgetToScreen (container) %d %d\n", x, y));
      }
 -    else if (mDrawingarea) {
 -        gdk_window_get_origin(mDrawingarea->inner_window, &x, &y);
 +    else if (mGdkWindow) {
 +        gdk_window_get_origin(mGdkWindow, &x, &y);
          LOG(("WidgetToScreen (drawing) %d %d\n", x, y));
      }
  
 @@ -2013,8 +2008,8 @@ nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect)
          gdk_window_get_root_origin(GTK_WIDGET(mContainer)->window,
                                     &x, &y);
      }
 -    else if (mDrawingarea) {
 -        gdk_window_get_origin(mDrawingarea->inner_window, &x, &y);
 +    else if (mGdkWindow) {
 +        gdk_window_get_origin(mGdkWindow, &x, &y);
      }
  
      aNewRect.x = aOldRect.x - x;
 @@ -2065,7 +2060,7 @@ nsWindow::CaptureMouse(PRBool aCapture)
  {
      LOG(("CaptureMouse %p\n", (void *)this));
  
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NS_OK;
  
      GtkWidget *widget = GetMozContainerWidget();
 @@ -2089,7 +2084,7 @@ nsWindow::CaptureRollupEvents(nsIRollupListener *aListener,
                                PRBool             aDoCapture,
                                PRBool             aConsumeRollupEvent)
  {
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NS_OK;
  
      GtkWidget *widget = GetMozContainerWidget();
 @@ -2271,11 +2266,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent)
          return FALSE;
      }
  
 -    if (!mDrawingarea)
 -        return FALSE;
 -
 -    // handle exposes for the inner window only
 -    if (aEvent->window != mDrawingarea->inner_window)
 +    if (!mGdkWindow)
          return FALSE;
  
      static NS_DEFINE_CID(kRegionCID, NS_REGION_CID);
 @@ -2320,7 +2311,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent)
      nsRefPtr<gfxContext> ctx = rc->ThebesContext();
  
      gfxPlatformGtk::GetPlatform()->SetGdkDrawable(ctx->OriginalSurface(),
 -                                                  GDK_DRAWABLE(mDrawingarea->inner_window));
 +                                                  GDK_DRAWABLE(mGdkWindow));
  
      // clip to the update region
      ctx->Save();
 @@ -2381,7 +2372,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent)
          if (gForce24bpp) {
              depth = 24; // 24 always
          } else {
 -            depth = gdk_drawable_get_depth(GDK_DRAWABLE(mDrawingarea->inner_window));
 +            depth = gdk_drawable_get_depth(GDK_DRAWABLE(mGdkWindow));
          }
  
          if (!gUseBufferPixmap ||
 @@ -2390,7 +2381,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent)
          {
              // create a one-off always if we're not using the global pixmap
              // if gUseBufferPixmap == TRUE, who's redrawing an area bigger than the screen?
 -            bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window),
 +            bufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow),
                                            boundsRect.width, boundsRect.height,
                                            depth);
              bufferPixmapSize.width = boundsRect.width;
 @@ -2405,7 +2396,7 @@ nsWindow::OnExposeEvent(GtkWidget *aWidget, GdkEventExpose *aEvent)
              gBufferPixmapSize.width = PR_MAX(gBufferPixmapSize.width, boundsRect.width);
              gBufferPixmapSize.height = PR_MAX(gBufferPixmapSize.height, boundsRect.height);
  
 -            gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mDrawingarea->inner_window),
 +            gBufferPixmap = gdk_pixmap_new(GDK_DRAWABLE(mGdkWindow),
                                             gBufferPixmapSize.width, gBufferPixmapSize.height,
                                             depth);
  
 @@ -2575,8 +2566,11 @@ nsWindow::OnContainerUnrealize(GtkWidget *aWidget)
      NS_ASSERTION(mContainer == MOZ_CONTAINER(aWidget),
                   "unexpected \"unrealize\" signal");
  
 -    if (mDrawingarea) {
 -        SetWidgetForHierarchy(mDrawingarea->clip_window, aWidget, NULL);
 +    if (mGdkWindow) {
 +        DestroyChildWindows();
 +
 +        g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", NULL);
 +        mGdkWindow = NULL;
      }
  }
  
 @@ -2595,11 +2589,9 @@ nsWindow::OnSizeAllocate(GtkWidget *aWidget, GtkAllocation *aAllocation)
      mBounds.width = rect.width;
      mBounds.height = rect.height;
  
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return;
  
 -    moz_drawingarea_resize (mDrawingarea, rect.width, rect.height);
 -
      if (mTransparencyBitmap) {
        ApplyTransparencyBitmap();
      }
 @@ -2668,7 +2660,7 @@ nsWindow::OnLeaveNotifyEvent(GtkWidget *aWidget, GdkEventCrossing *aEvent)
  
      event.time = aEvent->time;
  
 -    event.exit = is_top_level_mouse_exit(mDrawingarea->inner_window, aEvent)
 +    event.exit = is_top_level_mouse_exit(mGdkWindow, aEvent)
          ? nsMouseEvent::eTopLevel : nsMouseEvent::eChild;
  
      LOG(("OnLeaveNotify: %p\n", (void *)this));
 @@ -2797,7 +2789,7 @@ nsWindow::OnMotionNotifyEvent(GtkWidget *aWidget, GdkEventMotion *aEvent)
      }
      else {
          // XXX see OnScrollEvent()
 -        if (aEvent->window == mDrawingarea->inner_window) {
 +        if (aEvent->window == mGdkWindow) {
              event.refPoint.x = nscoord(aEvent->x);
              event.refPoint.y = nscoord(aEvent->y);
          } else {
 @@ -2828,7 +2820,7 @@ nsWindow::InitButtonEvent(nsMouseEvent &aEvent,
                            GdkEventButton *aGdkEvent)
  {
      // XXX see OnScrollEvent()
 -    if (aGdkEvent->window == mDrawingarea->inner_window) {
 +    if (aGdkEvent->window == mGdkWindow) {
          aEvent.refPoint.x = nscoord(aGdkEvent->x);
          aEvent.refPoint.y = nscoord(aGdkEvent->y);
      } else {
 @@ -3373,7 +3365,7 @@ nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent)
          break;
      }
  
 -    if (aEvent->window == mDrawingarea->inner_window) {
 +    if (aEvent->window == mGdkWindow) {
          // we are the window that the event happened on so no need for expensive ScreenToWidget
          event.refPoint.x = nscoord(aEvent->x);
          event.refPoint.y = nscoord(aEvent->y);
 @@ -3469,12 +3461,12 @@ nsWindow::ThemeChanged()
      nsEventStatus status = nsEventStatus_eIgnore;
      DispatchEvent(&event, status);
  
 -    if (!mDrawingarea || NS_UNLIKELY(mIsDestroyed))
 +    if (!mGdkWindow || NS_UNLIKELY(mIsDestroyed))
          return;
  
      // Dispatch NS_THEMECHANGED to all child windows
      GList *children =
 -        gdk_window_peek_children(mDrawingarea->inner_window);
 +        gdk_window_peek_children(mGdkWindow);
      while (children) {
          GdkWindow *gdkWin = GDK_WINDOW(children->data);
  
 @@ -3823,6 +3815,38 @@ GetBrandName(nsXPIDLString& brandName)
          brandName.Assign(NS_LITERAL_STRING("Mozilla"));
  }
  
 +static GdkWindow *
 +CreateGdkWindow(GdkWindow *parent, GtkWidget *widget)
 +{
 +    GdkWindowAttr attributes;
 +    gint          attributes_mask = GDK_WA_VISUAL | GDK_WA_COLORMAP;
 +
 +    attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK |
 +                             GDK_VISIBILITY_NOTIFY_MASK |
 +                             GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
 +                             GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
 +#ifdef HAVE_GTK_MOTION_HINTS
 +                             GDK_POINTER_MOTION_HINT_MASK |
 +#endif
 +                             GDK_POINTER_MOTION_MASK);
 +
 +    attributes.width = 1;
 +    attributes.height = 1;
 +    attributes.wclass = GDK_INPUT_OUTPUT;
 +    attributes.visual = gtk_widget_get_visual(widget);
 +    attributes.colormap = gtk_widget_get_colormap(widget);
 +    attributes.window_type = GDK_WINDOW_CHILD;
 +
 +    GdkWindow *window = gdk_window_new(parent, &attributes, attributes_mask);
 +    gdk_window_set_user_data(window, widget);
 +
 +    /* set the default pixmap to None so that you don't end up with the
 +       gtk default which is BlackPixel. */
 +    gdk_window_set_back_pixmap(window, NULL, FALSE);
 +
 +    return window;
 +}
 +
  nsresult
  nsWindow::NativeCreate(nsIWidget        *aParent,
                         nsNativeWidget    aNativeParent,
 @@ -3866,8 +3890,7 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
      }
  
      // figure out our parent window
 -    MozDrawingarea *parentArea = nsnull;
 -    MozContainer   *parentMozContainer = nsnull;
 +    GtkWidget      *parentMozContainer = nsnull;
      GtkContainer   *parentGtkContainer = nsnull;
      GdkWindow      *parentGdkWindow = nsnull;
      GtkWindow      *topLevelParent = nsnull;
 @@ -3880,28 +3903,10 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
          parentGtkContainer = GTK_CONTAINER(aNativeParent);
  
      if (parentGdkWindow) {
 -        // find the mozarea on that window
 -        gpointer user_data = nsnull;
 -        user_data = g_object_get_data(G_OBJECT(parentGdkWindow),
 -                                      "mozdrawingarea");
 -        parentArea = MOZ_DRAWINGAREA(user_data);
 -
 -        NS_ASSERTION(parentArea, "no drawingarea for parent widget!\n");
 -        if (!parentArea)
 -            return NS_ERROR_FAILURE;
 -
 -        // get the user data for the widget - it should be a container
 -        user_data = nsnull;
 -        gdk_window_get_user_data(parentArea->inner_window, &user_data);
 -        NS_ASSERTION(user_data, "no user data for parentArea\n");
 -        if (!user_data)
 -            return NS_ERROR_FAILURE;
 +        // get the widget for the window - it should be a moz container
 +        parentMozContainer = get_gtk_widget_for_gdk_window(parentGdkWindow);
  
 -        // Get the parent moz container
 -        parentMozContainer = MOZ_CONTAINER(user_data);
 -        NS_ASSERTION(parentMozContainer,
 -                     "owning widget is not a mozcontainer!\n");
 -        if (!parentMozContainer)
 +        if (!IS_MOZ_CONTAINER(parentMozContainer))
              return NS_ERROR_FAILURE;
  
          // get the toplevel window just in case someone needs to use it
 @@ -3910,8 +3915,6 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
              GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(parentMozContainer)));
      }
  
 -    GdkVisual* visual = nsnull;
 -
      // ok, create our windows
      switch (mWindowType) {
      case eWindowType_dialog:
 @@ -3939,11 +3942,11 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
                  GdkWindow* dialoglead = mShell->window;
                  gdk_window_set_group(dialoglead, dialoglead);
              }
 -            if (parentArea) {
 +            if (parentGdkWindow) {
                  nsWindow *parentnsWindow =
 -                    get_window_for_gdk_window(parentArea->inner_window);
 +                    get_window_for_gdk_window(parentGdkWindow);
                  NS_ASSERTION(parentnsWindow,
 -                             "no nsWindow for parentArea!");
 +                             "no nsWindow for parentGdkWindow!");
                  if (parentnsWindow && parentnsWindow->mWindowGroup) {
                      gtk_window_group_add_window(parentnsWindow->mWindowGroup,
                                                  GTK_WINDOW(mShell));
 @@ -4009,15 +4012,16 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
          }
  
          // create our container
 -        mContainer = MOZ_CONTAINER(moz_container_new());
 -        gtk_container_add(GTK_CONTAINER(mShell), GTK_WIDGET(mContainer));
 -        gtk_widget_realize(GTK_WIDGET(mContainer));
 +        GtkWidget *container = moz_container_new();
 +        mContainer = MOZ_CONTAINER(container);
 +        gtk_container_add(GTK_CONTAINER(mShell), container);
 +        gtk_widget_realize(container);
  
          // make sure this is the focus widget in the container
 -        gtk_window_set_focus(GTK_WINDOW(mShell), GTK_WIDGET(mContainer));
 +        gtk_window_set_focus(GTK_WINDOW(mShell), container);
  
          // and the drawing area
 -        mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual);
 +        mGdkWindow = container->window;
  
          if (mWindowType == eWindowType_popup) {
              // gdk does not automatically set the cursor for "temporary"
 @@ -4033,14 +4037,15 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
          break;
      case eWindowType_child: {
          if (parentMozContainer) {
 -            mDrawingarea = moz_drawingarea_new(parentArea, parentMozContainer, visual);
 +            mGdkWindow = CreateGdkWindow(parentGdkWindow, parentMozContainer);
          }
          else if (parentGtkContainer) {
 -            mContainer = MOZ_CONTAINER(moz_container_new());
 -            gtk_container_add(parentGtkContainer, GTK_WIDGET(mContainer));
 -            gtk_widget_realize(GTK_WIDGET(mContainer));
 +            GtkWidget *container = moz_container_new();
 +            mContainer = MOZ_CONTAINER(container);
 +            gtk_container_add(parentGtkContainer, container);
 +            gtk_widget_realize(container);
  
 -            mDrawingarea = moz_drawingarea_new(nsnull, mContainer, visual);
 +            mGdkWindow = container->window;
          }
          else {
              NS_WARNING("Warning: tried to create a new child widget with no parent!");
 @@ -4061,17 +4066,8 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
          gtk_widget_set_double_buffered (GTK_WIDGET(mContainer),FALSE);
  #endif
  
 -    // label the drawing area with this object so we can find our way
 -    // home
 -    g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "nsWindow",
 -                      this);
 -    g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "nsWindow",
 -                      this);
 -
 -    g_object_set_data(G_OBJECT(mDrawingarea->clip_window), "mozdrawingarea",
 -                      mDrawingarea);
 -    g_object_set_data(G_OBJECT(mDrawingarea->inner_window), "mozdrawingarea",
 -                      mDrawingarea);
 +    // label the drawing window with this object so we can find our way home
 +    g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this);
  
      if (mContainer)
          g_object_set_data(G_OBJECT(mContainer), "nsWindow", this);
 @@ -4161,13 +4157,9 @@ nsWindow::NativeCreate(nsIWidget        *aParent,
               (void *)GTK_WIDGET(mContainer)->window,
               GDK_WINDOW_XWINDOW(GTK_WIDGET(mContainer)->window)));
      }
 -
 -    if (mDrawingarea) {
 -        LOG(("\tmDrawingarea %p %p %p %lx %lx\n", (void *)mDrawingarea,
 -             (void *)mDrawingarea->clip_window,
 -             (void *)mDrawingarea->inner_window,
 -             GDK_WINDOW_XWINDOW(mDrawingarea->clip_window),
 -             GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)));
 +    else if (mGdkWindow) {
 +        LOG(("\tmGdkWindow %p %lx\n", (void *)mGdkWindow,
 +             GDK_WINDOW_XWINDOW(mGdkWindow)));
      }
  
      // resize so that everything is set to the right dimensions
 @@ -4325,16 +4317,16 @@ nsWindow::NativeResize(PRInt32 aWidth, PRInt32 aHeight, PRBool  aRepaint)
          gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight);
      }
      else if (mContainer) {
 +        GtkWidget *widget = GTK_WIDGET(mContainer);
          GtkAllocation allocation;
 -        allocation.x = 0;
 -        allocation.y = 0;
 +        allocation.x = widget->allocation.x;
 +        allocation.y = widget->allocation.y;
          allocation.width = aWidth;
          allocation.height = aHeight;
 -        gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation);
 +        gtk_widget_size_allocate(widget, &allocation);
      }
 -
 -    if (mDrawingarea) {
 -        moz_drawingarea_resize (mDrawingarea, aWidth, aHeight);
 +    else if (mGdkWindow) {
 +        gdk_window_resize(mGdkWindow, aWidth, aHeight);
      }
  }
  
 @@ -4360,19 +4352,18 @@ nsWindow::NativeResize(PRInt32 aX, PRInt32 aY,
              gtk_window_move(GTK_WINDOW(mShell), aX, aY);
  
          gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight);
 -        moz_drawingarea_resize(mDrawingarea, aWidth, aHeight);
 +        gdk_window_resize(mGdkWindow, aWidth, aHeight);
      }
      else if (mContainer) {
          GtkAllocation allocation;
 -        allocation.x = 0;
 -        allocation.y = 0;
 +        allocation.x = aX;
 +        allocation.y = aY;
          allocation.width = aWidth;
          allocation.height = aHeight;
          gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation);
 -        moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight);
      }
 -    else if (mDrawingarea) {
 -        moz_drawingarea_move_resize(mDrawingarea, aX, aY, aWidth, aHeight);
 +    else if (mGdkWindow) {
 +        gdk_window_move_resize(mGdkWindow, aX, aY, aWidth, aHeight);
      }
  }
  
 @@ -4401,16 +4392,14 @@ nsWindow::NativeShow (PRBool  aAction)
                  SetUserTimeAndStartupIDForActivatedWindow(mShell);
              }
  
 -            moz_drawingarea_set_visibility(mDrawingarea, aAction);
              gtk_widget_show(GTK_WIDGET(mContainer));
              gtk_widget_show(mShell);
          }
          else if (mContainer) {
 -            moz_drawingarea_set_visibility(mDrawingarea, TRUE);
              gtk_widget_show(GTK_WIDGET(mContainer));
          }
 -        else if (mDrawingarea) {
 -            moz_drawingarea_set_visibility(mDrawingarea, TRUE);
 +        else if (mGdkWindow) {
 +            gdk_window_show_unraised(mGdkWindow);
          }
      }
      else {
 @@ -4420,10 +4409,9 @@ nsWindow::NativeShow (PRBool  aAction)
          }
          else if (mContainer) {
              gtk_widget_hide(GTK_WIDGET(mContainer));
 -            moz_drawingarea_set_visibility(mDrawingarea, FALSE);
          }
 -        if (mDrawingarea) {
 -            moz_drawingarea_set_visibility(mDrawingarea, FALSE);
 +        else if (mGdkWindow) {
 +            gdk_window_hide(mGdkWindow);
          }
      }
  }
 @@ -4684,11 +4672,11 @@ nsWindow::GrabPointer(void)
          return;
      }
  
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return;
  
      gint retval;
 -    retval = gdk_pointer_grab(mDrawingarea->inner_window, TRUE,
 +    retval = gdk_pointer_grab(mGdkWindow, TRUE,
                                (GdkEventMask)(GDK_BUTTON_PRESS_MASK |
                                               GDK_BUTTON_RELEASE_MASK |
                                               GDK_ENTER_NOTIFY_MASK |
 @@ -4730,8 +4718,8 @@ nsWindow::GrabKeyboard(void)
  
      if (mTransientParent)
          grabWindow = GTK_WIDGET(mTransientParent)->window;
 -    else if (mDrawingarea)
 -        grabWindow = mDrawingarea->inner_window;
 +    else if (mGdkWindow)
 +        grabWindow = mGdkWindow;
      else
          return;
  
 @@ -4777,11 +4765,11 @@ nsWindow::GetToplevelWidget(GtkWidget **aWidget)
  GtkWidget *
  nsWindow::GetMozContainerWidget()
  {
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return NULL;
  
      GtkWidget *owningWidget =
 -        get_gtk_widget_for_gdk_window(mDrawingarea->inner_window);
 +        get_gtk_widget_for_gdk_window(mGdkWindow);
      return owningWidget;
  }
  
 @@ -4821,10 +4809,10 @@ nsWindow::SetUrgencyHint(GtkWidget *top_window, PRBool state)
  void *
  nsWindow::SetupPluginPort(void)
  {
 -    if (!mDrawingarea)
 +    if (!mGdkWindow)
          return nsnull;
  
 -    if (GDK_WINDOW_OBJECT(mDrawingarea->inner_window)->destroyed == TRUE)
 +    if (GDK_WINDOW_OBJECT(mGdkWindow)->destroyed == TRUE)
          return nsnull;
  
      // we have to flush the X queue here so that any plugins that
 @@ -4832,22 +4820,19 @@ nsWindow::SetupPluginPort(void)
      // this window in case it was just created
  #ifdef MOZ_X11
      XWindowAttributes xattrs;
 -    XGetWindowAttributes(GDK_DISPLAY (),
 -                         GDK_WINDOW_XWINDOW(mDrawingarea->inner_window),
 +    XGetWindowAttributes(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(mGdkWindow),
                           &xattrs);
      XSelectInput (GDK_DISPLAY (),
 -                  GDK_WINDOW_XWINDOW(mDrawingarea->inner_window),
 +                  GDK_WINDOW_XWINDOW(mGdkWindow),
                    xattrs.your_event_mask |
                    SubstructureNotifyMask);
  
 -    gdk_window_add_filter(mDrawingarea->inner_window,
 -                          plugin_window_filter_func,
 -                          this);
 +    gdk_window_add_filter(mGdkWindow, plugin_window_filter_func, this);
  
      XSync(GDK_DISPLAY(), False);
  #endif /* MOZ_X11 */
  
 -    return (void *)GDK_WINDOW_XWINDOW(mDrawingarea->inner_window);
 +    return (void *)GDK_WINDOW_XWINDOW(mGdkWindow);
  }
  
  nsresult
 @@ -4907,14 +4892,13 @@ nsWindow::SetNonXEmbedPluginFocus()
      Window curFocusWindow;
      int focusState;
  
 -    XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 +    XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow),
                     &curFocusWindow,
                     &focusState);
  
      LOGFOCUS(("\t curFocusWindow=%p\n", curFocusWindow));
  
 -    GdkWindow* toplevel = gdk_window_get_toplevel
 -                                (mDrawingarea->inner_window);
 +    GdkWindow* toplevel = gdk_window_get_toplevel(mGdkWindow);
      GdkWindow *gdkfocuswin = gdk_window_lookup(curFocusWindow);
  
      // lookup with the focus proxy window is supposed to get the
 @@ -4926,11 +4910,11 @@ nsWindow::SetNonXEmbedPluginFocus()
  
      // switch the focus from the focus proxy to the plugin window
      mOldFocusWindow = curFocusWindow;
 -    XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 -                 GDK_WINDOW_XWINDOW(mDrawingarea->inner_window));
 +    XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow),
 +                 GDK_WINDOW_XWINDOW(mGdkWindow));
      gdk_error_trap_push();
 -    XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 -                   GDK_WINDOW_XWINDOW(mDrawingarea->inner_window),
 +    XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow),
 +                   GDK_WINDOW_XWINDOW(mGdkWindow),
                     RevertToNone,
                     CurrentTime);
      gdk_flush();
 @@ -4939,8 +4923,7 @@ nsWindow::SetNonXEmbedPluginFocus()
      gdk_window_add_filter(NULL, plugin_client_message_filter, this);
  
      LOGFOCUS(("nsWindow::SetNonXEmbedPluginFocus oldfocus=%p new=%p\n",
 -                mOldFocusWindow,
 -                GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)));
 +              mOldFocusWindow, GDK_WINDOW_XWINDOW(mGdkWindow)));
  }
  
  void
 @@ -4957,7 +4940,7 @@ nsWindow::LoseNonXEmbedPluginFocus()
      Window curFocusWindow;
      int focusState;
  
 -    XGetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 +    XGetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow),
                     &curFocusWindow,
                     &focusState);
  
 @@ -4966,12 +4949,12 @@ nsWindow::LoseNonXEmbedPluginFocus()
      // event filter that blocks the WM_TAKE_FOCUS is enough. WM and gtk2
      // will take care of the focus later.
      if (!curFocusWindow ||
 -        curFocusWindow == GDK_WINDOW_XWINDOW(mDrawingarea->inner_window)) {
 +        curFocusWindow == GDK_WINDOW_XWINDOW(mGdkWindow)) {
  
          gdk_error_trap_push();
 -        XRaiseWindow(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 +        XRaiseWindow(GDK_WINDOW_XDISPLAY(mGdkWindow),
                       mOldFocusWindow);
 -        XSetInputFocus(GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 +        XSetInputFocus(GDK_WINDOW_XDISPLAY(mGdkWindow),
                         mOldFocusWindow,
                         RevertToParent,
                         CurrentTime);
 @@ -6655,13 +6638,11 @@ nsWindow::IMESetCursorPosition(const nsTextEventReply& aReply)
  
      // Get the position of the refWindow in screen.
      gint refX, refY;
 -    gdk_window_get_origin(refWindow->mDrawingarea->inner_window,
 -                          &refX, &refY);
 +    gdk_window_get_origin(refWindow->mGdkWindow, &refX, &refY);
  
      // Get the position of IM context owner window in screen.
      gint ownerX, ownerY;
 -    gdk_window_get_origin(ownerWindow->mDrawingarea->inner_window,
 -                          &ownerX, &ownerY);
 +    gdk_window_get_origin(ownerWindow->mGdkWindow, &ownerX, &ownerY);
  
      // Compute the caret position in the IM owner window.
      GdkRectangle area;
 @@ -6807,7 +6788,7 @@ nsWindow::GetToggledKeyState(PRUint32 aKeyCode, PRBool* aLEDState)
      GdkModifierType modifiers = gdk_keyboard_get_modifiers();
      PRUint32 capsLockMask, numLockMask, scrollLockMask;
      PRBool foundMasks = gdk_keyboard_get_modmap_masks(
 -                          GDK_WINDOW_XDISPLAY(mDrawingarea->inner_window),
 +                          GDK_WINDOW_XDISPLAY(mGdkWindow),
                            &capsLockMask, &numLockMask, &scrollLockMask);
      if (!foundMasks)
          return NS_ERROR_NOT_IMPLEMENTED;
 @@ -7138,10 +7119,12 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable,
  gfxASurface*
  nsWindow::GetThebesSurface()
  {
 +    if (!mGdkWindow)
 +        return nsnull;
 +
      GdkDrawable* d;
      gint x_offset, y_offset;
 -    gdk_window_get_internal_paint_info(mDrawingarea->inner_window,
 -                                       &d, &x_offset, &y_offset);
 +    gdk_window_get_internal_paint_info(mGdkWindow, &d, &x_offset, &y_offset);
  
  #ifdef MOZ_X11
      gint width, height;
 @@ -7217,7 +7200,7 @@ nsWindow::BeginResizeDrag(nsGUIEvent* aEvent, PRInt32 aHorizontal, PRInt32 aVert
      }
  
      // get the gdk window for this widget
 -    GdkWindow* gdk_window = mDrawingarea->inner_window;
 +    GdkWindow* gdk_window = mGdkWindow;
      if (!GDK_IS_WINDOW(gdk_window)) {
        return NS_ERROR_FAILURE;
      }
 diff --git a/widget/src/gtk2/nsWindow.h b/widget/src/gtk2/nsWindow.h
 index 23aa482..277c82c 100644
 --- widget/src/gtk2/nsWindow.h
 +++ widget/src/gtk2/nsWindow.h
 @@ -43,7 +43,6 @@
  #include "nsAutoPtr.h"
  
  #include "mozcontainer.h"
 -#include "mozdrawingarea.h"
  #include "nsWeakReference.h"
  
  #include "nsIDragService.h"
 @@ -480,6 +479,7 @@ protected:
      PRUint32            mPreferredHeight;
  
  private:
 +    void               DestroyChildWindows();
      void               GetToplevelWidget(GtkWidget **aWidget);
      GtkWidget         *GetMozContainerWidget();
      nsWindow          *GetContainerWindow();
 @@ -492,7 +492,7 @@ private:
  
      GtkWidget          *mShell;
      MozContainer       *mContainer;
 -    MozDrawingarea     *mDrawingarea;
 +    GdkWindow          *mGdkWindow;
  
      GtkWindowGroup     *mWindowGroup;
  
 
 --------------090706010105080009080509--

From: Stefan Walter <stefan@freebsd.org>
To: Beat Gaetzi <beat@FreeBSD.org>
Cc: GNATS <FreeBSD-gnats-submit@FreeBSD.org>,
	Martin Birgmeier <martin.birgmeier@aon.at>
Subject: Re: ports/146619: firefox 3.5.9 crashes when closing a tab
Date: Tue, 18 May 2010 14:28:06 +0200

 Hi Beat,
 
 at least with me, the patch seems to have fixed the problem. I haven't
 seen any crashes today after rebuilding www/firefox35 with it.
 
 Regards,
 Stefan

From: Beat Gaetzi <beat@FreeBSD.org>
To: Stefan Walter <stefan@freebsd.org>
Cc: GNATS <FreeBSD-gnats-submit@FreeBSD.org>, 
 Martin Birgmeier <martin.birgmeier@aon.at>
Subject: Re: ports/146619: firefox 3.5.9 crashes when closing a tab
Date: Tue, 18 May 2010 15:30:33 +0200

 Hi Stefan,
 
 On 05/18/10 14:28, Stefan Walter wrote:
 > at least with me, the patch seems to have fixed the problem. I haven't
 > seen any crashes today after rebuilding www/firefox35 with it.
 
 Thanks for testing. As I have a report that this patch fixes the
 problems with seamonkey2 (both based on Gecko 1.9.1) too I will commit
 the patch soon.
 
 Regards,
 Beat
State-Changed-From-To: open->closed 
State-Changed-By: beat 
State-Changed-When: Tue May 18 14:19:10 UTC 2010 
State-Changed-Why:  
Committed. Thanks for the report and testing! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=146619 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/146619: commit references a PR
Date: Tue, 18 May 2010 14:17:40 +0000 (UTC)

 beat        2010-05-18 14:17:31 UTC
 
   FreeBSD ports repository
 
   Modified files:
     www/firefox35        Makefile 
   Added files:
     www/firefox35/files  patch-bugzilla-522635 
   Log:
   - Fix crash when closing tab after recent cairo update
   - Bump PORTREVISION
   
   PR:             ports/146619
   Submitted by:   Martin Birgmeier <martin.birgmeier AT aon.at>
   Tested by:      stefan@
   Obtained from:  https://bugzilla.mozilla.org/show_bug.cgi?id=522635
   
   Revision  Changes    Path
   1.191     +1 -0      ports/www/firefox35/Makefile
   1.1       +1445 -0   ports/www/firefox35/files/patch-bugzilla-522635 (new)
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 
>Unformatted:
