Definição de interfaces do usuário como navegadores para conteúdo HTML

Adobe AIR 1.0 e posterior

O JavaScript oferece diversas APIs para controlar a janela que exibe o conteúdo HTML. No AIR, essas APIs podem ser sobrescritas com a implementação de uma classe personalizada HTMLHost .

Sobre estender a classe HTMLHost

Se, por exemplo, o aplicativo apresentar vários objetos HTMLLoader em uma interface com abas, talvez você deseje que as alterações feitas pelas páginas HTML carregadas alterem o rótulo da aba e não o título da janela principal. Da mesma forma, o código pode responder a uma chamada window.moveTo() reposicionando o objeto HTMLLoader no respectivo contêiner do objeto de exibição pai, movendo a janela que contém o objeto HTMLLoader, não fazendo exatamente nada ou fazendo alguma outra coisa por completo.

A classe HTMLHost do AIR controla as seguintes propriedades e métodos JavaScript:

  • window.status

  • window.document.title

  • window.location

  • window.blur()

  • window.close()

  • window.focus()

  • window.moveBy()

  • window.moveTo()

  • window.open()

  • window.resizeBy()

  • window.resizeTo()

Quando você cria um objeto HTMLLoader usando new HTMLLoader() , as propriedades ou métodos JavaScript listados não são ativados. A classe HTMLHost oferece uma implementação padrão como navegador dessas APIs JavaScript. Você também pode estender a classe HTMLHost para personalizar o comportamento. Para criar um objeto HTMLHost que ofereça suporte ao comportamento padrão, defina o parâmetro defaultBehaviors como true no construtor HTMLHost:

var defaultHost:HTMLHost = new HTMLHost(true); 

Quando você cria uma janela HTML no AIR com o método createRootWindow() da classe HTMLLoader, uma ocorrência HTMLHost com suporte aos comportamentos padrão é atribuída automaticamente. Você pode alterar o comportamento do objeto host atribuindo uma implementação HTMLHost diferente à propriedade htmlHost do HTMLLoader ou, pode atribuir null para desativar os recursos completamente.

Nota: O AIR atribui um objeto HTMLHost padrão à janela inicial criada para o aplicativo do AIR baseado em HTML e qualquer janela criada pela implementação padrão do método window.open() de JavaScript.

Exemplo: Extensão da classe HTMLHost

O exemplo a seguir mostra como personalizar a maneira como o objeto HTMLLoader afeta a interface do usuário, estendendo a classe HTMLHost:

Exemplo do Flex:

  1. Crie uma classe que estenda a classe HTMLHost (uma subclasse).

  2. Substitua os métodos da nova classe para tratar alterações nas configurações relacionadas à interface do usuário. Por exemplo, a classe a seguir, CustomHost, define comportamentos de chamadas para window.open() e altera para window.document.title . As chamadas para window.open() abrem a página HTML em uma nova janela e alterações em window.document.title (incluindo a configuração do elemento <title> da página HTML) definem o título dessa janela.

    package 
    { 
        import flash.html.*; 
        import flash.display.StageScaleMode; 
        import flash.display.NativeWindow; 
        import flash.display.NativeWindowInitOptions; 
     
        public class CustomHost extends HTMLHost 
        { 
            import flash.html.*; 
            override public function 
                createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader 
            { 
                var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); 
                var bounds:Rectangle = new Rectangle(windowCreateOptions.x, 
                                                windowCreateOptions.y, 
                                                windowCreateOptions.width, 
                                                windowCreateOptions.height); 
                var htmlControl:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, 
                                            windowCreateOptions.scrollBarsVisible, bounds); 
                htmlControl.htmlHost = new HTMLHostImplementation(); 
                if(windowCreateOptions.fullscreen){ 
                    htmlControl.stage.displayState = 
                        StageDisplayState.FULL_SCREEN_INTERACTIVE; 
                } 
                return htmlControl; 
            } 
            override public function updateTitle(title:String):void 
            { 
                htmlLoader.stage.nativeWindow.title = title; 
            } 
        } 
    }
  3. No código que contém o HTMLLoader (não no código da nova subclasse de HTMLHost), crie um objeto da nova classe. Atribua o novo objeto à propriedade htmlHost do HTMLLoader. O seguinte código Flex usa a classe CustomHost definida na etapa anterior:

    <?xml version="1.0" encoding="utf-8"?> 
    <mx:WindowedApplication 
        xmlns:mx="http://www.adobe.com/2006/mxml" 
        layout="vertical" 
        applicationComplete="init()"> 
        <mx:Script> 
            <![CDATA[ 
                import flash.html.HTMLLoader; 
                import CustomHost; 
                private function init():void 
                { 
                    var html:HTMLLoader = new HTMLLoader(); 
                    html.width = container.width; 
                    html.height = container.height; 
                    var urlReq:URLRequest = new URLRequest("Test.html"); 
                    html.htmlHost = new CustomHost(); 
                    html.load(urlReq); 
                    container.addChild(html); 
                } 
            ]]> 
        </mx:Script> 
        <mx:UIComponent id="container" width="100%" height="100%"/> 
    </mx:WindowedApplication>

