PBToolboxAI v5 ← Site

webbrowser — u_pbt_webbrowser #

← Riferimento dei componenti · Sommario della guida

Browser web integrato nella Sua finestra: visualizzazione di una pagina, barra degli indirizzi, cronologia Indietro / Avanti, menu contestuale di navigazione.

▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Web browser: l'anteprima, il codice che lo produce e questa pagina, affiancati.


In breve #

Userobjectu_pbt_webbrowser
Classe degli item— (componente senza item)
Serve perMostrare una pagina web, un portale interno, una documentazione online o un contenuto HTML generato, senza uscire dall'applicazione

Avvio rapido #

// event open della finestra
uo_browser.ib_address_bar = true    // barra degli indirizzi + pulsanti di navigazione
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

Impostare is_address è l'atto di navigazione: ogni assegnazione apre la pagina richiesta. Un indirizzo privo di protocollo ("esempio.it") riceve automaticamente https://. Un percorso su disco (C:\cartella\pagina.html, \\server\condivisione\pagina.html) diventa un indirizzo file:///. Parole che non sono un indirizzo ("fattura 2026") vanno al motore di ricerca di is_search_url; senza motore vengono rifiutate e ue_error lo segnala. Un nome di server di una sola parola seguito da /, ? o # (office/, intranet/home) è un indirizzo, come un indirizzo IPv6 tra parentesi quadre ([::1]/x); la parola da sola (intranet) resta testo libero. Un server senza HTTPS si scrive con http:// esplicito.


Proprietà #

