1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2007, 2008 Novell, Inc.
23 // Andreia Gaita (avidigal@novell.com)
29 using System.Collections;
30 using System.Reflection;
31 using System.Runtime.InteropServices;
33 using System.Diagnostics;
34 using Mono.WebBrowser;
35 using Mono.WebBrowser.DOM;
37 namespace Mono.Mozilla
39 internal class WebBrowser : IWebBrowser
42 internal bool created = false;
43 bool creating = false;
45 internal DOM.Document document;
47 internal DOM.Navigation navigation;
48 internal Platform platform;
49 internal Platform enginePlatform;
50 internal Callback callbacks;
51 System.ComponentModel.EventHandlerList events;
52 System.ComponentModel.EventHandlerList domEvents;
58 internal Hashtable documents;
60 public WebBrowser (Platform platform)
62 this.platform = platform;
63 callbacks = new Callback(this);
64 loaded = Base.Init (this, platform);
65 documents = new Hashtable ();
68 public bool Load (IntPtr handle, int width, int height)
70 loaded = Base.Bind (this, handle, width, height);
76 if (!creating && !created) {
78 created = Base.Create (this);
84 public void Shutdown ()
89 internal void Reset ()
92 this.DomEvents.Dispose ();
93 this.domEvents = null;
94 this.documents.Clear ();
97 public bool Initialized {
98 get { return this.loaded; }
101 public IWindow Window {
103 if (Navigation != null) {
104 nsIWebBrowserFocus webBrowserFocus = (nsIWebBrowserFocus) (navigation.navigation);
106 webBrowserFocus.getFocusedWindow (out window);
107 return new DOM.Window (this, window) as IWindow;
113 public IDocument Document {
115 if (Navigation != null && document == null) {
116 document = navigation.Document;
118 return document as IDocument;
122 public INavigation Navigation {
124 if (!Created) return null;
126 if (navigation == null) {
128 nsIWebNavigation webNav = Base.GetWebNavigation (this);
129 navigation = new DOM.Navigation (this, webNav);
131 return navigation as INavigation;
135 public string StatusText {
136 get { return statusText; }
139 public bool Offline {
142 if (!Created) return true;
143 IOService.getOffline (out ret);
147 IOService.setOffline (value);
151 internal System.ComponentModel.EventHandlerList DomEvents {
153 if (domEvents == null)
154 domEvents = new System.ComponentModel.EventHandlerList();
160 internal System.ComponentModel.EventHandlerList Events {
163 events = new System.ComponentModel.EventHandlerList();
169 Mono.Mozilla.DOM.ContentListener contentListener;
170 Mono.Mozilla.DOM.ContentListener ContentListener {
172 if (contentListener == null)
173 contentListener = new Mono.Mozilla.DOM.ContentListener (this);
174 return contentListener;
179 nsIServiceManager servMan;
180 internal nsIServiceManager ServiceManager {
182 if (servMan == null) {
183 servMan = Base.GetServiceManager (this);
189 nsIIOService ioService;
190 internal nsIIOService IOService {
192 if (ioService == null) {
193 IntPtr ioServicePtr = IntPtr.Zero;
195 ServiceManager.getServiceByContractID ("@mozilla.org/network/io-service;1", typeof (nsIIOService).GUID,
197 if (ioServicePtr == IntPtr.Zero)
198 throw new Mono.WebBrowser.Exception (Mono.WebBrowser.Exception.ErrorCodes.IOService);
201 ioService = (nsIIOService)Marshal.GetObjectForIUnknown (ioServicePtr);
202 } catch (System.Exception ex) {
203 throw new Mono.WebBrowser.Exception (Mono.WebBrowser.Exception.ErrorCodes.IOService, ex);
210 nsIAccessibilityService accessibilityService;
211 internal nsIAccessibilityService AccessibilityService {
213 if (accessibilityService == null) {
214 IntPtr accessibilityServicePtr = IntPtr.Zero;
215 ServiceManager.getServiceByContractID ("@mozilla.org/accessibilityService;1", typeof (nsIAccessibilityService).GUID,
216 out accessibilityServicePtr);
217 if (accessibilityServicePtr == IntPtr.Zero) {
218 throw new Mono.WebBrowser.Exception (Mono.WebBrowser.Exception.ErrorCodes.AccessibilityService);
222 accessibilityService = (nsIAccessibilityService)Marshal.GetObjectForIUnknown (accessibilityServicePtr);
223 } catch (System.Exception ex) {
224 throw new Mono.WebBrowser.Exception (Mono.WebBrowser.Exception.ErrorCodes.AccessibilityService, ex);
227 return accessibilityService;
231 nsIErrorService errorService;
232 internal nsIErrorService ErrorService {
234 if (errorService == null) {
235 IntPtr errorServicePtr = IntPtr.Zero;
237 ServiceManager.getServiceByContractID ("@mozilla.org/xpcom/error-service;1", typeof (nsIErrorService).GUID,
238 out errorServicePtr);
239 if (errorServicePtr == IntPtr.Zero)
243 errorService = (nsIErrorService)Marshal.GetObjectForIUnknown (errorServicePtr);
244 } catch (System.Exception ex) {
252 DocumentEncoder docEncoder;
253 internal DocumentEncoder DocEncoder {
255 if (docEncoder == null) {
256 docEncoder = new DocumentEncoder (this);
263 public void FocusIn (FocusOption focus)
265 if (!created) return;
266 Base.Focus (this, focus);
268 public void FocusOut ()
270 if (!created) return;
274 public void Activate ()
276 if (!Created) return;
277 Base.Activate (this);
279 public void Deactivate ()
281 if (!created) return;
282 Base.Deactivate (this);
285 public void Resize (int width, int height)
287 if (!created) return;
288 Base.Resize (this, width, height);
291 public void Render (byte[] data)
293 if (!Created) return;
295 throw new ArgumentNullException ("data");
296 string html = System.Text.ASCIIEncoding.UTF8.GetString (data);
300 public void Render (string html)
302 if (!Created) return;
303 Render (html, "file:///", "text/html");
307 public void Render (string html, string uri, string contentType)
309 if (!Created) return;
310 nsIWebBrowserStream stream;
311 if (Navigation != null) {
312 stream = (nsIWebBrowserStream) navigation.navigation;
314 throw new Mono.WebBrowser.Exception (Mono.WebBrowser.Exception.ErrorCodes.Navigation);
315 AsciiString asciiUri = new AsciiString (uri);
317 IOService.newURI (asciiUri.Handle, null, null, out ret);
319 AsciiString ctype = new AsciiString(contentType);
321 HandleRef han = ctype.Handle;
323 stream.openStream (ret, han);
325 IntPtr native_html = Marshal.StringToHGlobalAnsi (html);
326 stream.appendToStream (native_html, (uint)html.Length);
327 Marshal.FreeHGlobal (native_html);
329 stream.closeStream ();
333 public void ExecuteScript (string script) {
334 if (!Created) return;
335 Base.EvalScript (this, script);
338 internal void AttachEvent (INode node, string eve, EventHandler handler) {
339 string key = String.Intern (node.GetHashCode() + ":" + eve);
341 Console.Error.WriteLine ("Event Attached: " + key);
343 DomEvents.AddHandler (key, handler);
346 internal void DetachEvent (INode node, string eve, EventHandler handler) {
347 string key = String.Intern (node.GetHashCode() + ":" + eve);
349 Console.Error.WriteLine ("Event Detached: " + key);
351 DomEvents.RemoveHandler (key, handler);
357 internal static object KeyDownEvent = new object ();
358 internal static object KeyPressEvent = new object ();
359 internal static object KeyUpEvent = new object ();
360 internal static object MouseClickEvent = new object ();
361 internal static object MouseDoubleClickEvent = new object ();
362 internal static object MouseDownEvent = new object ();
363 internal static object MouseEnterEvent = new object ();
364 internal static object MouseLeaveEvent = new object ();
365 internal static object MouseMoveEvent = new object ();
366 internal static object MouseUpEvent = new object ();
367 internal static object FocusEvent = new object ();
368 internal static object BlurEvent = new object ();
369 internal static object CreateNewWindowEvent = new object ();
370 internal static object AlertEvent = new object ();
372 internal static object LoadStartedEvent = new object ();
373 internal static object LoadCommitedEvent = new object ();
374 internal static object ProgressChangedEvent = new object ();
375 internal static object LoadFinishedEvent = new object ();
377 internal static object LoadEvent = new object ();
378 internal static object UnloadEvent = new object ();
379 internal static object StatusChangedEvent = new object ();
380 internal static object SecurityChangedEvent = new object ();
381 internal static object ProgressEvent = new object ();
382 internal static object ContextMenuEvent = new object ();
384 internal static object NavigationRequestedEvent = new object ();
386 public event NodeEventHandler KeyDown
388 add { Events.AddHandler (KeyDownEvent, value); }
389 remove { Events.RemoveHandler (KeyDownEvent, value); }
392 public event NodeEventHandler KeyPress
394 add { Events.AddHandler (KeyPressEvent, value); }
395 remove { Events.RemoveHandler (KeyPressEvent, value); }
397 public event NodeEventHandler KeyUp
399 add { Events.AddHandler (KeyUpEvent, value); }
400 remove { Events.RemoveHandler (KeyUpEvent, value); }
402 public event NodeEventHandler MouseClick
404 add { Events.AddHandler (MouseClickEvent, value); }
405 remove { Events.RemoveHandler (MouseClickEvent, value); }
407 public event NodeEventHandler MouseDoubleClick
409 add { Events.AddHandler (MouseDoubleClickEvent, value); }
410 remove { Events.RemoveHandler (MouseDoubleClickEvent, value); }
412 public event NodeEventHandler MouseDown
414 add { Events.AddHandler (MouseDownEvent, value); }
415 remove { Events.RemoveHandler (MouseDownEvent, value); }
417 public event NodeEventHandler MouseEnter
419 add { Events.AddHandler (MouseEnterEvent, value); }
420 remove { Events.RemoveHandler (MouseEnterEvent, value); }
422 public event NodeEventHandler MouseLeave
424 add { Events.AddHandler (MouseLeaveEvent, value); }
425 remove { Events.RemoveHandler (MouseLeaveEvent, value); }
427 public event NodeEventHandler MouseMove
429 add { Events.AddHandler (MouseMoveEvent, value); }
430 remove { Events.RemoveHandler (MouseMoveEvent, value); }
432 public event NodeEventHandler MouseUp
434 add { Events.AddHandler (MouseUpEvent, value); }
435 remove { Events.RemoveHandler (MouseUpEvent, value); }
437 public event EventHandler Focus
439 add { Events.AddHandler (FocusEvent, value); }
440 remove { Events.RemoveHandler (FocusEvent, value); }
442 public event EventHandler Blur
444 add { Events.AddHandler (BlurEvent, value); }
445 remove { Events.RemoveHandler (BlurEvent, value); }
447 public event CreateNewWindowEventHandler CreateNewWindow
449 add { Events.AddHandler (CreateNewWindowEvent, value); }
450 remove { Events.RemoveHandler (CreateNewWindowEvent, value); }
452 public event AlertEventHandler Alert
454 add { Events.AddHandler (AlertEvent, value); }
455 remove { Events.RemoveHandler (AlertEvent, value); }
457 public event EventHandler Loaded
459 add { Events.AddHandler (LoadEvent, value); }
460 remove { Events.RemoveHandler (LoadEvent, value); }
462 public event EventHandler Unloaded
464 add { Events.AddHandler (UnloadEvent, value); }
465 remove { Events.RemoveHandler (UnloadEvent, value); }
468 public event StatusChangedEventHandler StatusChanged
470 add { Events.AddHandler (StatusChangedEvent, value); }
471 remove { Events.RemoveHandler (StatusChangedEvent, value); }
474 public event SecurityChangedEventHandler SecurityChanged
476 add { Events.AddHandler (SecurityChangedEvent, value); }
477 remove { Events.RemoveHandler (SecurityChangedEvent, value); }
480 public event LoadStartedEventHandler LoadStarted
482 add { Events.AddHandler (LoadStartedEvent, value); }
483 remove { Events.RemoveHandler (LoadStartedEvent, value); }
486 public event LoadCommitedEventHandler LoadCommited
488 add { Events.AddHandler (LoadCommitedEvent, value); }
489 remove { Events.RemoveHandler (LoadCommitedEvent, value); }
492 public event ProgressChangedEventHandler ProgressChanged
494 add { Events.AddHandler (ProgressChangedEvent, value); }
495 remove { Events.RemoveHandler (ProgressChangedEvent, value); }
498 public event LoadFinishedEventHandler LoadFinished
500 add { Events.AddHandler (LoadFinishedEvent, value); }
501 remove { Events.RemoveHandler (LoadFinishedEvent, value); }
504 public event ContextMenuEventHandler ContextMenuShown
506 add { Events.AddHandler (ContextMenuEvent, value); }
507 remove { Events.RemoveHandler (ContextMenuEvent, value); }
510 public event NavigationRequestedEventHandler NavigationRequested
512 add { ContentListener.AddHandler (value); }
513 remove { ContentListener.RemoveHandler (value); }
516 internal static object GenericEvent = new object ();
517 internal event EventHandler Generic
519 add { Events.AddHandler (GenericEvent, value); }
520 remove { Events.RemoveHandler (GenericEvent, value); }