Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

380 lines
10 KiB
C#

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// Copyright (c) 2007, 2008 Novell, Inc.
//
// Authors:
// Andreia Gaita (avidigal@novell.com)
//
using System;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;
using System.Diagnostics;
using Mono.WebBrowser;
namespace Mono.Mozilla
{
internal class Base
{
private static Hashtable boundControls;
private static bool initialized;
private static object initLock = new object ();
private static string monoMozDir;
private class BindingInfo
{
public CallbackBinder callback;
public IntPtr gluezilla;
}
private static bool isInitialized ()
{
if (!initialized)
return false;
return true;
}
private static BindingInfo getBinding (IWebBrowser control)
{
if (!boundControls.ContainsKey (control))
return null;
BindingInfo info = boundControls[control] as BindingInfo;
return info;
}
static Base ()
{
boundControls = new Hashtable ();
}
public Base () { }
public static void Debug (int signal)
{
gluezilla_debug (signal);
}
public static bool Init (WebBrowser control, Platform platform)
{
lock (initLock) {
if (!initialized) {
Platform mozPlatform;
try {
short version = gluezilla_init (platform, out mozPlatform);
monoMozDir = System.IO.Path.Combine (
System.IO.Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData),
".mono"), "mozilla-" + version);
if (!System.IO.Directory.Exists (monoMozDir))
System.IO.Directory.CreateDirectory (monoMozDir);
}
catch (DllNotFoundException) {
Console.WriteLine ("libgluezilla not found. To have webbrowser support, you need libgluezilla installed");
initialized = false;
return false;
}
control.enginePlatform = mozPlatform;
initialized = true;
}
}
return initialized;
}
public static bool Bind (WebBrowser control, IntPtr handle, int width, int height)
{
if (!isInitialized ())
return false;
BindingInfo info = new BindingInfo ();
info.callback = new CallbackBinder (control.callbacks);
IntPtr ptrCallback = Marshal.AllocHGlobal (Marshal.SizeOf (info.callback));
Marshal.StructureToPtr (info.callback, ptrCallback, true);
info.gluezilla = gluezilla_bind (ptrCallback, handle, width, height, Environment.CurrentDirectory, monoMozDir, control.platform);
lock (initLock) {
if (info.gluezilla == IntPtr.Zero) {
Marshal.FreeHGlobal (ptrCallback);
info = null;
initialized = false;
return false;
}
}
boundControls.Add (control as IWebBrowser, info);
return true;
}
public static bool Create (IWebBrowser control) {
if (!isInitialized ())
return false;
BindingInfo info = getBinding (control);
gluezilla_createBrowserWindow (info.gluezilla);
return true;
}
public static void Shutdown (IWebBrowser control)
{
lock (initLock) {
if (!initialized)
return;
BindingInfo info = getBinding (control);
gluezilla_shutdown (info.gluezilla);
boundControls.Remove (control);
if (boundControls.Count == 0) {
info = null;
initialized = false;
}
}
}
// layout
public static void Focus (IWebBrowser control, FocusOption focus)
{
if (!isInitialized ())
return;
BindingInfo info = getBinding (control);
gluezilla_focus (info.gluezilla, focus);
}
public static void Blur (IWebBrowser control)
{
if (!isInitialized ())
return;
BindingInfo info = getBinding (control);
gluezilla_blur (info.gluezilla);
}
public static void Activate (IWebBrowser control)
{
if (!isInitialized ())
return;
BindingInfo info = getBinding (control);
gluezilla_activate (info.gluezilla);
}
public static void Deactivate (IWebBrowser control)
{
if (!isInitialized ())
return;
BindingInfo info = getBinding (control);
gluezilla_deactivate (info.gluezilla);
}
public static void Resize (IWebBrowser control, int width, int height)
{
if (!isInitialized ())
return;
BindingInfo info = getBinding (control);
gluezilla_resize (info.gluezilla, width, height);
}
// navigation
public static void Home (IWebBrowser control)
{
if (!isInitialized ())
return;
BindingInfo info = getBinding (control);
gluezilla_home (info.gluezilla);
}
public static nsIWebNavigation GetWebNavigation (IWebBrowser control)
{
if (!isInitialized ())
return null;
BindingInfo info = getBinding (control);
return gluezilla_getWebNavigation (info.gluezilla);
}
public static IntPtr StringInit ()
{
if (!isInitialized ())
return IntPtr.Zero;
return gluezilla_stringInit ();
}
public static void StringFinish (HandleRef str)
{
if (!isInitialized ())
return;
gluezilla_stringFinish (str);
}
public static string StringGet (HandleRef str)
{
if (!isInitialized ())
return String.Empty;
IntPtr p = gluezilla_stringGet (str);
return Marshal.PtrToStringUni (p);
}
public static void StringSet (HandleRef str, string text)
{
if (!isInitialized ())
return;
gluezilla_stringSet (str, text);
}
public static object GetProxyForObject (IWebBrowser control, Guid iid, object obj)
{
if (!isInitialized ())
return null;
BindingInfo info = getBinding (control);
IntPtr ret;
gluezilla_getProxyForObject (info.gluezilla, iid, obj, out ret);
object o = Marshal.GetObjectForIUnknown (ret);
return o;
}
public static nsIServiceManager GetServiceManager (IWebBrowser control)
{
if (!isInitialized ())
return null;
BindingInfo info = getBinding (control);
return gluezilla_getServiceManager2 (info.gluezilla);
}
public static string EvalScript (IWebBrowser control, string script)
{
if (!isInitialized ())
return null;
BindingInfo info = getBinding (control);
IntPtr p = gluezilla_evalScript (info.gluezilla, script);
return Marshal.PtrToStringAuto (p);
}
#region pinvokes
[DllImport("gluezilla")]
private static extern void gluezilla_debug(int signal);
[DllImport("gluezilla")]
private static extern short gluezilla_init (Platform platform, out Platform mozPlatform);
[DllImport ("gluezilla")]
private static extern IntPtr gluezilla_bind (IntPtr events, IntPtr hwnd,
Int32 width, Int32 height,
string startDir, string dataDir,
Platform platform);
[DllImport ("gluezilla")]
private static extern int gluezilla_createBrowserWindow (IntPtr instance);
[DllImport ("gluezilla")]
private static extern IntPtr gluezilla_shutdown (IntPtr instance);
// layout
[DllImport ("gluezilla")]
private static extern int gluezilla_focus (IntPtr instance, FocusOption focus);
[DllImport ("gluezilla")]
private static extern int gluezilla_blur (IntPtr instance);
[DllImport ("gluezilla")]
private static extern int gluezilla_activate (IntPtr instance);
[DllImport ("gluezilla")]
private static extern int gluezilla_deactivate (IntPtr instance);
[DllImport ("gluezilla")]
private static extern int gluezilla_resize (IntPtr instance, Int32 width, Int32 height);
// navigation
[DllImport ("gluezilla")]
private static extern int gluezilla_home (IntPtr instance);
// dom
[DllImport ("gluezilla")]
[return:MarshalAs(UnmanagedType.Interface)]
private static extern nsIWebNavigation gluezilla_getWebNavigation (IntPtr instance);
[DllImport ("gluezilla")]
private static extern IntPtr gluezilla_stringInit ();
[DllImport ("gluezilla")]
private static extern int gluezilla_stringFinish (HandleRef str);
[DllImport ("gluezilla")]
private static extern IntPtr gluezilla_stringGet (HandleRef str);
[DllImport ("gluezilla")]
private static extern void gluezilla_stringSet (HandleRef str, [MarshalAs (UnmanagedType.LPWStr)] string text);
[DllImport ("gluezilla")]
private static extern void gluezilla_getProxyForObject (
IntPtr instance,
[MarshalAs (UnmanagedType.LPStruct)] Guid iid,
[MarshalAs (UnmanagedType.Interface)] object obj,
out IntPtr ret);
[DllImport ("gluezilla")]
public static extern uint gluezilla_StringContainerInit (HandleRef /*nsStringContainer & */aStr);
[DllImport ("gluezilla")]
public static extern void gluezilla_StringContainerFinish (HandleRef /*nsStringContainer & */aStr);
[DllImport ("gluezilla")]
public static extern uint gluezilla_StringGetData (HandleRef /*const nsAString &*/ aStr,
out IntPtr /*const PRUnichar ** */aBuf,
out bool /*PRBool * */aTerm);
[DllImport ("gluezilla")]
public static extern uint gluezilla_StringSetData (HandleRef /*nsAString &*/ aStr,
[MarshalAs (UnmanagedType.LPWStr)] string /*const PRUnichar * */ aBuf, uint aCount);
[DllImport ("gluezilla")]
public static extern uint gluezilla_CStringContainerInit (HandleRef /*nsCStringContainer &*/ aStr);
[DllImport ("gluezilla")]
public static extern void gluezilla_CStringContainerFinish (HandleRef /*nsCStringContainer &*/ aStr);
[DllImport ("gluezilla")]
public static extern uint gluezilla_CStringGetData (HandleRef /*const nsACString &*/ aStr,
out IntPtr /*const PRUnichar ** */aBuf,
out bool /*PRBool **/ aTerm);
[DllImport ("gluezilla")]
public static extern uint gluezilla_CStringSetData (HandleRef /*nsACString &*/ aStr,
string aBuf,
uint aCount);
[DllImport ("gluezilla")]
[return: MarshalAs (UnmanagedType.Interface)]
public static extern nsIServiceManager gluezilla_getServiceManager2 (IntPtr instance);
[DllImport ("gluezilla")]
private static extern IntPtr gluezilla_evalScript (IntPtr instance, string script);
#endregion
}
}