PBToolboxAI v5 ← Site

webbrowser — u_pbt_webbrowser #

← Komponentenreferenz · Inhalt des Handbuchs

Ein in Ihr Fenster integrierter Webbrowser: Anzeige einer Seite, Adressleiste, Verlauf Zurück / Vorwärts, Kontextmenü für die Navigation.

▶ Live ansehen — Demoanwendung, Kachel Web browser: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.


Auf einen Blick #

Userobjectu_pbt_webbrowser
Item-Klasse— (Komponente ohne Items)
WofürEine Webseite, ein internes Portal, eine Online-Dokumentation oder erzeugte HTML-Inhalte anzeigen, ohne die Anwendung zu verlassen

Schnellstart #

// open-Event des Fensters
uo_browser.ib_address_bar = true    // Adressleiste + Navigationsschaltflaechen
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

Das Setzen von is_address ist der Navigationsvorgang: Jede Zuweisung öffnet die angeforderte Seite. Eine Adresse ohne Protokoll ("beispiel.de") erhält automatisch https://. Ein Dateipfad (C:\ordner\seite.html, \\server\freigabe\seite.html) wird zu einer file:///-Adresse. Wörter, die keine Adresse sind ("Rechnung 2026"), gehen an die Suchmaschine von is_search_url; ohne Suchmaschine werden sie abgelehnt, und ue_error meldet es. Ein Servername aus einem Wort, gefolgt von /, ? oder # (office/, intranet/start), ist eine Adresse, ebenso eine IPv6-Adresse in eckigen Klammern ([::1]/x); das Wort allein (intranet) bleibt freier Text. Ein Server ohne HTTPS wird mit ausdrücklichem http:// geschrieben.


Eigenschaften #

