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. Una página mostrada por of_show_html (una página data:) no tiene dirección propia: se relee vacía |
ib_address_bar | boolean | false | Muestra la barra de direcciones integrada: campo URL, botones Atrás / Adelante / Recargar — que pasa a Detener mientras se carga una página |
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 la página pase a otra: un vínculo, un formulario o un script del sitio, o un gesto del usuario (una dirección escrita en la barra, Abrir vínculo, una ventana nueva); devolver false mantiene la página actual. Nunca para una dirección asignada por su código, ni para una redirección del servidor: para mantener la aplicación en sus propios servidores, vea is_allowed_hosts. 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. Vacío para una página sin título propio |
is_allowed_hosts | string | "" | Los hosts que la página puede mostrar, unidos por |: "intranet.example.com|*.example.com" (*. = cualquier subdominio, no el dominio mismo). Toda página de una dirección http(s) fuera de la lista se rechaza, la pida quien la pida — su código, un vínculo, el usuario en la barra, una redirección del servidor — y ue_navigation_blocked lo indica; la página mostrada se mantiene. Un archivo local, una página de of_show_html y about:blank no se ven afectados. Una entrada que no es un nombre de host lanza ue_error y la lista vigente se mantiene. Vacío por defecto: cualquier host |
ii_zoom | integer | 100 | Zoom del sitio en porcentaje, de 25 a 500 (la barra de direcciones nunca hace zoom); un valor fuera de rango se lleva a él. Leído en directo: Ctrl+rueda del ratón en el sitio también lo cambia. Se conserva de una página a otra y a través de ib_private |
ib_certificate_questions | boolean | false | Pregunta a ue_certificate_error cuando el certificado de un servidor no es válido (una intranet con certificado interno o caducado), en lugar de rechazarlo de inmediato. La respuesta solo vale para esa navegación, y una pregunta sin respuesta es un no. Desactivado por defecto: la página se rechaza y ue_load_failed da un estado LOADSTATUS_CERT_* |
ib_web_messages | boolean | false | Abre el puente entre el sitio y la aplicación: la página envía un valor con chrome.webview.postMessage(value) y ue_web_message lo recibe; of_post_message envía uno a la página. Solo para los orígenes de is_message_origins: sin origen, el puente sigue cerrado. Un mensaje de más de 64 KB se descarta. Desactivado por defecto: ningún sitio llega a la aplicación |
is_message_origins | string | "" | Los orígenes autorizados a hablar con la aplicación (vea ib_web_messages), unidos por |: "https://portal.example.com|https://erp.example.com" — un esquema, un host, un puerto si no es el predeterminado; la ruta se ignora. Exactos: un subdominio es otro origen. file:/// designa las páginas del equipo. Una entrada sin esquema lanza ue_error y la lista vigente se mantiene |
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 ( ) → long | 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. Devuelve 0 una vez pedido, -2 si el componente no está creado |
of_go_forward ( ) → long | Avanza a la página siguiente. Devuelve 0 una vez pedido, -2 si el componente no está creado |
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 ( ) → long | Interrumpe la carga en curso y descarta las páginas aún en espera; la carga interrumpida lanza ue_load_failed. Devuelve 0 una vez pedido, -2 si el componente no está creado |
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_is_loading ( ) → boolean | true mientras se carga una página: de ue_load_started a ue_load_completed o ue_load_failed — para un reloj de arena o un botón Detener. Leído en directo; false antes de cualquier página |
of_post_message (string as_json) → long | Envía un valor a la página mostrada, escrito en JSON (un objeto, un texto entre comillas, un número); la página lo recibe mediante el evento message de chrome.webview. Solo con ib_web_messages, hacia una página de un origen de is_message_origins: cualquier otra página lanza ue_error y no recibe nada. Devuelve 0 una vez enviado, -5 si el texto está vacío o no es JSON (of_get_last_error dice por qué), -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. También vacía is_allowed_hosts, devuelve ii_zoom a 100, cierra el puente de mensajes (ib_web_messages, is_message_origins) y desactiva ib_certificate_questions |
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. Para una página de of_show_html, as_url está vacío |
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 | La página pasa a otra: un vínculo, un formulario o un script del sitio, o un gesto del usuario (dirección escrita en la barra, Abrir vínculo, ventana nueva) — nunca para una dirección asignada por su aplicación, ni para una redirección del servidor. 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_load_started (string as_url) | Una página empieza a cargarse — una dirección de su código, un vínculo, un gesto del usuario. as_url está vacío para una página de of_show_html. of_is_loading() devuelve true hasta ue_load_completed o ue_load_failed |
ue_navigation_blocked (string as_url) | is_allowed_hosts rechazó una página: una dirección, un vínculo o una redirección hacia un host fuera de la lista. No se cargó nada, la página mostrada se mantiene |
ue_certificate_error (string as_url, long al_status) → boolean | El certificado de un servidor no es válido (al_status = una constante LOADSTATUS_CERT_*). Solo se lanza si ib_certificate_questions = true. Rechazado salvo que el evento devuelva true: aceptar un certificado es una decisión de seguridad, nunca el valor predeterminado. La respuesta solo vale para esta navegación |
ue_web_message (string as_origin, string as_json) | El sitio envió un valor (chrome.webview.postMessage): as_json es ese valor en JSON (se lee con n_pbt_json), as_origin el origen de la página que lo envió. Solo con ib_web_messages y desde un origen de is_message_origins |
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. Un texto que no es una dirección se señala: el campo se bordea de rojo, con una información sobre herramientas, hasta la siguiente tecla. Intro en un campo vacío no hace nada: la página se mantiene.
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"
Una ventana de inicio de sesión que dialoga con la página que la abrió (un inicio de sesión OAuth o Microsoft en una ventana emergente) pierde ese vínculo una vez mostrada en la vista, y el inicio de sesión no termina: abra ese inicio de sesión en la propia página (modo de redirección).
Quedarse en sus propios servidores #
Para mantener una aplicación de gestión en sus propios servidores, enumérelos en is_allowed_hosts: toda página de otro host se rechaza, la pida quien la pida — su código, un vínculo, una dirección escrita en la barra, una redirección del servidor —, y ue_navigation_blocked lo indica. La página mostrada se mantiene.
// Only the company servers : any other host is refused, redirections included
uo_browser.is_allowed_hosts = "intranet.example.com|*.example.com"
// ue_navigation_blocked event of uo_browser : (string as_url)
st_message.text = "This site is not allowed : " + as_url
ue_navigating se lanza cada vez que la página pasa a otra — un vínculo, un formulario o un script del sitio, una dirección escrita por el usuario, Abrir vínculo, una ventana nueva —, nunca para una dirección asignada por su código ni para una redirección. 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; un formulario enviado por POST pierde sus datos. Compare el host de la dirección, nunca un trozo de la dirección completa: https://evil.test/?next=://intranet.example.com/ contiene el nombre de su servidor.
// Ask before the site leaves for another page
uo_browser.ib_veto_navigation = true
// ue_navigating event of uo_browser : (string as_url)
// Local variables
string ls_host
long ll_cut
// The host of the address : after "://", up to the first "/", "?", "#" or ":"
ls_host = Lower(Mid(as_url, Pos(as_url, "://") + 3))
for ll_cut = 1 to Len(ls_host)
if Pos("/?#:", Mid(ls_host, ll_cut, 1)) > 0 then exit
next
ls_host = Left(ls_host, ll_cut - 1)
// Only the company server may be opened : the host must be EXACTLY it
return ls_host = "intranet.example.com"
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")
Indicador de carga #
ue_load_started se lanza cuando una página empieza a cargarse — una dirección de su código, un vínculo, un gesto del usuario —, y of_is_loading() devuelve true hasta ue_load_completed o ue_load_failed: lo suficiente para mostrar un reloj de arena o activar su botón Detener.
// ue_load_started event of uo_browser : (string as_url)
// The Stop button works while the page loads
cb_stop.enabled = true
// ue_load_completed event of uo_browser : (string as_url)
// Loaded : nothing left to stop
cb_stop.enabled = uo_browser.of_is_loading()
Zoom #
ii_zoom amplía o reduce el sitio (la barra de direcciones conserva su tamaño), del 25 al 500 %. Se relee en directo: Ctrl+rueda del ratón en el sitio también lo cambia, y su código lo ve.
// A screen read from a distance : the site one and a half times larger
uo_browser.ii_zoom = 150
El certificado de una intranet #
Un servidor cuyo certificado no es válido (certificado interno o caducado) se rechaza, y ue_load_failed da un estado LOADSTATUS_CERT_*. Con ib_certificate_questions, decide ue_certificate_error — y su respuesta predeterminada es no, como para un permiso: aceptar un certificado es una decisión de seguridad. Una respuesta solo vale para la navegación en curso; no se recuerda nada.
// Ask about certificates instead of refusing them at once
uo_browser.ib_certificate_questions = true
// ue_certificate_error event of uo_browser : (string as_url, long al_status)
// Only the test server of the company, whose certificate is internal
return Left(Lower(as_url), 34) = "https://test-intranet.example.com/"
Mensajes entre la página y la aplicación #
Un portal interno puede avisar a la aplicación («expediente guardado», «fila elegida»): abra el puente con ib_web_messages, y enumere en is_message_origins los orígenes autorizados a hablar. Sin origen en la lista, el puente sigue cerrado: ningún sitio de la Web puede llegar a su aplicación. La página envía un valor JSON, ue_web_message lo recibe tal cual; of_post_message responde a la página.
// The company portal may talk with the application
uo_browser.ib_web_messages = true
uo_browser.is_message_origins = "https://portal.example.com"
uo_browser.is_address = "https://portal.example.com/orders"
// In a page of the portal : send a value to the application, and listen to its answers
chrome.webview.postMessage({ order: 4152, action: "open" });
chrome.webview.addEventListener("message", function (e) { console.log(e.data); });
// ue_web_message event of uo_browser : (string as_origin, string as_json)
// Local variables
n_pbt_json lnv_json
// Read the value the page sent, then answer it
lnv_json.of_load(/*json*/ as_json)
if lnv_json.of_get_string(/*path*/ "action") = "open" then
st_message.text = "Order " + String(lnv_json.of_get_number(/*path*/ "order"))
uo_browser.of_post_message(/*json*/ '{"opened":true}')
end if
Un origen se escribe con esquema, host y puerto si no es el predeterminado (https://portal.example.com:8443); un subdominio es otro origen, y file:/// designa las páginas del equipo. Un mensaje de más de 64 KB se descarta. of_post_message hacia una página de otro origen lanza ue_error y no envía nada.
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).
Una página así no tiene dirección propia: is_address se relee vacía, igual que la barra de direcciones, y ue_load_completed recibe una dirección vacía. Sin <title>, su título está vacío. Una imagen del disco (file:///) no se muestra en ella: el motor no deja que una página data: lea los archivos del equipo; escriba la imagen en la página (<img src="data:image/png;base64,…">).
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.
// Local variables
string ls_folder_url
// La direccion del expediente que el usuario acaba de abrir
ls_folder_url = "https://intranet.example.com/files/4152"
// 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.
- Para mantener la aplicación en sus propios servidores, enumérelos en
is_allowed_hosts: también detiene las redirecciones, queue_navigatingno ve.
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 |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |
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.