public static void Shutdown() { GeckoPreferences.Shutdown(); WindowWatcher.Shutdown(); WindowMediator.Shutdown(); PromptFactoryFactory.Shutdown(); Xpcom.DisposeObject(ref _comGC); if (Xpcom.ChromeContext != null) { Xpcom.ChromeContext.Dispose(); Xpcom.ChromeContext = null; } if (ComponentRegistrar != null) { Marshal.ReleaseComObject(ComponentRegistrar); } if (ComponentManager != null) { Marshal.ReleaseComObject(ComponentManager); } if (ServiceManager != null) { var s = GetService <nsIObserverService>("@mozilla.org/observer-service;1"); s.NotifyObservers(null, "profile-change-net-teardown", "shutdown-persist"); s.NotifyObservers(null, "profile-change-teardown", "shutdown-persist"); s.NotifyObservers(null, "profile-before-change", "shutdown-persist"); s.NotifyObservers(null, "profile-before-change2", "shutdown-persist"); Marshal.ReleaseComObject(s); // NS_ShutdownXPCOM calls Release on the ServiceManager COM objects. // However since the ServiceManager is a __ComObject its finaliser will also call release. var ptr = Marshal.GetIUnknownForObject(ServiceManager); NS_ShutdownXPCOM(ServiceManager); Marshal.ReleaseComObject(ServiceManager); } _IsInitialized = false; }
public static void Shutdown() { GeckoPreferences.Shutdown(); WindowWatcher.Shutdown(); WindowMediator.Shutdown(); PromptFactoryFactory.Shutdown(); Xpcom.DisposeObject(ref _comGC); if (Xpcom.ChromeContext != null) { Xpcom.ChromeContext.Dispose(); Xpcom.ChromeContext = null; } if (ComponentRegistrar != null) { Marshal.ReleaseComObject(ComponentRegistrar); } if (ComponentManager != null) { Marshal.ReleaseComObject(ComponentManager); } if (ServiceManager != null) { // NS_ShutdownXPCOM calls Release on the ServiceManager COM objects. // However since the ServiceManager is a __ComObject its finaliser will also call release. var ptr = Marshal.GetIUnknownForObject(ServiceManager); NS_ShutdownXPCOM(ServiceManager); Marshal.ReleaseComObject(ServiceManager); } _IsInitialized = false; }
protected override void OnHandleDestroyed(EventArgs e) { if (BaseWindow != null) { this.Stop(); WindowMediator.UnregisterWindow(this); if (_weakRef != null) { _weakRef.Dispose(); _weakRef = null; } nsIDocShell docShell = Xpcom.QueryInterface <nsIDocShell>(BaseWindow); if (docShell != null && !docShell.IsBeingDestroyed()) { try { var window = Xpcom.QueryInterface <nsIDOMWindow>(docShell); if (window != null) { try { var w = new WebIDL.Window(window, (nsISupports)window); if (!w.Closed) { w.Close(); } } finally { Xpcom.FreeComObject(ref window); } } } finally { Xpcom.FreeComObject(ref docShell); } } if (EventTarget != null) { RemoveFrameEvents(); DetachEvents(); EventTarget.Dispose(); EventTarget = null; } BaseWindow.Destroy(); Xpcom.FreeComObject(ref CommandParams); var webBrowserFocus = this.WebBrowserFocus; this.WebBrowserFocus = null; Xpcom.FreeComObject(ref webBrowserFocus); Xpcom.FreeComObject(ref WebNav); Xpcom.FreeComObject(ref BaseWindow); Xpcom.FreeComObject(ref WebBrowser); if (this.menu != null) { this.menu.MenuItems.Clear(); this.menu.Dispose(); this.menu = null; } #if GTK if (m_wrapper != null) { m_wrapper.Dispose(); m_wrapper = null; } #endif } base.OnHandleDestroyed(e); }
protected override void OnHandleCreated(EventArgs e) { try { InOnHandleCreate = true; #if GTK if (Xpcom.IsMono) { base.OnHandleCreated(e); if (m_wrapper != null) { m_wrapper.Init(); } } #endif if (!this.DesignMode) { Xpcom.Initialize(); WindowCreator.Register(); #if !GTK LauncherDialogFactory.Register(); #endif WebBrowser = Xpcom.CreateInstance <nsIWebBrowser>(Contracts.WebBrowser); WebBrowserFocus = (nsIWebBrowserFocus)WebBrowser; BaseWindow = (nsIBaseWindow)WebBrowser; WebNav = (nsIWebNavigation)WebBrowser; WebBrowser.SetContainerWindowAttribute(this); #if GTK if (Xpcom.IsMono && m_wrapper != null) { BaseWindow.InitWindow(m_wrapper.BrowserWindow.Handle, IntPtr.Zero, 0, 0, this.Width, this.Height); } else #endif BaseWindow.InitWindow(this.Handle, IntPtr.Zero, 0, 0, this.Width, this.Height); BaseWindow.Create(); var docShell = Xpcom.QueryInterface <nsIDocShell>(BaseWindow); // Allow visible control before finished loading see https://bugzilla.mozilla.org/show_bug.cgi?id=1138536 docShell.CreateAboutBlankContentViewer(null); Xpcom.FreeComObject(ref docShell); BaseWindow.SetVisibilityAttribute(true); Guid nsIWebProgressListenerGUID = typeof(nsIWebProgressListener).GUID; Guid nsIWebProgressListener2GUID = typeof(nsIWebProgressListener2).GUID; WebBrowser.AddWebBrowserListener(this.GetWeakReference(), ref nsIWebProgressListenerGUID); WebBrowser.AddWebBrowserListener(this.GetWeakReference(), ref nsIWebProgressListener2GUID); if (UseHttpActivityObserver) { ObserverService.AddObserver(this, ObserverNotifications.HttpRequests.HttpOnModifyRequest, false); Net.HttpActivityDistributor.AddObserver(this); } // force inital window initialization. (Events now get added after document navigation. { var domWindow = WebBrowser.GetContentDOMWindowAttribute(); EventTarget = Gecko.Interop.ExtensionMethods.AsComPtr(((nsIDOMEventTarget)domWindow)); using (var eventType = new nsAString("somedummyevent")) { EventTarget.Instance.AddEventListener(eventType, this, true, true, 2); EventTarget.Instance.RemoveEventListener(eventType, this, true); } } // history { var sessionHistory = WebNav.GetSessionHistoryAttribute(); if (sessionHistory != null) { sessionHistory.AddSHistoryListener(this); } } // this fix prevents the browser from crashing if the first page loaded is invalid (missing file, invalid URL, etc) var doc = Document; if (doc != null) { // only for html documents doc.Cookie = ""; } WindowMediator.RegisterWindow(this); } #if !GTK base.OnHandleCreated(e); #endif } finally { InOnHandleCreate = false; GeckoHandleCreated(this, EventArgs.Empty); } }
protected override void OnHandleCreated(EventArgs e) { try { InOnHandleCreate = true; #if GTK if (Xpcom.IsMono) { base.OnHandleCreated(e); } #endif if (!this.DesignMode) { Xpcom.Initialize(); WindowCreator.Register(); #if !GTK LauncherDialogFactory.Register(); #endif WebBrowser = Xpcom.CreateInstance <nsIWebBrowser>(Contracts.WebBrowser); WebBrowserFocus = (nsIWebBrowserFocus)Browser; BaseWindow = (nsIBaseWindow)Browser; WebNav = (nsIWebNavigation)Browser; Browser.SetContainerWindowAttribute(this); #if GTK var drawn = false; Gtk.DrawnHandler drawnHandler = null; drawnHandler = (object o, Gtk.DrawnArgs args) => { _topLevelWindow.Drawn -= drawnHandler; drawn = true; }; _topLevelWindow.Drawn += drawnHandler; if (Xpcom.IsMono) { if (m_wrapper == null) { throw new InvalidOperationException("If GTK window is null we can't continue."); } BaseWindow.InitWindow(m_wrapper.BrowserWindow.Handle, IntPtr.Zero, 0, 0, this.Width, this.Height); } else #endif BaseWindow.InitWindow(this.Handle, IntPtr.Zero, 0, 0, this.Width, this.Height); #if GTK if (m_wrapper != null) { m_wrapper.Init(); } // Only wait for a max of 300ms. (To prevent possiblty of a hang) DateTime d = DateTime.Now; while (Gtk.Application.EventsPending() && !drawn) { Gtk.Application.RunIteration(false); if ((DateTime.Now - d).TotalMilliseconds > 300) { break; } } #endif BaseWindow.Create(); var docShell = Xpcom.QueryInterface <nsIDocShell>(BaseWindow); // Allow visible control before finished loading see https://bugzilla.mozilla.org/show_bug.cgi?id=1138536 docShell.CreateAboutBlankContentViewer(null); Xpcom.FreeComObject(ref docShell); BaseWindow.SetVisibilityAttribute(true); Guid nsIWebProgressListenerGUID = typeof(nsIWebProgressListener).GUID; Guid nsIWebProgressListener2GUID = typeof(nsIWebProgressListener2).GUID; // AddEventListener Doesn't yet work Browser.AddWebBrowserListener(this.GetWeakReference(), ref nsIWebProgressListenerGUID); Browser.AddWebBrowserListener(this.GetWeakReference(), ref nsIWebProgressListener2GUID); if (UseHttpActivityObserver) { ObserverService.AddObserver(this, ObserverNotifications.HttpRequests.HttpOnModifyRequest, false); Net.HttpActivityDistributor.AddObserver(this); } // force inital window initialization. (Events now get added after document navigation. { var domWindow = Browser.GetContentDOMWindowAttribute(); EventTarget = ((nsIDOMEventTarget)domWindow).AsComPtr(); using (var eventType = new nsAString("somedummyevent")) { EventTarget.Instance.AddEventListener(eventType, this, true, true, 2); EventTarget.Instance.RemoveEventListener(eventType, this, true); } } // history { var sessionHistory = WebNav.GetSessionHistoryAttribute(); if (sessionHistory != null) { sessionHistory.AddSHistoryListener(this); } } WindowMediator.RegisterWindow(this); } #if !GTK base.OnHandleCreated(e); #endif } finally { InOnHandleCreate = false; GeckoHandleCreated(this, EventArgs.Empty); } }
protected override void OnHandleDestroyed(EventArgs e) { if (BaseWindow != null) { this.Stop(); WindowMediator.UnregisterWindow(this); nsIDocShell docShell = Xpcom.QueryInterface <nsIDocShell>(BaseWindow); if (docShell != null && !docShell.IsBeingDestroyed()) { try { var window = Xpcom.QueryInterface <nsIDOMWindow>(docShell); if (window != null) { try { if (!window.GetClosedAttribute()) { window.Close(); } } finally { Xpcom.FreeComObject(ref window); } } } finally { Xpcom.FreeComObject(ref docShell); } } if (EventTarget != null) { //Remove Event Listener foreach (string sEventType in this.DefaultEvents) { using (var eventType = new nsAString(sEventType)) { EventTarget.Instance.RemoveEventListener(eventType, this, true); } } EventTarget.Dispose(); EventTarget = null; } BaseWindow.Destroy(); Xpcom.FreeComObject(ref CommandParams); var webBrowserFocus = this.WebBrowserFocus; this.WebBrowserFocus = null; Xpcom.FreeComObject(ref webBrowserFocus); Xpcom.FreeComObject(ref WebNav); Xpcom.FreeComObject(ref BaseWindow); Xpcom.FreeComObject(ref WebBrowser); #if GTK if (m_wrapper != null) { m_wrapper.Dispose(); } #endif } base.OnHandleDestroyed(e); }
protected override void OnHandleCreated(EventArgs e) { #if GTK if (Xpcom.IsMono) { base.OnHandleCreated(e); m_wrapper.Init(); } #endif if (!this.DesignMode) { Xpcom.Initialize(); WindowCreator.Register(); #if !GTK LauncherDialogFactory.Register(); #endif WebBrowser = Xpcom.CreateInstance <nsIWebBrowser>(Contracts.WebBrowser); WebBrowserFocus = ( nsIWebBrowserFocus )WebBrowser; BaseWindow = ( nsIBaseWindow )WebBrowser; WebNav = ( nsIWebNavigation )WebBrowser; WebBrowser.SetContainerWindowAttribute(this); #if GTK if (Xpcom.IsMono) { BaseWindow.InitWindow(m_wrapper.BrowserWindow.Handle, IntPtr.Zero, 0, 0, this.Width, this.Height); } else #endif BaseWindow.InitWindow(this.Handle, IntPtr.Zero, 0, 0, this.Width, this.Height); BaseWindow.Create(); Guid nsIWebProgressListenerGUID = typeof(nsIWebProgressListener).GUID; Guid nsIWebProgressListener2GUID = typeof(nsIWebProgressListener2).GUID; WebBrowser.AddWebBrowserListener(this.GetWeakReference(), ref nsIWebProgressListenerGUID); WebBrowser.AddWebBrowserListener(this.GetWeakReference(), ref nsIWebProgressListener2GUID); if (UseHttpActivityObserver) { ObserverService.AddObserver(this, ObserverNotifications.HttpRequests.HttpOnModifyRequest, false); Net.HttpActivityDistributor.AddObserver(this); } // var domEventListener = new GeckoDOMEventListener(this); { var domWindow = WebBrowser.GetContentDOMWindowAttribute(); EventTarget = domWindow.GetWindowRootAttribute().AsComPtr(); Marshal.ReleaseComObject(domWindow); } foreach (string sEventName in this.DefaultEvents) { using (var eventType = new nsAString(sEventName)) { EventTarget.Instance.AddEventListener(eventType, this, true, true, 2); } } // history { var sessionHistory = WebNav.GetSessionHistoryAttribute(); if (sessionHistory != null) { sessionHistory.AddSHistoryListener(this); } } BaseWindow.SetVisibilityAttribute(true); // this fix prevents the browser from crashing if the first page loaded is invalid (missing file, invalid URL, etc) if (Document != null) { // only for html documents Document.Cookie = ""; } WindowMediator.RegisterWindow(this); } base.OnHandleCreated(e); }