Проблема с доступом JavaScript в веб-браузере winforms - PullRequest
0 голосов
/ 20 февраля 2012

ETA: у меня все работает, и ответ выложен ниже. В качестве ответа я отмечу любого, кто может точно объяснить, что происходит и как я могу это убрать.

У меня есть класс, который содержит форму с веб-браузером winforms для отображения HTML-страницы. Я ввожу какой-то скрипт в заголовок страницы, чтобы можно было запрашивать информацию о стилях.

Когда я запускаю приложение из исполняемого файла, все работает нормально. Однако сейчас я пытаюсь запустить приложение из надстройки во время разработки. Что происходит, вы щелкаете правой кнопкой мыши файл типа .htm и нажимаете, чтобы запустить браузер. Затем надстройка запускает браузер, который переходит к указанному пути файла .htm.

Первое, что я заметил, это то, что браузер теперь отображает это сообщение:

" Чтобы защитить вашу безопасность, ваш веб-браузер ограничил показ этого файла активным контентом, который может получить доступ к вашему компьютеру. Нажмите здесь, чтобы получить варианты ... "

Затем я заметил, что все мои вызовы javascript теперь перестали работать, даже если я щелкнул, чтобы включить активный контент.

В качестве теста я попробовал этот простой вызов javascript (без явного внедрения):

Me.Document.InvokeScript("execScript", New Object() {"alert('hello');", "JavaScript"})

В результате появляется диалоговое окно с сообщением об ошибке JavaScript, которое гласит: « доступ запрещен »

Итак, это проблема безопасности. Не то чтобы я хотел, но я попытался временно снизить все уровни безопасности в IE, но это не имело никакого значения.

Я должен добавить, что приложение содержит 2 элемента управления веб-браузера. Второй размещает веб-страницу, которая создается путем установки свойства DocumentText браузера. Это не страдает от проблем доступа к JavaScript.