ProprietàTipoPredefinitoRuolo
is_addressstring""Indirizzo visualizzato. Assegnare questa proprietà avvia la navigazione. Rileggerla restituisce la pagina realmente visualizzata: se l'utente segue un link o torna indietro, segue anche lei (ue_load_completed La avvisa). Schemi accettati: http(s):, file: (anche un percorso su disco), about:, data:, mailto:, tel:; javascript: è rifiutato. Una pagina mostrata da of_show_html (una pagina data:) non ha un indirizzo proprio: si rilegge vuota
ib_address_barbooleanfalseMostra la barra degli indirizzi integrata: campo URL, pulsanti Indietro / Avanti / Ricarica — che diventa Interrompi mentre una pagina si carica
ib_context_menubooleanfalseAttiva il menu contestuale al clic destro: Indietro, Avanti, Ricarica, più Copia su una selezione, Apri collegamento e Copia indirizzo collegamento su un collegamento, Copia immagine su un'immagine. Aperto da tastiera (Maiusc+F10), compare sull'elemento. In un campo di immissione resta il menu Taglia / Copia / Incolla
is_search_urlstring""Motore di ricerca per le parole che non sono un indirizzo, %s = il testo codificato (es. https://www.bing.com/search?q=%s). Vuoto per impostazione predefinita: un tale testo viene rifiutato e viene sollevato ue_error — un'applicazione gestionale non invia ciò che digitano i suoi utenti a un motore che non ha scelto. È accettato solo un indirizzo http(s) che contiene %s: qualsiasi altro solleva ue_error e il motore in vigore resta
ib_veto_new_windowbooleanfalseChiede a ue_new_window prima di aprire una nuova finestra nella vista; restituire false mantiene la pagina corrente
ib_veto_downloadsbooleanfalseChiede a ue_download_starting prima di ogni download; restituire false lo annulla
ib_veto_navigationbooleanfalseChiede a ue_navigating prima che la pagina passi a un'altra: un collegamento, un modulo o uno script del sito, oppure un gesto dell'utente (un indirizzo digitato nella barra, Apri collegamento, una nuova finestra); restituire false mantiene la pagina corrente. Mai per un indirizzo impostato dal Suo codice, né per un reindirizzamento del server: per tenere l'applicazione sui propri server, veda is_allowed_hosts. Una pagina autorizzata viene riaperta all'indirizzo richiesto: un modulo inviato in POST perde i suoi dati
ib_privatebooleanfalseNavigazione privata: cookie, archiviazione e cache dei siti non vengono mai scritti su disco e scompaiono con la vista. Da impostare prima di is_address: cambiarla riapre la vista vuota (nessuna pagina, nessuna cronologia); reimpostarla a true apre una nuova sessione privata
is_titlestring""Titolo della pagina visualizzata, letto in tempo reale (ue_title_changed avvisa quando cambia). Solo lettura: scriverlo non cambia nulla. Vuoto per una pagina senza un titolo proprio
is_allowed_hostsstring""Gli host che la pagina può mostrare, uniti da |: "intranet.example.com|*.example.com" (*. = qualsiasi sottodominio, non il dominio stesso). Ogni pagina di un indirizzo http(s) fuori dall'elenco viene rifiutata, chiunque la richieda — il Suo codice, un collegamento, l'utente nella barra, un reindirizzamento del server — e ue_navigation_blocked lo segnala; la pagina visualizzata resta. Un file locale, una pagina di of_show_html e about:blank non sono interessati. Una voce che non è un nome di host solleva ue_error e l'elenco in vigore resta. Vuoto per impostazione predefinita: qualsiasi host
ii_zoominteger100Zoom del sito in percentuale, da 25 a 500 (la barra degli indirizzi non zooma mai); un valore fuori intervallo vi viene riportato. Letto in tempo reale: Ctrl+rotellina nel sito lo cambia anche. Mantenuto da una pagina all'altra e attraverso ib_private
ib_certificate_questionsbooleanfalseChiede a ue_certificate_error quando il certificato di un server non è valido (una intranet con certificato interno o scaduto), invece di rifiutarlo subito. La risposta vale solo per quella navigazione, e una domanda rimasta senza risposta è un no. Disattivato per impostazione predefinita: la pagina viene rifiutata e ue_load_failed fornisce uno stato LOADSTATUS_CERT_*
ib_web_messagesbooleanfalseApre il ponte tra il sito e l'applicazione: la pagina invia un valore con chrome.webview.postMessage(value) e ue_web_message lo riceve; of_post_message ne invia uno alla pagina. Solo per le origini di is_message_origins: senza origine, il ponte resta chiuso. Un messaggio oltre i 64 KB viene scartato. Disattivato per impostazione predefinita: nessun sito raggiunge l'applicazione
is_message_originsstring""Le origini autorizzate a parlare con l'applicazione (veda ib_web_messages), unite da |: "https://portal.example.com|https://erp.example.com" — uno schema, un host, una porta se non è quella predefinita; il percorso viene ignorato. Esatte: un sottodominio è un'altra origine. file:/// indica le pagine della postazione. Una voce senza schema solleva ue_error e l'elenco in vigore resta
is_theme_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)

Metodi #

