summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJo Shields <directhex@apebox.org>2014-02-19 22:55:31 +0000
committerJo Shields <directhex@apebox.org>2014-02-19 22:55:31 +0000
commit00f4046b9af55d8a76fc255433d9937b8eb7c4ea (patch)
tree38d69f09da3db17099c3a5732593944b717bbd98
parent192b98c71f06224b7e658f3b507f58a4c42c268d (diff)
parentce90ff42d73bc70e70256c3ff8324c3f4fa2a7ac (diff)
downloadmono-00f4046b9af55d8a76fc255433d9937b8eb7c4ea.tar.gz
Merge branch 'master-experimental-patches/nullbrowser-backend-for-swf-webbrowser' into merge/3.2.8+dfsg
-rw-r--r--mcs/class/Mono.WebBrowser/Mono.NullBrowser/Base.cs174
-rwxr-xr-xmcs/class/Mono.WebBrowser/Mono.NullBrowser/DOM/Navigation.cs127
-rw-r--r--mcs/class/Mono.WebBrowser/Mono.NullBrowser/WebBrowser.cs414
-rw-r--r--mcs/class/Mono.WebBrowser/Mono.WebBrowser.dll.sources3
-rw-r--r--mcs/class/Mono.WebBrowser/Mono.WebBrowser/Manager.cs11
5 files changed, 727 insertions, 2 deletions
diff --git a/mcs/class/Mono.WebBrowser/Mono.NullBrowser/Base.cs b/mcs/class/Mono.WebBrowser/Mono.NullBrowser/Base.cs
new file mode 100644
index 0000000000..265ef4586b
--- /dev/null
+++ b/mcs/class/Mono.WebBrowser/Mono.NullBrowser/Base.cs
@@ -0,0 +1,174 @@
+// 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.NullBrowser
+{
+ internal class Base
+ {
+ private static Hashtable boundControls;
+ private static bool initialized;
+ private static object initLock = new object ();
+ private static string monoMozDir;
+
+ private static bool isInitialized ()
+ {
+ if (!initialized)
+ return false;
+ return true;
+ }
+
+ static Base ()
+ {
+ boundControls = new Hashtable ();
+ }
+
+ public Base () { }
+
+ public static bool Init (WebBrowser control, Platform platform)
+ {
+ lock (initLock) {
+ if (!initialized) {
+
+ initialized = true;
+ }
+ }
+ return initialized;
+ }
+
+ public static bool Bind (WebBrowser control, IntPtr handle, int width, int height)
+ {
+ if (!isInitialized ())
+ return false;
+
+
+ return true;
+ }
+
+ public static bool Create (IWebBrowser control) {
+ if (!isInitialized ())
+ return false;
+
+ return true;
+ }
+
+ public static void Shutdown (IWebBrowser control)
+ {
+ lock (initLock) {
+ if (!initialized)
+ return;
+
+
+ boundControls.Remove (control);
+ if (boundControls.Count == 0) {
+ initialized = false;
+ }
+ }
+ }
+
+ // layout
+ public static void Focus (IWebBrowser control, FocusOption focus)
+ {
+ if (!isInitialized ())
+ return;
+
+ }
+
+
+ public static void Blur (IWebBrowser control)
+ {
+ if (!isInitialized ())
+ return;
+
+ }
+
+ public static void Activate (IWebBrowser control)
+ {
+ if (!isInitialized ())
+ return;
+
+ }
+
+ public static void Deactivate (IWebBrowser control)
+ {
+ if (!isInitialized ())
+ return;
+
+ }
+
+ public static void Resize (IWebBrowser control, int width, int height)
+ {
+ if (!isInitialized ())
+ return;
+
+ }
+
+ // navigation
+ public static void Home (IWebBrowser control)
+ {
+ if (!isInitialized ())
+ return;
+
+ }
+
+
+ public static IntPtr StringInit ()
+ {
+ return IntPtr.Zero;
+ }
+
+ public static void StringFinish (HandleRef str)
+ {
+ }
+
+ public static string StringGet (HandleRef str)
+ {
+ return String.Empty;
+ }
+
+ public static void StringSet (HandleRef str, string text)
+ {
+ }
+
+
+ public static object GetProxyForObject (IWebBrowser control, Guid iid, object obj)
+ {
+ return null;
+ }
+
+ public static string EvalScript (IWebBrowser control, string script)
+ {
+ return null;
+ }
+
+
+ }
+}
diff --git a/mcs/class/Mono.WebBrowser/Mono.NullBrowser/DOM/Navigation.cs b/mcs/class/Mono.WebBrowser/Mono.NullBrowser/DOM/Navigation.cs
new file mode 100755
index 0000000000..8d7a73449e
--- /dev/null
+++ b/mcs/class/Mono.WebBrowser/Mono.NullBrowser/DOM/Navigation.cs
@@ -0,0 +1,127 @@
+// 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.Runtime.InteropServices;
+using System.Text;
+using Mono.WebBrowser;
+using Mono.WebBrowser.DOM;
+
+namespace Mono.NullBrowser.DOM
+{
+ internal class Navigation: INavigation
+ {
+
+
+ #region INavigation Members
+
+ public bool CanGoBack {
+ get {
+ return false;
+ }
+ }
+
+ public bool CanGoForward {
+ get {
+ return false;
+ }
+ }
+
+ public bool Back ()
+ {
+ return false;
+ }
+
+ public bool Forward ()
+ {
+ return false;
+ }
+
+ public void Home ()
+ {
+ }
+
+ public void Reload ()
+ {
+ }
+
+ public void Reload (ReloadOption option)
+ {
+ }
+
+ public void Stop ()
+ {
+ }
+
+
+ /// <summary>
+ /// Navigate to the page in the history, by index.
+ /// </summary>
+ /// <param name="index">
+ /// A <see cref="System.Int32"/> representing an absolute index in the
+ /// history (that is, > -1 and < history length
+ /// </param>
+ public void Go (int index)
+ {
+ }
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="index">
+ /// A <see cref="System.Int32"/> representing an index in the
+ /// history, that can be relative or absolute depending on the relative argument
+ /// </param>
+ /// <param name="relative">
+ /// A <see cref="System.Boolean"/> indicating whether the index is relative to
+ /// the current place in history or not (i.e., if relative = true, index can be
+ /// positive or negative, and index=-1 means load the previous page in the history.
+ /// if relative = false, index must be > -1, and index = 0 means load the first
+ /// page of the history.
+ /// </param>
+ public void Go (int index, bool relative) {
+ }
+
+ public void Go (string url)
+ {
+ }
+
+ public void Go (string url, LoadFlags flags)
+ {
+ }
+
+ public int HistoryCount {
+ get {
+ return 0;
+ }
+ }
+
+ #endregion
+
+ public override int GetHashCode () {
+ return 0;
+ }
+ }
+}
diff --git a/mcs/class/Mono.WebBrowser/Mono.NullBrowser/WebBrowser.cs b/mcs/class/Mono.WebBrowser/Mono.NullBrowser/WebBrowser.cs
new file mode 100644
index 0000000000..aea4feae3d
--- /dev/null
+++ b/mcs/class/Mono.WebBrowser/Mono.NullBrowser/WebBrowser.cs
@@ -0,0 +1,414 @@
+// 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.
+// Copyright (c) 2013 Jo Shields
+//
+// Authors:
+// Andreia Gaita (avidigal@novell.com)
+// Jo Shields (directhex@apebox.org)
+//
+
+#undef debug
+
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Diagnostics;
+using Mono.WebBrowser;
+using Mono.WebBrowser.DOM;
+
+namespace Mono.NullBrowser
+{
+ internal class WebBrowser : IWebBrowser
+ {
+ bool loaded;
+ internal bool created = false;
+ bool creating = false;
+
+ internal DOM.Navigation navigation;
+
+ internal Platform platform;
+ internal Platform enginePlatform;
+ System.ComponentModel.EventHandlerList events;
+ System.ComponentModel.EventHandlerList domEvents;
+
+ string statusText;
+
+ bool streamingMode;
+
+ internal Hashtable documents;
+
+ int width;
+ int height;
+ bool isDirty;
+
+ public WebBrowser (Platform platform)
+ {
+ this.platform = platform;
+ loaded = Base.Init (this, platform);
+ documents = new Hashtable ();
+ }
+
+ public bool Load (IntPtr handle, int width, int height)
+ {
+ loaded = Base.Bind (this, handle, width, height);
+ return loaded;
+ }
+
+ bool Created {
+ get {
+ if (!creating && !created) {
+ creating = true;
+ created = Base.Create (this);
+ if (created && isDirty) {
+ isDirty = false;
+ Base.Resize (this, width, height);
+ }
+ }
+ return created;
+ }
+ }
+
+ public void Shutdown ()
+ {
+ Base.Shutdown (this);
+ }
+
+ internal void Reset ()
+ {
+ this.DomEvents.Dispose ();
+ this.domEvents = null;
+ this.documents.Clear ();
+ }
+
+ public bool Initialized {
+ get { return this.loaded; }
+ }
+
+ public IWindow Window {
+ get {
+ return null;
+ }
+ }
+
+ public IDocument Document {
+ get {
+ return null;
+ }
+ }
+
+ public INavigation Navigation {
+ get {
+ if (!Created) return null;
+
+ if (navigation == null) {
+
+ navigation = new DOM.Navigation ();
+ }
+ return navigation as INavigation;
+ }
+ }
+
+ public string StatusText {
+ get { return statusText; }
+ }
+
+ public bool Offline {
+ get {
+ return false;
+ }
+ set {
+ }
+ }
+
+ internal System.ComponentModel.EventHandlerList DomEvents {
+ get {
+ if (domEvents == null)
+ domEvents = new System.ComponentModel.EventHandlerList();
+
+ return domEvents;
+ }
+ }
+
+ internal System.ComponentModel.EventHandlerList Events {
+ get {
+ if (events == null)
+ events = new System.ComponentModel.EventHandlerList();
+
+ return events;
+ }
+ }
+
+ #region Layout
+ public void FocusIn (FocusOption focus)
+ {
+ if (!created) return;
+ Base.Focus (this, focus);
+ }
+ public void FocusOut ()
+ {
+ if (!created) return;
+ Base.Blur (this);
+ }
+
+ public void Activate ()
+ {
+ if (!Created) return;
+ Base.Activate (this);
+ }
+ public void Deactivate ()
+ {
+ if (!created) return;
+ Base.Deactivate (this);
+ }
+
+ public void Resize (int width, int height)
+ {
+ this.width = width;
+ this.height = height;
+ isDirty = true;
+ if (!created) return;
+ Base.Resize (this, width, height);
+ }
+
+ public void Render (byte[] data)
+ {
+ if (!Created) return;
+ if (data == null)
+ throw new ArgumentNullException ("data");
+ string html = System.Text.ASCIIEncoding.UTF8.GetString (data);
+ Render (html);
+ }
+
+ public void Render (string html)
+ {
+ if (!Created) return;
+ Render (html, "file:///", "text/html");
+ }
+
+
+ public void Render (string html, string uri, string contentType)
+ {
+ if (!Created) return;
+ throw new Mono.WebBrowser.Exception (Mono.WebBrowser.Exception.ErrorCodes.Navigation);
+
+ IntPtr native_html = Marshal.StringToHGlobalAnsi (html);
+ Marshal.FreeHGlobal (native_html);
+
+
+ }
+
+ public void ExecuteScript (string script) {
+ if (!Created) return;
+ Base.EvalScript (this, script);
+ }
+
+ internal void AttachEvent (INode node, string eve, EventHandler handler) {
+ string key = String.Intern (node.GetHashCode() + ":" + eve);
+#if debug
+ Console.Error.WriteLine ("Event Attached: " + key);
+#endif
+ DomEvents.AddHandler (key, handler);
+ }
+
+ internal void DetachEvent (INode node, string eve, EventHandler handler) {
+ string key = String.Intern (node.GetHashCode() + ":" + eve);
+#if debug
+ Console.Error.WriteLine ("Event Detached: " + key);
+#endif
+ DomEvents.RemoveHandler (key, handler);
+ }
+
+ #endregion
+
+ #region Events
+ internal static object KeyDownEvent = new object ();
+ internal static object KeyPressEvent = new object ();
+ internal static object KeyUpEvent = new object ();
+ internal static object MouseClickEvent = new object ();
+ internal static object MouseDoubleClickEvent = new object ();
+ internal static object MouseDownEvent = new object ();
+ internal static object MouseEnterEvent = new object ();
+ internal static object MouseLeaveEvent = new object ();
+ internal static object MouseMoveEvent = new object ();
+ internal static object MouseUpEvent = new object ();
+ internal static object FocusEvent = new object ();
+ internal static object BlurEvent = new object ();
+ internal static object CreateNewWindowEvent = new object ();
+ internal static object AlertEvent = new object ();
+
+ internal static object LoadStartedEvent = new object ();
+ internal static object LoadCommitedEvent = new object ();
+ internal static object ProgressChangedEvent = new object ();
+ internal static object LoadFinishedEvent = new object ();
+
+ internal static object LoadEvent = new object ();
+ internal static object UnloadEvent = new object ();
+ internal static object StatusChangedEvent = new object ();
+ internal static object SecurityChangedEvent = new object ();
+ internal static object ProgressEvent = new object ();
+ internal static object ContextMenuEvent = new object ();
+
+ internal static object NavigationRequestedEvent = new object ();
+
+ public event NodeEventHandler KeyDown
+ {
+ add { Events.AddHandler (KeyDownEvent, value); }
+ remove { Events.RemoveHandler (KeyDownEvent, value); }
+ }
+
+ public event NodeEventHandler KeyPress
+ {
+ add { Events.AddHandler (KeyPressEvent, value); }
+ remove { Events.RemoveHandler (KeyPressEvent, value); }
+ }
+ public event NodeEventHandler KeyUp
+ {
+ add { Events.AddHandler (KeyUpEvent, value); }
+ remove { Events.RemoveHandler (KeyUpEvent, value); }
+ }
+ public event NodeEventHandler MouseClick
+ {
+ add { Events.AddHandler (MouseClickEvent, value); }
+ remove { Events.RemoveHandler (MouseClickEvent, value); }
+ }
+ public event NodeEventHandler MouseDoubleClick
+ {
+ add { Events.AddHandler (MouseDoubleClickEvent, value); }
+ remove { Events.RemoveHandler (MouseDoubleClickEvent, value); }
+ }
+ public event NodeEventHandler MouseDown
+ {
+ add { Events.AddHandler (MouseDownEvent, value); }
+ remove { Events.RemoveHandler (MouseDownEvent, value); }
+ }
+ public event NodeEventHandler MouseEnter
+ {
+ add { Events.AddHandler (MouseEnterEvent, value); }
+ remove { Events.RemoveHandler (MouseEnterEvent, value); }
+ }
+ public event NodeEventHandler MouseLeave
+ {
+ add { Events.AddHandler (MouseLeaveEvent, value); }
+ remove { Events.RemoveHandler (MouseLeaveEvent, value); }
+ }
+ public event NodeEventHandler MouseMove
+ {
+ add { Events.AddHandler (MouseMoveEvent, value); }
+ remove { Events.RemoveHandler (MouseMoveEvent, value); }
+ }
+ public event NodeEventHandler MouseUp
+ {
+ add { Events.AddHandler (MouseUpEvent, value); }
+ remove { Events.RemoveHandler (MouseUpEvent, value); }
+ }
+ public event EventHandler Focus
+ {
+ add { Events.AddHandler (FocusEvent, value); }
+ remove { Events.RemoveHandler (FocusEvent, value); }
+ }
+ public event EventHandler Blur
+ {
+ add { Events.AddHandler (BlurEvent, value); }
+ remove { Events.RemoveHandler (BlurEvent, value); }
+ }
+ public event CreateNewWindowEventHandler CreateNewWindow
+ {
+ add { Events.AddHandler (CreateNewWindowEvent, value); }
+ remove { Events.RemoveHandler (CreateNewWindowEvent, value); }
+ }
+ public event AlertEventHandler Alert
+ {
+ add { Events.AddHandler (AlertEvent, value); }
+ remove { Events.RemoveHandler (AlertEvent, value); }
+ }
+ public event EventHandler Loaded
+ {
+ add { Events.AddHandler (LoadEvent, value); }
+ remove { Events.RemoveHandler (LoadEvent, value); }
+ }
+ public event EventHandler Unloaded
+ {
+ add { Events.AddHandler (UnloadEvent, value); }
+ remove { Events.RemoveHandler (UnloadEvent, value); }
+ }
+
+ public event StatusChangedEventHandler StatusChanged
+ {
+ add { Events.AddHandler (StatusChangedEvent, value); }
+ remove { Events.RemoveHandler (StatusChangedEvent, value); }
+ }
+
+ public event SecurityChangedEventHandler SecurityChanged
+ {
+ add { Events.AddHandler (SecurityChangedEvent, value); }
+ remove { Events.RemoveHandler (SecurityChangedEvent, value); }
+ }
+
+ public event LoadStartedEventHandler LoadStarted
+ {
+ add { Events.AddHandler (LoadStartedEvent, value); }
+ remove { Events.RemoveHandler (LoadStartedEvent, value); }
+ }
+
+ public event LoadCommitedEventHandler LoadCommited
+ {
+ add { Events.AddHandler (LoadCommitedEvent, value); }
+ remove { Events.RemoveHandler (LoadCommitedEvent, value); }
+ }
+
+ public event ProgressChangedEventHandler ProgressChanged
+ {
+ add { Events.AddHandler (ProgressChangedEvent, value); }
+ remove { Events.RemoveHandler (ProgressChangedEvent, value); }
+ }
+
+ public event LoadFinishedEventHandler LoadFinished
+ {
+ add { Events.AddHandler (LoadFinishedEvent, value); }
+ remove { Events.RemoveHandler (LoadFinishedEvent, value); }
+ }
+
+ public event ContextMenuEventHandler ContextMenuShown
+ {
+ add { Events.AddHandler (ContextMenuEvent, value); }
+ remove { Events.RemoveHandler (ContextMenuEvent, value); }
+ }
+
+ public event NavigationRequestedEventHandler NavigationRequested
+ {
+ add { }
+ remove { }
+ }
+
+ internal static object GenericEvent = new object ();
+ internal event EventHandler Generic
+ {
+ add { Events.AddHandler (GenericEvent, value); }
+ remove { Events.RemoveHandler (GenericEvent, value); }
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/mcs/class/Mono.WebBrowser/Mono.WebBrowser.dll.sources b/mcs/class/Mono.WebBrowser/Mono.WebBrowser.dll.sources
index 5f8c9cc615..62034900e8 100644
--- a/mcs/class/Mono.WebBrowser/Mono.WebBrowser.dll.sources
+++ b/mcs/class/Mono.WebBrowser/Mono.WebBrowser.dll.sources
@@ -133,6 +133,9 @@ Mono.Mozilla/interfaces/nsIWebNavigation.cs
Mono.Mozilla/interfaces/extras/NodeType.cs
Mono.Mozilla/interfaces/extras/nsIWriteSegmentFun.cs
Mono.Mozilla/interfaces/extras/Options.cs
+Mono.NullBrowser/Base.cs
+Mono.NullBrowser/WebBrowser.cs
+Mono.NullBrowser/DOM/Navigation.cs
Mono.WebBrowser/DOM/IDocumentType.cs
Mono.WebBrowser/DOM/IDOMImplementation.cs
Mono.WebBrowser/DOM/IMediaList.cs
diff --git a/mcs/class/Mono.WebBrowser/Mono.WebBrowser/Manager.cs b/mcs/class/Mono.WebBrowser/Mono.WebBrowser/Manager.cs
index a67d846afc..1b1a662972 100644
--- a/mcs/class/Mono.WebBrowser/Mono.WebBrowser/Manager.cs
+++ b/mcs/class/Mono.WebBrowser/Mono.WebBrowser/Manager.cs
@@ -52,8 +52,15 @@ namespace Mono.WebBrowser
}
}
#endif
- if (browserEngine == null || browserEngine == "mozilla")
- return new Mono.Mozilla.WebBrowser (platform);
+ if (browserEngine == "mozilla") {
+ try {
+ return new Mono.Mozilla.WebBrowser (platform);
+ } catch {
+ browserEngine = null;
+ }
+ }
+ if (browserEngine == null)
+ return new Mono.NullBrowser.WebBrowser (platform);
throw new Exception (Mono.WebBrowser.Exception.ErrorCodes.EngineNotSupported, browserEngine);
}