Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / WinForms / Managed / System / WinForms / HtmlWindow.cs / 1 / HtmlWindow.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Drawing.Printing; using System.IO; using System.Net; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; namespace System.Windows.Forms { ////// /// [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] public sealed class HtmlWindow { internal static readonly object EventError = new object(); internal static readonly object EventGotFocus = new object(); internal static readonly object EventLoad = new object(); internal static readonly object EventLostFocus = new object(); internal static readonly object EventResize = new object(); internal static readonly object EventScroll = new object(); internal static readonly object EventUnload = new object(); private HtmlShimManager shimManager; private UnsafeNativeMethods.IHTMLWindow2 htmlWindow2; [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] internal HtmlWindow(HtmlShimManager shimManager, UnsafeNativeMethods.IHTMLWindow2 win) { this.htmlWindow2 = win; Debug.Assert(this.NativeHtmlWindow != null, "The window object should implement IHTMLWindow2"); this.shimManager = shimManager; } internal UnsafeNativeMethods.IHTMLWindow2 NativeHtmlWindow { get { return this.htmlWindow2; } } private HtmlShimManager ShimManager { get { return shimManager; } } private HtmlWindowShim WindowShim { get { if (ShimManager != null) { HtmlWindowShim shim = ShimManager.GetWindowShim(this); if (shim == null) { shimManager.AddWindowShim(this); shim = ShimManager.GetWindowShim(this); } return shim; } return null; } } ///[To be supplied.] ////// /// public HtmlDocument Document { get { UnsafeNativeMethods.IHTMLDocument iHTMLDocument = this.NativeHtmlWindow.GetDocument() as UnsafeNativeMethods.IHTMLDocument; return iHTMLDocument != null ? new HtmlDocument(ShimManager, iHTMLDocument) : null; } } ///[To be supplied.] ////// /// public object DomWindow { get { return this.NativeHtmlWindow; } } ///[To be supplied.] ////// /// public HtmlWindowCollection Frames { get { UnsafeNativeMethods.IHTMLFramesCollection2 iHTMLFramesCollection2 = this.NativeHtmlWindow.GetFrames(); return (iHTMLFramesCollection2 != null) ? new HtmlWindowCollection(ShimManager, iHTMLFramesCollection2) : null; } } ///[To be supplied.] ////// /// public HtmlHistory History { get { UnsafeNativeMethods.IOmHistory iOmHistory = this.NativeHtmlWindow.GetHistory(); return iOmHistory != null ? new HtmlHistory(iOmHistory) : null; } } ///[To be supplied.] ////// /// public bool IsClosed { get { return this.NativeHtmlWindow.GetClosed(); } } ///[To be supplied.] ////// /// public string Name { get { return this.NativeHtmlWindow.GetName(); } set { this.NativeHtmlWindow.SetName(value); } } ///Name of the NativeHtmlWindow ////// /// public HtmlWindow Opener { get { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.GetOpener() as UnsafeNativeMethods.IHTMLWindow2; return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } } ///[To be supplied.] ////// /// public HtmlWindow Parent { get { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.GetParent(); return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } } ///[To be supplied.] ////// /// public Point Position { get { return new Point(((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).GetScreenLeft(), ((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).GetScreenTop()); } } ///[To be supplied.] ////// /// public Size Size { get { UnsafeNativeMethods.IHTMLElement bodyElement = this.NativeHtmlWindow.GetDocument().GetBody(); return new Size(bodyElement.GetOffsetWidth(), bodyElement.GetOffsetHeight()); } set { ResizeTo(value.Width, value.Height); } } ///Gets or sets size for the window ////// /// public string StatusBarText { get { return this.NativeHtmlWindow.GetStatus(); } set { this.NativeHtmlWindow.SetStatus(value); } } ///[To be supplied.] ////// /// public Uri Url { get { UnsafeNativeMethods.IHTMLLocation iHtmlLocation = this.NativeHtmlWindow.GetLocation(); string stringLocation = (iHtmlLocation == null) ? "" : iHtmlLocation.GetHref(); return string.IsNullOrEmpty(stringLocation) ? null : new Uri(stringLocation); } } ///[To be supplied.] ////// /// public HtmlElement WindowFrameElement { get { UnsafeNativeMethods.IHTMLElement htmlElement = ((UnsafeNativeMethods.IHTMLWindow4)this.NativeHtmlWindow).frameElement() as UnsafeNativeMethods.IHTMLElement; return (htmlElement != null) ? new HtmlElement(ShimManager, htmlElement) : null; } } ///[To be supplied.] ////// /// public void Alert(string message) { this.NativeHtmlWindow.Alert(message); } ///[To be supplied.] ////// /// public void AttachEventHandler(string eventName, EventHandler eventHandler) { WindowShim.AttachEventHandler(eventName, eventHandler); } ///[To be supplied.] ////// /// public void Close() { this.NativeHtmlWindow.Close(); } ///[To be supplied.] ////// /// public bool Confirm(string message) { return this.NativeHtmlWindow.Confirm(message); } ///[To be supplied.] ////// /// public void DetachEventHandler(string eventName, EventHandler eventHandler) { WindowShim.DetachEventHandler(eventName, eventHandler); } ///[To be supplied.] ////// /// public void Focus() { this.NativeHtmlWindow.Focus(); } ///[To be supplied.] ////// /// public void MoveTo(int x, int y) { this.NativeHtmlWindow.MoveTo(x, y); } ///Moves the Window to the position requested ////// /// public void MoveTo(Point point) { this.NativeHtmlWindow.MoveTo(point.X, point.Y); } ///Moves the Window to the point requested ////// /// public void Navigate(Uri url) { this.NativeHtmlWindow.Navigate(url.ToString()); } ///[To be supplied.] ////// /// /// Note: We intentionally have a string overload (apparently Mort wants one). We don't have /// string overloads call Uri overloads because that breaks Uris that aren't fully qualified /// (things like "www.microsoft.com") that the underlying objects support and we don't want to /// break. [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads")] public void Navigate(string urlString) { this.NativeHtmlWindow.Navigate(urlString); } ///[To be supplied.] ////// /// /// Note: We intentionally have a string overload (apparently Mort wants one). We don't have /// string overloads call Uri overloads because that breaks Uris that aren't fully qualified /// (things like "www.microsoft.com") that the underlying objects support and we don't want to /// break. [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads")] public HtmlWindow Open(string urlString, string target, string windowOptions, bool replaceEntry) { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.Open(urlString, target, windowOptions, replaceEntry); return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } ///[To be supplied.] ////// /// [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings")] public HtmlWindow Open(Uri url, string target, string windowOptions, bool replaceEntry) { return Open(url.ToString(), target, windowOptions, replaceEntry); } ///[To be supplied.] ////// /// /// Note: We intentionally have a string overload (apparently Mort wants one). We don't have /// string overloads call Uri overloads because that breaks Uris that aren't fully qualified /// (things like "www.microsoft.com") that the underlying objects support and we don't want to /// break. [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads")] public HtmlWindow OpenNew(string urlString, string windowOptions) { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.Open(urlString, "_blank", windowOptions, true); return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } ///[To be supplied.] ////// /// [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings")] public HtmlWindow OpenNew(Uri url, string windowOptions) { return OpenNew(url.ToString(), windowOptions); } ///[To be supplied.] ////// /// public string Prompt(string message, string defaultInputValue) { return this.NativeHtmlWindow.Prompt(message, defaultInputValue).ToString(); } ///[To be supplied.] ////// /// public void RemoveFocus() { this.NativeHtmlWindow.Blur(); } ///[To be supplied.] ////// /// public void ResizeTo(int width, int height) { this.NativeHtmlWindow.ResizeTo(width, height); } ///Resize the window to the width/height requested ////// public void ResizeTo(Size size) { this.NativeHtmlWindow.ResizeTo(size.Width, size.Height); } ///Resize the window to the Size requested ////// /// public void ScrollTo(int x, int y) { this.NativeHtmlWindow.ScrollTo(x, y); } ///Scroll the window to the position requested ////// /// public void ScrollTo(Point point) { this.NativeHtmlWindow.ScrollTo(point.X, point.Y); } // // Events // ///Scroll the window to the point requested ////// /// public event HtmlElementErrorEventHandler Error { add { WindowShim.AddHandler(EventError, value); } remove { WindowShim.RemoveHandler(EventError, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler GotFocus { add { WindowShim.AddHandler(EventGotFocus, value); } remove { WindowShim.RemoveHandler(EventGotFocus, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Load { add { WindowShim.AddHandler(EventLoad, value); } remove { WindowShim.RemoveHandler(EventLoad, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler LostFocus { add { WindowShim.AddHandler(EventLostFocus, value); } remove { WindowShim.RemoveHandler(EventLostFocus, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Resize { add { WindowShim.AddHandler(EventResize, value); } remove { WindowShim.RemoveHandler(EventResize, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Scroll { add { WindowShim.AddHandler(EventScroll, value); } remove { WindowShim.RemoveHandler(EventScroll, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Unload { add { WindowShim.AddHandler(EventUnload, value); } remove { WindowShim.RemoveHandler(EventUnload, value); } } // // Private classes: // [ClassInterface(ClassInterfaceType.None)] private class HTMLWindowEvents2 : StandardOleMarshalObject, /*Enforce calling back on the same thread*/ UnsafeNativeMethods.DHTMLWindowEvents2 { private HtmlWindow parent; public HTMLWindowEvents2(HtmlWindow htmlWindow) { this.parent = htmlWindow; } private void FireEvent(object key, EventArgs e) { if (this.parent != null) { parent.WindowShim.FireEvent(key, e); } } public void onfocus(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventGotFocus, e); } public void onblur(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventLostFocus, e); } public bool onerror(string description, string urlString, int line) { HtmlElementErrorEventArgs e = new HtmlElementErrorEventArgs(description, urlString, line); FireEvent(HtmlWindow.EventError, e); return e.Handled; } public void onload(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventLoad, e); } public void onunload(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventUnload, e); if (parent != null) { parent.WindowShim.OnWindowUnload(); } } public void onscroll(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventScroll, e); } public void onresize(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventResize, e); } public bool onhelp(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); return e.ReturnValue; } public void onbeforeunload(UnsafeNativeMethods.IHTMLEventObj evtObj) { } public void onbeforeprint(UnsafeNativeMethods.IHTMLEventObj evtObj) { } public void onafterprint(UnsafeNativeMethods.IHTMLEventObj evtObj) { } } ///[To be supplied.] ////// HtmlWindowShim - this is the glue between the DOM eventing mechanisms /// and our CLR callbacks. /// /// There are two kinds of events: HTMLWindowEvents2 and IHtmlWindow3.AttachHandler style /// HTMLWindowEvents2: we create an IConnectionPoint (via ConnectionPointCookie) between us and MSHTML and it calls back /// on an instance of HTMLWindowEvents2. The HTMLWindowEvents2 class then fires the event. /// /// IHTMLWindow3.AttachHandler: MSHML calls back on an HtmlToClrEventProxy that we've created, looking /// for a method named DISPID=0. For each event that's subscribed, we create /// a new HtmlToClrEventProxy, detect the callback and fire the corresponding /// CLR event. /// internal class HtmlWindowShim : HtmlShim { private AxHost.ConnectionPointCookie cookie; private HtmlWindow htmlWindow; public HtmlWindowShim(HtmlWindow window) { this.htmlWindow = window; } public UnsafeNativeMethods.IHTMLWindow2 NativeHtmlWindow { get { return htmlWindow.NativeHtmlWindow; } } public override UnsafeNativeMethods.IHTMLWindow2 AssociatedWindow { get { return htmlWindow.NativeHtmlWindow; } } /// Support IHtmlDocument3.AttachHandler public override void AttachEventHandler(string eventName, System.EventHandler eventHandler) { // IE likes to call back on an IDispatch of DISPID=0 when it has an event, // the HtmlToClrEventProxy helps us fake out the CLR so that we can call back on // our EventHandler properly. HtmlToClrEventProxy proxy = AddEventProxy(eventName, eventHandler); bool success = ((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).AttachEvent(eventName, proxy); Debug.Assert(success, "failed to add event"); } /// Support HTMLWindowEvents2 public override void ConnectToEvents() { if (cookie == null || !cookie.Connected) { this.cookie = new AxHost.ConnectionPointCookie(NativeHtmlWindow, new HTMLWindowEvents2(htmlWindow), typeof(UnsafeNativeMethods.DHTMLWindowEvents2), /*throwException*/ false); if (!cookie.Connected) { cookie = null; } } } /// Support IHTMLWindow3.DetachHandler public override void DetachEventHandler(string eventName, System.EventHandler eventHandler) { HtmlToClrEventProxy proxy = RemoveEventProxy(eventHandler); if (proxy != null) { ((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).DetachEvent(eventName, proxy); } } public override void DisconnectFromEvents() { if (this.cookie != null) { this.cookie.Disconnect(); this.cookie = null; } } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { if (htmlWindow != null && htmlWindow.NativeHtmlWindow != null) { Marshal.FinalReleaseComObject(htmlWindow.NativeHtmlWindow); } htmlWindow = null; } } protected override object GetEventSender() { return htmlWindow; } public void OnWindowUnload() { if (htmlWindow != null) { htmlWindow.ShimManager.OnWindowUnloaded(htmlWindow); } } } #region operators ///[SuppressMessage("Microsoft.Design", "CA1046:DoNotOverrideOperatorEqualsOnReferenceTypes")] public static bool operator ==(HtmlWindow left, HtmlWindow right) { //Not equal if only one's null. if (object.ReferenceEquals(left, null) != object.ReferenceEquals(right, null)) { return false; } //Equal if both are null. if (object.ReferenceEquals(left, null)) { return true; } //Neither are null. Get the IUnknowns and compare them. IntPtr leftPtr = IntPtr.Zero; IntPtr rightPtr = IntPtr.Zero; try { leftPtr = Marshal.GetIUnknownForObject(left.NativeHtmlWindow); rightPtr = Marshal.GetIUnknownForObject(right.NativeHtmlWindow); return leftPtr == rightPtr; } finally { if (leftPtr != IntPtr.Zero) { Marshal.Release(leftPtr); } if (rightPtr != IntPtr.Zero) { Marshal.Release(rightPtr); } } } /// public static bool operator !=(HtmlWindow left, HtmlWindow right) { return !(left == right); } /// public override int GetHashCode() { return htmlWindow2 == null ? 0 : htmlWindow2.GetHashCode(); } /// public override bool Equals(object obj) { return (this == (HtmlWindow)obj); } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Drawing; using System.Drawing.Printing; using System.IO; using System.Net; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; namespace System.Windows.Forms { ////// /// [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] public sealed class HtmlWindow { internal static readonly object EventError = new object(); internal static readonly object EventGotFocus = new object(); internal static readonly object EventLoad = new object(); internal static readonly object EventLostFocus = new object(); internal static readonly object EventResize = new object(); internal static readonly object EventScroll = new object(); internal static readonly object EventUnload = new object(); private HtmlShimManager shimManager; private UnsafeNativeMethods.IHTMLWindow2 htmlWindow2; [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] internal HtmlWindow(HtmlShimManager shimManager, UnsafeNativeMethods.IHTMLWindow2 win) { this.htmlWindow2 = win; Debug.Assert(this.NativeHtmlWindow != null, "The window object should implement IHTMLWindow2"); this.shimManager = shimManager; } internal UnsafeNativeMethods.IHTMLWindow2 NativeHtmlWindow { get { return this.htmlWindow2; } } private HtmlShimManager ShimManager { get { return shimManager; } } private HtmlWindowShim WindowShim { get { if (ShimManager != null) { HtmlWindowShim shim = ShimManager.GetWindowShim(this); if (shim == null) { shimManager.AddWindowShim(this); shim = ShimManager.GetWindowShim(this); } return shim; } return null; } } ///[To be supplied.] ////// /// public HtmlDocument Document { get { UnsafeNativeMethods.IHTMLDocument iHTMLDocument = this.NativeHtmlWindow.GetDocument() as UnsafeNativeMethods.IHTMLDocument; return iHTMLDocument != null ? new HtmlDocument(ShimManager, iHTMLDocument) : null; } } ///[To be supplied.] ////// /// public object DomWindow { get { return this.NativeHtmlWindow; } } ///[To be supplied.] ////// /// public HtmlWindowCollection Frames { get { UnsafeNativeMethods.IHTMLFramesCollection2 iHTMLFramesCollection2 = this.NativeHtmlWindow.GetFrames(); return (iHTMLFramesCollection2 != null) ? new HtmlWindowCollection(ShimManager, iHTMLFramesCollection2) : null; } } ///[To be supplied.] ////// /// public HtmlHistory History { get { UnsafeNativeMethods.IOmHistory iOmHistory = this.NativeHtmlWindow.GetHistory(); return iOmHistory != null ? new HtmlHistory(iOmHistory) : null; } } ///[To be supplied.] ////// /// public bool IsClosed { get { return this.NativeHtmlWindow.GetClosed(); } } ///[To be supplied.] ////// /// public string Name { get { return this.NativeHtmlWindow.GetName(); } set { this.NativeHtmlWindow.SetName(value); } } ///Name of the NativeHtmlWindow ////// /// public HtmlWindow Opener { get { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.GetOpener() as UnsafeNativeMethods.IHTMLWindow2; return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } } ///[To be supplied.] ////// /// public HtmlWindow Parent { get { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.GetParent(); return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } } ///[To be supplied.] ////// /// public Point Position { get { return new Point(((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).GetScreenLeft(), ((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).GetScreenTop()); } } ///[To be supplied.] ////// /// public Size Size { get { UnsafeNativeMethods.IHTMLElement bodyElement = this.NativeHtmlWindow.GetDocument().GetBody(); return new Size(bodyElement.GetOffsetWidth(), bodyElement.GetOffsetHeight()); } set { ResizeTo(value.Width, value.Height); } } ///Gets or sets size for the window ////// /// public string StatusBarText { get { return this.NativeHtmlWindow.GetStatus(); } set { this.NativeHtmlWindow.SetStatus(value); } } ///[To be supplied.] ////// /// public Uri Url { get { UnsafeNativeMethods.IHTMLLocation iHtmlLocation = this.NativeHtmlWindow.GetLocation(); string stringLocation = (iHtmlLocation == null) ? "" : iHtmlLocation.GetHref(); return string.IsNullOrEmpty(stringLocation) ? null : new Uri(stringLocation); } } ///[To be supplied.] ////// /// public HtmlElement WindowFrameElement { get { UnsafeNativeMethods.IHTMLElement htmlElement = ((UnsafeNativeMethods.IHTMLWindow4)this.NativeHtmlWindow).frameElement() as UnsafeNativeMethods.IHTMLElement; return (htmlElement != null) ? new HtmlElement(ShimManager, htmlElement) : null; } } ///[To be supplied.] ////// /// public void Alert(string message) { this.NativeHtmlWindow.Alert(message); } ///[To be supplied.] ////// /// public void AttachEventHandler(string eventName, EventHandler eventHandler) { WindowShim.AttachEventHandler(eventName, eventHandler); } ///[To be supplied.] ////// /// public void Close() { this.NativeHtmlWindow.Close(); } ///[To be supplied.] ////// /// public bool Confirm(string message) { return this.NativeHtmlWindow.Confirm(message); } ///[To be supplied.] ////// /// public void DetachEventHandler(string eventName, EventHandler eventHandler) { WindowShim.DetachEventHandler(eventName, eventHandler); } ///[To be supplied.] ////// /// public void Focus() { this.NativeHtmlWindow.Focus(); } ///[To be supplied.] ////// /// public void MoveTo(int x, int y) { this.NativeHtmlWindow.MoveTo(x, y); } ///Moves the Window to the position requested ////// /// public void MoveTo(Point point) { this.NativeHtmlWindow.MoveTo(point.X, point.Y); } ///Moves the Window to the point requested ////// /// public void Navigate(Uri url) { this.NativeHtmlWindow.Navigate(url.ToString()); } ///[To be supplied.] ////// /// /// Note: We intentionally have a string overload (apparently Mort wants one). We don't have /// string overloads call Uri overloads because that breaks Uris that aren't fully qualified /// (things like "www.microsoft.com") that the underlying objects support and we don't want to /// break. [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads")] public void Navigate(string urlString) { this.NativeHtmlWindow.Navigate(urlString); } ///[To be supplied.] ////// /// /// Note: We intentionally have a string overload (apparently Mort wants one). We don't have /// string overloads call Uri overloads because that breaks Uris that aren't fully qualified /// (things like "www.microsoft.com") that the underlying objects support and we don't want to /// break. [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads")] public HtmlWindow Open(string urlString, string target, string windowOptions, bool replaceEntry) { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.Open(urlString, target, windowOptions, replaceEntry); return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } ///[To be supplied.] ////// /// [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings")] public HtmlWindow Open(Uri url, string target, string windowOptions, bool replaceEntry) { return Open(url.ToString(), target, windowOptions, replaceEntry); } ///[To be supplied.] ////// /// /// Note: We intentionally have a string overload (apparently Mort wants one). We don't have /// string overloads call Uri overloads because that breaks Uris that aren't fully qualified /// (things like "www.microsoft.com") that the underlying objects support and we don't want to /// break. [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads")] public HtmlWindow OpenNew(string urlString, string windowOptions) { UnsafeNativeMethods.IHTMLWindow2 iHTMLWindow2 = this.NativeHtmlWindow.Open(urlString, "_blank", windowOptions, true); return (iHTMLWindow2 != null) ? new HtmlWindow(ShimManager, iHTMLWindow2) : null; } ///[To be supplied.] ////// /// [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings")] public HtmlWindow OpenNew(Uri url, string windowOptions) { return OpenNew(url.ToString(), windowOptions); } ///[To be supplied.] ////// /// public string Prompt(string message, string defaultInputValue) { return this.NativeHtmlWindow.Prompt(message, defaultInputValue).ToString(); } ///[To be supplied.] ////// /// public void RemoveFocus() { this.NativeHtmlWindow.Blur(); } ///[To be supplied.] ////// /// public void ResizeTo(int width, int height) { this.NativeHtmlWindow.ResizeTo(width, height); } ///Resize the window to the width/height requested ////// public void ResizeTo(Size size) { this.NativeHtmlWindow.ResizeTo(size.Width, size.Height); } ///Resize the window to the Size requested ////// /// public void ScrollTo(int x, int y) { this.NativeHtmlWindow.ScrollTo(x, y); } ///Scroll the window to the position requested ////// /// public void ScrollTo(Point point) { this.NativeHtmlWindow.ScrollTo(point.X, point.Y); } // // Events // ///Scroll the window to the point requested ////// /// public event HtmlElementErrorEventHandler Error { add { WindowShim.AddHandler(EventError, value); } remove { WindowShim.RemoveHandler(EventError, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler GotFocus { add { WindowShim.AddHandler(EventGotFocus, value); } remove { WindowShim.RemoveHandler(EventGotFocus, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Load { add { WindowShim.AddHandler(EventLoad, value); } remove { WindowShim.RemoveHandler(EventLoad, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler LostFocus { add { WindowShim.AddHandler(EventLostFocus, value); } remove { WindowShim.RemoveHandler(EventLostFocus, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Resize { add { WindowShim.AddHandler(EventResize, value); } remove { WindowShim.RemoveHandler(EventResize, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Scroll { add { WindowShim.AddHandler(EventScroll, value); } remove { WindowShim.RemoveHandler(EventScroll, value); } } ///[To be supplied.] ////// /// public event HtmlElementEventHandler Unload { add { WindowShim.AddHandler(EventUnload, value); } remove { WindowShim.RemoveHandler(EventUnload, value); } } // // Private classes: // [ClassInterface(ClassInterfaceType.None)] private class HTMLWindowEvents2 : StandardOleMarshalObject, /*Enforce calling back on the same thread*/ UnsafeNativeMethods.DHTMLWindowEvents2 { private HtmlWindow parent; public HTMLWindowEvents2(HtmlWindow htmlWindow) { this.parent = htmlWindow; } private void FireEvent(object key, EventArgs e) { if (this.parent != null) { parent.WindowShim.FireEvent(key, e); } } public void onfocus(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventGotFocus, e); } public void onblur(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventLostFocus, e); } public bool onerror(string description, string urlString, int line) { HtmlElementErrorEventArgs e = new HtmlElementErrorEventArgs(description, urlString, line); FireEvent(HtmlWindow.EventError, e); return e.Handled; } public void onload(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventLoad, e); } public void onunload(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventUnload, e); if (parent != null) { parent.WindowShim.OnWindowUnload(); } } public void onscroll(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventScroll, e); } public void onresize(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); FireEvent(HtmlWindow.EventResize, e); } public bool onhelp(UnsafeNativeMethods.IHTMLEventObj evtObj) { HtmlElementEventArgs e = new HtmlElementEventArgs(parent.ShimManager, evtObj); return e.ReturnValue; } public void onbeforeunload(UnsafeNativeMethods.IHTMLEventObj evtObj) { } public void onbeforeprint(UnsafeNativeMethods.IHTMLEventObj evtObj) { } public void onafterprint(UnsafeNativeMethods.IHTMLEventObj evtObj) { } } ///[To be supplied.] ////// HtmlWindowShim - this is the glue between the DOM eventing mechanisms /// and our CLR callbacks. /// /// There are two kinds of events: HTMLWindowEvents2 and IHtmlWindow3.AttachHandler style /// HTMLWindowEvents2: we create an IConnectionPoint (via ConnectionPointCookie) between us and MSHTML and it calls back /// on an instance of HTMLWindowEvents2. The HTMLWindowEvents2 class then fires the event. /// /// IHTMLWindow3.AttachHandler: MSHML calls back on an HtmlToClrEventProxy that we've created, looking /// for a method named DISPID=0. For each event that's subscribed, we create /// a new HtmlToClrEventProxy, detect the callback and fire the corresponding /// CLR event. /// internal class HtmlWindowShim : HtmlShim { private AxHost.ConnectionPointCookie cookie; private HtmlWindow htmlWindow; public HtmlWindowShim(HtmlWindow window) { this.htmlWindow = window; } public UnsafeNativeMethods.IHTMLWindow2 NativeHtmlWindow { get { return htmlWindow.NativeHtmlWindow; } } public override UnsafeNativeMethods.IHTMLWindow2 AssociatedWindow { get { return htmlWindow.NativeHtmlWindow; } } /// Support IHtmlDocument3.AttachHandler public override void AttachEventHandler(string eventName, System.EventHandler eventHandler) { // IE likes to call back on an IDispatch of DISPID=0 when it has an event, // the HtmlToClrEventProxy helps us fake out the CLR so that we can call back on // our EventHandler properly. HtmlToClrEventProxy proxy = AddEventProxy(eventName, eventHandler); bool success = ((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).AttachEvent(eventName, proxy); Debug.Assert(success, "failed to add event"); } /// Support HTMLWindowEvents2 public override void ConnectToEvents() { if (cookie == null || !cookie.Connected) { this.cookie = new AxHost.ConnectionPointCookie(NativeHtmlWindow, new HTMLWindowEvents2(htmlWindow), typeof(UnsafeNativeMethods.DHTMLWindowEvents2), /*throwException*/ false); if (!cookie.Connected) { cookie = null; } } } /// Support IHTMLWindow3.DetachHandler public override void DetachEventHandler(string eventName, System.EventHandler eventHandler) { HtmlToClrEventProxy proxy = RemoveEventProxy(eventHandler); if (proxy != null) { ((UnsafeNativeMethods.IHTMLWindow3)this.NativeHtmlWindow).DetachEvent(eventName, proxy); } } public override void DisconnectFromEvents() { if (this.cookie != null) { this.cookie.Disconnect(); this.cookie = null; } } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { if (htmlWindow != null && htmlWindow.NativeHtmlWindow != null) { Marshal.FinalReleaseComObject(htmlWindow.NativeHtmlWindow); } htmlWindow = null; } } protected override object GetEventSender() { return htmlWindow; } public void OnWindowUnload() { if (htmlWindow != null) { htmlWindow.ShimManager.OnWindowUnloaded(htmlWindow); } } } #region operators ///[SuppressMessage("Microsoft.Design", "CA1046:DoNotOverrideOperatorEqualsOnReferenceTypes")] public static bool operator ==(HtmlWindow left, HtmlWindow right) { //Not equal if only one's null. if (object.ReferenceEquals(left, null) != object.ReferenceEquals(right, null)) { return false; } //Equal if both are null. if (object.ReferenceEquals(left, null)) { return true; } //Neither are null. Get the IUnknowns and compare them. IntPtr leftPtr = IntPtr.Zero; IntPtr rightPtr = IntPtr.Zero; try { leftPtr = Marshal.GetIUnknownForObject(left.NativeHtmlWindow); rightPtr = Marshal.GetIUnknownForObject(right.NativeHtmlWindow); return leftPtr == rightPtr; } finally { if (leftPtr != IntPtr.Zero) { Marshal.Release(leftPtr); } if (rightPtr != IntPtr.Zero) { Marshal.Release(rightPtr); } } } /// public static bool operator !=(HtmlWindow left, HtmlWindow right) { return !(left == right); } /// public override int GetHashCode() { return htmlWindow2 == null ? 0 : htmlWindow2.GetHashCode(); } /// public override bool Equals(object obj) { return (this == (HtmlWindow)obj); } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SrgsText.cs
- xsdvalidator.cs
- IODescriptionAttribute.cs
- RemotingHelper.cs
- CqlLexer.cs
- EntityTypeEmitter.cs
- AsyncStreamReader.cs
- CodeTypeReferenceExpression.cs
- MailDefinition.cs
- RoleManagerEventArgs.cs
- SoapClientMessage.cs
- ReadOnlyCollection.cs
- ReachBasicContext.cs
- DisplayNameAttribute.cs
- FrameSecurityDescriptor.cs
- PointAnimationUsingPath.cs
- ConfigXmlAttribute.cs
- PartialTrustVisibleAssembly.cs
- NamespaceQuery.cs
- SimpleMailWebEventProvider.cs
- BamlResourceContent.cs
- RotateTransform3D.cs
- LocalizationComments.cs
- StrongNameUtility.cs
- EntityClassGenerator.cs
- DataGridViewRowConverter.cs
- XmlIterators.cs
- WebPageTraceListener.cs
- DefaultTraceListener.cs
- SqlUDTStorage.cs
- DataServiceCollectionOfT.cs
- ListViewInsertionMark.cs
- FieldBuilder.cs
- LookupNode.cs
- DriveInfo.cs
- LeaseManager.cs
- JsonObjectDataContract.cs
- ListViewItemMouseHoverEvent.cs
- DiagnosticEventProvider.cs
- RuntimeCompatibilityAttribute.cs
- DoubleLink.cs
- AxHost.cs
- TableSectionStyle.cs
- COSERVERINFO.cs
- CompositeCollection.cs
- _SslState.cs
- DbDataAdapter.cs
- OleDbInfoMessageEvent.cs
- ServiceOperationParameter.cs
- DeclarativeCatalogPart.cs
- TreeView.cs
- WebPartsSection.cs
- ArgumentNullException.cs
- DataGridBoolColumn.cs
- DetailsViewDesigner.cs
- WsdlContractConversionContext.cs
- MembershipPasswordException.cs
- ScrollableControl.cs
- ProfileManager.cs
- FilteredXmlReader.cs
- SqlUdtInfo.cs
- ToolStripDropTargetManager.cs
- OutputCacheSettingsSection.cs
- AutomationIdentifier.cs
- XmlAttributes.cs
- PartialCachingAttribute.cs
- EditingCoordinator.cs
- XmlDataCollection.cs
- DeflateEmulationStream.cs
- DbCommandDefinition.cs
- Vector3DIndependentAnimationStorage.cs
- Literal.cs
- Form.cs
- InternalControlCollection.cs
- ImpersonationContext.cs
- PKCS1MaskGenerationMethod.cs
- DocumentViewerHelper.cs
- PlainXmlSerializer.cs
- XmlNamespaceMappingCollection.cs
- ObjectItemCollectionAssemblyCacheEntry.cs
- VirtualizedCellInfoCollection.cs
- SqlCommand.cs
- UndoManager.cs
- TypeUtils.cs
- DocumentAutomationPeer.cs
- ConfigXmlText.cs
- ObjectDataSourceStatusEventArgs.cs
- MemberBinding.cs
- PackageStore.cs
- CategoryState.cs
- GPStream.cs
- ProxyAttribute.cs
- ObjectContextServiceProvider.cs
- LocatorGroup.cs
- PlatformCulture.cs
- RelationshipEndCollection.cs
- AssociationSetEnd.cs
- HttpChannelHelper.cs
- OrderedHashRepartitionEnumerator.cs
- GenericEnumerator.cs