Para testar o código descrito aqui, inclua um arquivo HTML com o seguinte conteúdo no diretório do aplicativo:

<html> 
    <head> 
        <title>Test</title> 
    </head> 
    <script> 
        function openWindow() 
        { 
            window.runtime.trace("in"); 
            document.title = "foo" 
            window.open('Test.html'); 
            window.runtime.trace("out"); 
        } 
    </script> 
    <body> 
        <a href="#" onclick="openWindow()">window.open('Test.html')</a> 
    </body> 
</html>

Exemplo do Flash Professional:

  1. Crie um arquivo Flash para o AIR. Defina a classe do documento como CustomHostExample e, em seguida, salve o arquivo como CustomHostExample.fla.

  2. Crie um arquivo ActionScript chamado CustomHost.as contendo uma classe que estenda a classe HTMLHost (uma subclasse). Essa classe substitui certos métodos da nova classe para tratar alterações nas configurações relacionadas à interface do usuário. Por exemplo, a classe a seguir, CustomHost, define comportamentos de chamadas para window.open() e altera para window.document.title . As chamadas para o método window.open() abrem a página HTML em uma nova janela e alterações na propriedade window.document.title (incluindo a configuração do elemento <title> da página HTML) definem o título dessa janela.

    package 
    { 
        import flash.display.StageScaleMode; 
        import flash.display.NativeWindow; 
        import flash.display.NativeWindowInitOptions; 
        import flash.events.Event; 
        import flash.events.NativeWindowBoundsEvent; 
        import flash.geom.Rectangle; 
        import flash.html.HTMLLoader; 
        import flash.html.HTMLHost; 
        import flash.html.HTMLWindowCreateOptions; 
        import flash.text.TextField; 
     
        public class CustomHost extends HTMLHost 
        { 
            public var statusField:TextField; 
             
            public function CustomHost(defaultBehaviors:Boolean=true) 
            { 
                super(defaultBehaviors); 
            } 
            override public function windowClose():void 
            { 
                htmlLoader.stage.nativeWindow.close(); 
            } 
            override public function createWindow( 
                                    windowCreateOptions:HTMLWindowCreateOptions ):HTMLLoader 
            { 
                var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); 
                var bounds:Rectangle = new Rectangle(windowCreateOptions.x, 
                                                windowCreateOptions.y, 
                                                windowCreateOptions.width, 
                                                windowCreateOptions.height); 
                var htmlControl:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, 
                                            windowCreateOptions.scrollBarsVisible, bounds); 
                htmlControl.htmlHost = new HTMLHostImplementation(); 
                if(windowCreateOptions.fullscreen){ 
                    htmlControl.stage.displayState = 
                        StageDisplayState.FULL_SCREEN_INTERACTIVE; 
                } 
                return htmlControl; 
            } 
            override public function updateLocation(locationURL:String):void 
            { 
                trace(locationURL); 
            } 
            override public function set windowRect(value:Rectangle):void 
            { 
                htmlLoader.stage.nativeWindow.bounds = value; 
            } 
            override public function updateStatus(status:String):void 
            { 
                statusField.text = status; 
                trace(status); 
            } 
            override public function updateTitle(title:String):void 
            { 
                htmlLoader.stage.nativeWindow.title = title + "- Example Application"; 
            } 
            override public function windowBlur():void 
            { 
                htmlLoader.alpha = 0.5; 
            } 
            override public function windowFocus():void 
            { 
                htmlLoader.alpha = 1; 
            } 
        } 
    }
  3. Crie outro arquivo ActionScript chamado CustomHostExample.as para conter a classe de documento do aplicativo. Essa classe cria um objeto HTMLLoader e define a respectiva propriedade host como uma ocorrência da classe CustomHost definida na etapa anterior:

    package 
    { 
        import flash.display.Sprite; 
        import flash.html.HTMLLoader; 
        import flash.net.URLRequest; 
        import flash.text.TextField; 
     
        public class CustomHostExample extends Sprite 
        { 
            function CustomHostExample():void 
            { 
                var html:HTMLLoader = new HTMLLoader(); 
                html.width = 550; 
                html.height = 380; 
                var host:CustomHost = new CustomHost(); 
                html.htmlHost = host; 
                 
                var urlReq:URLRequest = new URLRequest("Test.html"); 
                html.load(urlReq); 
                 
                addChild(html); 
                 
                var statusTxt:TextField = new TextField(); 
                statusTxt.y = 380; 
                statusTxt.height = 20; 
                statusTxt.width = 550; 
                statusTxt.background = true; 
                statusTxt.backgroundColor = 0xEEEEEEEE; 
                addChild(statusTxt); 
                 
                host.statusField = statusTxt; 
            } 
        } 
    }

    Para testar o código descrito aqui, inclua um arquivo HTML com o seguinte conteúdo no diretório do aplicativo:

    <html> 
         <head> 
         <title>Test</title> 
         <script> 
         function openWindow() 
         { 
         document.title = "Test" 
         window.open('Test.html'); 
         } 
         </script> 
         </head> 
         <body bgColor="#EEEEEE"> 
         <a href="#" onclick="window.open('Test.html')">window.open('Test.html')</a> 
         <br/><a href="#" onclick="window.document.location='http://www.adobe.com'"> 
         window.document.location = 'http://www.adobe.com'</a> 
         <br/><a href="#" onclick="window.moveBy(6, 12)">moveBy(6, 12)</a> 
         <br/><a href="#" onclick="window.close()">window.close()</a> 
         <br/><a href="#" onclick="window.blur()">window.blur()</a> 
         <br/><a href="#" onclick="window.focus()">window.focus()</a> 
         <br/><a href="#" onclick="window.status = new Date().toString()">window.status=new Date().toString()</a> 
         </body> 
    </html>