EigenschaftTypStandardZweck
is_addressstring""Angezeigte Adresse. Das Setzen dieser Eigenschaft löst die Navigation aus. Beim Zurücklesen erhalten Sie die tatsächlich angezeigte Seite: Folgt der Benutzer einem Link oder geht er zurück, folgt sie mit (ue_load_completed informiert Sie). Akzeptierte Schemata: http(s):, file: (auch ein Dateipfad), about:, data:, mailto:, tel:; javascript: wird abgelehnt. Eine mit of_show_html angezeigte Seite (eine data:-Seite) hat keine eigene Adresse: Sie liest sich leer
ib_address_barbooleanfalseZeigt die integrierte Adressleiste an: URL-Feld, Schaltflächen Zurück / Vorwärts / Neu laden — während eine Seite lädt, wird Neu laden zu Abbrechen
ib_context_menubooleanfalseAktiviert das Kontextmenü beim Rechtsklick: Zurück, Vorwärts, Neu laden, dazu Kopieren auf einer Auswahl, Link öffnen und Linkadresse kopieren auf einem Link, Bild kopieren auf einem Bild. Per Tastatur geöffnet (Umschalt+F10) erscheint es am Element. In einem Eingabefeld bleibt das Menü Ausschneiden / Kopieren / Einfügen
is_search_urlstring""Suchmaschine für Wörter, die keine Adresse sind, %s = der kodierte Text (z. B. https://www.bing.com/search?q=%s). Standardmäßig leer: Ein solcher Text wird abgelehnt und ue_error ausgelöst — eine Geschäftsanwendung schickt die Eingaben ihrer Benutzer nicht an eine Suchmaschine, die sie nicht gewählt hat. Nur eine http(s)-Adresse mit %s wird angenommen: jede andere löst ue_error aus, und die bisherige Suchmaschine bleibt
ib_veto_new_windowbooleanfalseFragt ue_new_window, bevor ein neues Fenster in der Ansicht geöffnet wird; false behält die aktuelle Seite
ib_veto_downloadsbooleanfalseFragt ue_download_starting vor jedem Download; false bricht ihn ab
ib_veto_navigationbooleanfalseFragt ue_navigating, bevor die Seite zu einer anderen wechselt: ein Link, ein Formular oder ein Skript der Website oder eine Geste des Benutzers (eine in die Leiste getippte Adresse, Link öffnen, ein neues Fenster); false behält die aktuelle Seite. Nie für eine von Ihrem Code gesetzte Adresse und nie für eine Umleitung des Servers: Um die Anwendung auf ihren eigenen Servern zu halten, siehe is_allowed_hosts. Eine erlaubte Seite wird unter der angeforderten Adresse neu geöffnet: Ein per POST gesendetes Formular verliert dabei seine Daten
ib_privatebooleanfalsePrivates Surfen: Cookies, Speicher und Cache der Websites werden nie auf die Festplatte geschrieben und verschwinden mit der Ansicht. Vor is_address setzen: Eine Änderung öffnet die Ansicht leer (keine Seite, kein Verlauf); erneut auf true gesetzt, öffnet sie eine neue private Sitzung
is_titlestring""Titel der angezeigten Seite, live gelesen (ue_title_changed meldet jede Änderung). Nur lesbar: Ein Schreiben ändert nichts. Leer für eine Seite ohne eigenen Titel
is_allowed_hostsstring""Die Hosts, die die Seite anzeigen darf, durch | verbunden: "intranet.example.com|*.example.com" (*. = jede Subdomain, nicht die Domain selbst). Jede Seite einer http(s)-Adresse außerhalb der Liste wird abgelehnt, gleich wer sie anfordert — Ihr Code, ein Link, der Benutzer in der Leiste, eine Umleitung des Servers —, und ue_navigation_blocked meldet es; die angezeigte Seite bleibt. Eine lokale Datei, eine Seite von of_show_html und about:blank sind nicht betroffen. Ein Eintrag, der kein Hostname ist, löst ue_error aus, und die geltende Liste bleibt. Standardmäßig leer: jeder Host
ii_zoominteger100Zoom der Website in Prozent, 25 bis 500 (die Adressleiste zoomt nie); ein Wert außerhalb wird darauf zurückgeführt. Live gelesen: Strg+Mausrad in der Website ändert ihn ebenfalls. Bleibt von Seite zu Seite und über ib_private hinweg erhalten
ib_certificate_questionsbooleanfalseFragt ue_certificate_error, wenn das Zertifikat eines Servers ungültig ist (ein Intranet mit internem oder abgelaufenem Zertifikat), statt es sofort abzulehnen. Die Antwort gilt nur für diese Navigation, und eine unbeantwortete Frage ist ein Nein. Standardmäßig aus: Die Seite wird abgelehnt, und ue_load_failed liefert einen Status LOADSTATUS_CERT_*
ib_web_messagesbooleanfalseÖffnet die Brücke zwischen der Website und der Anwendung: Die Seite sendet einen Wert mit chrome.webview.postMessage(value), und ue_web_message empfängt ihn; of_post_message sendet einen an die Seite. Nur für die Ursprünge von is_message_origins: Ohne Ursprung bleibt die Brücke geschlossen. Eine Nachricht über 64 KB wird verworfen. Standardmäßig aus: Keine Website erreicht die Anwendung
is_message_originsstring""Die Ursprünge, die mit der Anwendung sprechen dürfen (siehe ib_web_messages), durch | verbunden: "https://portal.example.com|https://erp.example.com" — ein Schema, ein Host, ein Port, wenn er nicht der Standardport ist; der Pfad wird ignoriert. Exakt: Eine Subdomain ist ein anderer Ursprung. file:/// steht für die Seiten des Arbeitsplatzes. Ein Eintrag ohne Schema löst ue_error aus, und die geltende Liste bleibt
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)

Methoden #

