aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--embed/ephy-embed-single.c20
-rw-r--r--embed/ephy-embed-single.h5
-rw-r--r--embed/mozilla/EphySidebar.cpp181
-rw-r--r--embed/mozilla/EphySidebar.h53
-rw-r--r--embed/mozilla/Makefile.am3
-rw-r--r--embed/mozilla/MozRegisterComponents.cpp23
7 files changed, 298 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 69a0687e5..f494ccc62 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2005-01-01 Crispin Flowerday <gnome@flowerday.cx>
+
+ * embed/ephy-embed-single.c: (ephy_embed_single_iface_init):
+ * embed/ephy-embed-single.h:
+ * embed/mozilla/EphySidebar.cpp:
+ * embed/mozilla/EphySidebar.h:
+ * embed/mozilla/Makefile.am:
+ * embed/mozilla/MozRegisterComponents.cpp:
+
+ Add an "add-sidebar" signal on the EphyEmbedSingle interface,
+ it gets emitted when a user clicks on a link that wants
+ to add a url to the sidebar.
+
2005-01-01 Christian Persch <chpe@cvs.gnome.org>
* configure.ac:
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c
index 9f07d7aa7..012b11795 100644
--- a/embed/ephy-embed-single.c
+++ b/embed/ephy-embed-single.c
@@ -96,6 +96,26 @@ ephy_embed_single_iface_init (gpointer g_class)
1,
G_TYPE_BOOLEAN);
+/**
+ * EphyEmbedSingle::add-sidebar:
+ * @single:
+ * @url: The url of the sidebar to be added
+ * @title: The title of the sidebar to be added
+ *
+ * The ::add-sidebar signal is emitted when the user clicks a javascript link that
+ * requests adding a url to the sidebar.
+ **/
+ g_signal_new ("add-sidebar",
+ EPHY_TYPE_EMBED_SINGLE,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EphyEmbedSingleIface, add_sidebar),
+ g_signal_accumulator_true_handled, NULL,
+ ephy_marshal_BOOLEAN__STRING_STRING,
+ G_TYPE_BOOLEAN,
+ 2,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+
initialised = TRUE;
}
}
diff --git a/embed/ephy-embed-single.h b/embed/ephy-embed-single.h
index f37460a82..7c3850b82 100644
--- a/embed/ephy-embed-single.h
+++ b/embed/ephy-embed-single.h
@@ -48,6 +48,11 @@ struct _EphyEmbedSingleIface
void (* network_status) (EphyEmbedSingle *single,
gboolean offline);
+
+ gboolean (* add_sidebar) (EphyEmbedSingle *single,
+ const char * url,
+ const char * title);
+
/* Methods */
GtkWidget * (* open_window) (EphyEmbedSingle *single,
diff --git a/embed/mozilla/EphySidebar.cpp b/embed/mozilla/EphySidebar.cpp
new file mode 100644
index 000000000..9b2ea9cda
--- /dev/null
+++ b/embed/mozilla/EphySidebar.cpp
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2002 Philip Langdale
+ * Copyright (C) 2004 Crispin Flowerday
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#include "mozilla-config.h"
+
+#include "config.h"
+
+#include <nsCOMPtr.h>
+#include <nsCRT.h>
+#include <nsIProgrammingLanguage.h>
+
+#define MOZILLA_STRICT_API
+#include <nsEmbedString.h>
+#undef MOZILLA_STRICT_API
+
+#include "EphySidebar.h"
+#include "ephy-embed-shell.h"
+#include "ephy-embed-single.h"
+#include "ephy-debug.h"
+
+/* Implementation file */
+NS_IMPL_ISUPPORTS2(EphySidebar, nsISidebar, nsIClassInfo)
+
+EphySidebar::EphySidebar()
+{
+}
+
+EphySidebar::~EphySidebar()
+{
+}
+
+
+/* void addPanel (in wstring aTitle, in string aContentURL, in string aCustomizeURL); */
+NS_IMETHODIMP
+EphySidebar::AddPanel (const PRUnichar *aTitle,
+ const char *aContentURL,
+ const char *aCustomizeURL)
+{
+ nsEmbedCString title;
+ EphyEmbedSingle *single;
+
+ NS_UTF16ToCString (nsEmbedString(aTitle),
+ NS_CSTRING_ENCODING_UTF8, title);
+
+ LOG ("Adding sidebar, url=%s title=%s", aContentURL, title.get());
+
+ single = EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (embed_shell));
+
+ g_signal_emit_by_name (single, "add-sidebar",
+ aContentURL, title.get());
+
+ return NS_OK;
+}
+
+/* void addPersistentPanel (in wstring aTitle, in string aContentURL, in string aCustomizeURL); */
+NS_IMETHODIMP
+EphySidebar::AddPersistentPanel (const PRUnichar *aTitle,
+ const char *aContentURL,
+ const char *aCustomizeURL)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void addSearchEngine (in string engineURL, in string iconURL, in wstring suggestedTitle, in wst
+ring suggestedCategory); */
+NS_IMETHODIMP
+EphySidebar::AddSearchEngine (const char *engineURL,
+ const char *iconURL,
+ const PRUnichar *suggestedTitle,
+ const PRUnichar *suggestedCategory)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+
+
+//------------------------------------------------------------------------------
+//nsIClassInfo Impl.
+//------------------------------------------------------------------------------
+
+/* void getInterfaces (out PRUint32 count, [array, size_is (count), retval] out nsIIDPtr array); */
+NS_IMETHODIMP EphySidebar::GetInterfaces(PRUint32 *aCount, nsIID * **aArray)
+{
+ PRUint32 count = 2;
+
+ *aCount = count;
+
+ *aArray = NS_STATIC_CAST(nsIID **, nsMemory::Alloc(count * sizeof(nsIID *)));
+ NS_ENSURE_TRUE(*aArray, NS_ERROR_OUT_OF_MEMORY);
+
+ nsIID *iid = NS_STATIC_CAST(nsIID *,
+ nsMemory::Clone(&(NS_GET_IID(nsISidebar)),
+ sizeof(nsIID)));
+ if (!iid)
+ {
+ NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(0, *aArray);
+
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ (*aArray)[0] = iid;
+
+
+ iid = NS_STATIC_CAST(nsIID *,
+ nsMemory::Clone(&(NS_GET_IID(nsIClassInfo)),
+ sizeof(nsIID)));
+ if (!iid)
+ {
+ NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(1, *aArray);
+
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ (*aArray)[1] = iid;
+
+ return NS_OK;
+}
+
+/* nsISupports getHelperForLanguage (in PRUint32 language); */
+NS_IMETHODIMP EphySidebar::GetHelperForLanguage(PRUint32 language, nsISupports **_retval)
+{
+ *_retval = nsnull;
+ return NS_OK;
+}
+
+/* readonly attribute string contractID; */
+NS_IMETHODIMP EphySidebar::GetContractID(char * *aContractID)
+{
+ *aContractID = nsCRT::strdup(NS_SIDEBAR_CONTRACTID);
+ return NS_OK;
+}
+
+/* readonly attribute string classDescription; */
+NS_IMETHODIMP EphySidebar::GetClassDescription(char * *aClassDescription)
+{
+ *aClassDescription = nsCRT::strdup("Sidebar");
+ return NS_OK;
+}
+
+/* readonly attribute nsCIDPtr classID; */
+NS_IMETHODIMP EphySidebar::GetClassID(nsCID * *aClassID)
+{
+ *aClassID = nsnull;
+ return NS_OK;
+}
+
+/* readonly attribute PRUint32 implementationLanguage; */
+NS_IMETHODIMP EphySidebar::GetImplementationLanguage(PRUint32 *aImplementationLanguage)
+{
+ *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
+ return NS_OK;
+}
+
+/* readonly attribute PRUint32 flags; */
+NS_IMETHODIMP EphySidebar::GetFlags(PRUint32 *aFlags)
+{
+ *aFlags = nsIClassInfo::DOM_OBJECT;
+ return NS_OK;
+}
+
+/* [notxpcom] readonly attribute nsCID classIDNoAlloc; */
+NS_IMETHODIMP EphySidebar::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
+{
+ return NS_ERROR_NOT_AVAILABLE;
+}
diff --git a/embed/mozilla/EphySidebar.h b/embed/mozilla/EphySidebar.h
new file mode 100644
index 000000000..fe5b98a48
--- /dev/null
+++ b/embed/mozilla/EphySidebar.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2002 Philip Langdale
+ * Copyright (C) 2004 Crispin Flowerday
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Id$
+ */
+
+#ifndef EPHY_SIDEBAR_H
+#define EPHY_SIDEBAR_H
+
+#include <nsISidebar.h>
+#include <nsIClassInfo.h>
+#include <nsError.h>
+
+#define EPHY_SIDEBAR_CLASSNAME \
+ "Epiphany's Sidebar Implementation"
+
+#define EPHY_SIDEBAR_CID \
+{ /* {50f13159-f9b9-44b3-b18e-6ee5d85a202a} */ \
+ 0x50f13159, \
+ 0xf9b9, \
+ 0x44b3, \
+ {0xb1, 0x8e, 0x6e, 0xe5, 0xd8, 0x5a, 0x20, 0x2a} \
+}
+
+class EphySidebar : public nsISidebar, nsIClassInfo
+{
+ public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSICLASSINFO
+ NS_DECL_NSISIDEBAR
+
+ EphySidebar();
+ virtual ~EphySidebar();
+ private:
+};
+
+#endif /* ! EPHY_SIDEBAR_H */
+
diff --git a/embed/mozilla/Makefile.am b/embed/mozilla/Makefile.am
index 5c4b96ed1..9ad41b50f 100644
--- a/embed/mozilla/Makefile.am
+++ b/embed/mozilla/Makefile.am
@@ -11,6 +11,8 @@ libephymozillaembed_la_SOURCES = \
EphyBrowser.h \
EphyHistoryListener.cpp \
EphyHistoryListener.h \
+ EphySidebar.cpp \
+ EphySidebar.h \
EphySingle.cpp \
EphySingle.h \
EphyUtils.cpp \
@@ -78,6 +80,7 @@ mozilla_include_subdirs = \
pipboot \
pipnss \
shistory \
+ sidebar \
uriloader \
uconv \
webbrowserpersist \
diff --git a/embed/mozilla/MozRegisterComponents.cpp b/embed/mozilla/MozRegisterComponents.cpp
index 5cebf9f38..7d8b3223d 100644
--- a/embed/mozilla/MozRegisterComponents.cpp
+++ b/embed/mozilla/MozRegisterComponents.cpp
@@ -28,6 +28,7 @@
#include "PrintingPromptService.h"
#include "MozDownload.h"
#include "EphyContentPolicy.h"
+#include "EphySidebar.h"
#ifdef ENABLE_FILEPICKER
#include "FilePicker.h"
@@ -55,6 +56,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(GContentHandler)
NS_GENERIC_FACTORY_CONSTRUCTOR(MozGlobalHistory)
NS_GENERIC_FACTORY_CONSTRUCTOR(GPrintingPromptService)
NS_GENERIC_FACTORY_CONSTRUCTOR(EphyContentPolicy)
+NS_GENERIC_FACTORY_CONSTRUCTOR(EphySidebar)
#ifdef ENABLE_FILEPICKER
NS_GENERIC_FACTORY_CONSTRUCTOR(GFilePicker)
@@ -86,6 +88,20 @@ RegisterContentPolicy(nsIComponentManager *aCompMgr, nsIFile *aPath,
return rv;
}
+static NS_METHOD
+RegisterSidebar(nsIComponentManager *aCompMgr, nsIFile *aPath,
+ const char *registryLocation, const char *componentType,
+ const nsModuleComponentInfo *info)
+{
+ nsCOMPtr<nsICategoryManager> cm =
+ do_GetService(NS_CATEGORYMANAGER_CONTRACTID);
+ NS_ENSURE_TRUE (cm, NS_ERROR_FAILURE);
+
+ return cm->AddCategoryEntry("JavaScript global property",
+ "sidebar", NS_SIDEBAR_CONTRACTID,
+ PR_FALSE, PR_TRUE, nsnull);
+}
+
static const nsModuleComponentInfo sAppComps[] = {
{
MOZ_DOWNLOAD_CLASSNAME,
@@ -152,6 +168,13 @@ static const nsModuleComponentInfo sAppComps[] = {
EphyContentPolicyConstructor,
RegisterContentPolicy
},
+ {
+ EPHY_SIDEBAR_CLASSNAME,
+ EPHY_SIDEBAR_CID,
+ NS_SIDEBAR_CONTRACTID,
+ EphySidebarConstructor,
+ RegisterSidebar
+ },
};