Tratamento de alterações na propriedade window.location

Substitua o método locationChange() para tratar alterações da URL da página HTML. O método locationChange() é chamado quando o JavaScript em uma página altera o valor de window.location . O exemplo a seguir simplesmente carrega a URL solicitada:

override public function updateLocation(locationURL:String):void 
{ 
    htmlLoader.load(new URLRequest(locationURL)); 
}
Nota: Você pode usar a propriedade htmlLoader do objeto HTMLHost para fazer referência ao objeto HTMLLoader atual.

Tratamento de chamadas de JavaScript de window.moveBy(), window.moveTo(), window.resizeTo() e window.resizeBy()

Substitua o método set windowRect() para tratar alterações nos limites do conteúdo HTML. O método set windowRect() é chamado quando o JavaScript em uma página chama window.moveBy() , window.moveTo() , window.resizeTo() ou window.resizeBy() . O exemplo a seguir simplesmente atualiza os limites da janela da área de trabalho:

override public function set windowRect(value:Rectangle):void 
{ 
    htmlLoader.stage.nativeWindow.bounds = value; 
}

Tratamento de chamadas JavaScript de window.open()

Substitui o método createWindow() para tratar chamadas JavaScript de window.open() . As implementações do método createWindow() são responsáveis pela criação e retorno de um novo objeto HTMLLoader. Normalmente você exibe o HTMLLoader em uma nova janela, mas não é necessário criar uma nova janela.

O exemplo a seguir ilustra como implementar a função createWindow() usando HTMLLoader.createRootWindow() para criar a janela e o objeto HTMLLoader. Você também pode criar o objeto NativeWindow separadamente e adicionar o HTMLLoader ao palco da janela.

override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader{ 
    var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); 
    var bounds:Rectangle = new Rectangle(windowCreateOptions.x, windowCreateOptions.y,  
                                windowCreateOptions.width, windowCreateOptions.height); 
    var htmlControl:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, 
                                    windowCreateOptions.scrollBarsVisible, bounds); 
    htmlControl.htmlHost = new HTMLHostImplementation(); 
    if(windowCreateOptions.fullscreen){ 
        htmlControl.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; 
    } 
    return htmlControl; 
}
Nota: Esse exemplo atribui a implementação HTMLHost personalizada a qualquer janela nova criada com window.open() . Você também pode usar uma implementação diferente ou definir a propriedade htmlHost como null em novas janelas, se desejar.

O objeto passado como parâmetro para o método createWindow() é um objeto HTMLWindowCreateOptions . A classe HTMLWindowCreateOptions inclui propriedades que informam os valores definidos na sequência de parâmetro features na chamada de window.open() :

propriedade HTMLWindowCreateOptions

Configuração correspondente na string de recursos na chamada JavaScript para window.open()

fullscreen

fullscreen

height

height

locationBarVisible

location

menuBarVisible

menubar

resizeable

resizable

scrollBarsVisible

scrollbars

statusBarVisible

status

toolBarVisible

toolbar

width

width

x

left ou screenX

