aboutsummaryrefslogtreecommitdiffstats
path: root/embed
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2006-01-18 23:53:54 +0800
committerChristian Persch <chpe@src.gnome.org>2006-01-18 23:53:54 +0800
commitbc05ca2fb4d1d031e5ba4f081666bfcbec875872 (patch)
treebce80060063e65e63366c4063267802dc35cde61 /embed
parent539426a9bd327676ad71b263e497ce19da1adde9 (diff)
downloadgsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.tar
gsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.tar.gz
gsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.tar.bz2
gsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.tar.lz
gsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.tar.xz
gsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.tar.zst
gsoc2013-epiphany-bc05ca2fb4d1d031e5ba4f081666bfcbec875872.zip
Decouple embed single instantiation and initialisation. Prevents
2006-01-18 Christian Persch <chpe@cvs.gnome.org> * embed/ephy-embed-shell.c: (impl_get_embed_single): * embed/ephy-embed-single.c: (ephy_embed_single_init): * embed/ephy-embed-single.h: * embed/mozilla/mozilla-embed-single.cpp: Decouple embed single instantiation and initialisation. Prevents double-initialisation on startup. * embed/mozilla/EphyContentPolicy.cpp: * embed/mozilla/EphyContentPolicy.h: Remove embed single variable, it was unused.
Diffstat (limited to 'embed')
-rw-r--r--embed/ephy-embed-shell.c37
-rw-r--r--embed/ephy-embed-single.c14
-rw-r--r--embed/ephy-embed-single.h3
-rw-r--r--embed/mozilla/EphyContentPolicy.cpp3
-rw-r--r--embed/mozilla/EphyContentPolicy.h3
-rw-r--r--embed/mozilla/mozilla-embed-single.cpp22
6 files changed, 58 insertions, 24 deletions
diff --git a/embed/ephy-embed-shell.c b/embed/ephy-embed-shell.c
index 9e50c59fc..32dd8e1bc 100644
--- a/embed/ephy-embed-shell.c
+++ b/embed/ephy-embed-shell.c
@@ -33,6 +33,9 @@
#include "ephy-debug.h"
#include "ephy-adblock-manager.h"
+#include <glib/gi18n.h>
+#include <gtk/gtkmessagedialog.h>
+
#define EPHY_EMBED_SHELL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_EMBED_SHELL, EphyEmbedShellPrivate))
struct _EphyEmbedShellPrivate
@@ -43,6 +46,7 @@ struct _EphyEmbedShellPrivate
EphyEmbedSingle *embed_single;
EphyEncodings *encodings;
EphyAdBlockManager *adblock_manager;
+ guint single_initialised : 1;
};
enum
@@ -201,12 +205,41 @@ ephy_embed_shell_get_downloader_view (EphyEmbedShell *shell)
static GObject *
impl_get_embed_single (EphyEmbedShell *shell)
{
+ EphyEmbedShellPrivate *priv;
+
g_return_val_if_fail (EPHY_IS_EMBED_SHELL (shell), NULL);
- if (shell->priv->embed_single == NULL)
+ priv = shell->priv;
+
+ if (priv->embed_single != NULL &&
+ !priv->single_initialised)
+ {
+ g_warning ("ephy_embed_shell_get_embed_single called while the single is being initialised!\n");
+ return G_OBJECT (priv->embed_single);
+ }
+
+ if (priv->embed_single == NULL)
{
- shell->priv->embed_single = EPHY_EMBED_SINGLE
+ priv->embed_single = EPHY_EMBED_SINGLE
(ephy_embed_factory_new_object (EPHY_TYPE_EMBED_SINGLE));
+
+ if (!ephy_embed_single_init (priv->embed_single))
+ {
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new
+ (NULL,
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ _("Epiphany can't be used now. "
+ "Mozilla initialization failed."));
+ gtk_dialog_run (GTK_DIALOG (dialog));
+
+ exit (0);
+ }
+
+ priv->single_initialised = TRUE;
}
return G_OBJECT (shell->priv->embed_single);
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c
index fe32a0289..33831f157 100644
--- a/embed/ephy-embed-single.c
+++ b/embed/ephy-embed-single.c
@@ -163,6 +163,20 @@ ephy_embed_single_iface_init (gpointer g_iface)
}
/**
+ * ephy_embed_single_init:
+ * @single: the #EphyEmbedSingle
+ *
+ * Performs startup initialisations. Must be called before calling
+ * any other methods.
+ **/
+gboolean
+ephy_embed_single_init (EphyEmbedSingle *single)
+{
+ EphyEmbedSingleIface *iface = EPHY_EMBED_SINGLE_GET_IFACE (single);
+ return iface->init (single);
+}
+
+/**
* ephy_embed_single_clear_cache:
* @single: the #EphyEmbedSingle
*
diff --git a/embed/ephy-embed-single.h b/embed/ephy-embed-single.h
index 916773d7f..0ff733e94 100644
--- a/embed/ephy-embed-single.h
+++ b/embed/ephy-embed-single.h
@@ -60,6 +60,7 @@ struct _EphyEmbedSingleIface
/* Methods */
+ gboolean (* init) (EphyEmbedSingle *single);
GtkWidget * (* open_window) (EphyEmbedSingle *single,
EphyEmbed *parent,
const char *address,
@@ -76,6 +77,8 @@ struct _EphyEmbedSingleIface
GType ephy_embed_single_get_type (void);
+gboolean ephy_embed_single_init (EphyEmbedSingle *single);
+
GtkWidget *ephy_embed_single_open_window (EphyEmbedSingle *single,
EphyEmbed *parent,
const char *address,
diff --git a/embed/mozilla/EphyContentPolicy.cpp b/embed/mozilla/EphyContentPolicy.cpp
index b5910063b..930e39e86 100644
--- a/embed/mozilla/EphyContentPolicy.cpp
+++ b/embed/mozilla/EphyContentPolicy.cpp
@@ -55,9 +55,6 @@ EphyContentPolicy::EphyContentPolicy()
mLocked = eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_UNSAFE_PROTOCOLS);
mSafeProtocols = eel_gconf_get_string_list (CONF_LOCKDOWN_ADDITIONAL_SAFE_PROTOCOLS);
-
- mEmbedSingle = ephy_embed_shell_get_embed_single (embed_shell);
- g_return_if_fail (mEmbedSingle);
}
EphyContentPolicy::~EphyContentPolicy()
diff --git a/embed/mozilla/EphyContentPolicy.h b/embed/mozilla/EphyContentPolicy.h
index 3c4813a17..7639a6d00 100644
--- a/embed/mozilla/EphyContentPolicy.h
+++ b/embed/mozilla/EphyContentPolicy.h
@@ -50,9 +50,8 @@ public:
EphyContentPolicy();
virtual ~EphyContentPolicy();
private:
- GtkWidget *GetEmbedFromContext (nsISupports *aContext);
+ static GtkWidget *GetEmbedFromContext (nsISupports *aContext);
- GObject *mEmbedSingle;
gboolean mLocked;
GSList *mSafeProtocols;
};
diff --git a/embed/mozilla/mozilla-embed-single.cpp b/embed/mozilla/mozilla-embed-single.cpp
index 0c7d04e0a..a7b3b0d49 100644
--- a/embed/mozilla/mozilla-embed-single.cpp
+++ b/embed/mozilla/mozilla-embed-single.cpp
@@ -783,8 +783,10 @@ mozilla_stylesheet_shutdown (MozillaEmbedSingle *single)
#endif /* HAVE_GECKO_1_8 */
static gboolean
-init_services (MozillaEmbedSingle *single)
+impl_init (EphyEmbedSingle *esingle)
{
+ MozillaEmbedSingle *single = MOZILLA_EMBED_SINGLE (esingle);
+
/* Pre initialization */
mozilla_init_plugin_path ();
mozilla_init_home ();
@@ -803,6 +805,7 @@ init_services (MozillaEmbedSingle *single)
/* Fire up the beast */
gtk_moz_embed_push_startup ();
+ /* FIXME check that it succeeded! */
mozilla_register_components ();
@@ -864,22 +867,6 @@ mozilla_embed_single_init (MozillaEmbedSingle *mes)
MOZILLA_PROFILE_FILE,
NULL);
- if (!init_services (mes))
- {
- GtkWidget *dialog;
-
- dialog = gtk_message_dialog_new
- (NULL,
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE,
- _("Epiphany can't be used now. "
- "Mozilla initialization failed."));
- gtk_dialog_run (GTK_DIALOG (dialog));
-
- exit (0);
- }
-
g_signal_connect_object (embed_shell, "prepare-close",
G_CALLBACK (prepare_close_cb), mes,
(GConnectFlags) 0);
@@ -1506,6 +1493,7 @@ mozilla_embed_single_class_init (MozillaEmbedSingleClass *klass)
static void
ephy_embed_single_iface_init (EphyEmbedSingleIface *iface)
{
+ iface->init = impl_init;
iface->clear_cache = impl_clear_cache;
iface->clear_auth_cache = impl_clear_auth_cache;
iface->set_network_status = impl_set_network_status;