/*
* 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 "ephy-stock-icons.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, EPHY_STOCK_EPHY);
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
(ngettext ("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;
}