PBToolboxAI v4 ← Site

webbrowser — u_pbt_webbrowser #

← Referencia de componentes · Índice de la guía

Navegador web integrado en su ventana: visualización de una página, barra de direcciones, historial Atrás / Adelante, menú contextual de navegación.

▶ Verlo en vivo — Aplicación de demostración, mosaico Web browser: la vista previa, el código que lo genera y esta página, uno al lado del otro.


De un vistazo #

Userobjectu_pbt_webbrowser
Clase de items— (componente sin items)
Sirve paraMostrar una página web, un portal interno, una documentación en línea o un contenido HTML generado, sin salir de la aplicación

Inicio rápido #

// event open de la ventana
uo_browser.ib_address_bar = true    // barra de direcciones + botones de navegacion
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

Asignar is_address es el acto de navegación: cada asignación abre la página solicitada. Una dirección sin protocolo ("ejemplo.com") recibe automáticamente https://. Una ruta de disco (C:\carpeta\pagina.html, \\servidor\recurso\pagina.html) se convierte en una dirección file:///. Las palabras que no son una dirección ("factura 2026") van al motor de búsqueda de is_search_url; sin motor, se rechazan y ue_error lo indica. Un nombre de servidor de una sola palabra seguido de /, ? o # (office/, intranet/inicio) es una dirección, igual que una dirección IPv6 entre corchetes ([::1]/x); la palabra sola (intranet) sigue siendo texto libre. Un servidor sin HTTPS se escribe con http:// explícito.


Propiedades #

PropiedadTipoPredeterminadoFunción
is_addressstring""Dirección mostrada. Asignar esta propiedad inicia la navegación. Releerla devuelve la página realmente mostrada: si el usuario sigue un enlace o vuelve atrás, ella también (ue_load_completed le avisa). Esquemas aceptados: http(s):, file: (también una ruta de disco), about:, data:, mailto:, tel:; javascript: se rechaza
ib_address_barbooleanfalseMuestra la barra de direcciones integrada: campo URL, botones Atrás / Adelante / Recargar
ib_context_menubooleanfalseActiva el menú contextual con el clic derecho: Atrás, Adelante, Recargar, más Copiar sobre una selección, Abrir vínculo y Copiar dirección del vínculo sobre un vínculo, Copiar imagen sobre una imagen. Abierto con el teclado (Mayús+F10), aparece sobre el elemento. En un campo de entrada se mantiene el menú Cortar / Copiar / Pegar
is_search_urlstring""Motor de búsqueda para las palabras que no son una dirección, %s = el texto codificado (p. ej. https://www.bing.com/search?q=%s). Vacío por defecto: ese texto se rechaza y se lanza ue_error — una aplicación de negocio no envía lo que escriben sus usuarios a un motor que no ha elegido. Solo se acepta una dirección http(s) que contenga %s: cualquier otra lanza ue_error y el motor vigente se mantiene
ib_veto_new_windowbooleanfalsePregunta a ue_new_window antes de abrir una nueva ventana en la vista; devolver false mantiene la página actual
ib_veto_downloadsbooleanfalsePregunta a ue_download_starting antes de cada descarga; devolver false la cancela
ib_veto_navigationbooleanfalsePregunta a ue_navigating antes de que el sitio pase a otra página (vínculo, formulario, script); devolver false mantiene la página actual. Una página autorizada se vuelve a abrir en la dirección pedida: un formulario enviado por POST pierde sus datos
ib_privatebooleanfalseNavegación privada: las cookies, el almacenamiento y la caché de los sitios nunca se escriben en el disco y desaparecen con la vista. Se asigna antes de is_address: cambiarla vuelve a abrir la vista vacía (sin página ni historial); volver a ponerla a true abre una sesión privada nueva
is_titlestring""Título de la página mostrada, leído en directo (ue_title_changed avisa cuando cambia). Solo lectura: escribirlo no cambia nada
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)

Métodos #

