diff options
author | Christian Persch <chpe@src.gnome.org> | 2007-09-14 04:36:04 +0800 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2007-09-14 04:36:04 +0800 |
commit | 033a9214932e228af131a35322461d3a3e7e06ae (patch) | |
tree | b45afafc1c92c3b72370da0829ea07dd61c3a407 /embed/xulrunner/utils/EphyUtils.cpp | |
parent | 8d92314d3772cdb4fe0240a19743ca1cf7c93267 (diff) | |
download | gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.tar gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.tar.gz gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.tar.bz2 gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.tar.lz gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.tar.xz gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.tar.zst gsoc2013-epiphany-033a9214932e228af131a35322461d3a3e7e06ae.zip |
Move EphyUtils and GeckoUtils to utils/.
svn path=/trunk/; revision=7434
Diffstat (limited to 'embed/xulrunner/utils/EphyUtils.cpp')
-rw-r--r-- | embed/xulrunner/utils/EphyUtils.cpp | 203 |
1 files changed, 203 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 (); +} |