ETA: Я изучал IInternetSecurityManager, это может быть как-то связано с этим? Я надеюсь, что нет: (

1 Ответ

0 голосов
/ 20 февраля 2012

Мне удалось заставить его работать с IInternetSecurityManager, который является сервисом, возвращаемым сайтом элемента управления веб-браузера. Я заработал, вернув Ok в методе ProcessUrlAction независимо от URL.

Я собрал это вместе из фрагментов, которые я нашел в Интернете, так что, если кто-нибудь сможет указать, как его можно очистить и ограничить интранетом, я отмечу это как ответ.

Я предполагаю, что мне нужно изучить URL-адрес в ProcessUrlAction и вернуть Ok или Default в зависимости от его содержимого.

Вот код:

Friend Class MainBrowser
Inherits WebBrowser

Private _Site As WebBrowserSite
Protected Overrides Function CreateWebBrowserSiteBase() As WebBrowserSiteBase
    If _Site Is Nothing Then
        _Site = New WebBrowserSite(Me)
    End If
    Return _Site
End Function

Protected Class WebBrowserSite
    Inherits System.Windows.Forms.WebBrowser.WebBrowserSite
    Implements NativeInterfaces.IServiceProvider
    Implements NativeInterfaces.IInternetSecurityManager

    Private Const INET_E_DEFAULT_ACTION As Integer = &H800C0011
    Private Const S_OK As Integer = 0
    Private Const E_NOINTERFACEX As Integer = &H80004002

    Private Shared IID_IInternetSecurityManager As Guid = Marshal.GenerateGuidForType(GetType(NativeInterfaces.IInternetSecurityManager))

    Private Owner As MainBrowser

    Public Sub New(ByVal owner As MainBrowser)
        MyBase.New(owner)
        owner = owner
    End Sub

    Public Function QueryService(ByRef guidService As System.Guid, ByRef riid As System.Guid, ByRef ppvObject As System.IntPtr) As Integer Implements NativeInterfaces.IServiceProvider.QueryService
        If guidService = IID_IInternetSecurityManager AndAlso riid = IID_IInternetSecurityManager Then
            ppvObject = Marshal.GetComInterfaceForObject(Me, GetType(NativeInterfaces.IInternetSecurityManager))
            Return S_OK
        End If
        ppvObject = IntPtr.Zero
        Return E_NOINTERFACEX
    End Function

    Public Function GetSecurityId(ByVal pwszUrl As String, ByVal pbSecurityId As System.IntPtr, ByRef pcbSecurityId As UInteger, ByRef dwReserved As UInteger) As Integer Implements NativeInterfaces.IInternetSecurityManager.GetSecurityId
        Return INET_E_DEFAULT_ACTION
    End Function

    Public Function GetSecuritySite(ByRef pSite As System.IntPtr) As Integer Implements NativeInterfaces.IInternetSecurityManager.GetSecuritySite
        pSite = IntPtr.Zero
        Return INET_E_DEFAULT_ACTION
    End Function

    Public Function SetSecuritySite(ByVal pSite As System.IntPtr) As Integer Implements NativeInterfaces.IInternetSecurityManager.SetSecuritySite
        Return INET_E_DEFAULT_ACTION
    End Function

    Public Function MapUrlToZone(ByVal pwszUrl As String, ByRef pdwZone As UInteger, ByVal dwFlags As UInteger) As Integer Implements NativeInterfaces.IInternetSecurityManager.MapUrlToZone
        pdwZone = 0 // URLZONE_LOCAL_MACHINE ?
        Return S_OK // no difference
        // Return INET_E_DEFAULT_ACTION
    End Function

    Public Function ProcessUrlAction(ByVal pwszUrl As String, ByVal dwAction As UInteger, ByVal pPolicy As System.IntPtr, ByVal cbPolicy As UInteger, ByVal pContext As System.IntPtr, ByVal cbContext As UInteger, ByVal dwFlags As UInteger, ByVal dwReserved As UInteger) As Integer Implements NativeInterfaces.IInternetSecurityManager.ProcessUrlAction
        // Return INET_E_DEFAULT_ACTION
        Return S_OK // This is what made the difference
    End Function

    Public Function QueryCustomPolicy(ByVal pwszUrl As String, ByRef guidKey As System.Guid, ByRef ppPolicy As System.IntPtr, ByRef pcbPolicy As UInteger, ByVal pContext As System.IntPtr, ByVal cbContext As UInteger, ByVal dwReserved As UInteger) As Integer Implements NativeInterfaces.IInternetSecurityManager.QueryCustomPolicy
        ppPolicy = IntPtr.Zero
        pcbPolicy = 0
        Return INET_E_DEFAULT_ACTION
    End Function

    Public Function SetZoneMapping1(ByVal dwZone As UInteger, ByVal lpszPattern As String, ByVal dwFlags As UInteger) As Integer Implements NativeInterfaces.IInternetSecurityManager.SetZoneMapping
        Return INET_E_DEFAULT_ACTION
    End Function

    Public Function GetZoneMappings(ByVal dwZone As UInteger, ByRef ppenumString As System.Runtime.InteropServices.ComTypes.IEnumString, ByVal dwFlags As UInteger) As Integer Implements NativeInterfaces.IInternetSecurityManager.GetZoneMappings
        ppenumString = Nothing
        Return INET_E_DEFAULT_ACTION
    End Function

End Class

End Class

Интерфейсы:

 <ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("6d5140c1-7436-11ce-8034-00aa006009fa")> _
Interface IServiceProvider
    <PreserveSig()> _
    Function QueryService(ByRef guidService As Guid, ByRef riid As Guid, ByRef ppvObject As IntPtr) As <MarshalAs(UnmanagedType.I4)> Integer
End Interface


<ComImport(), GuidAttribute("79EAC9EE-BAF9-11CE-8C82-00AA004BA90B"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IInternetSecurityManager
    <PreserveSig()> _
    Function SetSecuritySite(<[In]()> ByVal pSite As IntPtr) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function GetSecuritySite(ByRef pSite As IntPtr) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function MapUrlToZone(<[In](), MarshalAs(UnmanagedType.LPWStr)> ByVal pwszUrl As String, ByRef pdwZone As UInt32, <[In]()> ByVal dwFlags As UInt32) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function GetSecurityId(<[In](), MarshalAs(UnmanagedType.LPWStr)> ByVal pwszUrl As String, <Out()> ByVal pbSecurityId As IntPtr, <[In](), Out()> ByRef pcbSecurityId As UInt32, <[In]()> ByRef dwReserved As UInt32) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function ProcessUrlAction(<[In](), MarshalAs(UnmanagedType.LPWStr)> ByVal pwszUrl As String, ByVal dwAction As UInt32, ByVal pPolicy As IntPtr, ByVal cbPolicy As UInt32, ByVal pContext As IntPtr, ByVal cbContext As UInt32, _
         ByVal dwFlags As UInt32, ByVal dwReserved As UInt32) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function QueryCustomPolicy(<[In](), MarshalAs(UnmanagedType.LPWStr)> ByVal pwszUrl As String, ByRef guidKey As Guid, ByRef ppPolicy As IntPtr, ByRef pcbPolicy As UInt32, ByVal pContext As IntPtr, ByVal cbContext As UInt32, _
         ByVal dwReserved As UInt32) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function SetZoneMapping(ByVal dwZone As UInt32, <[In](), MarshalAs(UnmanagedType.LPWStr)> ByVal lpszPattern As String, ByVal dwFlags As UInt32) As <MarshalAs(UnmanagedType.I4)> Integer

    <PreserveSig()> _
    Function GetZoneMappings(<[In]()> ByVal dwZone As UInt32, ByRef ppenumString As ComTypes.IEnumString, <[In]()> ByVal dwFlags As UInt32) As <MarshalAs(UnmanagedType.I4)> Integer
End Interface
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...