MetodoRuolo
of_refresh ( )Ricarica la pagina corrente. Restituisce 0 una volta richiesto, -4 se nessuna pagina è visualizzata (is_address vuoto), -2 se il componente non è creato
of_go_back ( ) → longTorna alla pagina precedente. Segue l'ordine del Suo codice: is_address poi of_go_back() vengono eseguiti in quest'ordine. Restituisce 0 una volta richiesto, -2 se il componente non è creato
of_go_forward ( ) → longAvanza alla pagina successiva. Restituisce 0 una volta richiesto, -2 se il componente non è creato
of_can_go_back ( ) → booleantrue se esiste una pagina precedente — per attivare o disattivare il Suo pulsante Indietro. Letto in diretta dalla pagina; da leggere dopo un caricamento (ue_load_completed)
of_can_go_forward ( ) → booleantrue se esiste una pagina successiva
of_stop ( ) → longInterrompe il caricamento in corso e abbandona le pagine ancora in attesa; il caricamento interrotto solleva ue_load_failed. Restituisce 0 una volta richiesto, -2 se il componente non è creato
of_execute_javascript (string as_script)Esegue uno script nella pagina visualizzata e ne restituisce il valore in JSON: un testo torna tra virgolette, un numero no (42), uno script che solleva un errore o non restituisce nulla dà null. Una risposta lunga torna intera. Una sola condizione, ed è strutturale: la pagina deve essere caricata, quindi la chiami da ue_load_completed, mai subito dopo aver impostato is_address. Restituisce una stringa vuota se non c'è ancora una pagina o senza risposta entro 5 secondi: of_get_last_error() dice perché
of_show_html (string as_html) → longMostra una pagina costruita dall'applicazione (una fattura, una lettera). La pagina è codificata: un colore #c00, un'ancora, un % o un accento appaiono come scritti. Al massimo 2 MB una volta codificata: oltre, ue_error e nulla cambia. Restituisce 0 una volta inviato, -2 se il componente non è creato
of_clear_browsing_data ( ) → longCancella ciò che i siti hanno memorizzato: cookie (una sessione aperta), archiviazione locale, cache, permessi concessi. La cancellazione prende posto dopo gli indirizzi già impostati: la pagina successiva si apre pulita. Tutti i webbrowser dell'applicazione condividono questi dati. Restituisce 0 una volta inviato, -2 se il componente non è creato
of_is_loading ( ) → booleantrue mentre una pagina si carica: da ue_load_started a ue_load_completed o ue_load_failed — per una clessidra o un pulsante Interrompi. Letto in tempo reale; false prima di qualsiasi pagina
of_post_message (string as_json) → longInvia un valore alla pagina visualizzata, scritto in JSON (un oggetto, un testo tra virgolette, un numero); la pagina lo riceve tramite l'evento message di chrome.webview. Solo con ib_web_messages, verso una pagina di un'origine di is_message_origins: qualsiasi altra pagina solleva ue_error e non riceve nulla. Restituisce 0 una volta inviato, -5 se il testo è vuoto o non è JSON (of_get_last_error dice perché), -2 se il componente non è creato
of_reset ( )Riporta il componente allo stato iniziale: pagina svuotata, cronologia di navigazione cancellata, barra degli indirizzi nascosta, menu contestuale disattivato, motore di ricerca svuotato, richieste (ib_veto_*) disattivate, navigazione privata disattivata. Cookie e sessioni dei siti restano: per quelli c'è of_clear_browsing_data. Restituisce 0 una volta applicato, -2 se il componente non è creato. Svuota anche is_allowed_hosts, riporta ii_zoom a 100, chiude il ponte dei messaggi (ib_web_messages, is_message_origins) e disattiva ib_certificate_questions
of_save_as_png (string) · of_save_as_jpg (string)Esporta il sito visualizzato come immagine. Restituisce 0 una volta scritta l'immagine, -4 se la scrittura fallisce, -2 se il componente non è creato

Event #

