Funktionen, die durch Benutzeraktivierung gesperrt sind
Um sicherzustellen, dass Anwendungen APIs nicht missbrauchen können, die eine schlechte Benutzererfahrung erzeugen können, wenn das Verhalten nicht erwünscht ist, können einige APIs nur verwendet werden, wenn der Benutzer sich im Zustand einer „aktiven Interaktion“ befindet, was 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, Vollbildmodus oder Vibrations-APIs auf aktive Benutzerinteraktionen, um zu verhindern, dass böswillige Skripte diese Funktionen missbrauchen. Diese Seite listet die Webplattform-Funktionen 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 eine Schaltfläche oder eine andere Benutzerinteraktion mit der Benutzeroberfläche.
Genauer gesagt ist ein Aktivierung auslösendes Eingabeereignis ein Ereignis, das:
- das Attribut
isTrusted
auftrue
gesetzt hat, und - ein Ereignis der folgenden Typen ist:
keydown
(außer der Esc-Taste oder einer vom Benutzeragenten reservierten 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 Benutzeraktivierungs-Fensterzuständen: sticky und transient.
Transiente Aktivierung
Transiente Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer kürzlich eine Schaltfläche gedrückt, die Maus bewegt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Eine transiente Aktivierung läuft nach einer Zeitüberschreitung ab (wenn sie nicht durch weitere Interaktionen erneuert wird) und kann auch durch einige APIs konsumiert werden (wie Window.open()
).
APIs, die eine transiente Aktivierung erfordern (nicht erschöpfende Liste):
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 Schaltfläche gedrückt, die Maus bewegt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Sie wird nicht zurückgesetzt, nachdem sie einmal gesetzt wurde (im Gegensatz zur transienten Aktivierung).
APIs, die eine sticky Aktivierung erfordern (nicht erschöpfende Liste):
beforeunload
EreignisNavigator.vibrate()
VirtualKeyboard.show()
- Autoplay von Media und Web Audio APIs (insbesondere für
AudioContexts
).
UserActivation API
Um programmatisch festzustellen, ob ein Fenster entweder sticky oder transiente Benutzeraktivierung hat, bietet die UserActivation
API zwei Eigenschaften, die über navigator.userActivation
verfügbar sind:
UserActivation.hasBeenActive
zeigt an, ob das Fenster eine sticky Benutzeraktivierung hat.UserActivation.isActive
zeigt an, ob das Fenster eine transiente Benutzeraktivierung hat.