y

top ou screenY

A classe HTMLLoader não implementa todos os recursos que podem ser especificados na string de recursos. O aplicativo deve fornecer barras de rolagem, barras de localização, barras de menu, barras de status e barras de ferramentas, quando apropriado.

Os outros argumentos para o método window.open() de JavaScript são tratados pelo sistema. A implementação createWindow() não deve carregar conteúdo no objeto HTMLLoader nem definir o título da janela.

Tratamento de chamadas JavaScript de window.close()

Substitui o método windowClose() para tratar chamadas JavaScript do método window.close() . O exemplo a seguir fecha a janela da área de trabalho quando o método window.close() é chamado:

override public function windowClose():void 
{ 
    htmlLoader.stage.nativeWindow.close(); 
}

As chamadas JavaScript de window.close() não têm que fechar as janelas que as contêm. Você pode, por exemplo, remover o HTMLLoader da lista de exibição, deixando a janela (que pode ter outro conteúdo) aberta, conforme o código a seguir:

override public function windowClose():void 
{ 
    htmlLoader.parent.removeChild(htmlLoader); 
}

Tratamento de alterações da propriedade windows.status

Substitua o método updateStatus() para tratar alterações JavaScript no valor de window.status . O exemplo a seguir rastreia o valor do status:

override public function updateStatus(status:String):void 
{ 
    trace(status); 
}

O status solicitado é passado como string para o método updateStatus() .

O objeto HTMLLoader não oferece uma barra de status.

Tratamento de alterações da propriedade window.document.title

Substitua o método updateTitle() para tratar alterações JavaScript no valor de window.document.title . O exemplo a seguir altera o título da janela e acrescenta a sequência, "Sample", ao título:

override public function updateTitle(title:String):void 
{ 
    htmlLoader.stage.nativeWindow.title = title + " - Sample"; 
}

Quando document.title estiver definido em uma página HTML, o título solicitado será passado como string para o método updateTitle() .

As alterações em document.title não devem alterar o título da janela que contém o objeto HTMLLoader. Você pode, por exemplo, alterar outro elemento de interface, como campo de texto.

Tratamento de chamadas JavaScript de window.blur() e window.focus()

Substitua os métodos windowBlur() e windowFocus() para tratar chamadas JavaScript de window.blur() e window.focus() , conforme mostrado o exemplo a seguir:

override public function windowBlur():void 
{ 
    htmlLoader.alpha = 0.5; 
} 
override public function windowFocus():void 
{ 
    htmlLoader.alpha = 1.0; 
    NativeApplication.nativeApplication.activate(htmlLoader.stage.nativeWindow); 
}
Nota: O AIR não fornece nenhuma API para desativar janela nem aplicativo.

Criação de janelas com conteúdo HTML de rolagem

A classe HTMLLoader inclui um método estático, HTMLLoader.createRootWindow() , que permite abrir uma nova janela (representada por um objeto NativeWindow) que contém um objeto HTMLLoader e define algumas configurações da interface do usuário para essa janela. O método tem quatro parâmetros que permitem definir a interface do usuário:

Parâmetro

Descrição

visible

Um valor booliano que especifica se a janela ficará inicialmente visível ( true ) ou não ( false ).

windowInitOptions

Um objeto NativeWindowInitOptions . A classe NativeWindowInitOptions define as opções de inicialização do objeto NativeWindow, incluindo o seguinte: se a janela é minimizável, maximizável ou redimensionável, se a janela tem cromo do sistema ou cromo personalizado, se a janela é transparente ou não (para janelas que não usam o cromo do sistema) e o tipo de janela.

scrollBarsVisible

Se há barras de rolagem ( true ) ou não ( false ).

bounds

Um objeto Rectangle definindo a posição e as dimensões da nova janela.

Por exemplo, o código a seguir usa o método HTMLLoader.createRootWindow() para criar uma janela com conteúdo HTMLLoader que usa barras de rolagem:

var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions(); 
var bounds:Rectangle = new Rectangle(10, 10, 600, 400); 
var html2:HTMLLoader = HTMLLoader.createRootWindow(true, initOptions, true, bounds); 
var urlReq2:URLRequest = new URLRequest("http://www.example.com"); 
html2.load(urlReq2); 
html2.stage.nativeWindow.activate(); 
Nota: Janelas criadas chamando createRootWindow() diretamente em JavaScript permanecem independentes da janela HTML aberta. As propriedades opener e parent da janela JavaScript, por exemplo, são null . No entanto, se você chamar createRootWindow() indiretamente substituindo o método createWindow() do HTMLHost para chamar createRootWindow() , opener e parent farão referência à janela HTML aberta.