aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla/GeckoCookiePromptService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'embed/mozilla/GeckoCookiePromptService.cpp')
-rw-r--r--embed/mozilla/GeckoCookiePromptService.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/embed/mozilla/GeckoCookiePromptService.cpp b/embed/mozilla/GeckoCookiePromptService.cpp
new file mode 100644
index 000000000..843546c2d
--- /dev/null
+++ b/embed/mozilla/GeckoCookiePromptService.cpp
@@ -0,0 +1,160 @@
+/*
+ * Copyright © 2003 Tommi Komulainen <tommi.komulainen@iki.fi>
+ * Copyright © 2004, 2007 Christian Persch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "mozilla-config.h"
+#include "config.h"
+
+#include <glib/gi18n.h>
+
+#include <gtk/gtkbox.h>
+#include <gtk/gtkcheckbutton.h>
+#include <gtk/gtkdialog.h>
+#include <gtk/gtkmessagedialog.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtkwindow.h>
+
+#include <nsStringAPI.h>
+
+#include "ephy-debug.h"
+#include "ephy-gui.h"
+
+#include "AutoJSContextStack.h"
+#include "AutoWindowModalState.h"
+#include "EphyUtils.h"
+
+#include "GeckoCookiePromptService.h"
+
+NS_IMPL_ISUPPORTS1 (GeckoCookiePromptService, nsICookiePromptService)
+
+GeckoCookiePromptService::GeckoCookiePromptService()
+{
+ LOG ("GeckoCookiePromptService ctor [%p]", this);
+}
+
+GeckoCookiePromptService::~GeckoCookiePromptService()
+{
+ LOG ("GeckoCookiePromptService dtor [%p]", this);
+}
+
+/* boolean cookieDialog (in nsIDOMWindow parent, in nsICookie cookie, in ACString hostname, in long cookiesFromHost, in boolean changingCookie, inout boolean checkValue); */
+NS_IMETHODIMP
+GeckoCookiePromptService::CookieDialog (nsIDOMWindow *aParent,
+ nsICookie *aCookie,
+ const nsACString &aHostname,
+ PRInt32 aCookiesFromHost,
+ PRBool aChangingCookie,
+ PRBool *_checkValue,
+ PRBool *_retval)
+{
+ NS_ENSURE_ARG (aParent);
+ NS_ENSURE_ARG (aCookie);
+ NS_ENSURE_ARG_POINTER (_checkValue);
+ NS_ENSURE_ARG_POINTER (_retval);
+
+ // TODO short-circuit and accept session cookies as per preference
+ // TODO until mozilla starts supporting it natively?
+
+ GtkWidget *parent = EphyUtils::FindGtkParent (aParent);
+ NS_ENSURE_TRUE(parent, NS_ERROR_INVALID_POINTER);
+
+ nsresult rv;
+ AutoJSContextStack stack;
+ rv = stack.Init ();
+ if (NS_FAILED (rv)) {
+ return rv;
+ }
+
+ AutoWindowModalState modalState (aParent);
+
+ nsCString host(aHostname);
+
+ GtkWidget *dialog = gtk_message_dialog_new
+ (GTK_WINDOW (parent),
+ GTK_DIALOG_MODAL /* FIXME mozilla sucks! */,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("Accept cookie from %s?"),
+ host.get());
+ GtkWindow *window = GTK_WINDOW (dialog);
+ GtkDialog *gdialog = GTK_DIALOG (dialog);
+ GtkMessageDialog *message_dialog = GTK_MESSAGE_DIALOG (dialog);
+
+ gtk_window_set_icon_name (window, "web-browser");
+ gtk_window_set_title (window, _("Accept Cookie?"));
+
+ if (aChangingCookie) {
+ gtk_message_dialog_format_secondary_text
+ (message_dialog,
+ _("The site wants to modify an existing cookie."));
+ } else if (aCookiesFromHost == 0) {
+ gtk_message_dialog_format_secondary_text
+ (message_dialog,
+ _("The site wants to set a cookie."));
+ } else if (aCookiesFromHost == 1) {
+ gtk_message_dialog_format_secondary_text
+ (message_dialog,
+ _("The site wants to set a second cookie."));
+ } else {
+ char *num_text = g_strdup_printf
+ (dngettext (GETTEXT_PACKAGE,
+ "You already have %d cookie from this site.",
+ "You already have %d cookies from this site.",
+ aCookiesFromHost),
+ aCookiesFromHost);
+
+ gtk_message_dialog_format_secondary_text
+ (message_dialog,
+ "The site %s wants to set another cookie. %s",
+ host.get(), num_text);
+ g_free (num_text);
+ }
+
+ GtkWidget *checkbutton;
+ checkbutton = gtk_check_button_new_with_mnemonic
+ (_("Apply this _decision to all cookies from this site"));
+ gtk_widget_show (checkbutton);
+ gtk_box_pack_start (GTK_BOX (ephy_gui_message_dialog_get_content_box (dialog)),
+ checkbutton, FALSE, FALSE, 0);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton), *_checkValue);
+
+ gtk_dialog_add_button (gdialog,
+ _("_Reject"), GTK_RESPONSE_REJECT);
+ gtk_dialog_add_button (gdialog,
+ _("_Accept"), GTK_RESPONSE_ACCEPT);
+ gtk_dialog_set_default_response (gdialog, GTK_RESPONSE_ACCEPT);
+
+ int response = gtk_dialog_run (gdialog);
+
+ if (response == GTK_RESPONSE_ACCEPT || response == GTK_RESPONSE_REJECT) {
+ *_retval = (response == GTK_RESPONSE_ACCEPT);
+ *_checkValue = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton));
+ } else {
+ /* if the dialog was closed, but no button was pressed,
+ * consider it as 'Reject' but ignore the checkbutton
+ */
+ *_retval = PR_FALSE;
+ *_checkValue = PR_FALSE;
+ }
+
+ gtk_widget_destroy (dialog);
+
+ return NS_OK;
+}