1 //----------------------------------------------------------------------
3 // Copyright (c) Microsoft Corporation.
4 // All rights reserved.
6 // This code is licensed under the MIT License.
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files(the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions :
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26 //------------------------------------------------------------------------------
29 using System.Collections.Generic;
30 using System.Runtime.InteropServices;
31 using System.Windows.Forms;
33 namespace Microsoft.IdentityModel.Clients.ActiveDirectory.Internal
35 internal partial class CustomWebBrowser : WebBrowser
37 private const int S_OK = 0;
38 private const int S_FALSE = 1;
39 private const int WM_CHAR = 0x102;
41 private AxHost.ConnectionPointCookie webBrowserEventCookie;
42 private CustomWebBrowserEvent webBrowserEvent;
43 private static readonly HashSet<Shortcut> shortcutBlacklist = new HashSet<Shortcut>();
45 static CustomWebBrowser()
47 shortcutBlacklist.Add(Shortcut.AltBksp);
48 shortcutBlacklist.Add(Shortcut.AltDownArrow);
49 shortcutBlacklist.Add(Shortcut.AltLeftArrow);
50 shortcutBlacklist.Add(Shortcut.AltRightArrow);
51 shortcutBlacklist.Add(Shortcut.AltUpArrow);
54 [ComVisible(true), ComDefaultInterface(typeof(NativeWrapper.IDocHostUIHandler))]
55 protected class CustomSite : WebBrowserSite, NativeWrapper.IDocHostUIHandler, ICustomQueryInterface
57 private const int NotImplemented = -2147467263;
59 private readonly WebBrowser host;
61 public CustomSite(WebBrowser host)
68 public int EnableModeless(bool fEnable)
70 return NotImplemented;
73 public int FilterDataObject(System.Runtime.InteropServices.ComTypes.IDataObject pDO, out System.Runtime.InteropServices.ComTypes.IDataObject ppDORet)
79 public int GetDropTarget(NativeWrapper.IOleDropTarget pDropTarget, out NativeWrapper.IOleDropTarget ppDropTarget)
85 public int GetExternal(out object ppDispatch)
87 ppDispatch = this.host.ObjectForScripting;
90 public int GetHostInfo(NativeWrapper.DOCHOSTUIINFO info)
92 const int DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION = 0x4000000;
93 const int DOCHOSTUIFLAG_NO3DOUTERBORDER = 0x0020000;
94 const int DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE = 0x00000010;
95 const int DOCHOSTUIFLAG_NOTHEME = 0x00080000;
96 const int DOCHOSTUIFLAG_SCROLL_NO = 0x00000008;
97 const int DOCHOSTUIFLAG_FLAT_SCROLLBAR = 0x00000080;
98 const int DOCHOSTUIFLAG_THEME = 0x00040000;
99 const int DOCHOSTUIFLAG_DPI_AWARE = 0x40000000;
101 info.dwDoubleClick = 0;
102 info.dwFlags = DOCHOSTUIFLAG_NO3DOUTERBORDER | DOCHOSTUIFLAG_DISABLE_SCRIPT_INACTIVE;
104 if (NativeWrapper.NativeMethods.IsProcessDPIAware())
106 info.dwFlags |= DOCHOSTUIFLAG_DPI_AWARE;
109 if (this.host.ScrollBarsEnabled)
111 info.dwFlags |= DOCHOSTUIFLAG_FLAT_SCROLLBAR;
115 info.dwFlags |= DOCHOSTUIFLAG_SCROLL_NO;
117 if (Application.RenderWithVisualStyles)
119 info.dwFlags |= DOCHOSTUIFLAG_THEME;
123 info.dwFlags |= DOCHOSTUIFLAG_NOTHEME;
126 info.dwFlags |= DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION;
130 public int GetOptionKeyPath(string[] pbstrKey, int dw)
132 return NotImplemented;
137 return NotImplemented;
140 public int OnDocWindowActivate(bool fActivate)
142 return NotImplemented;
145 public int OnFrameWindowActivate(bool fActivate)
147 return NotImplemented;
150 public int ResizeBorder(NativeWrapper.COMRECT rect, NativeWrapper.IOleInPlaceUIWindow doc, bool fFrameWindow)
152 return NotImplemented;
155 public int ShowContextMenu(int dwID, NativeWrapper.POINT pt, object pcmdtReserved, object pdispReserved)
159 // http://msdn.microsoft.com/en-us/library/aa753264(v=vs.85).aspx
160 case 0x2: // this is edit CONTEXT_MENU_CONTROL
161 case 0x4: // selected text CONTEXT_MENU_TEXTSELECT
162 case 0x9: // CONTEXT_MENU_VSCROLL
163 case 0x10: //CONTEXT_MENU_HSCROLL
164 return S_FALSE; // allow to show menu; Host did not display its UI. MSHTML will display its UI.
170 public int ShowUI(int dwID, NativeWrapper.IOleInPlaceActiveObject activeObject, NativeWrapper.IOleCommandTarget commandTarget, NativeWrapper.IOleInPlaceFrame frame, NativeWrapper.IOleInPlaceUIWindow doc)
175 public int TranslateAccelerator(ref NativeWrapper.MSG msg, ref Guid group, int nCmdID)
177 if (msg.message != WM_CHAR)
179 if (ModifierKeys == Keys.Shift || ModifierKeys == Keys.Alt || ModifierKeys == Keys.Control)
181 int num = ((int) msg.wParam) | (int) ModifierKeys;
182 Shortcut s = (Shortcut) num;
183 if (shortcutBlacklist.Contains(s))
193 public int TranslateUrl(int dwTranslate, string strUrlIn, out string pstrUrlOut)
199 public int UpdateUI()
201 return NotImplemented;
204 #region ICustomQueryInterface Members
206 public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
209 if (iid == typeof(NativeWrapper.IDocHostUIHandler).GUID)
211 ppv = Marshal.GetComInterfaceForObject(this, typeof(NativeWrapper.IDocHostUIHandler), CustomQueryInterfaceMode.Ignore);
212 return CustomQueryInterfaceResult.Handled;
214 return CustomQueryInterfaceResult.NotHandled;
220 protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
222 return new CustomSite(this);
225 protected override void CreateSink()
229 object activeXInstance = this.ActiveXInstance;
230 if (activeXInstance != null)
232 this.webBrowserEvent = new CustomWebBrowserEvent(this);
233 this.webBrowserEventCookie = new AxHost.ConnectionPointCookie(activeXInstance, this.webBrowserEvent, typeof(NativeWrapper.DWebBrowserEvents2));
238 protected override void DetachSink()
240 if (this.webBrowserEventCookie != null)
242 this.webBrowserEventCookie.Disconnect();
243 this.webBrowserEventCookie = null;
249 protected virtual void OnNavigateError(WebBrowserNavigateErrorEventArgs e)
251 if (NavigateError != null)
253 this.NavigateError(this, e);
258 public event WebBrowserNavigateErrorEventHandler NavigateError;
262 /// Delegate to handle navifation errors in the browser control
264 /// <param name="sender">object type</param>
265 /// <param name="e">WebBrowserNavigateErrorEventArgs type</param>
266 public delegate void WebBrowserNavigateErrorEventHandler(object sender, WebBrowserNavigateErrorEventArgs e);