MétodoFunción
of_refresh ( )Recarga la página actual. Devuelve 0 una vez solicitado, -4 si no se muestra ninguna página (is_address vacío), -2 si el componente no está creado
of_go_back ( )Vuelve a la página anterior. Sigue el orden de su código: is_address y luego of_go_back() se ejecutan en ese orden
of_go_forward ( )Avanza a la página siguiente
of_can_go_back ( ) → booleantrue si existe una página anterior — para activar o atenuar su botón Atrás. Se lee en directo en la página; léalo tras una carga (ue_load_completed)
of_can_go_forward ( ) → booleantrue si existe una página siguiente
of_stop ( )Interrumpe la carga en curso y descarta las páginas aún en espera; la carga interrumpida lanza ue_load_failed
of_execute_javascript (string as_script)Ejecuta un script en la página mostrada y devuelve su valor en JSON: un texto vuelve entre comillas, un número no (42), un script que lanza un error o no devuelve nada da null. Una respuesta larga vuelve entera. Una sola condición, y es estructural: la página debe estar cargada, así que llámela desde ue_load_completed, nunca justo después de asignar is_address. Devuelve una cadena vacía si todavía no hay página o sin respuesta en 5 segundos: of_get_last_error() indica por qué
of_show_html (string as_html) → longMuestra una página construida por la aplicación (una factura, una carta). La página se codifica: un color #c00, un ancla, un % o un acento se muestran tal como se escribieron. Como máximo 2 MB una vez codificada: por encima, ue_error y nada cambia. Devuelve 0 una vez enviado, -2 si el componente no está creado
of_clear_browsing_data ( ) → longBorra lo que los sitios guardaron: cookies (una sesión iniciada), almacenamiento local, caché, permisos concedidos. El borrado ocupa su lugar tras las direcciones ya asignadas: la página siguiente se abre limpia. Todos los webbrowser de la aplicación comparten estos datos. Devuelve 0 una vez enviado, -2 si el componente no está creado
of_reset ( )Deja el componente como nuevo: página vaciada, historial de navegación borrado, barra de direcciones oculta, menú contextual desactivado, motor de búsqueda vaciado, preguntas (ib_veto_*) desactivadas, navegación privada desactivada. Las cookies y sesiones de los sitios se mantienen: para eso está of_clear_browsing_data. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_save_as_png (string) · of_save_as_jpg (string)Exporta el sitio mostrado como imagen. Devuelve 0 una vez escrita la imagen, -4 si la escritura falla, -2 si el componente no está creado

Eventos #

EventoSe activa cuando
ue_load_completed (string as_url)Una página ha terminado de cargarse (la suya, un enlace, Atrás, of_refresh); as_url es la dirección realmente alcanzada, redirecciones incluidas. No se lanza para una dirección vacía (about:blank) ni para una carga fallida
ue_load_failed (string as_url, long al_status)Una página no se pudo cargar: host desconocido, sin red, certificado, o carga cancelada por of_stop o por una dirección más reciente. al_status indica el motivo: ver Por qué no se cargó una página
ue_error (string as_message)Un texto asignado a is_address (o escrito en la barra) no es una dirección y no hay is_search_url, una dirección no se pudo abrir en absoluto, o el proceso de la página se detuvo. Nada más queda retenido: la dirección siguiente se carga con normalidad
ue_new_window (string as_url) → booleanLa página pide una nueva ventana tras un clic (enlace target=_blank, window.open): se abre en esta vista. Cancelable si ib_veto_new_window = true: devolver false mantiene la página actual. Una ventana abierta solo por un script, sin clic, se ignora. Solo se abren direcciones http y https: un sitio que pide un archivo, una página data: o un vínculo de correo obtiene ue_error. Un vínculo file: en una página web (http, https, data:) lo rechaza el propio motor, antes que el componente: no se abre nada y no se lanza ningún evento
ue_download_starting (string as_url, string as_path) → booleanEmpieza una descarga: as_url es lo que se descarga, as_path el archivo que se escribirá. Cancelable si ib_veto_downloads = true: devolver false la cancela; si no, continúa como en Edge
ue_navigating (string as_url) → booleanEl sitio pasa a otra página: un vínculo, un formulario, un script — nunca una dirección asignada por su aplicación. Cancelable si ib_veto_navigation = true: devolver false mantiene la página actual
ue_title_changed (string as_title)El título de la página mostrada ha cambiado (is_title lo vuelve a leer en cualquier momento)
ue_permission_requested (string as_url, string as_kind) → booleanEl sitio pide la cámara, el micrófono, la ubicación… (as_kind = una constante PERMISSION_*). Rechazado salvo que el evento devuelva true: la única pregunta de la biblioteca en la que el silencio vale NO
ue_ready ( )El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido
ue_runtime_missing ( )El runtime WebView2 está ausente: el componente permanece vacío
ue_bg_color (long al_color)El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor)
ue_script_error (string as_message, string as_stack)Se ha producido un error de JavaScript en la barra de direcciones del componente (nunca en el sitio mostrado)