EventAttivato quando
ue_load_completed (string as_url)Una pagina ha finito di caricarsi (la Sua, un link, Indietro, of_refresh); as_url è l'indirizzo effettivamente raggiunto, redirezioni comprese. Non sollevato per un indirizzo vuoto (about:blank) né per un caricamento fallito. Per una pagina di of_show_html, as_url è vuoto
ue_load_failed (string as_url, long al_status)Una pagina non ha potuto essere caricata: host sconosciuto, nessuna rete, certificato, o caricamento annullato da of_stop o da un indirizzo più recente. al_status dice il motivo: vedere Perché una pagina non si è caricata
ue_error (string as_message)Un testo impostato in is_address (o digitato nella barra) non è un indirizzo e nessun is_search_url è impostato, un indirizzo non ha potuto essere aperto affatto, o il processo della pagina si è fermato. Nient'altro resta bloccato: l'indirizzo successivo si carica normalmente
ue_new_window (string as_url) → booleanLa pagina chiede una nuova finestra dopo un clic (link target=_blank, window.open): si apre in questa vista. Annullabile se ib_veto_new_window = true: restituire false mantiene la pagina corrente. Una finestra aperta da uno script da solo, senza clic, viene ignorata. Si aprono solo indirizzi http e https: un sito che chiede un file, una pagina data: o un link di posta ottiene ue_error. Un link file: in una pagina web (http, https, data:) è rifiutato dal motore stesso, prima del componente: non si apre nulla e non viene sollevato alcun evento
ue_download_starting (string as_url, string as_path) → booleanUn download sta iniziando: as_url è ciò che viene scaricato, as_path il file che verrà scritto. Annullabile se ib_veto_downloads = true: restituire false lo annulla; altrimenti prosegue come in Edge
ue_navigating (string as_url) → booleanLa pagina passa a un'altra: un collegamento, un modulo o uno script del sito, oppure un gesto dell'utente (indirizzo digitato nella barra, Apri collegamento, nuova finestra) — mai per un indirizzo impostato dalla Sua applicazione, né per un reindirizzamento del server. Annullabile se ib_veto_navigation = true: restituire false mantiene la pagina corrente
ue_title_changed (string as_title)Il titolo della pagina visualizzata è cambiato (is_title lo rilegge in qualsiasi momento)
ue_permission_requested (string as_url, string as_kind) → booleanIl sito chiede la fotocamera, il microfono, la posizione… (as_kind = una costante PERMISSION_*). Rifiutato a meno che l'evento restituisca true: l'unica domanda della libreria in cui il silenzio vale NO
ue_load_started (string as_url)Una pagina inizia a caricarsi — un indirizzo del Suo codice, un collegamento, un gesto dell'utente. as_url è vuoto per una pagina di of_show_html. of_is_loading() restituisce true fino a ue_load_completed o ue_load_failed
ue_navigation_blocked (string as_url)is_allowed_hosts ha rifiutato una pagina: un indirizzo, un collegamento o un reindirizzamento verso un host fuori dall'elenco. Non è stato caricato nulla, la pagina visualizzata resta
ue_certificate_error (string as_url, long al_status) → booleanIl certificato di un server non è valido (al_status = una costante LOADSTATUS_CERT_*). Sollevato solo se ib_certificate_questions = true. Rifiutato a meno che l'evento restituisca true: accettare un certificato è una decisione di sicurezza, mai il comportamento predefinito. La risposta vale solo per questa navigazione
ue_web_message (string as_origin, string as_json)Il sito ha inviato un valore (chrome.webview.postMessage): as_json è quel valore in JSON (da leggere con n_pbt_json), as_origin l'origine della pagina che l'ha inviato. Solo con ib_web_messages e da un'origine di is_message_origins
ue_ready ( )Il componente ha terminato il caricamento; tutto ciò che è stato inviato prima è stato riprodotto
ue_runtime_missing ( )Il runtime WebView2 è assente: il componente resta vuoto
ue_bg_color (long al_color)Il componente ha calcolato il colore di sfondo del proprio tema; l'userobject lo ha già adottato (backcolor)
ue_script_error (string as_message, string as_stack)Si è verificato un errore JavaScript nella barra degli indirizzi del componente (mai nel sito visualizzato)

La barra degli indirizzi integrata #

È la soluzione più rapida: una proprietà, e l'utente dispone di un campo URL e dei pulsanti Indietro / Avanti / Ricarica, a tema come il resto dell'applicazione.

// La barra degli indirizzi, poi la pagina da aprire
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

I pulsanti si disattivano da soli quando non c'è alcun posto dove andare. Nel campo indirizzo, F5 (o Ctrl+R) ricarica, Alt+← / Alt+→ vanno indietro e avanti (invertiti nella scrittura da destra a sinistra), Esc ripristina l'indirizzo corrente dopo una digitazione abbandonata, e il primo clic seleziona l'intero indirizzo. Un testo che non è un indirizzo viene segnalato: il campo si borda di rosso, con una descrizione comando, fino al tasto successivo. Invio su un campo vuoto non fa nulla: la pagina resta.

I Suoi pulsanti personali #