MethodeZweck
of_refresh ( )Lädt die aktuelle Seite neu. Gibt 0 zurück, sobald angefordert, -4, wenn keine Seite angezeigt wird (is_address leer), -2, wenn die Komponente nicht erstellt ist
of_go_back ( ) → longKehrt zur vorherigen Seite zurück. Folgt der Reihenfolge Ihres Codes: is_address und dann of_go_back() werden in dieser Reihenfolge ausgeführt. Gibt 0 zurück, sobald angefordert, -2, wenn die Komponente nicht erstellt ist
of_go_forward ( ) → longGeht zur nächsten Seite weiter. Gibt 0 zurück, sobald angefordert, -2, wenn die Komponente nicht erstellt ist
of_can_go_back ( ) → booleantrue, wenn eine vorherige Seite vorhanden ist — um Ihre eigene Zurück-Schaltfläche zu aktivieren oder auszugrauen. Live von der Seite gelesen; nach einem Ladevorgang lesen (ue_load_completed)
of_can_go_forward ( ) → booleantrue, wenn eine nächste Seite vorhanden ist
of_stop ( ) → longBricht den laufenden Ladevorgang ab und verwirft die noch wartenden Seiten; der abgebrochene Ladevorgang löst ue_load_failed aus. Gibt 0 zurück, sobald angefordert, -2, wenn die Komponente nicht erstellt ist
of_execute_javascript (string as_script)Führt ein Skript in der angezeigten Seite aus und gibt seinen Wert als JSON zurück: ein Text kommt in Anführungszeichen zurück, eine Zahl nicht (42), ein Skript, das einen Fehler auslöst oder nichts zurückgibt, ergibt null. Eine lange Antwort kommt vollständig zurück. Eine einzige Bedingung, und sie ist strukturell: Die Seite muss geladen sein, rufen Sie es also aus ue_load_completed auf, nie direkt nach dem Setzen von is_address. Gibt eine leere Zeichenkette zurück, wenn noch keine Seite da ist oder nach 5 Sekunden keine Antwort kam: of_get_last_error() sagt warum
of_show_html (string as_html) → longZeigt eine von der Anwendung erzeugte Seite an (Rechnung, Schreiben). Die Seite wird kodiert: Eine Farbe #c00, ein Anker, ein % oder ein Akzent erscheinen wie geschrieben. Höchstens 2 MB nach der Kodierung: darüber ue_error, und nichts ändert sich. Gibt 0 zurück, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_clear_browsing_data ( ) → longLöscht, was die Websites gespeichert haben: Cookies (eine angemeldete Sitzung), lokalen Speicher, Cache, erteilte Berechtigungen. Das Löschen reiht sich hinter die bereits gesetzten Adressen ein: Die nächste Seite öffnet sich unbelastet. Alle webbrowser der Anwendung teilen diese Daten. Gibt 0 zurück, sobald gesendet, -2, wenn die Komponente nicht erstellt ist
of_is_loading ( ) → booleantrue, solange eine Seite lädt: von ue_load_started bis ue_load_completed oder ue_load_failed — für eine Sanduhr oder eine Stopp-Schaltfläche. Live gelesen; false vor jeder Seite
of_post_message (string as_json) → longSendet einen Wert an die angezeigte Seite, als JSON geschrieben (ein Objekt, ein Text in Anführungszeichen, eine Zahl); die Seite empfängt ihn über das Ereignis message von chrome.webview. Nur mit ib_web_messages, an eine Seite eines Ursprungs aus is_message_origins: Jede andere Seite löst ue_error aus und erhält nichts. Gibt 0 zurück, sobald gesendet, -5, wenn der Text leer oder kein JSON ist (of_get_last_error sagt warum), -2, wenn die Komponente nicht erstellt ist
of_reset ( )Setzt die Komponente zurück: Seite geleert, Navigationsverlauf gelöscht, Adressleiste ausgeblendet, Kontextmenü deaktiviert, Suchmaschine geleert, Rückfragen (ib_veto_*) deaktiviert, privates Surfen aus. Cookies und Sitzungen der Websites bleiben: Dafür gibt es of_clear_browsing_data. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist. Außerdem leert es is_allowed_hosts, setzt ii_zoom auf 100 zurück, schließt die Nachrichtenbrücke (ib_web_messages, is_message_origins) und schaltet ib_certificate_questions aus
of_save_as_png (string) · of_save_as_jpg (string)Exportiert die angezeigte Website als Bild. Liefert 0 nach dem Schreiben des Bildes, -4 wenn das Schreiben fehlschlägt, -2 wenn die Komponente nicht erzeugt ist