La barra de direcciones integrada #

Es la solución más rápida: una propiedad, y el usuario dispone de un campo URL y de los botones Atrás / Adelante / Recargar, con el mismo tema que el resto de la aplicación.

// La barra de direcciones, luego la pagina que se abre
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

Los botones se atenúan solos cuando no hay ningún sitio al que ir. En el campo de dirección, F5 (o Ctrl+R) recarga, Alt+← / Alt+→ retroceden y avanzan (invertidos en escritura de derecha a izquierda), Esc restaura la dirección actual tras una escritura abandonada, y el primer clic selecciona toda la dirección.

Sus propios botones #

Si prefiere controlar la navegación desde su propia barra de herramientas, oculte la barra integrada y utilice los métodos:

// Botones Atras / Adelante de su ventana
uo_browser.of_go_back()
uo_browser.of_go_forward()
// event ue_load_completed de uo_browser : (string as_url)
// Actualizar el estado de sus botones despues de cada pagina
uo_toolbar.of_item(/*keys*/ "main/back").ib_enabled = uo_browser.of_can_go_back()
uo_toolbar.of_item(/*keys*/ "main/forward").ib_enabled   = uo_browser.of_can_go_forward()

// Y reflejar la direccion real (redirecciones incluidas)
sle_url.text = as_url

El menú contextual de navegación #

ib_context_menu añade con el clic derecho un pequeño menú Atrás / Adelante / Recargar, con tema y representado por la aplicación. Sigue lo que hay bajo el ratón: Copiar sobre un texto seleccionado, Abrir vínculo y Copiar dirección del vínculo sobre un vínculo, Copiar imagen sobre una imagen. Abierto con el teclado (Mayús+F10, tecla Menú), aparece sobre el elemento. Comparte exactamente el mismo historial que la barra de direcciones: los dos permanecen, por tanto, siempre coherentes.

// A small menu on a right click : back, forward, refresh
uo_browser.ib_context_menu = true

Detener una carga #

// Boton Detener : interrumpe una pagina que tarda demasiado
uo_browser.of_stop()

Palabras en lugar de una dirección #

Por defecto, un texto que no es una dirección se rechaza (ue_error), sin retener nada: la dirección siguiente se carga con normalidad. Para convertirlo en una búsqueda, elija el motor:

// Words typed in the address bar go to this engine (%s = the text)
uo_browser.is_search_url = "https://www.bing.com/search?q=%s"
uo_browser.is_address = "PowerBuilder WebView2"

Nuevas ventanas y descargas #

Un enlace «abrir en una pestaña nueva» o una ventana de inicio de sesión abierta tras un clic se muestra en la vista, y ue_new_window se lo indica. Una descarga continúa como en Edge, y ue_download_starting le da la dirección y el archivo. Ambos se convierten en una pregunta cuando usted lo pide:

// Ask before each download
uo_browser.ib_veto_downloads = true
// ue_download_starting event of uo_browser : (string as_url, string as_path)
// Only PDF files may be downloaded
return Lower(Right(as_path, 4)) = ".pdf"

Quedarse en sus propios servidores #

ue_navigating se lanza cada vez que el sitio pasa a otra página — un vínculo, un formulario, un script —, nunca para una dirección asignada por su código. Con ib_veto_navigation es una pregunta: devolver false mantiene la página actual. Una página autorizada se vuelve a abrir en la dirección pedida por el sitio; un formulario enviado por POST pierde sus datos.

// Ask before the site leaves for another page
uo_browser.ib_veto_navigation = true
// ue_navigating event of uo_browser : (string as_url)
// Only the company servers may be opened
return Pos(Lower(as_url), "://intranet.example.com/") > 0

Cámara, micrófono, ubicación #

Cuando un sitio pide la cámara, el micrófono, la ubicación, las notificaciones o leer el portapapeles, decide ue_permission_requested, y la respuesta por defecto es no: un sitio no enciende una cámara mediante un aviso que el usuario no entiende. Es la única pregunta de la biblioteca en la que el silencio vale rechazo. No se recuerda nada: la pregunta vuelve en cada solicitud.

// ue_permission_requested event of uo_browser : (string as_url, string as_kind)
// The video-call page of the company may use the camera and the microphone
if Pos(Lower(as_url), "://visio.example.com/") = 0 then return false
return as_kind = uo_browser.PERMISSION_CAMERA or as_kind = uo_browser.PERMISSION_MICROPHONE

Valores de as_kind: PERMISSION_CAMERA, PERMISSION_MICROPHONE, PERMISSION_GEOLOCATION, PERMISSION_NOTIFICATIONS, PERMISSION_CLIPBOARD, PERMISSION_SENSORS, PERMISSION_DOWNLOADS (varias descargas seguidas), PERMISSION_FILES, PERMISSION_AUTOPLAY, PERMISSION_FONTS, PERMISSION_MIDI, PERMISSION_WINDOWS, PERMISSION_UNKNOWN.

Por qué no se cargó una página #

al_status de ue_load_failed se compara con las constantes LOADSTATUS_* del componente:

ConstanteSignifica
LOADSTATUS_HOST_NOT_RESOLVEDHost desconocido (nombre mal escrito, DNS)
LOADSTATUS_DISCONNECTED · LOADSTATUS_CANNOT_CONNECT · LOADSTATUS_SERVER_UNREACHABLESin red, servidor inaccesible
LOADSTATUS_TIMEOUTEl servidor no respondió a tiempo
LOADSTATUS_CERT_INVALID · LOADSTATUS_CERT_EXPIRED · LOADSTATUS_CERT_NAME_INCORRECT · LOADSTATUS_CERT_REVOKED · LOADSTATUS_CLIENT_CERT_ERRORCertificado rechazado
LOADSTATUS_CANCELEDCarga cancelada por of_stop o por una dirección más reciente
LOADSTATUS_AUTH_REQUIRED · LOADSTATUS_PROXY_AUTH_REQUIREDSe requieren credenciales (servidor, proxy)
LOADSTATUS_CONNECTION_ABORTED · LOADSTATUS_CONNECTION_RESET · LOADSTATUS_INVALID_RESPONSE · LOADSTATUS_REDIRECT_FAILED · LOADSTATUS_UNEXPECTED_ERROR · LOADSTATUS_UNKNOWNOtros fallos de conexión o de respuesta
// ue_load_failed event of uo_browser : (string as_url, long al_status)
if al_status = uo_browser.LOADSTATUS_HOST_NOT_RESOLVED then
	st_message.text = "Unknown address : " + as_url
end if

Ejecutar un script en la página #

of_execute_javascript lee o modifica la página mostrada (su título, un campo, un contador). No está limitado por la licencia, ni siquiera en una página about:blank o data:: ejecutar un script en la página es la función de un navegador, y el componente es gratuito.

