diff options
Diffstat (limited to 'embed/xulrunner/utils')
-rw-r--r-- | embed/xulrunner/utils/EphyUtils.cpp | 203 | ||||
-rw-r--r-- | embed/xulrunner/utils/EphyUtils.h | 66 | ||||
-rw-r--r-- | embed/xulrunner/utils/GeckoUtils.cpp | 87 | ||||
-rw-r--r-- | embed/xulrunner/utils/GeckoUtils.h | 34 | ||||
-rw-r--r-- | embed/xulrunner/utils/Makefile.am | 5 |
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) |