Events #

EventAusgelöst wenn
ue_load_completed (string as_url)Eine Seite ist fertig geladen (Ihre, ein Link, Zurück, of_refresh); as_url ist die tatsächlich erreichte Adresse, Weiterleitungen inbegriffen. Nicht ausgelöst für eine leere Adresse (about:blank) oder einen fehlgeschlagenen Ladevorgang. Für eine Seite von of_show_html ist as_url leer
ue_load_failed (string as_url, long al_status)Eine Seite konnte nicht geladen werden: unbekannter Host, kein Netzwerk, Zertifikat oder ein durch of_stop oder eine neuere Adresse abgebrochener Ladevorgang. al_status nennt den Grund: siehe Warum eine Seite nicht geladen wurde
ue_error (string as_message)Ein in is_address gesetzter (oder in der Leiste getippter) Text ist keine Adresse und kein is_search_url ist gesetzt, eine Adresse konnte gar nicht geöffnet werden, oder der Prozess der Seite wurde beendet. Sonst wird nichts blockiert: Die nächste Adresse lädt normal
ue_new_window (string as_url) → booleanDie Seite verlangt nach einem Klick ein neues Fenster (Link mit target=_blank, window.open): Es öffnet sich in dieser Ansicht. Abbrechbar, wenn ib_veto_new_window = true: false behält die aktuelle Seite. Ein nur per Skript, ohne Klick geöffnetes Fenster wird ignoriert. Nur http- und https-Adressen werden geöffnet: Eine Website, die eine Datei, eine data:-Seite oder einen Mail-Link verlangt, erhält ue_error. Einen file:-Link in einer Webseite (http, https, data:) lehnt die Engine selbst ab, noch vor der Komponente: Nichts öffnet sich, und es wird kein Ereignis ausgelöst
ue_download_starting (string as_url, string as_path) → booleanEin Download beginnt: as_url ist, was heruntergeladen wird, as_path die Datei, die geschrieben wird. Abbrechbar, wenn ib_veto_downloads = true: false bricht ihn ab; sonst läuft er wie in Edge weiter
ue_navigating (string as_url) → booleanDie Seite wechselt zu einer anderen: ein Link, ein Formular oder ein Skript der Website oder eine Geste des Benutzers (in die Leiste getippte Adresse, Link öffnen, neues Fenster) — nie für eine von Ihrer Anwendung gesetzte Adresse und nie für eine Umleitung des Servers. Abbrechbar, wenn ib_veto_navigation = true: false behält die aktuelle Seite
ue_title_changed (string as_title)Der Titel der angezeigten Seite hat sich geändert (is_title liest ihn jederzeit)
ue_permission_requested (string as_url, string as_kind) → booleanDie Website verlangt Kamera, Mikrofon, Standort… (as_kind = eine PERMISSION_*-Konstante). Abgelehnt, sofern das Event nicht true zurückgibt: die einzige Frage der Bibliothek, bei der Schweigen NEIN bedeutet
ue_load_started (string as_url)Eine Seite beginnt zu laden — eine Adresse Ihres Codes, ein Link, eine Geste des Benutzers. as_url ist für eine Seite von of_show_html leer. of_is_loading() gibt bis ue_load_completed oder ue_load_failed true zurück
ue_navigation_blocked (string as_url)is_allowed_hosts hat eine Seite abgelehnt: eine Adresse, ein Link oder eine Umleitung zu einem Host außerhalb der Liste. Nichts wurde geladen, die angezeigte Seite bleibt
ue_certificate_error (string as_url, long al_status) → booleanDas Zertifikat eines Servers ist ungültig (al_status = eine Konstante LOADSTATUS_CERT_*). Nur ausgelöst, wenn ib_certificate_questions = true. Abgelehnt, außer das Ereignis gibt true zurück: Ein Zertifikat zu akzeptieren ist eine Sicherheitsentscheidung, nie der Standard. Die Antwort gilt nur für diese Navigation
ue_web_message (string as_origin, string as_json)Die Website hat einen Wert gesendet (chrome.webview.postMessage): as_json ist dieser Wert als JSON (mit n_pbt_json zu lesen), as_origin der Ursprung der sendenden Seite. Nur mit ib_web_messages und von einem Ursprung aus is_message_origins
ue_ready ( )Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt
ue_runtime_missing ( )Die WebView2-Runtime fehlt: die Komponente bleibt leer
ue_bg_color (long al_color)Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor)
ue_script_error (string as_message, string as_stack)In der Adressleiste der Komponente ist ein JavaScript-Fehler aufgetreten (nie in der angezeigten Website)

