none
El puente DOM/Scripting está deshabilitado RRS feed

  • Pregunta

  • ¡Hola!


    Estoy desarrollando en Silverlight 4.0 una aplicación fuera del navegador y al ejecutarla me arroja el siguiente error: El puente DOM/Scripting está deshabilitado

    Supongo que es porque empleo:

    HtmlPage.Window.Navigate

    Para tal efecto Rodrigo Diaz en su blog apunta:

    "SÍ podemos habilitar el Puente HTML editando directamente el archivo index.html, agregando simplemente el parámetro enablehtmlaccess y establecerlo a true.  En este caso sllauncher.exe se comporta como cualquier Navegador ya que es capaz de entender la funcionalidad de los métodos que la clase HtmlPage"

    Esto por lo visto es para Silverlight 3.0 porque para el 4 ya viene por defecto como true. Por si acaso he editado el HTML y el ASPX y he añadido su correspondiente línea de habilitación:

    <param name="enableHtmlAccess" value="true" />

    En definitiva, que sigue arrojando el error.


    En algunos sitios apuntaban a que había que editar el html que lanza el sllauncher.exe. ¿Dónde se guarda en el cliente?. Y si es éste el que hay que modificar. ¿Cómo se hace para que vaya pegado a cada cliente?


    Agradezco vuestras aportaciones de ante mano. Un saludo


    jueves, 21 de julio de 2011 10:25

Respuestas

  • Leyendo este post (http://forums.silverlight.net/p/148719/338607.aspx) encuentro un chico de Microsoft (Johnatan) que dice que no es posible. En resumen lo que he encontrado es que el runtime genera, en tiempo de ejecución y en el cliente (esto es nuevo para mi), el archivo html que hospeda la aplicación OOB. Asi las cosas no es posible agregarle el parámetro enablehtmlaccess, que en una aplicación OOB parecer estar definido en False.

    Sólo agregar que el parámetro en cuestión sólo sirve para restringir el acceso al DOM cuanto la aplicación no se ejecute en modo OOB.

    Vi en otro lado alguien más que utilizó un WebControl y el Html bridge que existe en su interior (este parece ser no se deshabilita) para poder hacer una operación como la que necesitas.

    Por supuesto, si tu aplicación tiene permisos elevados siempre podrás abrir directamente el navegador pero esto sólo funciona con Windows.


    Blog: Silverideas
    • Marcado como respuesta CorsarioVasco jueves, 21 de julio de 2011 19:16
    jueves, 21 de julio de 2011 16:26
  • Hola Corsario.

    ¿como estas, ya estas en EA ;)?

    Nestor tiene razon, cuando se esta OOB no se puede acceder al browser por que no existe, realmente silverlight es un ActiveX y se incrusta en una ventana de windows estableciendole una sandbox para limitarlo por motivos evidentes.

    Es posible que en Silverlight 5 existan otras opciones, pero mientras sale, te comento lo que se puede hacer hasta ahora para realizar las acciones que quieres.

    Se trata de usar la automatizacion del UI para acceder a la interface y poder realizar acciones sobre ella, en cuanto a mostrar una web OOB (solo en FullTrust) se puede hacer mediante el servidor de automatizacion de interoperbilidad (jo, parece que todo es automatico xDD).

    Bien, comenzando con un codigo .xaml sencillito que no hace falta que explique:

     <StackPanel x:Name="LayoutRoot" Background="White">
      <TextBlock Height="23" Text="Escribir en el primer TextBox y pulsar 'enter' 
         (esto pone el foco en el segundo TextBox y hace click en el botón, el cual navega a una página)" />
      <TextBox Height="23" Name="textBox1" VerticalAlignment="Top" Width="120" KeyUp="textBox1_KeyUp" />
      <TextBox Height="23" Name="textBox2" VerticalAlignment="Top" Width="120" />
      <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
     </StackPanel>
    

    2 TextBox y un boton, al escribir en el primer TextBox y pulsar 'Intro' se pasara el foco al segundo ademas de hacer click en el boton (el cual solo navega a la pagina especificada).

    El codigo c#

      private void button1_Click(object sender, RoutedEventArgs e)
      {
       // corriendo en un navegador
       if (!App.Current.IsRunningOutOfBrowser) 
        System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("http://www.microsoft.com"));
       // corriendo OOB con FullTrust
       else if (App.Current.HasElevatedPermissions) Navigate("http://www.microsoft.com");
    
       // Si no tienes permisos en OOB (no hay nada que hacer)
      }
    
    
      private void textBox1_KeyUp(object sender, KeyEventArgs e)
      {
       // si la tecla pulsada es 'Enter'
       if (e.Key == Key.Enter)
       {
        // crear un objeto de automatizacion del UI para cambiar el foco
        System.Windows.Automation.Peers.AutomationPeer peer =
         new System.Windows.Automation.Peers.TextBoxAutomationPeer(textBox2);
        peer.SetFocus();
    
        // crear un objeto de automatizacion del UI para pulsar un boton 
        peer = new System.Windows.Automation.Peers.ButtonAutomationPeer(button1);
        ((System.Windows.Automation.Provider.IInvokeProvider)peer).Invoke();
    
        // NOTA: tras ejecutar esto, se mantiene el foco en el textBox y se llamara al evento click del boton.
       }
       
      }
    
    
      public static void Navigate(string _url)
      {
       // Verificar que se puede utilizar el servidor de automatizacion (solo con permisos elevados en OOB)
       if (!System.Runtime.InteropServices.Automation.AutomationFactory.IsAvailable) return;
    
       try
       {
        // NOTA Asegurarse de agregar el ensamblado 'Microsoft.CSharp' para usar variables dinamicas
        // crear el objeto para hacer uso de la Shell
        dynamic shell = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject("WScript.Shell");
        shell.run(_url);    
       }
       catch (Exception ex)
       {
        MessageBox.Show(string.Format("error al mostrar la ventana. {0}{1}", System.Environment.NewLine, ex.Message));
       }
    
      }
    

    Bueno en este codigo no hay mucho que comentar, solo es conocer esas clases de automatizacion.

    En cuanto a pasar el foco entre controles, lo ideal es usar el sistema de automatizacion del UI, ya que ofrece muchas mas posibilidades.

    Y bueno, creo que esto es todo, si no se entiende algo comentalo

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    • Marcado como respuesta CorsarioVasco jueves, 21 de julio de 2011 19:16
    jueves, 21 de julio de 2011 18:03

