a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
380 lines
10 KiB
C#
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
|
|
}
|
|
}
|