Die integrierte Adressleiste #

Das ist die schnellste Lösung: eine Eigenschaft, und der Benutzer verfügt über ein URL-Feld sowie die Schaltflächen Zurück / Vorwärts / Neu laden, im Design der übrigen Anwendung.

// Die Adressleiste, dann die zu oeffnende Seite
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

Die Schaltflächen grauen sich von selbst aus, wenn es nirgendwohin zu gehen gibt. Im Adressfeld lädt F5 (oder Strg+R) neu, Alt+← / Alt+→ gehen zurück und vorwärts (bei Schreibrichtung von rechts nach links vertauscht), Esc stellt nach einer abgebrochenen Eingabe die aktuelle Adresse wieder her, und der erste Klick markiert die ganze Adresse. Ein Text, der keine Adresse ist, wird markiert: Das Feld erhält bis zur nächsten Taste einen roten Rahmen mit einer QuickInfo. Eingabe in einem leeren Feld bewirkt nichts: Die Seite bleibt.

Ihre eigenen Schaltflächen #

Wenn Sie die Navigation lieber über Ihre eigene Symbolleiste steuern möchten, blenden Sie die integrierte Leiste aus und verwenden Sie die Methoden:

// Schaltflaechen Zurueck / Vorwaerts Ihres Fensters
uo_browser.of_go_back()
uo_browser.of_go_forward()
// ue_load_completed-Event von uo_browser : (string as_url)
// Den Zustand Ihrer Schaltflaechen nach jeder Seite aktualisieren
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()

// Und die tatsaechliche Adresse widerspiegeln (Weiterleitungen inbegriffen)
sle_url.text = as_url

Das Kontextmenü für die Navigation #

ib_context_menu fügt beim Rechtsklick ein kleines Menü Zurück / Vorwärts / Neu laden hinzu, im Design und von der Anwendung gezeichnet. Es richtet sich nach dem, was unter der Maus liegt: Kopieren auf markiertem Text, Link öffnen und Linkadresse kopieren auf einem Link, Bild kopieren auf einem Bild. Per Tastatur geöffnet (Umschalt+F10, Menütaste) erscheint es am Element. Es teilt sich denselben Verlauf wie die Adressleiste: Beide bleiben also stets konsistent.

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

Einen Ladevorgang abbrechen #

// Schaltflaeche Stopp : bricht eine Seite ab, die zu lange braucht
uo_browser.of_stop()

Wörter statt einer Adresse #

Standardmäßig wird ein Text, der keine Adresse ist, abgelehnt (ue_error), ohne etwas zu blockieren: Die nächste Adresse lädt normal. Um daraus eine Suche zu machen, wählen Sie die Suchmaschine:

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

Neue Fenster und Downloads #

