aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--embed/ephy-embed.c17
-rw-r--r--embed/ephy-embed.h2
-rw-r--r--embed/mozilla/EphyBrowser.cpp31
-rw-r--r--embed/mozilla/EphyBrowser.h8
5 files changed, 69 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index a4d6f971b..de8950c32 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-05-12 Jean-François Rameau <jframeau@cvs.gnome.org>
+
+ * embed/ephy-embed.h:
+ * embed/ephy-embed.c:
+ * embed/mozilla/EphyBrowser.cpp:
+ * embed/mozilla/EventContext.cpp:
+
+ Add handling of DOMContentLoaded event from Gecko.
+ It is an event that Gecko throws when the dom’s content is loaded,
+ that is, before all the images and what not have loaded.
+
2005-05-12 Christian Persch <chpe@cvs.gnome.org>
* src/Makefile.am:
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 1fbed68e2..f6547f8fc 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -332,6 +332,23 @@ ephy_embed_base_init (gpointer g_class)
G_TYPE_NONE,
1,
EPHY_TYPE_EMBED_DOCUMENT_TYPE);
+/**
+ * EphyEmbed::dom-content-loaded:
+ * @embed:
+ *
+ * The ::dom-content-loaded signal is emitted when
+ * the document has been loaded (excluding images and other loads initiated by this document).
+ * That's true also for frameset and all the frames within it.
+ **/
+ g_signal_new ("dom_content_loaded",
+ EPHY_TYPE_EMBED,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (EphyEmbedIface, dom_content_loaded),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
initialized = TRUE;
}
diff --git a/embed/ephy-embed.h b/embed/ephy-embed.h
index 014aa6cd8..b16a25e86 100644
--- a/embed/ephy-embed.h
+++ b/embed/ephy-embed.h
@@ -129,6 +129,8 @@ struct _EphyEmbedIface
EphyEmbedEvent *event);
gboolean (* dom_mouse_down) (EphyEmbed *embed,
EphyEmbedEvent *event);
+ void (* dom_content_loaded) (EphyEmbed *embed,
+ gpointer event);
void (* popup_blocked) (EphyEmbed *embed,
const char *address,
const char *features);
diff --git a/embed/mozilla/EphyBrowser.cpp b/embed/mozilla/EphyBrowser.cpp
index 0f70367a3..f0147ed33 100644
--- a/embed/mozilla/EphyBrowser.cpp
+++ b/embed/mozilla/EphyBrowser.cpp
@@ -101,6 +101,7 @@
#endif
const static PRUnichar kDOMLinkAdded[] = { 'D', 'O', 'M', 'L', 'i', 'n', 'k', 'A', 'd', 'd', 'e', 'd', '\0' };
+const static PRUnichar kDOMContentLoaded[] = { 'D', 'O', 'M', 'C', 'o', 'n', 't', 'e', 'n', 't', 'L', 'o', 'a', 'd', 'e', 'd', '\0' };
const static PRUnichar kContextMenu[] = { 'c', 'o', 'n', 't', 'e', 'x', 't', 'm', 'e', 'n', 'u', '\0' };
const static PRUnichar kDOMPopupBlocked[] = { 'D', 'O', 'M', 'P', 'o', 'p', 'u', 'p', 'B', 'l', 'o', 'c', 'k', 'e', 'd', '\0' };
const static PRUnichar kDOMWillOpenModalDialog[] = { 'D', 'O', 'M', 'W', 'i', 'l', 'l', 'O', 'p', 'e', 'n', 'M', 'o', 'd', 'a', 'l', 'D', 'i', 'a', 'l', 'o', 'g', '\0' };
@@ -287,6 +288,25 @@ EphyDOMLinkEventListener::HandleEvent (nsIDOMEvent* aDOMEvent)
return NS_OK;
}
+NS_IMETHODIMP
+EphyDOMContentLoadedEventListener::HandleEvent (nsIDOMEvent* aDOMEvent)
+{
+ LOG ("DOMContentLoaded event fired up");
+
+#ifdef MOZ_NSIDOMNSEVENT_GETISTRUSTED
+ /* make sure the event is trusted */
+ nsCOMPtr<nsIDOMNSEvent> nsEvent (do_QueryInterface (aDOMEvent));
+ NS_ENSURE_TRUE (nsEvent, NS_ERROR_FAILURE);
+ PRBool isTrusted = PR_FALSE;
+ nsEvent->GetIsTrusted (&isTrusted);
+ if (!isTrusted) return NS_OK;
+#endif /* MOZ_NSIDOMNSEVENT_GETISTRUSTED */
+
+ g_signal_emit_by_name (mOwner->mEmbed, "dom_content_loaded", (gpointer)aDOMEvent);
+
+ return NS_OK;
+}
+
nsresult
EphyDOMLinkEventListener::GetDocURI (nsIDOMElement *aElement,
nsIURI **aDocURI)
@@ -489,6 +509,7 @@ EphyContextMenuListener::HandleEvent (nsIDOMEvent* aDOMEvent)
EphyBrowser::EphyBrowser ()
: mDOMLinkEventListener(nsnull)
+, mDOMContentLoadedEventListener(nsnull)
, mPopupBlockEventListener(nsnull)
, mModalAlertListener(nsnull)
, mContextMenuListener(nsnull)
@@ -527,6 +548,12 @@ nsresult EphyBrowser::Init (GtkMozEmbed *mozembed)
rv = mDOMLinkEventListener->Init (this);
NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
+ mDOMContentLoadedEventListener = new EphyDOMContentLoadedEventListener();
+ if (!mDOMContentLoadedEventListener) return NS_ERROR_OUT_OF_MEMORY;
+
+ rv = mDOMContentLoadedEventListener->Init (this);
+ NS_ENSURE_SUCCESS (rv, NS_ERROR_FAILURE);
+
mPopupBlockEventListener = new EphyPopupBlockEventListener();
if (!mPopupBlockEventListener) return NS_ERROR_OUT_OF_MEMORY;
@@ -632,6 +659,8 @@ EphyBrowser::AttachListeners(void)
nsresult rv;
rv = mEventTarget->AddEventListener(nsEmbedString(kDOMLinkAdded),
mDOMLinkEventListener, PR_FALSE);
+ rv |= mEventTarget->AddEventListener(nsEmbedString(kDOMContentLoaded),
+ mDOMContentLoadedEventListener, PR_FALSE);
rv |= mEventTarget->AddEventListener(nsEmbedString(kDOMPopupBlocked),
mPopupBlockEventListener, PR_FALSE);
rv |= mEventTarget->AddEventListener(nsEmbedString(kDOMWillOpenModalDialog),
@@ -653,6 +682,8 @@ EphyBrowser::DetachListeners(void)
nsresult rv;
rv = mEventTarget->RemoveEventListener(nsEmbedString(kDOMLinkAdded),
mDOMLinkEventListener, PR_FALSE);
+ rv |= mEventTarget->RemoveEventListener(nsEmbedString(kDOMContentLoaded),
+ mDOMContentLoadedEventListener, PR_FALSE);
rv |= mEventTarget->RemoveEventListener(nsEmbedString(kDOMPopupBlocked),
mPopupBlockEventListener, PR_FALSE);
rv |= mEventTarget->RemoveEventListener(nsEmbedString(kDOMWillOpenModalDialog),
diff --git a/embed/mozilla/EphyBrowser.h b/embed/mozilla/EphyBrowser.h
index ffb11e11f..195d26f64 100644
--- a/embed/mozilla/EphyBrowser.h
+++ b/embed/mozilla/EphyBrowser.h
@@ -89,6 +89,12 @@ public:
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
};
+class EphyDOMContentLoadedEventListener : public EphyEventListener
+{
+public:
+ NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
+};
+
class EphyContextMenuListener : public nsIDOMContextMenuListener
{
public:
@@ -112,6 +118,7 @@ class EphyBrowser
{
friend class EphyEventListener;
friend class EphyDOMLinkEventListener;
+friend class EphyDOMContentLoadedEventListener;
friend class EphyPopupBlockEventListener;
friend class EphyModalAlertEventListener;
friend class EphyContextMenuListener;
@@ -182,6 +189,7 @@ private:
nsCOMPtr<nsIDOMEventTarget> mEventTarget;
nsCOMPtr<nsIDOMWindow> mDOMWindow;
EphyDOMLinkEventListener *mDOMLinkEventListener;
+ EphyDOMContentLoadedEventListener *mDOMContentLoadedEventListener;
EphyPopupBlockEventListener *mPopupBlockEventListener;
EphyModalAlertEventListener *mModalAlertListener;
EphyContextMenuListener *mContextMenuListener;