Benutzeraktivierung
Um sicherzustellen, dass Anwendungen keine APIs missbrauchen können, die ein schlechtes Benutzererlebnis schaffen, wenn das Verhalten unerwünscht ist, können einige APIs nur genutzt werden, wenn der Benutzer in einem Zustand der "aktiven Interaktion" ist. Das bedeutet, dass der Benutzer aktuell mit der Webseite interagiert oder mindestens einmal in der Vergangenheit mit der Seite interagiert hat. Browser beschränken den Zugriff auf sensible 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 einer Benutzeraktivierung verfügbar sind.
Eine Benutzeraktivierung impliziert entweder, dass der Benutzer derzeit mit der Seite interagiert, oder dass eine Interaktion seit dem Laden der Seite abgeschlossen wurde. In der Regel handelt es sich dabei um einen Klick auf einen Button oder eine andere Interaktion mit der Benutzeroberfläche.
Genauer gesagt ist ein aktivierungs-auslösendes Eingabeereignis ein Ereignis, welches:
- das
isTrustedAttribut auftruegesetzt hat, und - eine der folgenden Typen ist:
-
keydown(außer für die Esc-Taste, browserreservierte Shortcuts und bestimmte Tasten, die keine Benutzeraktivierung auslösen, was je nach Tastatur variieren kann, wie z.B. Caps Lock, Num Lock und Print Screen. Das Verhalten kann je nach Browser variieren. -
pointerdown(wennpointerType"mouse" ist) -
pointerup(wennpointerTypenicht "mouse" ist)
-
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 die transiente Aktivierung nur für kurze Zeit anhält und in einigen Fällen beim Gebrauch einer geschützten Funktion aufgebraucht (deaktiviert) werden kann, während die sticky Aktivierung bis zum Ende der Session dauert.
Das Beschränken von Funktionen auf die transiente Aktivierung stellt sicher, dass diese 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 sollen, wie z.B. Popups.
Transiente Aktivierung
Transiente Aktivierung ist ein Fensterzustand, der anzeigt, dass ein Benutzer kürzlich einen Button gedrückt oder eine andere Benutzerinteraktion durchgeführt hat. Die transiente Aktivierung läuft nach einem Timeout ab (wenn sie nicht durch weitere Interaktion erneuert wird) und kann auch durch einige APIs aufgebraucht werden (wie z.B. Window.open()).
APIs, die transiente Aktivierung erfordern (Liste ist 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()LanguageModel.create()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 Button gedrückt, ein Menü verwendet oder eine andere Benutzerinteraktion durchgeführt hat. Sobald sie einmal gesetzt wurde, wird sie (im Gegensatz zur transienten Aktivierung) nicht zurückgesetzt.
APIs, die sticky Aktivierung erfordern (nicht abschließend):
beforeunloadEreignisNavigator.vibrate()VirtualKeyboard.show()- Autoplay von Media und Web Audio APIs (insbesondere für
AudioContexts). clipboardchangeEreignisse (diese können auch aktiviert werden, wenn der Benutzer dieclipboard-readBerechtigung erteilt).
BenutzerAktivierungs-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.hasBeenActivegibt an, ob das Fenster sticky Benutzeraktivierung hat.UserActivation.isActivegibt an, ob das Fenster transiente Benutzeraktivierung hat.