Benutzeraktivierung
Um sicherzustellen, dass Anwendungen keine APIs missbrauchen, die ein schlechtes Benutzererlebnis schaffen können, wenn das Verhalten nicht gewünscht ist, können einige APIs nur verwendet werden, wenn der Benutzer sich im Zustand der "aktiven Interaktion" befindet. Das bedeutet, dass der Benutzer derzeit mit der Webseite interagiert oder mindestens einmal mit der Seite interagiert hat. Browser beschränken den Zugang zu sensiblen APIs wie Popups, Vollbild- oder Vibrations-APIs auf aktive Benutzerinteraktionen, um zu verhindern, dass bösartige Skripte diese Funktionen 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 durchgeführt hat. Typischerweise ist dies ein Klick auf einen Button oder eine andere Interaktion mit der Benutzeroberfläche.
Genauer gesagt, ist ein Aktivierung auslösender Eingabeereignis ein Ereignis, welches:
- das Attribut
isTrustedauftruegesetzt hat, und - einer der folgenden Typen ist:
keydown(außer für die Esc-Taste oder eine vom Benutzeragenten reservierte Tastenkombination)mousedownpointerdown(wennpointerType"mouse" ist)pointerup(wennpointerTypenicht "mouse" ist)touchend
Wenn eine Aktivierung ausgelöst wurde, unterscheidet der Benutzeragent 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 transiente Aktivierung nur kurz dauert und in einigen Fällen verbraucht (deaktiviert) werden kann, wenn eine geschützte Funktion genutzt wird, während sticky Aktivierung bis zum Ende der Sitzung anhält.
Das Sperren von Funktionen bei 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. Transiente Aktivierung läuft nach einer Zeitüberschreitung ab (sofern sie nicht durch weitere Interaktion erneuert wird) und kann auch durch einige APIs (wie Window.open()) verbraucht werden.
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ü benutzt oder eine andere Benutzerinteraktion durchgeführt hat. Sie wird nicht zurückgesetzt, nachdem sie einmal aktiviert wurde (im Gegensatz zur transienten Aktivierung).
APIs, die sticky Aktivierung erfordern (nicht erschöpfend):
beforeunloadEreignisNavigator.vibrate()VirtualKeyboard.show()- Autoplay von Medien und Web Audio APIs (insbesondere für
AudioContexts).
UserActivation API
Um programmatisch zu bestimmen, ob ein Fenster entweder sticky oder transiente Benutzeraktivierung hat, bietet die UserActivation API zwei Eigenschaften, die über navigator.userActivation verfügbar sind:
UserActivation.hasBeenActivegibt an, ob das Fenster eine sticky Benutzeraktivierung hat.UserActivation.isActivegibt an, ob das Fenster eine transiente Benutzeraktivierung hat.