diff options
Diffstat (limited to 'embed/xulrunner/utils/ggeAutoModalDialog.cpp')
-rw-r--r-- | embed/xulrunner/utils/ggeAutoModalDialog.cpp | 189 |
1 files changed, 0 insertions, 189 deletions
diff --git a/embed/xulrunner/utils/ggeAutoModalDialog.cpp b/embed/xulrunner/utils/ggeAutoModalDialog.cpp deleted file mode 100644 index 761e871d9..000000000 --- a/embed/xulrunner/utils/ggeAutoModalDialog.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright © 2006 Christian Persch - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation; either version 2.1, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Some code taken from mozilla/embedding/components/windowwatcher/src/nsPromptService.cpp - * which was under MPL/LGPL/GPL tri-licence and is here being used under the licence above. - * Original notice: - * - * 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. - */ - -#include <xpcom-config.h> -#include <config.h> - -struct JSContext; /* Just so we don't need to include a bunch of JS headers */ - -#include <nsIDOMDocumentEvent.h> -#include <nsIDOMDocument.h> -#include <nsIDOMEvent.h> -#include <nsIDOMEventTarget.h> -#include <nsIJSContextStack.h> -#include <nsIPrivateDOMEvent.h> -#include <nsPIDOMWindow.h> -#include <nsServiceManagerUtils.h> -#include <nsThreadUtils.h> - -#include <gtk/gtkdialog.h> - -#include "ggeAutoModalDialog.h" - -ggeAutoModalDialog::ggeAutoModalDialog (nsIDOMWindow *aWindow, - PRBool aNotifyDOM) - : mWindow (aWindow), - mPWindow (do_QueryInterface (aWindow)), - mStack (do_GetService ("@mozilla.org/js/xpc/ContextStack;1")), - mDefaultEnabled (DispatchEvent ("DOMWillOpenModalDialog", aNotifyDOM)), - mContextPushed (PR_FALSE), - mModalStateSet (PR_FALSE) -{ - /* First we check whether we should show the dialogue at all */ - if (aNotifyDOM) { - if (!mDefaultEnabled) { - return; - } - } - - if (mStack) { - mContextPushed = NS_SUCCEEDED (mStack->Push (nsnull)); - } - - if (mWindow) { - NS_ASSERTION (mPWindow, "Should have a window here!"); - - mPWindow->EnterModalState (); - mModalStateSet = PR_TRUE; - } -} - -ggeAutoModalDialog::~ggeAutoModalDialog () -{ - if (mModalStateSet) { - NS_ASSERTION (mPWindow, "Should have a window here!"); - mPWindow->LeaveModalState (); - } - - if (mContextPushed) { - NS_ASSERTION (mStack, "Should have a stack!"); - - JSContext* cx; - mStack->Pop (&cx); - - NS_ASSERTION(cx == nsnull, "We pushed a null context but popped a non-null context!?"); - } - -} - -/* static */ void PR_CALLBACK -ggeAutoModalDialog::ResponseCallback (GtkWidget *aDialog, - int aResponse, - void *aData) -{ - ggeAutoModalDialog *obj = reinterpret_cast<ggeAutoModalDialog*>(aData); - - gtk_widget_hide (aDialog); - obj->mResponse = aResponse; - obj->mContinueModalLoop = PR_FALSE; -} - -/* static */ gboolean PR_CALLBACK -ggeAutoModalDialog::DeleteCallback (GtkWidget *aDialog, - void *aEvent, - void *aData) -{ - gtk_dialog_response (GTK_DIALOG (aDialog), GTK_RESPONSE_DELETE_EVENT); - return TRUE; -} - -void -ggeAutoModalDialog::Run (GtkWidget *aDialog) -{ - NS_ASSERTION (ShouldShow(), "Calling ::Run on a prevented dialogue!"); - - /* Do NOT use gtk_dialog_run here, since it blocks the network thread! - * See https://bugzilla.mozilla.org/show_bug.cgi?id=338225 - */ - - // Reset popup state while opening a modal dialog, and firing - // events about the dialog, to prevent the current state from - // being active the whole time a modal dialog is open. - nsAutoPopupStatePusher popupStatePusher (mPWindow, openAbused); - - mDialog = aDialog; - g_object_ref_sink (mDialog); - mResponse = GTK_RESPONSE_DELETE_EVENT; - - gulong responseHandler = g_signal_connect (mDialog, "response", - G_CALLBACK (ResponseCallback), - reinterpret_cast<void*>(this)); - gulong deleteHandler = g_signal_connect (mDialog, "delete-event", - G_CALLBACK (DeleteCallback), - reinterpret_cast<void*>(this)); - - nsCOMPtr<nsIThread> thread (do_GetCurrentThread ()); - NS_ASSERTION (thread, "No UI thread?"); - - mContinueModalLoop = PR_TRUE; - while (mContinueModalLoop) { - if (!NS_ProcessNextEvent (thread)) - break; - } - - g_signal_handler_disconnect (mDialog, responseHandler); - g_signal_handler_disconnect (mDialog, deleteHandler); - /* FIXME */ - g_object_unref (mDialog); - mDialog = NULL; -} - -PRBool -ggeAutoModalDialog::DispatchEvent (const char *aEventName, - PRBool aDoNotify) -{ - if (!mWindow || !aDoNotify) { - return PR_TRUE; - } - - nsCOMPtr<nsIDOMDocument> domdoc; - mWindow->GetDocument (getter_AddRefs (domdoc)); - - nsCOMPtr<nsIDOMDocumentEvent> docevent (do_QueryInterface (domdoc)); - nsCOMPtr<nsIDOMEvent> event; - - PRBool defaultActionEnabled = PR_TRUE; - - if (docevent) { - docevent->CreateEvent (NS_LITERAL_STRING ("Events"), getter_AddRefs (event)); - - nsCOMPtr<nsIPrivateDOMEvent> privateEvent (do_QueryInterface (event)); - if (privateEvent) { - event->InitEvent (NS_ConvertASCIItoUTF16 (aEventName), PR_TRUE, PR_TRUE); - - privateEvent->SetTrusted(PR_TRUE); - - nsCOMPtr<nsIDOMEventTarget> target (do_QueryInterface (mWindow)); - - target->DispatchEvent (event, &defaultActionEnabled); - } - } - - return defaultActionEnabled; -} |