Se preferisce pilotare la navigazione dalla Sua barra degli strumenti, nasconda la barra integrata e utilizzi i metodi:

// Pulsanti Indietro / Avanti della Sua finestra
uo_browser.of_go_back()
uo_browser.of_go_forward()
// event ue_load_completed di uo_browser : (string as_url)
// Aggiornare lo stato dei Suoi pulsanti dopo ogni 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()

// E rispecchiare l'indirizzo reale (redirezioni comprese)
sle_url.text = as_url

Il menu contestuale di navigazione #

ib_context_menu aggiunge al clic destro un piccolo menu Indietro / Avanti / Ricarica, a tema e disegnato dall'applicazione. Segue ciò che si trova sotto il mouse: Copia su un testo selezionato, Apri collegamento e Copia indirizzo collegamento su un collegamento, Copia immagine su un'immagine. Aperto da tastiera (Maiusc+F10, tasto Menu), compare sull'elemento. Condivide esattamente la stessa cronologia della barra degli indirizzi: i due restano quindi sempre coerenti.

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

Interrompere un caricamento #

// Pulsante Stop : interrompe una pagina che tarda
uo_browser.of_stop()

Parole invece di un indirizzo #

Per impostazione predefinita, un testo che non è un indirizzo viene rifiutato (ue_error), senza bloccare nulla: l'indirizzo successivo si carica normalmente. Per farne una ricerca, scelga il motore:

// 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"

Nuove finestre e download #

Un link «apri in una nuova scheda» o una finestra di accesso aperta dopo un clic viene mostrata nella vista, e ue_new_window glielo segnala. Un download prosegue come in Edge, e ue_download_starting Le fornisce indirizzo e file. Entrambi diventano una domanda quando lo richiede:

// 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 finestra di accesso che dialoga con la pagina che l'ha aperta (un accesso OAuth o Microsoft in una finestra a comparsa) perde questo legame una volta mostrata nella vista, e l'accesso non va a buon fine: apra un simile accesso nella pagina stessa (modalità reindirizzamento).

Restare sui propri server #

Per tenere un'applicazione gestionale sui propri server, li elenchi in is_allowed_hosts: ogni pagina di un altro host viene rifiutata, chiunque la richieda — il Suo codice, un collegamento, un indirizzo digitato nella barra, un reindirizzamento del server —, e ue_navigation_blocked lo segnala. La pagina visualizzata resta.

// 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 viene sollevato ogni volta che la pagina passa a un'altra — un collegamento, un modulo o uno script del sito, un indirizzo digitato dall'utente, Apri collegamento, una nuova finestra —, mai per un indirizzo impostato dal Suo codice né per un reindirizzamento. Con ib_veto_navigation diventa una domanda: restituire false mantiene la pagina corrente. Una pagina autorizzata viene riaperta all'indirizzo richiesto; un modulo inviato in POST perde i suoi dati. Confronti l'host dell'indirizzo, mai un pezzo dell'indirizzo intero: https://evil.test/?next=://intranet.example.com/ contiene il nome del Suo server.

// 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"

Fotocamera, microfono, posizione #

Quando un sito chiede la fotocamera, il microfono, la posizione, le notifiche o la lettura degli appunti, decide ue_permission_requested, e la risposta predefinita è no: un sito non accende una fotocamera tramite una richiesta che l'utente non capisce. È l'unica domanda della libreria in cui il silenzio vale rifiuto. Nulla viene memorizzato: la domanda ritorna a ogni richiesta.

// 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

Valori di as_kind: PERMISSION_CAMERA, PERMISSION_MICROPHONE, PERMISSION_GEOLOCATION, PERMISSION_NOTIFICATIONS, PERMISSION_CLIPBOARD, PERMISSION_SENSORS, PERMISSION_DOWNLOADS (più download di seguito), PERMISSION_FILES, PERMISSION_AUTOPLAY, PERMISSION_FONTS, PERMISSION_MIDI, PERMISSION_WINDOWS, PERMISSION_UNKNOWN.

