diff options
Diffstat (limited to 'embed/mozilla/ContentHandler.cpp')
-rw-r--r-- | embed/mozilla/ContentHandler.cpp | 490 |
1 files changed, 0 insertions, 490 deletions
diff --git a/embed/mozilla/ContentHandler.cpp b/embed/mozilla/ContentHandler.cpp deleted file mode 100644 index 3535d362c..000000000 --- a/embed/mozilla/ContentHandler.cpp +++ /dev/null @@ -1,490 +0,0 @@ -/* - * Copyright © 2001 Philip Langdale - * Copyright © 2003 Marco Pesenti Gritti - * Copyright © 2003 Xan Lopez - * Copyright © 2004 Christian Persch - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $Id$ - */ - -#include "mozilla-config.h" -#include "config.h" - -#include <glib/gi18n.h> -#include <gio/gio.h> -#include <gtk/gtkbutton.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkimage.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkstock.h> - -#include <nsStringAPI.h> - -#include <nsCExternalHandlerService.h> -#include <nsComponentManagerUtils.h> -#include <nsIDOMWindow.h> -#include <nsIInterfaceRequestorUtils.h> -#include <nsILocalFile.h> -#include <nsIMIMEInfo.h> -#include <nsIURL.h> -#include <nsMemory.h> -#include <nsNetError.h> -#include <nsServiceManagerUtils.h> - -#include "eel-gconf-extensions.h" -#include "ephy-debug.h" -#include "ephy-embed-shell.h" -#include "ephy-embed-single.h" -#include "ephy-file-chooser.h" -#include "ephy-file-helpers.h" -#include "ephy-gui.h" -#include "ephy-prefs.h" -#include "ephy-stock-icons.h" - -#include "AutoModalDialog.h" -#include "EphyUtils.h" -#include "MozDownload.h" - -#include "ContentHandler.h" - -/* FIXME: we don't generally have a timestamp for the user action which initiated this - * content handler. - */ -GContentHandler::GContentHandler() -: mUserTime(0) -{ - LOG ("GContentHandler ctor (%p)", this); -} - -GContentHandler::~GContentHandler() -{ - LOG ("GContentHandler dtor (%p)", this); -} - -NS_IMPL_ISUPPORTS1(GContentHandler, nsIHelperAppLauncherDialog) - -/* void show (in nsIHelperAppLauncher aLauncher, in nsISupports aContext, in unsigned long aReason); */ -NS_IMETHODIMP -GContentHandler::Show (nsIHelperAppLauncher *aLauncher, - nsISupports *aContext, - PRUint32 aReason) -{ - nsresult rv; - EphyEmbedSingle *single; - gboolean handled = FALSE; - - /* FIXME: handle aForced / aReason argument in some way? */ - - mContext = aContext; - - /* Check for a potential veto */ - nsCOMPtr<nsIDOMWindow> window (do_GetInterface (aContext)); - GtkWidget *embed = EphyUtils::FindEmbed (window); - if (EPHY_IS_EMBED (embed)) - { - if (g_object_get_data (G_OBJECT (embed), "content-handler-deny")) - { - return NS_OK; - } - } - - mLauncher = aLauncher; - rv = Init (); - NS_ENSURE_SUCCESS (rv, rv); - - single = EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (embed_shell)); - g_signal_emit_by_name (single, "handle_content", mMimeType.get(), - mUrl.get(), &handled); - - if (!handled) - { - MIMEInitiateAction (); - } - else - { - mLauncher->Cancel (NS_BINDING_ABORTED); - } - - return NS_OK; -} - -/* nsILocalFile promptForSaveToFile (in nsISupports aWindowContext, in wstring aDefaultFile, in wstring aSuggestedFileExtension); */ -NS_IMETHODIMP GContentHandler::PromptForSaveToFile( - nsIHelperAppLauncher *aLauncher, - nsISupports *aWindowContext, - const PRUnichar *aDefaultFile, - const PRUnichar *aSuggestedFileExtension, - nsILocalFile **_retval) -{ - EphyFileChooser *dialog; - int response; - char *filename = NULL; - nsCString defaultFile; - - NS_UTF16ToCString (nsString (aDefaultFile), - NS_CSTRING_ENCODING_UTF8, defaultFile); - - if (mAction != CONTENT_ACTION_SAVEAS) - { - return BuildDownloadPath (defaultFile.get(), _retval); - } - nsCOMPtr<nsIDOMWindow> parentDOMWindow (do_GetInterface (aWindowContext)); - - AutoModalDialog modalDialog (parentDOMWindow, PR_FALSE); - if (!modalDialog.ShouldShow ()) - return NS_ERROR_FAILURE; - - GtkWindow *parentWindow = modalDialog.GetParent (); - - dialog = ephy_file_chooser_new (_("Save"), GTK_WIDGET (parentWindow), - GTK_FILE_CHOOSER_ACTION_SAVE, - CONF_STATE_SAVE_DIR, - EPHY_FILE_FILTER_ALL); - gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), defaultFile.get()); - - if (parentWindow) - { - gtk_window_group_add_window (ephy_gui_ensure_window_group (GTK_WINDOW (parentWindow)), - GTK_WINDOW (dialog)); - } - - /* FIXME: this will only be the real user time if we came from ::Show */ - ephy_gui_window_update_user_time (GTK_WIDGET (dialog), (guint32) mUserTime); - - /* FIXME: modal -- mozilla sucks! */ - do - { - g_free (filename); - response = modalDialog.Run (GTK_DIALOG (dialog)); - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); - } while (response == GTK_RESPONSE_ACCEPT - && !ephy_gui_check_location_writable (GTK_WIDGET (dialog), filename)); - - if (response == GTK_RESPONSE_ACCEPT) - { - nsCOMPtr <nsILocalFile> destFile (do_CreateInstance(NS_LOCAL_FILE_CONTRACTID)); - NS_ENSURE_TRUE (destFile, NS_ERROR_FAILURE); - - destFile->InitWithNativePath (nsCString (filename)); - g_free (filename); - - NS_IF_ADDREF (*_retval = destFile); - - gtk_widget_destroy (GTK_WIDGET (dialog)); - - return NS_OK; - } - else - { - gtk_widget_destroy (GTK_WIDGET (dialog)); - g_free (filename); - - return NS_ERROR_FAILURE; - } -} - -NS_METHOD GContentHandler::Init () -{ - nsresult rv; - - NS_ENSURE_TRUE (mLauncher, NS_ERROR_FAILURE); - - nsCOMPtr<nsIMIMEInfo> MIMEInfo; - mLauncher->GetMIMEInfo (getter_AddRefs(MIMEInfo)); - NS_ENSURE_TRUE (MIMEInfo, NS_ERROR_FAILURE); - - rv = MIMEInfo->GetMIMEType (mMimeType); - - nsCOMPtr<nsIURI> uri; - mLauncher->GetSource (getter_AddRefs(uri)); - NS_ENSURE_TRUE (uri, NS_ERROR_FAILURE); - - uri->GetSpec (mUrl); - - return NS_OK; -} - -static void -response_cb (GtkWidget *dialog, - int response, - GContentHandler *self) -{ - gtk_widget_destroy (dialog); - - if (response > 0) - { - self->mAction = (ContentAction) response; - } - else - { - self->mAction = CONTENT_ACTION_NONE; - } - - self->MIMEDoAction (); -} - -static void -release_cb (GContentHandler *data) -{ - NS_RELEASE (data); -} - -NS_METHOD GContentHandler::MIMEConfirmAction () -{ - GtkWidget *dialog, *button, *image; - const char *action_label; - char *mime_description; - nsCString file_name; - - nsCOMPtr<nsIDOMWindow> parentDOMWindow = do_GetInterface (mContext); - GtkWindow *parentWindow = GTK_WINDOW (EphyUtils::FindGtkParent(parentDOMWindow)); - - action_label = (mAction == CONTENT_ACTION_OPEN) || - (mAction == CONTENT_ACTION_OPEN_TMP) ? - GTK_STOCK_OPEN : STOCK_DOWNLOAD; - - mime_description = g_content_type_get_description (mMimeType.get()); - if (mime_description == NULL) - { - /* Translators: The text before the "|" is context to help you decide on - * the correct translation. You MUST OMIT it in the translated string. */ - mime_description = g_strdup (Q_("File Type:|Unknown")); - } - - /* We have one tiny, minor issue, the filename can be empty (""), - is that severe enough to be completely fixed ? */ - nsString suggested; - - mLauncher->GetSuggestedFileName (suggested); - NS_UTF16ToCString (suggested, - NS_CSTRING_ENCODING_UTF8, file_name); - - if (mPermission != EPHY_MIME_PERMISSION_SAFE && mHelperApp) - { - dialog = gtk_message_dialog_new - (parentWindow, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, - _("Download this potentially unsafe file?")); - - gtk_message_dialog_format_secondary_text - (GTK_MESSAGE_DIALOG (dialog), - /* translators: First %s is the file type description, - Second %s is the file name */ - _("File Type: “%s”.\n\nIt is unsafe to open “%s” as " - "it could potentially damage your documents or " - "invade your privacy. You can download it instead."), - mime_description, file_name.get()); - } - else if (mAction == CONTENT_ACTION_OPEN_TMP && mHelperApp) - { - dialog = gtk_message_dialog_new - (parentWindow, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, - _("Open this file?")); - - gtk_message_dialog_format_secondary_text - (GTK_MESSAGE_DIALOG (dialog), - /* translators: First %s is the file type description, - Second %s is the file name, - Third %s is the application used to open the file */ - _("File Type: “%s”.\n\nYou can open “%s” using “%s” or save it."), - mime_description, file_name.get(), g_app_info_get_name (mHelperApp)); - } - else - { - dialog = gtk_message_dialog_new - (parentWindow, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, - _("Download this file?")); - - gtk_message_dialog_format_secondary_text - (GTK_MESSAGE_DIALOG (dialog), - /* translators: First %s is the file type description, - Second %s is the file name */ - _("File Type: “%s”.\n\nYou have no application able to open “%s”. " - "You can download it instead."), - mime_description, file_name.get()); - } - - g_free (mime_description); - - button = gtk_button_new_with_label (_("_Save As...")); - image = gtk_image_new_from_stock (GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_BUTTON); - gtk_button_set_image (GTK_BUTTON (button), image); - /* don't show the image! see bug #307818 */ - gtk_widget_show (button); - gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, CONTENT_ACTION_SAVEAS); - - gtk_dialog_add_button (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - gtk_dialog_add_button (GTK_DIALOG (dialog), - action_label, mAction); - - gtk_window_set_icon_name (GTK_WINDOW (dialog), EPHY_STOCK_EPHY); - - int defaultResponse = mAction == CONTENT_ACTION_NONE - ? (int) GTK_RESPONSE_CANCEL - : (int) mAction; - gtk_dialog_set_default_response (GTK_DIALOG (dialog), defaultResponse); - - NS_ADDREF_THIS(); - g_signal_connect_data (dialog, "response", - G_CALLBACK (response_cb), this, - (GClosureNotify) release_cb, (GConnectFlags) 0); - - /* FIXME: should find a way to get the user time of the user action which - * initiated this content handler - */ - gtk_window_present (GTK_WINDOW (dialog)); - - return NS_OK; -} - -NS_METHOD GContentHandler::MIMEInitiateAction (void) -{ - gboolean auto_downloads; - - if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK)) return NS_OK; - - auto_downloads = eel_gconf_get_boolean (CONF_AUTO_DOWNLOADS); - - mHelperApp = g_app_info_get_default_for_type (mMimeType.get(), TRUE); - mPermission = ephy_file_check_mime (mMimeType.get()); - - /* HACK! Check that this 'helper application' isn't Epiphany itself, - * see bug #310023. - */ - if (mHelperApp) - { - const char *id = g_app_info_get_id (mHelperApp); - - /* FIXME! menu editing can make this check fail!!!! */ - if (id && strcmp (id, "epiphany.desktop") == 0) - { - mHelperApp = nsnull; - } - } - - if (auto_downloads) - { - mAction = CONTENT_ACTION_OPEN; - } - else - { - mAction = CONTENT_ACTION_OPEN_TMP; - } - - if (!mHelperApp || mPermission != EPHY_MIME_PERMISSION_SAFE) - { - mAction = CONTENT_ACTION_DOWNLOAD; - } - - if (!auto_downloads || mAction == CONTENT_ACTION_DOWNLOAD) - { - MIMEConfirmAction (); - } - else - { - MIMEDoAction (); - } - - return NS_OK; -} - -NS_METHOD GContentHandler::MIMEDoAction (void) -{ - /* This is okay, since we either clicked on a button, or we get 0 */ - mUserTime = gtk_get_current_event_time (); - - nsCOMPtr<nsIMIMEInfo> mimeInfo; - mLauncher->GetMIMEInfo(getter_AddRefs(mimeInfo)); - NS_ENSURE_TRUE (mimeInfo, NS_ERROR_FAILURE); - -#ifndef HAVE_GECKO_1_9 - char *info = NULL; - - if (mAction == CONTENT_ACTION_OPEN) - { - g_return_val_if_fail (mHelperApp, NS_ERROR_FAILURE); - - const char *id; - id = g_app_info_get_id (mHelperApp); - - /* The current time is fine here as the user has just clicked - * a button (it is used as the time for the application opening) - */ - info = g_strdup_printf ("gnome-default:%d:%s", gtk_get_current_event_time(), id); - } - else if (mAction == CONTENT_ACTION_DOWNLOAD) - { - info = g_strdup_printf ("gnome-browse-to-file:%d", gtk_get_current_event_time()); - } - - if (info != NULL) - { - nsString desc; - NS_CStringToUTF16 (nsCString (info), - NS_CSTRING_ENCODING_UTF8, desc); - g_free (info); - - /* HACK we use the application description to ask - MozDownload to open the file when download - is finished */ - mimeInfo->SetApplicationDescription (desc); - } - else - { - mimeInfo->SetApplicationDescription (nsString ()); - } -#endif /* HAVE_GECKO_1_9 */ - - if (mAction == CONTENT_ACTION_OPEN) - { - mLauncher->SaveToDisk (nsnull, PR_FALSE); - } - else if (mAction == CONTENT_ACTION_OPEN_TMP) - { - mLauncher->LaunchWithApplication (nsnull, PR_FALSE); - } - else if (mAction == CONTENT_ACTION_NONE) - { - mLauncher->Cancel (NS_BINDING_ABORTED); - } - else - { - mLauncher->SaveToDisk (nsnull, PR_FALSE); - } - -#ifdef HAVE_GECKO_1_9 - /* We have to do this work down here because the external helper app modifies the - * value after calling SaveToDisk. - */ - nsHandlerInfoAction action; - if (mAction == CONTENT_ACTION_DOWNLOAD) { - action = EPHY_ACTION_BROWSE_TO_FILE; - - /* This won't be able to transport the activation time so we cannot - * do startup notification, but it's the best that was available - */ - mimeInfo->SetPreferredAction (action); - } -#endif - - return NS_OK; -} |