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 #
| Userobject | u_pbt_webbrowser |
| Classe degli item | — (componente senza item) |
| Serve per | Mostrare 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à | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_address | string | "" | 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 |
ib_address_bar | boolean | false | Mostra la barra degli indirizzi integrata: campo URL, pulsanti Indietro / Avanti / Ricarica |
ib_context_menu | boolean | false | Attiva 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_url | string | "" | 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_window | boolean | false | Chiede a ue_new_window prima di aprire una nuova finestra nella vista; restituire false mantiene la pagina corrente |
ib_veto_downloads | boolean | false | Chiede a ue_download_starting prima di ogni download; restituire false lo annulla |
ib_veto_navigation | boolean | false | Chiede a ue_navigating prima che il sito passi a un'altra pagina (collegamento, modulo, script); restituire false mantiene la pagina corrente. Una pagina autorizzata viene riaperta all'indirizzo richiesto: un modulo inviato in POST perde i suoi dati |
ib_private | boolean | false | Navigazione 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_title | string | "" | Titolo della pagina visualizzata, letto in tempo reale (ue_title_changed avvisa quando cambia). Solo lettura: scriverlo non cambia nulla |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
Metodi #
| Metodo | Ruolo |
|---|---|
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 ( ) | Torna alla pagina precedente. Segue l'ordine del Suo codice: is_address poi of_go_back() vengono eseguiti in quest'ordine |
of_go_forward ( ) | Avanza alla pagina successiva |
of_can_go_back ( ) → boolean | true 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 ( ) → boolean | true se esiste una pagina successiva |
of_stop ( ) | Interrompe il caricamento in corso e abbandona le pagine ancora in attesa; il caricamento interrotto solleva ue_load_failed |
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) → long | Mostra 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 ( ) → long | Cancella 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_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 |
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 #
| Event | Attivato 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 |
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) → boolean | La 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) → boolean | Un 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) → boolean | Il sito passa a un'altra pagina: un collegamento, un modulo, uno script — mai un indirizzo impostato dalla Sua applicazione. 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) → boolean | Il 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_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) |
Navigare #
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.
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"
Restare sui propri server #
ue_navigating viene sollevato ogni volta che il sito passa a un'altra pagina — un collegamento, un modulo, uno script —, mai per un indirizzo impostato dal Suo codice. Con ib_veto_navigation diventa una domanda: restituire false mantiene la pagina corrente. Una pagina autorizzata viene riaperta all'indirizzo richiesto dal sito; un modulo inviato in POST perde i suoi dati.
// 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
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:
| Costante | Significa |
|---|---|
LOADSTATUS_HOST_NOT_RESOLVED | Host sconosciuto (nome errato, DNS) |
LOADSTATUS_DISCONNECTED · LOADSTATUS_CANNOT_CONNECT · LOADSTATUS_SERVER_UNREACHABLE | Nessuna rete, server irraggiungibile |
LOADSTATUS_TIMEOUT | Il server non ha risposto in tempo |
LOADSTATUS_CERT_INVALID · LOADSTATUS_CERT_EXPIRED · LOADSTATUS_CERT_NAME_INCORRECT · LOADSTATUS_CERT_REVOKED · LOADSTATUS_CLIENT_CERT_ERROR | Certificato rifiutato |
LOADSTATUS_CANCELED | Caricamento annullato da of_stop o da un indirizzo più recente |
LOADSTATUS_AUTH_REQUIRED · LOADSTATUS_PROXY_AUTH_REQUIRED | Credenziali richieste (server, proxy) |
LOADSTATUS_CONNECTION_ABORTED · LOADSTATUS_CONNECTION_RESET · LOADSTATUS_INVALID_RESPONSE · LOADSTATUS_REDIRECT_FAILED · LOADSTATUS_UNEXPECTED_ERROR · LOADSTATUS_UNKNOWN | Altri 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")
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).
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.
// 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 #
- Assegni
is_address, non chiami un metodo di navigazione: è la proprietà che attiva l'apertura della pagina. - Attivi
ib_address_barnon appena l'utente può navigare liberamente; riservi il pilotaggio tramite i Suoi pulsanti ai percorsi vincolati. - Si affidi a
of_can_go_back()/of_can_go_forward()per lo stato dei Suoi pulsanti anziché contare le pagine da sé: le redirezioni falserebbero il Suo conteggio. - Nulla da prevedere per i siti che rifiutano la visualizzazione integrata: la pagina viene sempre aperta come documento principale, quelle intestazioni non si applicano.
- Chiami
of_reset()cambiando contesto: è l'unico modo per garantire che nessuna pagina precedente sia raggiungibile con il pulsante Indietro. Quando cambia l'utente della postazione, aggiungaof_clear_browsing_data(): senza di esso cookie e sessioni dei siti restano. - Il componente ha bisogno del runtime web installato sulla postazione: tratti
ue_runtime_missingcome per qualsiasi altro componente (Installazione). - Un sito può riprodurre suono senza un gesto dell'utente: la riproduzione automatica con audio è permessa in tutto l'ambiente WebView2 dell'applicazione (il lettore video e il lettore di suoni ne hanno bisogno, una pagina nascosta non ha gesti). Una pagina che avvia un video con audio all'apertura lo riprodurrà; se è un problema, apra indirizzi che conosce.
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.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
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.