// ue_load_completed event of uo_browser : (string as_url)
// The page title, as JSON : "PowerBuilder - Wikipedia" (quotes included)
sle_title.text = uo_browser.of_execute_javascript(/*script*/ "document.title")

Sitios que rechazan la visualización integrada #

Algunos sitios — Google, la mayoría de los bancos, muchas aplicaciones SaaS — envían encabezados de seguridad que prohíben su visualización dentro de otra página. El componente no se ve afectado: nunca muestra un sitio en un marco. La página se abre como documento principal, exactamente como lo hace su propio navegador, y esos encabezados dejan de aplicarse.

Así pues, no hay nada que configurar ni ningún caso particular que tratar en su código.

// Un sitio que rechaza ser integrado en una pagina : nada especial que hacer
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://www.google.com"

A cambio, la página ocupa toda la superficie del componente bajo la barra de direcciones: lo que dibujara por encima (bandas, superposiciones con tema) no se ve durante la navegación.


Contenido HTML sin red #

of_show_html muestra una página HTML construida por su aplicación: la vista previa de una carta, un ticket, una factura o un informe, sin ninguna llamada de red ni archivo temporal. La página se codifica por usted: un color #c00, un ancla, un % o un acento se muestran tal como se escribieron (2 MB como máximo).

// Local variables
string ls_html

// An order summary built by the application : the colour and the "%" come out as written
ls_html = "<html><body>" &
        + "<h1 style='color:#1f6feb'>Order #4152</h1>" &
        + "<p>Discount : 10%</p>" &
        + "</body></html>"
uo_browser.of_show_html(/*html*/ ls_html)

Asignada directamente en is_address, una dirección data:text/html, no se codifica: un # corta ahí la página (todo lo que sigue se toma por un ancla) y un % la estropea. Prefiera of_show_html, o codifique usted mismo (# → %23, % → %25).

Un archivo local se abre del mismo modo con file:///C:/temp/informe.html, o simplemente con su ruta C:\temp\informe.html.


Volver a empezar de cero #

of_reset() no se limita a vaciar la página: también borra el historial de navegación. Un usuario no puede, por tanto, volver con el botón Atrás a una página consultada por el usuario anterior o en otro expediente. No toca lo que los sitios guardaron: cookies, sesiones iniciadas, almacenamiento local, permisos. En un equipo compartido, el usuario siguiente llegaría conectado con la cuenta del anterior — es of_clear_browsing_data() lo que lo borra. Los sitios viven en un perfil de navegación propio, separado de los componentes de la aplicación.

// Cambio de expediente : se parte de un navegador virgen, sin historial
uo_browser.of_reset()

// Luego el expediente, con su barra de direcciones
uo_browser.ib_address_bar = true
uo_browser.is_address = ls_folder_url
// The user of the workstation changes : no page, no history, no signed-in session left
uo_browser.of_reset()
uo_browser.of_clear_browsing_data()

Para que nunca se escriba nada en el disco, asigne ib_private = true antes de la primera dirección: las cookies y el almacenamiento desaparecen con la vista.

Es el reflejo que conviene tener cada vez que un mismo componente sirve para mostrar contenidos de contextos diferentes.


Ejemplo completo #

// event open de la ventana : pagina de inicio del portal interno
uo_browser.of_reset()                  // partir de cero (historial incluido)

// Las herramientas de navegacion, luego la pagina de inicio
uo_browser.ib_address_bar  = true      // campo URL + Atras / Adelante / Recargar
uo_browser.ib_context_menu = true      // la misma navegacion con el clic derecho
uo_browser.is_address = "https://intranet.example.com/home"
// event ue_load_completed de uo_browser : (string as_url)
uo_status.of_panel(/*key*/ "main").is_text = "Página cargada: " + as_url

Buenas prácticas #

Heredado de la base común #

Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades

Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.


← Referencia de componentes · Índice de la guía