Ein Link „in neuem Tab öffnen“ oder ein nach einem Klick geöffnetes Anmeldefenster wird in der Ansicht angezeigt, und ue_new_window teilt es Ihnen mit. Ein Download läuft wie in Edge weiter, und ue_download_starting nennt Ihnen Adresse und Datei. Beide werden zu einer Rückfrage, wenn Sie es verlangen:

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

Ein Anmeldefenster, das mit der öffnenden Seite kommuniziert (eine OAuth- oder Microsoft-Anmeldung im Popup), verliert diese Verbindung, sobald es in der Ansicht angezeigt wird, und die Anmeldung wird nicht abgeschlossen: Öffnen Sie eine solche Anmeldung in der Seite selbst (Umleitungsmodus).

Auf den eigenen Servern bleiben #

Um eine Geschäftsanwendung auf ihren eigenen Servern zu halten, tragen Sie diese in is_allowed_hosts ein: Jede Seite eines anderen Hosts wird abgelehnt, gleich wer sie anfordert — Ihr Code, ein Link, eine in die Leiste getippte Adresse, eine Umleitung des Servers —, und ue_navigation_blocked meldet es. Die angezeigte Seite bleibt.

// 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 wird jedes Mal ausgelöst, wenn die Seite zu einer anderen wechselt — ein Link, ein Formular oder ein Skript der Website, eine vom Benutzer getippte Adresse, Link öffnen, ein neues Fenster —, nie für eine von Ihrem Code gesetzte Adresse und nie für eine Umleitung. Mit ib_veto_navigation wird es zur Rückfrage: false behält die aktuelle Seite. Eine erlaubte Seite wird unter der angeforderten Adresse neu geöffnet; ein per POST gesendetes Formular verliert dabei seine Daten. Vergleichen Sie den Host der Adresse, nie ein Stück der ganzen Adresse: https://evil.test/?next=://intranet.example.com/ enthält den Namen Ihres Servers.

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

Kamera, Mikrofon, Standort #

Wenn eine Website Kamera, Mikrofon, Standort, Benachrichtigungen oder das Lesen der Zwischenablage verlangt, entscheidet ue_permission_requested, und die Standardantwort ist nein: Eine Website schaltet keine Kamera über eine Rückfrage ein, die der Benutzer nicht versteht. Es ist die einzige Frage der Bibliothek, bei der Schweigen Ablehnung bedeutet. Nichts wird gespeichert: Die Frage kommt bei jeder Anforderung wieder.

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

Werte von as_kind: PERMISSION_CAMERA, PERMISSION_MICROPHONE, PERMISSION_GEOLOCATION, PERMISSION_NOTIFICATIONS, PERMISSION_CLIPBOARD, PERMISSION_SENSORS, PERMISSION_DOWNLOADS (mehrere Downloads hintereinander), PERMISSION_FILES, PERMISSION_AUTOPLAY, PERMISSION_FONTS, PERMISSION_MIDI, PERMISSION_WINDOWS, PERMISSION_UNKNOWN.

Warum eine Seite nicht geladen wurde #

al_status von ue_load_failed wird mit den LOADSTATUS_*-Konstanten der Komponente verglichen:

KonstanteBedeutet
LOADSTATUS_HOST_NOT_RESOLVEDUnbekannter Host (Tippfehler, DNS)
LOADSTATUS_DISCONNECTED · LOADSTATUS_CANNOT_CONNECT · LOADSTATUS_SERVER_UNREACHABLEKein Netzwerk, Server nicht erreichbar
LOADSTATUS_TIMEOUTDer Server hat nicht rechtzeitig geantwortet
LOADSTATUS_CERT_INVALID · LOADSTATUS_CERT_EXPIRED · LOADSTATUS_CERT_NAME_INCORRECT · LOADSTATUS_CERT_REVOKED · LOADSTATUS_CLIENT_CERT_ERRORZertifikat abgelehnt
LOADSTATUS_CANCELEDLadevorgang durch of_stop oder eine neuere Adresse abgebrochen
LOADSTATUS_AUTH_REQUIRED · LOADSTATUS_PROXY_AUTH_REQUIREDAnmeldung erforderlich (Server, Proxy)
LOADSTATUS_CONNECTION_ABORTED · LOADSTATUS_CONNECTION_RESET · LOADSTATUS_INVALID_RESPONSE · LOADSTATUS_REDIRECT_FAILED · LOADSTATUS_UNEXPECTED_ERROR · LOADSTATUS_UNKNOWNAndere Verbindungs- oder Antwortfehler
// 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