Perché una pagina non si è caricata #

al_status di ue_load_failed si confronta con le costanti LOADSTATUS_* del componente:

CostanteSignifica
LOADSTATUS_HOST_NOT_RESOLVEDHost sconosciuto (nome errato, DNS)
LOADSTATUS_DISCONNECTED · LOADSTATUS_CANNOT_CONNECT · LOADSTATUS_SERVER_UNREACHABLENessuna rete, server irraggiungibile
LOADSTATUS_TIMEOUTIl server non ha risposto in tempo
LOADSTATUS_CERT_INVALID · LOADSTATUS_CERT_EXPIRED · LOADSTATUS_CERT_NAME_INCORRECT · LOADSTATUS_CERT_REVOKED · LOADSTATUS_CLIENT_CERT_ERRORCertificato rifiutato
LOADSTATUS_CANCELEDCaricamento annullato da of_stop o da un indirizzo più recente
LOADSTATUS_AUTH_REQUIRED · LOADSTATUS_PROXY_AUTH_REQUIREDCredenziali richieste (server, proxy)
LOADSTATUS_CONNECTION_ABORTED · LOADSTATUS_CONNECTION_RESET · LOADSTATUS_INVALID_RESPONSE · LOADSTATUS_REDIRECT_FAILED · LOADSTATUS_UNEXPECTED_ERROR · LOADSTATUS_UNKNOWNAltri errori di connessione o di risposta
// 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

Eseguire uno script nella pagina #

of_execute_javascript legge o modifica la pagina visualizzata (il titolo, un campo, un contatore). Non è limitato dalla licenza, anche su una pagina about:blank o data:: eseguire uno script nella pagina è il mestiere di un browser, e il componente è 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")

Indicatore di caricamento #

ue_load_started viene sollevato quando una pagina inizia a caricarsi — un indirizzo del Suo codice, un collegamento, un gesto dell'utente —, e of_is_loading() restituisce true fino a ue_load_completed o ue_load_failed: quanto basta per mostrare una clessidra o attivare il Suo pulsante Interrompi.

// 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 ingrandisce o riduce il sito (la barra degli indirizzi mantiene la sua dimensione), dal 25 al 500 %. Si rilegge in tempo reale: Ctrl+rotellina nel sito lo cambia anche, e il Suo codice lo vede.

// A screen read from a distance : the site one and a half times larger
uo_browser.ii_zoom = 150

Il certificato di una intranet #

Un server il cui certificato non è valido (certificato interno o scaduto) viene rifiutato, e ue_load_failed fornisce uno stato LOADSTATUS_CERT_*. Con ib_certificate_questions, decide ue_certificate_error — e la sua risposta predefinita è no, come per un permesso: accettare un certificato è una decisione di sicurezza. Una risposta vale solo per la navigazione in corso; nulla viene memorizzato.

// 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/"

Messaggi tra la pagina e l'applicazione #

Un portale interno può avvisare l'applicazione («pratica salvata», «riga scelta»): apra il ponte con ib_web_messages, ed elenchi in is_message_origins le origini autorizzate a parlare. Senza origine elencata, il ponte resta chiuso: nessun sito del Web può raggiungere la Sua applicazione. La pagina invia un valore JSON, ue_web_message lo riceve tale e quale; of_post_message risponde alla pagina.

// 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'origine si scrive con schema, host e porta se non è quella predefinita (https://portal.example.com:8443); un sottodominio è un'altra origine, e file:/// indica le pagine della postazione. Un messaggio oltre i 64 KB viene scartato. of_post_message verso una pagina di un'altra origine solleva ue_error e non invia nulla.


Siti che rifiutano la visualizzazione integrata #

Alcuni siti — Google, la maggior parte delle banche, molte applicazioni SaaS — inviano intestazioni di sicurezza che vietano la visualizzazione all'interno di un'altra pagina. Il componente non è interessato: non mostra mai un sito in un riquadro. La pagina viene aperta come documento principale, esattamente come fa il Suo browser, e quelle intestazioni non si applicano più.