Todas las respuestas

  • Tengo una duda, con todo respeto y disculpa la pregunta porque me parece que lo tienes claro: Si estás ejecutando tu aplicación POR FUERA DEL EXPLORADOR (OOB), ¿Por qué intentas ejecutar instrucciones para el navegador? Nunca se me había pasado por la cabeza, pero estoy casi seguro que la ventana OOB no puede funcionar como un navegador cualquiera.


    Blog: Silverideas
    jueves, 21 de julio de 2011 12:27
  • ¡Hola!

    "con todo respeto y disculpa" ;-). Gracias por interesarte ;-). Si he suscitado hacerte pensar, ya hemos ganado con la pregunta ;-)

    Se me olvidó poner el enlace del blog de Rodrigo: http://rdiazconcha.com/category/silverlight/page/8/

    Y ahora respondiendo a la pregunta que me formulas.... en realidad no quiero que se comporte como un navegador cualquiera sino acceder a los métodos de HtmlPage.

    Por ponerte unos ejemplos:

    Me permite hacer esto:
    HtmlPage.Window.Navigate(new Uri("http://bogotadotnet.org/"), "_blank"); //Abrir una página web sin que sea un HyperlinkButton
    o hacer esto otro:
    HtmlPage.Plugin.Focus();
    mytextbox.Focus(); //Forzamos poner el foco. (Ver. http://silverlightips.net/2009/12/page/3/)

    Gracias y saludos

     

    jueves, 21 de julio de 2011 13:08
  • Bueno, la primera pregunta queda respondida: ¿Dónde se guarda en el cliente?; C:\Users\Corsariovasco\AppData\LocalLow\Microsoft\Silverlight\OutOfBrowser\

    ;-)

     

    Saludos,

    jueves, 21 de julio de 2011 13:26
  • Déjame reviso el blog y te cuento :o)
    Blog: Silverideas
    jueves, 21 de julio de 2011 14:06
  • Leyendo este post (http://forums.silverlight.net/p/148719/338607.aspx) encuentro un chico de Microsoft (Johnatan) que dice que no es posible. En resumen lo que he encontrado es que el runtime genera, en tiempo de ejecución y en el cliente (esto es nuevo para mi), el archivo html que hospeda la aplicación OOB. Asi las cosas no es posible agregarle el parámetro enablehtmlaccess, que en una aplicación OOB parecer estar definido en False.

    Sólo agregar que el parámetro en cuestión sólo sirve para restringir el acceso al DOM cuanto la aplicación no se ejecute en modo OOB.

    Vi en otro lado alguien más que utilizó un WebControl y el Html bridge que existe en su interior (este parece ser no se deshabilita) para poder hacer una operación como la que necesitas.

    Por supuesto, si tu aplicación tiene permisos elevados siempre podrás abrir directamente el navegador pero esto sólo funciona con Windows.


    Blog: Silverideas
    • Marcado como respuesta CorsarioVasco jueves, 21 de julio de 2011 19:16
    jueves, 21 de julio de 2011 16:26
  • Hola Corsario.

    ¿como estas, ya estas en EA ;)?

    Nestor tiene razon, cuando se esta OOB no se puede acceder al browser por que no existe, realmente silverlight es un ActiveX y se incrusta en una ventana de windows estableciendole una sandbox para limitarlo por motivos evidentes.

    Es posible que en Silverlight 5 existan otras opciones, pero mientras sale, te comento lo que se puede hacer hasta ahora para realizar las acciones que quieres.

    Se trata de usar la automatizacion del UI para acceder a la interface y poder realizar acciones sobre ella, en cuanto a mostrar una web OOB (solo en FullTrust) se puede hacer mediante el servidor de automatizacion de interoperbilidad (jo, parece que todo es automatico xDD).

    Bien, comenzando con un codigo .xaml sencillito que no hace falta que explique:

     <StackPanel x:Name="LayoutRoot" Background="White">
      <TextBlock Height="23" Text="Escribir en el primer TextBox y pulsar 'enter' 
         (esto pone el foco en el segundo TextBox y hace click en el botón, el cual navega a una página)" />
      <TextBox Height="23" Name="textBox1" VerticalAlignment="Top" Width="120" KeyUp="textBox1_KeyUp" />
      <TextBox Height="23" Name="textBox2" VerticalAlignment="Top" Width="120" />
      <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
     </StackPanel>
    

    2 TextBox y un boton, al escribir en el primer TextBox y pulsar 'Intro' se pasara el foco al segundo ademas de hacer click en el boton (el cual solo navega a la pagina especificada).

    El codigo c#

      private void button1_Click(object sender, RoutedEventArgs e)
      {
       // corriendo en un navegador
       if (!App.Current.IsRunningOutOfBrowser) 
        System.Windows.Browser.HtmlPage.Window.Navigate(new Uri("http://www.microsoft.com"));
       // corriendo OOB con FullTrust
       else if (App.Current.HasElevatedPermissions) Navigate("http://www.microsoft.com");
    
       // Si no tienes permisos en OOB (no hay nada que hacer)
      }
    
    
      private void textBox1_KeyUp(object sender, KeyEventArgs e)
      {
       // si la tecla pulsada es 'Enter'
       if (e.Key == Key.Enter)
       {
        // crear un objeto de automatizacion del UI para cambiar el foco
        System.Windows.Automation.Peers.AutomationPeer peer =
         new System.Windows.Automation.Peers.TextBoxAutomationPeer(textBox2);
        peer.SetFocus();
    
        // crear un objeto de automatizacion del UI para pulsar un boton 
        peer = new System.Windows.Automation.Peers.ButtonAutomationPeer(button1);
        ((System.Windows.Automation.Provider.IInvokeProvider)peer).Invoke();
    
        // NOTA: tras ejecutar esto, se mantiene el foco en el textBox y se llamara al evento click del boton.
       }
       
      }
    
    
      public static void Navigate(string _url)
      {
       // Verificar que se puede utilizar el servidor de automatizacion (solo con permisos elevados en OOB)
       if (!System.Runtime.InteropServices.Automation.AutomationFactory.IsAvailable) return;
    
       try
       {
        // NOTA Asegurarse de agregar el ensamblado 'Microsoft.CSharp' para usar variables dinamicas
        // crear el objeto para hacer uso de la Shell
        dynamic shell = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject("WScript.Shell");
        shell.run(_url);    
       }
       catch (Exception ex)
       {
        MessageBox.Show(string.Format("error al mostrar la ventana. {0}{1}", System.Environment.NewLine, ex.Message));
       }
    
      }
    

    Bueno en este codigo no hay mucho que comentar, solo es conocer esas clases de automatizacion.

    En cuanto a pasar el foco entre controles, lo ideal es usar el sistema de automatizacion del UI, ya que ofrece muchas mas posibilidades.

    Y bueno, creo que esto es todo, si no se entiende algo comentalo

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    • Marcado como respuesta CorsarioVasco jueves, 21 de julio de 2011 19:16
    jueves, 21 de julio de 2011 18:03
  • ¡Hola!

     

    David, David, David ;-). El EA tendrá que esperar a que te fichen. Es la única condición que pongo para fichar por ellos. Ni sueldo, ni nada, ya que me dejaran aprender de ti ;-)

    Al tema ,-). Gracias a Nestor y a ti por las molestias tomadas y por aclararme un poco el panorama. El post de Jonathan ya lo había leido pero las informaciones aparecen contradictorias en diferentes foros. Nestor lo explica mejor ;-), y me ha alegrado que la pregunta que formulo le haya servido a él también.

    Lo de realizar la llamada a través del shell era una de las soluciones que barajaba, lo que no conocía es tanta automatización. Gracias por el aporte. Muy bien explicado ;-)

     

    Un abrazo,

     

     

    P.D.: Respecto al juego.... todavía no lo han publicado :-(. Politicos!!! ;-).

     

    jueves, 21 de julio de 2011 19:16
  • Hola David, estuve visitando este Thread ya que me encuentro con un problema similar a estos. Según veo para el caso de estar OOB sugieres hacer esto:

     else if (App.Current.HasElevatedPermissions) Navigate("http://www.microsoft.com");

    Quería saber ese método "Navigate" de que clase es? pues a mi no me lo reconoce. O es un método propio?


    David Cardona
    Silverlight MCTS, .Net Developer
    Medellin, Colombia
    lunes, 1 de agosto de 2011 15:56
  • Hola David

    Nota esta parte del código:

     public static void Navigate(string _url)
     {
      // Verificar que se puede utilizar el servidor de automatizacion (solo con permisos elevados en OOB)
      if (!System.Runtime.InteropServices.Automation.AutomationFactory.IsAvailable) return;
    
      try
      {
      // NOTA Asegurarse de agregar el ensamblado 'Microsoft.CSharp' para usar variables dinamicas
      // crear el objeto para hacer uso de la Shell
      dynamic shell = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject("WScript.Shell");
      shell.run(_url);  
      }
      catch (Exception ex)
      {
      MessageBox.Show(string.Format("error al mostrar la ventana. {0}{1}", System.Environment.NewLine, ex.Message));
      }
    
     }
    
    



    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    lunes, 1 de agosto de 2011 16:42
  • Oh claro!!!  se me pasó por alto.

     

    Gracias!


    David Cardona
    Silverlight MCTS, .Net Developer
    Medellin, Colombia
    lunes, 1 de agosto de 2011 16:45