Ein Skript in der Seite ausführen #

of_execute_javascript liest oder ändert die angezeigte Seite (ihren Titel, ein Feld, einen Zähler). Es ist durch die Lizenz nicht eingeschränkt, auch nicht auf einer about:blank- oder data:-Seite: Ein Skript in der Seite auszuführen ist die Aufgabe eines Browsers, und die Komponente ist kostenlos.

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

Ladeanzeige #

ue_load_started wird ausgelöst, wenn eine Seite zu laden beginnt — eine Adresse Ihres Codes, ein Link, eine Geste des Benutzers —, und of_is_loading() gibt bis ue_load_completed oder ue_load_failed true zurück: genug, um eine Sanduhr anzuzeigen oder Ihre Stopp-Schaltfläche zu aktivieren.

// 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 vergrößert oder verkleinert die Website (die Adressleiste behält ihre Größe), von 25 bis 500 %. Er liest sich live zurück: Strg+Mausrad in der Website ändert ihn ebenfalls, und Ihr Code sieht es.

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

Das Zertifikat eines Intranets #

Ein Server mit ungültigem Zertifikat (internes oder abgelaufenes Zertifikat) wird abgelehnt, und ue_load_failed liefert einen Status LOADSTATUS_CERT_*. Mit ib_certificate_questions entscheidet ue_certificate_error — und seine Standardantwort ist Nein, wie bei einer Berechtigung: Ein Zertifikat zu akzeptieren ist eine Sicherheitsentscheidung. Eine Antwort gilt nur für die laufende Navigation; nichts wird gespeichert.

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

Nachrichten zwischen der Seite und der Anwendung #

Ein internes Portal kann der Anwendung etwas mitteilen („Vorgang gespeichert“, „Zeile gewählt“): Öffnen Sie die Brücke mit ib_web_messages, und tragen Sie in is_message_origins die Ursprünge ein, die sprechen dürfen. Ohne eingetragenen Ursprung bleibt die Brücke geschlossen: Keine Website im Web kann Ihre Anwendung erreichen. Die Seite sendet einen JSON-Wert, ue_web_message empfängt ihn unverändert; of_post_message antwortet der Seite.

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