Non c'è quindi nulla da impostare, né alcun caso particolare da gestire nel Suo codice.

// Un sito che rifiuta di essere integrato in una pagina : niente di speciale da fare
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://www.google.com"

In cambio, la pagina occupa tutta la superficie del componente sotto la barra degli indirizzi: ciò che disegnasse sopra di essa (fasce, sovrapposizioni a tema) non è visibile durante la navigazione.


Contenuto HTML senza rete #

of_show_html mostra una pagina HTML costruita dalla Sua applicazione: l'anteprima di una lettera, di un ticket, di una fattura o di un report, senza alcuna chiamata di rete né file temporaneo. La pagina viene codificata per Lei: un colore #c00, un'ancora, un % o un accento appaiono come scritti (al massimo 2 MB).

// 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)

Impostato direttamente in is_address, un indirizzo data:text/html, non viene codificato: un # taglia lì la pagina (tutto ciò che segue passa per un'ancora) e un % la altera. Preferisca of_show_html, oppure codifichi da sé (# → %23, % → %25).

Una tale pagina non ha un indirizzo proprio: is_address si rilegge vuoto, così come la barra degli indirizzi, e ue_load_completed riceve un indirizzo vuoto. Senza <title>, il suo titolo è vuoto. Un'immagine del disco (file:///) non vi viene mostrata: il motore non lascia che una pagina data: legga i file della postazione; scriva l'immagine nella pagina (<img src="data:image/png;base64,…">).

Un file locale si apre allo stesso modo con file:///C:/temp/rapporto.html, o semplicemente con il suo percorso C:\temp\rapporto.html.


Ripartire da zero #

of_reset() non si limita a svuotare la pagina: cancella anche la cronologia di navigazione. Un utente non può quindi tornare, con il pulsante Indietro, su una pagina consultata dall'utente precedente o in un'altra pratica. Non tocca ciò che i siti hanno memorizzato: cookie, sessioni aperte, archiviazione locale, permessi. Su una postazione condivisa, l'utente successivo arriverebbe connesso con l'account del precedente — è of_clear_browsing_data() a cancellarlo. I siti vivono in un profilo di navigazione a parte, separato dai componenti dell'applicazione.

// Local variables
string ls_folder_url

// L'indirizzo della pratica che l'utente ha appena aperto
ls_folder_url = "https://intranet.example.com/files/4152"

// Cambio di pratica : si riparte da un browser vergine, senza cronologia
uo_browser.of_reset()

// Poi la pratica, con la sua barra degli indirizzi
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()

Perché nulla venga mai scritto su disco, imposti ib_private = true prima del primo indirizzo: cookie e archiviazione scompaiono con la vista.

È il riflesso da avere ogni volta che uno stesso componente serve a mostrare contenuti di contesti differenti.


Esempio completo #

// event open della finestra : pagina iniziale del portale interno
uo_browser.of_reset()                  // ripartire puliti (cronologia compresa)

// Gli strumenti di navigazione, poi la pagina iniziale
uo_browser.ib_address_bar  = true      // campo URL + Indietro / Avanti / Ricarica
uo_browser.ib_context_menu = true      // stessa navigazione con il clic destro
uo_browser.is_address = "https://intranet.example.com/home"
// event ue_load_completed di uo_browser : (string as_url)
uo_status.of_panel(/*key*/ "main").is_text = "Pagina caricata: " + as_url

Buone pratiche #

Ereditato dalla base comune #

Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.

MembriRuoloDescritto in
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà
is_accessible_name · is_accessible_descriptionIl nome e la descrizione che dice un lettore di schermo3.4 Proprietà ed event opzionali

Due aiuti non sono ereditati: of_icon e of_escape_markup vivono su n_pbt_utils. Ne dichiari uno — n_pbt_utils lnv_utils, niente da creare — e li chiami su di esso.


← Riferimento dei componenti · Sommario della guida