Funktionen, die durch Benutzeraktivierung gesichert sind
Um sicherzustellen, dass Anwendungen keine APIs missbrauchen können, die ein schlechtes Benutzererlebnis schaffen können, wenn das Verhalten unerwünscht ist, können einige APIs nur verwendet werden, wenn sich der Benutzer in einem "aktiven Interaktions"-Zustand befindet. Das bedeutet, dass der Benutzer derzeit mit der Webseite interagiert oder zumindest einmal mit der Seite interagiert hat. Browser beschränken den Zugriff auf sensible APIs wie Popups, Vollbildmodus oder Vibrations-APIs auf aktive Benutzerinteraktionen, um zu verhindern, dass bösartige Skripte diese Funktionen missbrauchen. Diese Seite listet Webplattformfunktionen auf, die nur nach einer 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 ist dies ein Klick auf einen Button oder eine andere Benutzerinteraktion mit der Benutzeroberfläche.
Genauer gesagt, ist ein auslösender Eingabeereignis für die Aktivierung ein Ereignis, das:
- das Attribut
isTrusted
auftrue
gesetzt hat, und - ein Ereignis der folgenden Typen ist:
keydown
(außer für die Esc-Taste oder eine vom Benutzeragenten reservierte Tastenkombination)mousedown
pointerdown
(wennpointerType
"mouse" ist)pointerup
(wennpointerType
nicht "mouse" ist)touchend
Wenn eine Aktivierung ausgelöst wurde, unterscheidet der Benutzeragent zwischen zwei Arten von Benutzeraktivierungsfensterzuständen: sticky und transient.
Transiente Aktivierung
Transiente Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer kürzlich eine Taste gedrückt, die Maus bewegt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Transiente Aktivierung läuft nach einem Timeout 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 (nicht abschließend):
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 eine Taste gedrückt, die Maus bewegt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Sie wird, im Gegensatz zur transienten Aktivierung, nicht zurückgesetzt, nachdem sie initial gesetzt wurde.
APIs, die sticky Aktivierung erfordern (nicht abschließend):
beforeunload
EreignisNavigator.vibrate()
VirtualKeyboard.show()
- Autoplay von Medien- und Web-Audio-APIs (insbesondere für
AudioContexts
).
UserActivation API
Um programmatisch festzustellen, ob ein Fenster entweder eine sticky oder transiente Benutzeraktivierung hat, bietet die UserActivation
API zwei Eigenschaften, die über navigator.userActivation
abgerufen werden können:
UserActivation.hasBeenActive
zeigt an, ob das Fenster eine sticky Benutzeraktivierung hat.UserActivation.isActive
zeigt an, ob das Fenster eine transiente Benutzeraktivierung hat.