Ein Ursprung besteht aus Schema, Host und Port, wenn dieser nicht der Standardport ist (https://portal.example.com:8443); eine Subdomain ist ein anderer Ursprung, und file:/// steht für die Seiten des Arbeitsplatzes. Eine Nachricht über 64 KB wird verworfen. of_post_message an eine Seite eines anderen Ursprungs löst ue_error aus und sendet nichts.


Websites, die die eingebettete Anzeige verweigern #

Manche Websites — Google, die meisten Banken, viele SaaS-Anwendungen — senden Sicherheits-Header, die die Anzeige innerhalb einer anderen Seite verbieten. Die Komponente ist davon nicht betroffen: Sie zeigt eine Website nie in einem Rahmen. Die Seite wird als Hauptdokument geöffnet, genau wie in Ihrem eigenen Browser, und diese Header greifen dann nicht mehr.

Es gibt also nichts einzustellen und keinen Sonderfall, den Sie in Ihrem Code behandeln müssten.

// Eine Website, die die Einbettung verweigert : nichts Besonderes zu tun
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://www.google.com"

Im Gegenzug füllt die Seite die gesamte Komponente unterhalb der Adressleiste: Was Sie darüber zeichnen würden (Banner, gestaltete Überlagerungen), ist während des Surfens nicht sichtbar.


HTML-Inhalt ohne Netzwerk #

of_show_html zeigt eine von Ihrer Anwendung erzeugte HTML-Seite an: die Vorschau eines Schreibens, eines Tickets, einer Rechnung oder eines Berichts, ganz ohne Netzwerkaufruf und ohne temporäre Datei. Die Seite wird für Sie kodiert: Eine Farbe #c00, ein Anker, ein % oder ein Akzent erscheinen wie geschrieben (höchstens 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)

Direkt in is_address gesetzt, wird eine data:text/html,-Adresse nicht kodiert: Ein # schneidet die Seite dort ab (alles Folgende gilt als Anker), und ein % verfälscht sie. Verwenden Sie lieber of_show_html, oder kodieren Sie selbst (# → %23, % → %25).

Eine solche Seite hat keine eigene Adresse: is_address liest sich leer, ebenso die Adressleiste, und ue_load_completed erhält eine leere Adresse. Ohne <title> ist ihr Titel leer. Ein Bild der Festplatte (file:///) wird darin nicht angezeigt: Die Engine lässt eine data:-Seite keine Dateien des Arbeitsplatzes lesen; schreiben Sie das Bild in die Seite (<img src="data:image/png;base64,…">).

Eine lokale Datei öffnet sich genauso mit file:///C:/temp/bericht.html oder einfach über ihren Pfad C:\temp\bericht.html.


Wieder bei null anfangen #

of_reset() leert nicht nur die Seite: Es löscht auch den Navigationsverlauf. Ein Benutzer kann also nicht über die Zurück-Schaltfläche zu einer Seite gelangen, die vom vorherigen Benutzer oder in einem anderen Vorgang aufgerufen wurde. Was die Websites gespeichert haben, bleibt davon unberührt: Cookies, angemeldete Sitzungen, lokaler Speicher, Berechtigungen. An einem gemeinsam genutzten Arbeitsplatz wäre der nächste Benutzer als der vorherige angemeldet — of_clear_browsing_data() löscht das. Die Websites leben in einem eigenen Browserprofil, getrennt von den Komponenten der Anwendung.

// Local variables
string ls_folder_url

// Die Adresse des Vorgangs, den der Benutzer gerade geoeffnet hat
ls_folder_url = "https://intranet.example.com/files/4152"

// Wechsel des Vorgangs : mit einem leeren Browser ohne Verlauf neu beginnen
uo_browser.of_reset()

// Dann der Vorgang, mit seiner Adressleiste
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()

Damit nie etwas auf die Festplatte geschrieben wird, setzen Sie ib_private = true vor der ersten Adresse: Cookies und Speicher verschwinden mit der Ansicht.

Das ist der Reflex, den man haben sollte, sobald ein und dieselbe Komponente Inhalte aus unterschiedlichen Kontexten anzeigt.


Vollständiges Beispiel #

// open-Event des Fensters : Startseite des internen Portals
uo_browser.of_reset()                  // sauber neu beginnen (Verlauf inbegriffen)

// Die Navigationswerkzeuge, dann die Startseite
uo_browser.ib_address_bar  = true      // URL-Feld + Zurueck / Vorwaerts / Neu laden
uo_browser.ib_context_menu = true      // dieselbe Navigation beim Rechtsklick
uo_browser.is_address = "https://intranet.example.com/home"
// ue_load_completed-Event von uo_browser : (string as_url)
uo_status.of_panel(/*key*/ "main").is_text = "Seite geladen: " + as_url

Best Practices #

Vom gemeinsamen Sockel geerbt #

Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.

MitgliederRolleBeschrieben in
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine
is_accessible_name · is_accessible_descriptionName und Beschreibung, die ein Bildschirmleser sagt3.4 Optionale Eigenschaften und Events

Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.


← Komponentenreferenz · Inhalt des Handbuchs