Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / System / Windows / Interop / BrowserInteropHelper.cs / 1 / BrowserInteropHelper.cs
//----------------------------------------------------------------------------
//
// File: BrowserInteropHelper.cs
//
// Description: Implements Avalon BrowserInteropHelper class, which helps
// interop with the browser
//
// Created: 08/02/05
//
// Copyright (C) by Microsoft Corporation. All rights reserved.
//
//---------------------------------------------------------------------------
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Threading;
using System.Security;
using System.Security.Permissions;
using System.Diagnostics;
using MS.Internal;
using MS.Internal.PresentationFramework; // SecurityHelper
using MS.Win32;
using System.Windows.Input;
using MS.Internal.AppModel;
namespace System.Windows.Interop
{
///
/// Implements Avalon BrowserInteropHelper, which helps interop with the browser
///
public static class BrowserInteropHelper
{
///
/// Critical because it sets critical data.
/// Safe because it is the static ctor, and the data doesn't go anywhere.
///
[SecurityCritical, SecurityTreatAsSafe]
static BrowserInteropHelper()
{
SetBrowserHosted(false);
IsInitialViewerNavigation = true;
}
///
/// Returns the IOleClientSite interface
///
///
/// Callers must have UnmanagedCode permission to call this API.
///
///
/// Critical: Exposes a COM interface pointer to the IOleClientSite where the app is hosted
/// PublicOK: It is public, but there is a demand
///
public static object ClientSite
{
[SecurityCritical]
get
{
SecurityHelper.DemandUnmanagedCode();
object oleClientSite = null;
if (IsBrowserHosted)
{
Application.Current.BrowserCallbackServices.GetOleClientSite(out oleClientSite);
}
return oleClientSite;
}
}
///
/// Returns true if the app is a browser hosted app.
///
public static bool IsBrowserHosted
{
get
{
return _isBrowserHosted.Value;
}
}
///
/// This is critical because setting the BrowserHosted status is a critical resource.
///
[SecurityCritical]
internal static void SetBrowserHosted(bool value)
{
_isBrowserHosted.Value = value;
}
///
/// Returns the Uri used to launch the application.
///
public static Uri Source
{
get
{
return _source.Value;
}
}
///
/// Sets the Source URI
///
///
/// Critical: critical because setting the source is critical.
///
[SecurityCritical]
internal static void SetSource(Uri source)
{
_source.Value = source;
}
///
/// Returns true if we are running the XAML viewer pseudo-application (what used to be XamlViewer.xbap).
/// This explicitly does not cover the case of XPS documents (MimeType.Document).
///
internal static bool IsViewer
{
get
{
Application app = Application.Current;
return app != null && app.MimeType == MimeType.Markup;
}
}
///
/// Returns true if avalon it top level.
/// Also returns true if not browser-hosted.
///
///
/// Critical: Calls the SUCd IBrowserCallbackServices.IsAvalonTopLevel().
/// Safe: This is okay to dislose.
///
internal static bool IsAvalonTopLevel
{
[SecurityCritical, SecurityTreatAsSafe]
get
{
if (!IsBrowserHosted)
return true;
IBrowserCallbackServices bcs = Application.Current.BrowserCallbackServices;
return bcs != null && bcs.IsAvalonTopLevel();
}
}
///
/// Returns true if we are in viewer mode AND this is the first time that a viewer has been navigated.
/// Including IsViewer is defense-in-depth in case somebody forgets to check IsViewer. There are other
/// reasons why both IsViewer and IsViewerNavigation are necessary, however.
///
///
/// Critical: setting this information is a critical resource.
///
internal static bool IsInitialViewerNavigation
{
get
{
return IsViewer && _isInitialViewerNavigation.Value;
}
[SecurityCritical]
set
{
_isInitialViewerNavigation.Value = value;
}
}
///
/// Critical: this calls ForwardTranslateAccelerator, which is SUC'ed.
///
[SecurityCritical]
private static void HostFilterInput(ref MSG msg, ref bool handled)
{
// The host gets to see input, keyboard and mouse messages.
if (msg.message == MS.Win32.NativeMethods.WM_INPUT ||
(msg.message >= MS.Win32.NativeMethods.WM_KEYFIRST && msg.message <= MS.Win32.NativeMethods.WM_IME_KEYLAST) ||
(msg.message >= MS.Win32.NativeMethods.WM_MOUSEFIRST && msg.message <= MS.Win32.NativeMethods.WM_MOUSELAST))
{
if (MS.Win32.NativeMethods.S_OK == ForwardTranslateAccelerator(ref msg, false))
{
handled = true;
}
}
}
/// This hook gets a "last chance" to handle a key. Such applicaton-unhandled
/// keys are forwarded to the browser frame.
///
///
/// Critical: this calls ForwardTranslateAccelerator, which is SUC'ed.
///
[SecurityCritical]
internal static IntPtr PostFilterInput(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (!handled)
{
if (msg >= MS.Win32.NativeMethods.WM_KEYFIRST && msg <= MS.Win32.NativeMethods.WM_IME_KEYLAST)
{
MSG m = new MSG(hwnd, msg, wParam, lParam, SafeNativeMethods.GetMessageTime(), 0, 0);
if (MS.Win32.NativeMethods.S_OK == ForwardTranslateAccelerator(ref m, true))
{
handled = true;
}
}
}
return IntPtr.Zero;
}
///
/// Critical: this attaches an event to ThreadFilterMessage, which requires an assert
/// Safe: doesn't expose anything, just does some internal plumbing stuff
///
[SecurityCritical, SecurityTreatAsSafe]
internal static void InitializeHostFilterInput()
{
(new UIPermission(PermissionState.Unrestricted)).Assert(); // Blessed assert
try
{
ComponentDispatcher.ThreadFilterMessage +=
new ThreadMessageEventHandler(HostFilterInput);
}
finally
{
UIPermission.RevertAssert();
}
}
private static SecurityCriticalDataForSet _isBrowserHosted;
internal static SecurityCriticalDataForSet IsBrowserLowIntegrityProcess;
private static SecurityCriticalDataForSet _isInitialViewerNavigation;
private static SecurityCriticalDataForSet _source;
///
/// Critical - call is SUC'ed
///
[SecurityCritical, SuppressUnmanagedCodeSecurity]
[DllImport("PresentationHostDLL.dll", EntryPoint = "ForwardTranslateAccelerator")]
private static extern int ForwardTranslateAccelerator(ref MSG pMsg, bool appUnhandled);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
// File: BrowserInteropHelper.cs
//
// Description: Implements Avalon BrowserInteropHelper class, which helps
// interop with the browser
//
// Created: 08/02/05
//
// Copyright (C) by Microsoft Corporation. All rights reserved.
//
//---------------------------------------------------------------------------
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Threading;
using System.Security;
using System.Security.Permissions;
using System.Diagnostics;
using MS.Internal;
using MS.Internal.PresentationFramework; // SecurityHelper
using MS.Win32;
using System.Windows.Input;
using MS.Internal.AppModel;
namespace System.Windows.Interop
{
///
/// Implements Avalon BrowserInteropHelper, which helps interop with the browser
///
public static class BrowserInteropHelper
{
///
/// Critical because it sets critical data.
/// Safe because it is the static ctor, and the data doesn't go anywhere.
///
[SecurityCritical, SecurityTreatAsSafe]
static BrowserInteropHelper()
{
SetBrowserHosted(false);
IsInitialViewerNavigation = true;
}
///
/// Returns the IOleClientSite interface
///
///
/// Callers must have UnmanagedCode permission to call this API.
///
///
/// Critical: Exposes a COM interface pointer to the IOleClientSite where the app is hosted
/// PublicOK: It is public, but there is a demand
///
public static object ClientSite
{
[SecurityCritical]
get
{
SecurityHelper.DemandUnmanagedCode();
object oleClientSite = null;
if (IsBrowserHosted)
{
Application.Current.BrowserCallbackServices.GetOleClientSite(out oleClientSite);
}
return oleClientSite;
}
}
///
/// Returns true if the app is a browser hosted app.
///
public static bool IsBrowserHosted
{
get
{
return _isBrowserHosted.Value;
}
}
///
/// This is critical because setting the BrowserHosted status is a critical resource.
///
[SecurityCritical]
internal static void SetBrowserHosted(bool value)
{
_isBrowserHosted.Value = value;
}
///
/// Returns the Uri used to launch the application.
///
public static Uri Source
{
get
{
return _source.Value;
}
}
///
/// Sets the Source URI
///
///
/// Critical: critical because setting the source is critical.
///
[SecurityCritical]
internal static void SetSource(Uri source)
{
_source.Value = source;
}
///
/// Returns true if we are running the XAML viewer pseudo-application (what used to be XamlViewer.xbap).
/// This explicitly does not cover the case of XPS documents (MimeType.Document).
///
internal static bool IsViewer
{
get
{
Application app = Application.Current;
return app != null && app.MimeType == MimeType.Markup;
}
}
///
/// Returns true if avalon it top level.
/// Also returns true if not browser-hosted.
///
///
/// Critical: Calls the SUCd IBrowserCallbackServices.IsAvalonTopLevel().
/// Safe: This is okay to dislose.
///
internal static bool IsAvalonTopLevel
{
[SecurityCritical, SecurityTreatAsSafe]
get
{
if (!IsBrowserHosted)
return true;
IBrowserCallbackServices bcs = Application.Current.BrowserCallbackServices;
return bcs != null && bcs.IsAvalonTopLevel();
}
}
///
/// Returns true if we are in viewer mode AND this is the first time that a viewer has been navigated.
/// Including IsViewer is defense-in-depth in case somebody forgets to check IsViewer. There are other
/// reasons why both IsViewer and IsViewerNavigation are necessary, however.
///
///
/// Critical: setting this information is a critical resource.
///
internal static bool IsInitialViewerNavigation
{
get
{
return IsViewer && _isInitialViewerNavigation.Value;
}
[SecurityCritical]
set
{
_isInitialViewerNavigation.Value = value;
}
}
///
/// Critical: this calls ForwardTranslateAccelerator, which is SUC'ed.
///
[SecurityCritical]
private static void HostFilterInput(ref MSG msg, ref bool handled)
{
// The host gets to see input, keyboard and mouse messages.
if (msg.message == MS.Win32.NativeMethods.WM_INPUT ||
(msg.message >= MS.Win32.NativeMethods.WM_KEYFIRST && msg.message <= MS.Win32.NativeMethods.WM_IME_KEYLAST) ||
(msg.message >= MS.Win32.NativeMethods.WM_MOUSEFIRST && msg.message <= MS.Win32.NativeMethods.WM_MOUSELAST))
{
if (MS.Win32.NativeMethods.S_OK == ForwardTranslateAccelerator(ref msg, false))
{
handled = true;
}
}
}
/// This hook gets a "last chance" to handle a key. Such applicaton-unhandled
/// keys are forwarded to the browser frame.
///
///
/// Critical: this calls ForwardTranslateAccelerator, which is SUC'ed.
///
[SecurityCritical]
internal static IntPtr PostFilterInput(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (!handled)
{
if (msg >= MS.Win32.NativeMethods.WM_KEYFIRST && msg <= MS.Win32.NativeMethods.WM_IME_KEYLAST)
{
MSG m = new MSG(hwnd, msg, wParam, lParam, SafeNativeMethods.GetMessageTime(), 0, 0);
if (MS.Win32.NativeMethods.S_OK == ForwardTranslateAccelerator(ref m, true))
{
handled = true;
}
}
}
return IntPtr.Zero;
}
///
/// Critical: this attaches an event to ThreadFilterMessage, which requires an assert
/// Safe: doesn't expose anything, just does some internal plumbing stuff
///
[SecurityCritical, SecurityTreatAsSafe]
internal static void InitializeHostFilterInput()
{
(new UIPermission(PermissionState.Unrestricted)).Assert(); // Blessed assert
try
{
ComponentDispatcher.ThreadFilterMessage +=
new ThreadMessageEventHandler(HostFilterInput);
}
finally
{
UIPermission.RevertAssert();
}
}
private static SecurityCriticalDataForSet _isBrowserHosted;
internal static SecurityCriticalDataForSet IsBrowserLowIntegrityProcess;
private static SecurityCriticalDataForSet _isInitialViewerNavigation;
private static SecurityCriticalDataForSet _source;
///
/// Critical - call is SUC'ed
///
[SecurityCritical, SuppressUnmanagedCodeSecurity]
[DllImport("PresentationHostDLL.dll", EntryPoint = "ForwardTranslateAccelerator")]
private static extern int ForwardTranslateAccelerator(ref MSG pMsg, bool appUnhandled);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EditCommandColumn.cs
- AlternationConverter.cs
- Base64Encoder.cs
- ResponseBodyWriter.cs
- BooleanFunctions.cs
- SqlBulkCopy.cs
- RegexCode.cs
- Point3DValueSerializer.cs
- CodeStatement.cs
- DataGridRelationshipRow.cs
- MaterialCollection.cs
- AppAction.cs
- RealizationContext.cs
- control.ime.cs
- SchemaTableColumn.cs
- XmlBufferReader.cs
- WebPartHelpVerb.cs
- safex509handles.cs
- Figure.cs
- FormsAuthenticationCredentials.cs
- VisualProxy.cs
- EntitySetBaseCollection.cs
- UnionQueryOperator.cs
- HtmlTableCell.cs
- ScalarConstant.cs
- HttpCachePolicyElement.cs
- RealizationContext.cs
- Converter.cs
- WebHttpSecurity.cs
- EtwTrace.cs
- HttpStreamXmlDictionaryWriter.cs
- FeedUtils.cs
- MenuItemCollection.cs
- RegularExpressionValidator.cs
- SslStreamSecurityUpgradeProvider.cs
- _LoggingObject.cs
- controlskin.cs
- DbProviderFactory.cs
- MarginCollapsingState.cs
- ScriptMethodAttribute.cs
- DataSourceControlBuilder.cs
- ipaddressinformationcollection.cs
- ThreadStaticAttribute.cs
- DeferredRunTextReference.cs
- XsdDateTime.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- WindowsIPAddress.cs
- _NestedSingleAsyncResult.cs
- TypeLibConverter.cs
- SystemMulticastIPAddressInformation.cs
- NativeMsmqMessage.cs
- InvokeGenerator.cs
- Attributes.cs
- SplitterEvent.cs
- UnsafeNativeMethods.cs
- ConstrainedDataObject.cs
- Window.cs
- DbConnectionPoolIdentity.cs
- ObjectDataSource.cs
- Constants.cs
- WS2007FederationHttpBindingElement.cs
- ObjectMemberMapping.cs
- BamlLocalizabilityResolver.cs
- DataGridViewCellValidatingEventArgs.cs
- StreamGeometry.cs
- TextEditorCharacters.cs
- TemplateBuilder.cs
- ProviderBase.cs
- AccessibleObject.cs
- InternalReceiveMessage.cs
- commandenforcer.cs
- SourceInterpreter.cs
- OleDbDataAdapter.cs
- BlurEffect.cs
- CodeSnippetTypeMember.cs
- Array.cs
- OrderedDictionary.cs
- PinnedBufferMemoryStream.cs
- CheckPair.cs
- WebServiceErrorEvent.cs
- ComboBoxItem.cs
- WindowsButton.cs
- ResourceExpression.cs
- XmlDeclaration.cs
- DataGridPreparingCellForEditEventArgs.cs
- DataException.cs
- DBBindings.cs
- UnsignedPublishLicense.cs
- TabletDevice.cs
- SizeConverter.cs
- HtmlInputSubmit.cs
- QuadraticBezierSegment.cs
- ElementHost.cs
- Configuration.cs
- HttpHandlerActionCollection.cs
- SortKey.cs
- ZoneIdentityPermission.cs
- CounterCreationData.cs
- ProgressBar.cs