Benutzeraktivierung
Um sicherzustellen, dass Anwendungen nicht in der Lage sind, APIs zu missbrauchen, die eine schlechte Benutzererfahrung schaffen können, wenn das Verhalten nicht gewünscht wird, können einige APIs nur verwendet werden, wenn der Benutzer sich in einem "aktiven Interaktionszustand" befindet. Dies bedeutet, dass der Benutzer derzeit mit der Webseite interagiert oder mindestens einmal mit der Seite interagiert hat. Browser beschränken den Zugriff auf sensible APIs wie Popups, Vollbild oder Vibrations-APIs auf aktive Benutzerinteraktionen, um bösartige Skripte daran zu hindern, diese Funktionen zu missbrauchen. Diese Seite listet Webplattform-Funktionen auf, die nur nach Benutzeraktivierung verfügbar sind.
Eine Benutzeraktivierung impliziert entweder, dass der Benutzer derzeit mit der Seite interagiert oder seit dem Laden der Seite eine Interaktion abgeschlossen hat. Typischerweise handelt es sich dabei um einen Klick auf einen Button oder eine andere Interaktion mit der Benutzeroberfläche.
Genauer gesagt ist ein Aktivierungsauslösendes Eingabeereignis ein Ereignis, das:
- das Attribut
isTrustedauftruegesetzt hat und - einer der folgenden Typen ist:
-
keydown(außer der Esc-Taste, browserreservierten Tastenkombinationen und bestimmten Tasten, die keine Benutzeraktivierung erzeugen, was je nach Tastatur variiert, wie z.B. Caps Lock, Num Lock und Druck). Das Verhalten kann je nach Browser variieren. -
pointerdown(wennpointerType"mouse" ist) -
pointerup(wennpointerTypenicht "mouse" ist)
-
Wenn eine Aktivierung ausgelöst wurde, unterscheidet der User Agent zwischen zwei Arten von Benutzeraktivierungsfensterzuständen: sticky und transient.
Vergleich zwischen transienter und sticky Aktivierung
Der Unterschied zwischen transienter und sticky Aktivierung besteht darin, dass die transiente Aktivierung nur für kurze Zeit anhält und in einigen Fällen verbraucht werden kann (deaktiviert wird), wenn eine geschützte Funktion verwendet wird, während die sticky Aktivierung bis zum Ende der Sitzung bestehen bleibt.
Das Sperren von Funktionen auf transiente Aktivierung stellt sicher, dass sie nur verfügbar sind, wenn sie direkt von einem Benutzer ausgelöst werden. Sticky Aktivierung hingegen wird hauptsächlich verwendet, um Funktionen einzuschränken, die nicht automatisch beim Laden der Seite ausgelöst werden sollten, wie z.B. Popups.
Transiente Aktivierung
Transiente Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer kürzlich einen Knopf gedrückt oder eine andere Benutzerinteraktion durchgeführt hat.
Die transiente Aktivierung läuft nach einer Zeitüberschreitung ab (wenn sie nicht durch weitere Interaktion erneuert wird) und kann auch von einigen APIs verbraucht werden (wie Window.open()).
APIs, die transiente Aktivierung erfordern (Liste ist nicht erschöpfend):
Clients.openWindow()Clipboard.read()Clipboard.readText()Clipboard.write()Clipboard.writeText()ContactsManager.select()Document.requestStorageAccess()DocumentPictureInPicture.requestWindow()Element.requestFullScreen()Element.requestPointerLock()EyeDropper.open()HID.requestDevice()HTMLInputElement.showPicker()HTMLSelectElement.showPicker()HTMLVideoElement.requestPictureInPicture()IdleDetector.requestPermission()Keyboard.lock()MediaDevices.getDisplayMedia()MediaDevices.getViewportMedia()MediaDevices.selectAudioOutput()MediaStreamTrack.sendCaptureAction()Navigator.share()PaymentRequest.show()PresentationRequest.start()RemotePlayback.prompt()Serial.requestPort()USB.requestDevice()Window.getScreenDetails()Window.open()Window.queryLocalFonts()Window.showDirectoryPicker()Window.showOpenFilePicker()Window.showSaveFilePicker()WindowClient.focus()XRSystem.requestSession()
Sticky Aktivierung
Sticky Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer irgendwann in der Sitzung einen Knopf gedrückt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Er wird nicht zurückgesetzt, nachdem er einmal gesetzt wurde (im Gegensatz zur transienten Aktivierung).
APIs, die sticky Aktivierung erfordern (nicht erschöpfend):
beforeunloadEreignisNavigator.vibrate()VirtualKeyboard.show()- Automatische Wiedergabe von Media und Web Audio APIs (insbesondere für
AudioContexts).
UserActivation API
Um programmgesteuert zu bestimmen, ob ein Fenster entweder sticky oder transiente Benutzeraktivierung hat, stellt die UserActivation API zwei Eigenschaften zur Verfügung, die über navigator.userActivation verfügbar sind:
UserActivation.hasBeenActivezeigt an, ob das Fenster sticky Benutzeraktivierung hat.UserActivation.isActivezeigt an, ob das Fenster transiente Benutzeraktivierung hat.