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 #
| Userobject | u_pbt_webbrowser |
| Clase de items | — (componente sin items) |
| Sirve para | Mostrar 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 #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_address | string | "" | 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_bar | boolean | false | Muestra la barra de direcciones integrada: campo URL, botones Atrás / Adelante / Recargar |
ib_context_menu | boolean | false | Activa 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_url | string | "" | 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_window | boolean | false | Pregunta a ue_new_window antes de abrir una nueva ventana en la vista; devolver false mantiene la página actual |
ib_veto_downloads | boolean | false | Pregunta a ue_download_starting antes de cada descarga; devolver false la cancela |
ib_veto_navigation | boolean | false | Pregunta 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_private | boolean | false | Navegació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_title | string | "" | 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_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) |
Métodos #
| Método | Funció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 ( ) → boolean | true 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 ( ) → boolean | true 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) → long | Muestra 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 ( ) → long | Borra 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 #
| Evento | Se 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) → boolean | La 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) → boolean | Empieza 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) → boolean | El 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) → boolean | El 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) |
Navegar #
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:
| Constante | Significa |
|---|---|
LOADSTATUS_HOST_NOT_RESOLVED | Host desconocido (nombre mal escrito, DNS) |
LOADSTATUS_DISCONNECTED · LOADSTATUS_CANNOT_CONNECT · LOADSTATUS_SERVER_UNREACHABLE | Sin red, servidor inaccesible |
LOADSTATUS_TIMEOUT | El servidor no respondió a tiempo |
LOADSTATUS_CERT_INVALID · LOADSTATUS_CERT_EXPIRED · LOADSTATUS_CERT_NAME_INCORRECT · LOADSTATUS_CERT_REVOKED · LOADSTATUS_CLIENT_CERT_ERROR | Certificado rechazado |
LOADSTATUS_CANCELED | Carga cancelada por of_stop o por una dirección más reciente |
LOADSTATUS_AUTH_REQUIRED · LOADSTATUS_PROXY_AUTH_REQUIRED | Se requieren credenciales (servidor, proxy) |
LOADSTATUS_CONNECTION_ABORTED · LOADSTATUS_CONNECTION_RESET · LOADSTATUS_INVALID_RESPONSE · LOADSTATUS_REDIRECT_FAILED · LOADSTATUS_UNEXPECTED_ERROR · LOADSTATUS_UNKNOWN | Otros 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 #
- Asigne
is_address, no llame a ningún método de navegación: es la propiedad la que desencadena la apertura de la página. - Active
ib_address_baren cuanto el usuario pueda navegar libremente; reserve el control mediante sus propios botones para los recorridos restringidos. - Fíese de
of_can_go_back()/of_can_go_forward()para el estado de sus botones en lugar de contar las páginas usted mismo: las redirecciones falsearían su cuenta. - Nada que prever para los sitios que rechazan la visualización integrada: la página siempre se abre como documento principal, esos encabezados no se aplican.
- Llame a
of_reset()al cambiar de contexto: es la única manera de garantizar que ninguna página anterior sea accesible mediante el botón Atrás. Cuando cambia el usuario del equipo, añadaof_clear_browsing_data(): sin él, las cookies y sesiones de los sitios se mantienen. - El componente necesita el runtime web instalado en el equipo: trate
ue_runtime_missingigual que en cualquier otro componente (Instalación). - Un sitio puede reproducir sonido sin un gesto del usuario: la reproducción automática con sonido está permitida en todo el entorno WebView2 de la aplicación (el reproductor de vídeo y el de sonidos la necesitan, una página oculta no tiene gestos). Una página que lanza un vídeo con sonido al abrirse lo reproducirá; si es un problema, abra direcciones que conozca.
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.
| Miembros | Función | Detallado en |
|---|---|---|
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.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.