diff options
author | Christian Persch <chpe@cvs.gnome.org> | 2005-09-26 20:32:52 +0800 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2005-09-26 20:32:52 +0800 |
commit | 58bf466c8f6c5dd6132164ef3ac002be26b5933c (patch) | |
tree | b49afc2c31679a37ff0ac408bb3a3067167ab28c | |
parent | ca840a52b1caaf2bf47c900bd89825b841f0e0a9 (diff) | |
download | gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.tar gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.tar.gz gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.tar.bz2 gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.tar.lz gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.tar.xz gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.tar.zst gsoc2013-epiphany-58bf466c8f6c5dd6132164ef3ac002be26b5933c.zip |
Push a new event queue while showing the dialogue with gtk_dialog_run.
2005-09-26 Christian Persch <chpe@cvs.gnome.org>
* embed/mozilla/Makefile.am:
* embed/mozilla/AutoEventQueue.cpp:
* embed/mozilla/AutoEventQueue.h:
* embed/mozilla/GtkNSSSecurityWarningDialogs.cpp: (DoDialog):
Push a new event queue while showing the dialogue
with gtk_dialog_run. This fixes the problem (caused by the
braindead API of showing this dialogue synchronously) that
networking is blocked in all other windows while the dialogue
is shown.
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | embed/mozilla/AutoEventQueue.cpp | 106 | ||||
-rw-r--r-- | embed/mozilla/AutoEventQueue.h | 75 | ||||
-rw-r--r-- | embed/mozilla/GtkNSSSecurityWarningDialogs.cpp | 7 | ||||
-rw-r--r-- | embed/mozilla/Makefile.am | 2 |
5 files changed, 203 insertions, 0 deletions
@@ -1,3 +1,16 @@ +2005-09-26 Christian Persch <chpe@cvs.gnome.org> + + * embed/mozilla/Makefile.am: + * embed/mozilla/AutoEventQueue.cpp: + * embed/mozilla/AutoEventQueue.h: + * embed/mozilla/GtkNSSSecurityWarningDialogs.cpp: (DoDialog): + + Push a new event queue while showing the dialogue + with gtk_dialog_run. This fixes the problem (caused by the + braindead API of showing this dialogue synchronously) that + networking is blocked in all other windows while the dialogue + is shown. + 2005-09-25 Jean-François Rameau <jframeau@cvs.gnome.org> * data/epiphany-lockdown.schemas.in: diff --git a/embed/mozilla/AutoEventQueue.cpp b/embed/mozilla/AutoEventQueue.cpp new file mode 100644 index 000000000..46ec2cb93 --- /dev/null +++ b/embed/mozilla/AutoEventQueue.cpp @@ -0,0 +1,106 @@ +/* + * Copied from nsWindowWatcher.cpp. + * + * ***** 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 + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Harshal Pradhan <keeda@hotpop.com> + * + * 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 ***** + * + * $Id$ + */ + +#include "mozilla-config.h" +#include "config.h" + +#include "AutoEventQueue.h" + +#ifdef HAVE_LAME_APPSHELL +/* for NS_APPSHELL_CID */ +#include <nsWidgetsCID.h> +#endif +#include <nsIServiceManager.h> +#include <nsIServiceManagerUtils.h> + +#ifdef HAVE_LAME_APPSHELL +static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID); +#endif + +AutoEventQueue::AutoEventQueue() : mQueue(nsnull) +{ +} + +AutoEventQueue::~AutoEventQueue() +{ +#ifdef HAVE_LAME_APPSHELL + if (mAppShell) { + if (mQueue) + mAppShell->ListenToEventQueue(mQueue, PR_FALSE); + mAppShell->Spindown(); + mAppShell = nsnull; + } +#endif + + if(mQueue) + mService->PopThreadEventQueue(mQueue); +} + +nsresult AutoEventQueue::Init() +{ + if (mQueue) + return NS_ERROR_ALREADY_INITIALIZED; + + mService = do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID); + if (!mService) + return NS_ERROR_FAILURE; + + /* push a new queue onto it */ + mService->PushThreadEventQueue(getter_AddRefs(mQueue)); + if (!mQueue) + return NS_ERROR_FAILURE; + +#ifdef HAVE_LAME_APPSHELL + mAppShell = do_CreateInstance(kAppShellCID); + if (!mAppShell) + return NS_ERROR_FAILURE; + + mAppShell->Create(0, nsnull); + mAppShell->Spinup(); + + /* listen to the new queue */ + mAppShell->ListenToEventQueue(mQueue, PR_TRUE); +#endif + + return NS_OK; +} diff --git a/embed/mozilla/AutoEventQueue.h b/embed/mozilla/AutoEventQueue.h new file mode 100644 index 000000000..4b3ae3320 --- /dev/null +++ b/embed/mozilla/AutoEventQueue.h @@ -0,0 +1,75 @@ +/* + * Copied from nsWindowWatcher.cpp. + * + * ***** 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 + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2001 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Harshal Pradhan <keeda@hotpop.com> + * + * 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 ***** + * + * $Id$ + */ + +#ifndef AUTO_EVENT_QUEUE +#define AUTO_EVENT_QUEUE + +#include <nsCOMPtr.h> +#include <nsIEventQueue.h> +#include <nsIEventQueueService.h> + +#ifdef XP_UNIX +/* please see bugzilla.mozilla.org/show_bug.cgi?id=78421 for the eventual "right" fix for this */ +#define HAVE_LAME_APPSHELL +#endif + +#ifdef HAVE_LAME_APPSHELL +#include <nsIAppShell.h> +#endif + +class AutoEventQueue { +public: + AutoEventQueue(); + ~AutoEventQueue(); + + nsresult Init(); + +protected: + nsCOMPtr<nsIEventQueueService> mService; + nsCOMPtr<nsIEventQueue> mQueue; +#ifdef HAVE_LAME_APPSHELL + nsCOMPtr<nsIAppShell> mAppShell; +#endif +}; + +#endif diff --git a/embed/mozilla/GtkNSSSecurityWarningDialogs.cpp b/embed/mozilla/GtkNSSSecurityWarningDialogs.cpp index faec73741..1caa3e415 100644 --- a/embed/mozilla/GtkNSSSecurityWarningDialogs.cpp +++ b/embed/mozilla/GtkNSSSecurityWarningDialogs.cpp @@ -47,6 +47,7 @@ #include "GtkNSSSecurityWarningDialogs.h" #include "EphyUtils.h" +#include "AutoEventQueue.h" #include <nsCOMPtr.h> #include <nsIPrefBranch.h> @@ -200,6 +201,12 @@ GtkNSSSecurityWarningDialogs::DoDialog (nsIInterfaceRequestor *aContext, { *_retval = PR_FALSE; + /* Work around this broken API by pushing a new event queue. Otherwise + * networking will block while the dialogue is shown! + */ + AutoEventQueue queue; + if (NS_FAILED (queue.Init ())) return; + nsresult rv; PRBool show = PR_TRUE; nsCOMPtr<nsIPrefBranch> prefBranch diff --git a/embed/mozilla/Makefile.am b/embed/mozilla/Makefile.am index ae1585ca2..def68f77b 100644 --- a/embed/mozilla/Makefile.am +++ b/embed/mozilla/Makefile.am @@ -1,6 +1,8 @@ noinst_LTLIBRARIES = libephymozillaembed.la libephymozillaembed_la_SOURCES = \ + AutoEventQueue.cpp \ + AutoEventQueue.h \ ContentHandler.cpp \ ContentHandler.h \ EphyContentPolicy.cpp \ |