aboutsummaryrefslogtreecommitdiffstats
path: root/embed/xulrunner/utils
diff options
context:
space:
mode:
Diffstat (limited to 'embed/xulrunner/utils')
-rw-r--r--embed/xulrunner/utils/EphyUtils.cpp203
-rw-r--r--embed/xulrunner/utils/EphyUtils.h66
-rw-r--r--embed/xulrunner/utils/GeckoUtils.cpp87
-rw-r--r--embed/xulrunner/utils/GeckoUtils.h34
-rw-r--r--embed/xulrunner/utils/Makefile.am5
5 files changed, 395 insertions, 0 deletions
diff --git a/embed/xulrunner/utils/EphyUtils.cpp b/embed/xulrunner/utils/EphyUtils.cpp
new file mode 100644
index 000000000..a433294c8
--- /dev/null
+++ b/embed/xulrunner/utils/EphyUtils.cpp
@@ -0,0 +1,203 @@
+/*
+ * Copyright © 2004 Marco Pesenti Gritti
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1, 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 Lesser 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 <xpcom-config.h>
+#include "config.h"
+
+#include <nsStringGlue.h>
+
+#include <nsCOMPtr.h>
+#include <nsDOMJSUtils.h> /* for GetScriptContextFromJSContext */
+#include <nsIDOMWindow.h>
+#include <nsIEmbeddingSiteWindow.h>
+#include <nsIFile.h>
+#include <nsIIOService.h>
+#include <nsIScriptContext.h>
+#include <nsIScriptGlobalObject.h>
+#include <nsIServiceManager.h>
+#include <nsIURI.h>
+#include <nsIWebBrowserChrome.h>
+#include <nsIWindowWatcher.h>
+#include <nsIXPConnect.h>
+#include <nsPIDOMWindow.h>
+#include <nsServiceManagerUtils.h>
+#include <nsXPCOM.h>
+
+#include "EphyUtils.h"
+
+nsresult
+EphyUtils::GetIOService (nsIIOService **ioService)
+{
+ nsresult rv;
+
+ nsCOMPtr<nsIServiceManager> mgr;
+ NS_GetServiceManager (getter_AddRefs (mgr));
+ if (!mgr) return NS_ERROR_FAILURE;
+
+ rv = mgr->GetServiceByContractID ("@mozilla.org/network/io-service;1",
+ NS_GET_IID (nsIIOService),
+ (void **)ioService);
+ return rv;
+}
+
+nsresult
+EphyUtils::NewURI (nsIURI **result,
+ const nsAString &spec,
+ const char *charset,
+ nsIURI *baseURI)
+{
+ nsCString cSpec;
+ NS_UTF16ToCString (spec, NS_CSTRING_ENCODING_UTF8, cSpec);
+
+ return NewURI (result, cSpec, charset, baseURI);
+}
+
+nsresult
+EphyUtils::NewURI (nsIURI **result,
+ const nsACString &spec,
+ const char *charset,
+ nsIURI *baseURI)
+{
+ nsresult rv;
+ nsCOMPtr<nsIIOService> ioService;
+ rv = EphyUtils::GetIOService (getter_AddRefs (ioService));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ return ioService->NewURI (spec, charset, baseURI, result);
+}
+
+nsresult
+EphyUtils::NewFileURI (nsIURI **result,
+ nsIFile *spec)
+{
+ nsresult rv;
+ nsCOMPtr<nsIIOService> ioService;
+ rv = EphyUtils::GetIOService (getter_AddRefs (ioService));
+ NS_ENSURE_SUCCESS (rv, rv);
+
+ return ioService->NewFileURI (spec, result);
+}
+
+GtkWidget *
+EphyUtils::FindEmbed (nsIDOMWindow *aDOMWindow)
+{
+ if (!aDOMWindow) return nsnull;
+
+ nsCOMPtr<nsIWindowWatcher> wwatch
+ (do_GetService("@mozilla.org/embedcomp/window-watcher;1"));
+ NS_ENSURE_TRUE (wwatch, nsnull);
+
+ /* this DOM window may belong to some inner frame, we need
+ * to get the topmost DOM window to get the embed
+ */
+ nsCOMPtr<nsIDOMWindow> topWindow;
+ aDOMWindow->GetTop (getter_AddRefs (topWindow));
+ if (!topWindow) return nsnull;
+
+ nsCOMPtr<nsIWebBrowserChrome> windowChrome;
+ wwatch->GetChromeForWindow (topWindow, getter_AddRefs(windowChrome));
+ NS_ENSURE_TRUE (windowChrome, nsnull);
+
+ nsCOMPtr<nsIEmbeddingSiteWindow> window (do_QueryInterface(windowChrome));
+ NS_ENSURE_TRUE (window, nsnull);
+
+ nsresult rv;
+ GtkWidget *mozembed;
+ rv = window->GetSiteWindow ((void **)&mozembed);
+ NS_ENSURE_SUCCESS (rv, nsnull);
+
+ return mozembed;
+}
+
+GtkWidget *
+EphyUtils::FindGtkParent (nsIDOMWindow *aDOMWindow)
+{
+ GtkWidget *embed = FindEmbed (aDOMWindow);
+ if (!embed) return nsnull;
+
+ GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (embed));
+ if (!GTK_WIDGET_TOPLEVEL (toplevel)) return nsnull;
+
+ return toplevel;
+}
+
+char *
+EphyUtils::ConvertUTF16toUTF8 (const PRUnichar *aText,
+ PRInt32 aMaxLength)
+{
+ if (aText == nsnull) return NULL;
+
+ /* This depends on the assumption that
+ * typeof(PRUnichar) == typeof (gunichar2) == uint16,
+ * which should be pretty safe.
+ */
+ glong n_read = 0, n_written = 0;
+ char *converted = g_utf16_to_utf8 ((gunichar2*) aText, aMaxLength,
+ &n_read, &n_written, NULL);
+ /* FIXME loop from the end while !g_unichar_isspace (char)? */
+
+ return converted;
+}
+
+/* This isn't completely accurate: if you do window.prompt in one window, then
+ * call this in another window, it still returns TRUE ! Those are the wonders
+ * of recursive mainloops :-(
+ */
+PRBool
+EphyJSUtils::IsCalledFromScript ()
+{
+ nsresult rv;
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
+ NS_ENSURE_SUCCESS (rv, PR_FALSE);
+
+ nsCOMPtr<nsIXPCNativeCallContext> ncc;
+ rv = xpc->GetCurrentNativeCallContext (getter_AddRefs (ncc));
+ NS_ENSURE_SUCCESS(rv, PR_FALSE);
+
+ return nsnull != ncc;
+}
+
+/* NOTE: Only call this when we're SURE that we're called directly from JS! */
+nsIDOMWindow *
+EphyJSUtils::GetDOMWindowFromCallContext ()
+{
+ nsresult rv;
+ nsCOMPtr<nsIXPConnect> xpc (do_GetService(nsIXPConnect::GetCID(), &rv));
+ NS_ENSURE_SUCCESS (rv, nsnull);
+
+ nsCOMPtr<nsIXPCNativeCallContext> ncc;
+ rv = xpc->GetCurrentNativeCallContext (getter_AddRefs (ncc));
+ NS_ENSURE_SUCCESS (rv, nsnull);
+
+ JSContext *cx = nsnull;
+ rv = ncc->GetJSContext(&cx);
+ NS_ENSURE_TRUE (NS_SUCCEEDED (rv) && cx, nsnull);
+
+ nsIScriptContext* scriptContext = GetScriptContextFromJSContext (cx);
+ if (!scriptContext) return nsnull;
+
+ nsIScriptGlobalObject *globalObject = scriptContext->GetGlobalObject();
+ if (!globalObject) return nsnull;
+
+ nsCOMPtr<nsPIDOMWindow> piWindow (do_QueryInterface (globalObject));
+ if (!piWindow) return nsnull;
+
+ return piWindow->GetOuterWindow ();
+}
diff --git a/embed/xulrunner/utils/EphyUtils.h b/embed/xulrunner/utils/EphyUtils.h
new file mode 100644
index 000000000..65b1edb04
--- /dev/null
+++ b/embed/xulrunner/utils/EphyUtils.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2004 Marco Pesenti Gritti
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1, 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 Lesser 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$
+ */
+
+#ifndef EPHY_UTILS_H
+#define EPHY_UTILS_H
+
+#include <nscore.h>
+
+#include <gtk/gtkwidget.h>
+
+class nsACString;
+class nsAString;
+class nsIDOMWindow;
+class nsIFile;
+class nsIIOService;
+class nsIURI;
+
+namespace EphyUtils
+{
+ nsresult GetIOService (nsIIOService **ioService);
+
+ nsresult NewURI (nsIURI **result,
+ const nsAString &spec,
+ const char *charset = nsnull,
+ nsIURI *baseURI = nsnull);
+
+ nsresult NewURI (nsIURI **result,
+ const nsACString &spec,
+ const char *charset = nsnull,
+ nsIURI *baseURI = nsnull);
+
+ nsresult NewFileURI (nsIURI **result,
+ nsIFile *spec);
+
+ GtkWidget *FindEmbed (nsIDOMWindow *aDOMWindow);
+
+ GtkWidget *FindGtkParent (nsIDOMWindow *aDOMWindow);
+
+ char * ConvertUTF16toUTF8 (const PRUnichar*, PRInt32);
+}
+
+namespace EphyJSUtils
+{
+ PRBool IsCalledFromScript ();
+
+ /* not addref'd! */ nsIDOMWindow* GetDOMWindowFromCallContext ();
+}
+
+#endif
diff --git a/embed/xulrunner/utils/GeckoUtils.cpp b/embed/xulrunner/utils/GeckoUtils.cpp
new file mode 100644
index 000000000..c71fce4ba
--- /dev/null
+++ b/embed/xulrunner/utils/GeckoUtils.cpp
@@ -0,0 +1,87 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright © 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Brian Ryner <bryner@brianryner.com>
+ *
+ * $Id$
+ */
+
+#include <xpcom-config.h>
+#include "config.h"
+
+#include "GeckoUtils.h"
+
+#include "gecko-embed.h"
+
+#include <nsCOMPtr.h>
+#include <nsIDOMWindow.h>
+#include <nsIWindowWatcher.h>
+#include <nsIWebBrowserChrome.h>
+#include <nsIEmbeddingSiteWindow.h>
+#include <nsIServiceManager.h>
+#include <nsServiceManagerUtils.h>
+
+GtkWidget *
+GeckoUtils::GetGeckoEmbedForDOMWindow (nsIDOMWindow * aDOMWindow)
+{
+ if (!aDOMWindow)
+ return NULL;
+
+ /* Get the toplevel DOM window, in case this window is a frame */
+ nsCOMPtr<nsIDOMWindow> domWin;
+ aDOMWindow->GetTop (getter_AddRefs (domWin));
+ if (!domWin)
+ return NULL;
+
+ nsCOMPtr< nsIWindowWatcher> wwatch
+ (do_GetService ("@mozilla.org/embedcomp/window-watcher;1"));
+ NS_ENSURE_TRUE (wwatch, NULL);
+
+ nsCOMPtr<nsIWebBrowserChrome> chrome;
+ wwatch->GetChromeForWindow (domWin, getter_AddRefs (chrome));
+
+ nsCOMPtr <nsIEmbeddingSiteWindow> siteWindow (do_QueryInterface (chrome));
+ if (!siteWindow)
+ return NULL;
+
+ GtkWidget *widget;
+ siteWindow->GetSiteWindow ((void **) &widget);
+ if (!widget || !GECKO_IS_EMBED (widget))
+ return NULL;
+
+ return widget;
+}
+
+GtkWidget *
+GeckoUtils::GetGtkWindowForDOMWindow (nsIDOMWindow * aDOMWindow)
+{
+ GtkWidget *embed = GeckoUtils::GetGeckoEmbedForDOMWindow (aDOMWindow);
+ if (!embed)
+ return NULL;
+
+ GtkWidget *gtkWin = gtk_widget_get_toplevel (embed);
+ if (!GTK_WIDGET_TOPLEVEL (gtkWin))
+ return NULL;
+
+ return gtkWin;
+}
diff --git a/embed/xulrunner/utils/GeckoUtils.h b/embed/xulrunner/utils/GeckoUtils.h
new file mode 100644
index 000000000..05012e6b2
--- /dev/null
+++ b/embed/xulrunner/utils/GeckoUtils.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright © 2006 Christian Persch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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 GECKO_UTILS_H
+#define GECKO_UTILS_H
+
+#include <gtk/gtkwidget.h>
+
+class nsIDOMWindow;
+
+namespace GeckoUtils
+{
+ GtkWidget* GetGeckoEmbedForDOMWindow (nsIDOMWindow*);
+ GtkWidget* GetGtkWindowForDOMWindow (nsIDOMWindow*);
+}
+
+#endif
diff --git a/embed/xulrunner/utils/Makefile.am b/embed/xulrunner/utils/Makefile.am
index faeab4716..ef773f3fb 100644
--- a/embed/xulrunner/utils/Makefile.am
+++ b/embed/xulrunner/utils/Makefile.am
@@ -9,9 +9,14 @@ libephyxulrunnerutils_la_SOURCES = \
AutoWindowModalState.h \
EphyBadCertRejector.cpp \
EphyBadCertRejector.h \
+ EphyUtils.cpp \
+ EphyUtils.h \
+ GeckoUtils.cpp \
+ GeckoUtils.h \
$(NULL)
libephyxulrunnerutils_la_CPPFLAGS = \
+ -I$(top_srcdir)/embed/xulrunner/src \
$(LIBXUL_CXXCPPFLAGS) \
$(LIBXUL_INCLUDES) \
$(AM_CPPFLAGS)