Kích hoạt của người dùng
Để bảo đảm các ứng dụng không thể lạm dụng những API có thể tạo ra trải nghiệm người dùng tệ khi hành vi đó không mong muốn, một số API chỉ có thể được dùng khi người dùng đang ở trạng thái "tương tác chủ động", nghĩa là người dùng hiện đang tương tác với trang web, hoặc đã tương tác với trang ít nhất một lần. Trình duyệt giới hạn quyền truy cập vào các API nhạy cảm như popup, toàn màn hình hoặc rung cho các tương tác chủ động của người dùng để ngăn các script độc hại lạm dụng các tính năng này. Trang này liệt kê các tính năng của nền tảng web chỉ khả dụng sau khi có kích hoạt của người dùng.
Kích hoạt của người dùng ngụ ý rằng người dùng hiện đang tương tác với trang, hoặc đã hoàn tất một tương tác kể từ khi trang được tải. Thông thường, đó là một cú nhấp vào nút hoặc một tương tác khác với giao diện người dùng.
Chính xác hơn, một sự kiện đầu vào kích hoạt là một sự kiện:
- có thuộc tính
isTrustedđược đặt thànhtrue, và - là một trong các loại sau:
-
keydown(trừ phím Esc, các phím tắt dành riêng cho trình duyệt, và một số phím không tạo kích hoạt của người dùng, vốn thay đổi theo bàn phím, như Caps Lock, Num Lock, và Print Screen. Hành vi có thể khác nhau giữa các trình duyệt. -
pointerdown(nếupointerTypelà "mouse") -
pointerup(nếupointerTypekhông phải là "mouse")
-
Nếu một kích hoạt đã được kích hoạt, user agent phân biệt giữa hai trạng thái cửa sổ kích hoạt của người dùng: sticky và transient.
So sánh giữa transient và sticky activation
Sự khác nhau giữa transient và sticky activation là transient activation chỉ kéo dài trong một thời gian ngắn, và trong một số trường hợp có thể bị tiêu thụ (deactivated) khi một tính năng được bảo vệ được dùng, trong khi sticky activation tồn tại cho đến hết phiên làm việc.
Việc giới hạn tính năng bằng transient activation bảo đảm rằng chúng chỉ khả dụng nếu được người dùng kích hoạt trực tiếp. Ngược lại, sticky activation chủ yếu được dùng để hạn chế các tính năng không nên tự động kích hoạt khi tải trang, chẳng hạn popup.
Transient activation
Transient activation là một trạng thái cửa sổ cho biết người dùng gần đây đã nhấn nút hoặc thực hiện một tương tác người dùng khác.
Transient activation hết hạn sau một khoảng thời gian chờ (nếu không được gia hạn bởi tương tác tiếp theo) và cũng có thể bị một số API tiêu thụ (như Window.open()).
Các API yêu cầu transient activation (danh sách không đầy đủ):
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 activation
Sticky activation là một trạng thái cửa sổ cho biết trong một thời điểm nào đó của phiên, người dùng đã nhấn một nút, dùng một menu, hoặc thực hiện một tương tác người dùng khác. Trạng thái này không được đặt lại sau khi đã được thiết lập lần đầu (khác với transient activation).
Các API yêu cầu sticky activation (không đầy đủ):
- sự kiện
beforeunload Navigator.vibrate()VirtualKeyboard.show()- Tự phát của Media and Web Audio APIs (đặc biệt là đối với
AudioContexts). - các sự kiện
clipboardchange(các sự kiện này cũng có thể được bật nếu người dùng cấp quyềnclipboard-read).
UserActivation API
Để xác định bằng chương trình liệu một cửa sổ có sticky hay transient user activation hay không, API UserActivation cung cấp hai thuộc tính có thể truy cập qua navigator.userActivation:
UserActivation.hasBeenActivecho biết liệu cửa sổ có sticky user activation hay không.UserActivation.isActivecho biết liệu cửa sổ có transient user activation hay không.