Testowanie origin nowego elementu <uprawnień> HTML

Istnieje kilka obowiązkowych metod proszenia o zezwolenie na korzystanie z zaawansowanych funkcji, takich jak dostęp do lokalizacji w aplikacjach internetowych. Te metody wiążą się z wieloma problemami, dlatego zespół ds. uprawnień w Chrome eksperymentuje z nową metodą deklaratywną: specjalnym elementem HTML <permission>. Ten element jest testowany w Chrome 126, a w przyszłości chcemy go ustandaryzować.

Metody imperatywne proszenia o uprawnienia

Gdy aplikacje internetowe potrzebują dostępu do zaawansowanych funkcji, muszą poprosić o zgodę. Na przykład, gdy Mapy Google wymagają lokalizacji użytkownika za pomocą interfejsu Geolocation API, przeglądarki wyświetlają użytkownikowi pytanie, często z opcją zapisania decyzji. Jest to dobrze zdefiniowane pojęcie w specyfikacji uprawnień.

Dorozumiane pytanie przy pierwszym użyciu a wyraźna prośba z wyprzedzeniem

Geolocation API to zaawansowany interfejs API, który opiera się na metodzie niejawnego pytania przy pierwszym użyciu. Na przykład, gdy aplikacja wywoła metodę navigator.geolocation.getCurrentPosition(), przy pierwszym wywołaniu automatycznie pojawi się prośba o uprawnienia. Inny przykład to navigator.mediaDevices.getUserMedia().

Inne interfejsy API, takie jak Notification API czy Device Orientation and Motion API, zwykle mają wyraźny sposób na żądanie uprawnień za pomocą metody statycznej, np. Notification.requestPermission() lub DeviceMotionEvent.requestPermission().

Problemy z metodami imperatywnymi proszenia o uprawnienia

Spam związany z prośbami o uprawnienia

W przeszłości witryny mogły wywoływać metody takie jak navigator.mediaDevices.getUserMedia() lub Notification.requestPermission(), a także navigator.geolocation.getCurrentPosition() natychmiast po załadowaniu witryny. Zanim użytkownik wejdzie w interakcję z witryną, pojawi się prośba o przyznanie uprawnień. Czasami jest to określane jako spam związany z prośbą o zgodę. Dotyczy to obu podejść: zarówno pośredniego pytania przy pierwszym użyciu, jak i bezpośredniej prośby o zgodę z wyprzedzeniem.

Komunikat z prośbą o przyznanie uprawnień do korzystania z mikrofonu wyświetlany podczas ładowania strony internetowej.

Ograniczenia przeglądarki i wymagania dotyczące gestów użytkownika

Spam związany z prośbami o uprawnienia spowodował, że dostawcy przeglądarek zaczęli wymagać od użytkowników wykonania gestu, takiego jak kliknięcie przycisku lub naciśnięcie klawisza, zanim wyświetlą prośbę o uprawnienia. Problem z tym podejściem polega na tym, że przeglądarce bardzo trudno jest określić, czy dany gest użytkownika powinien spowodować wyświetlenie prośby o uprawnienia. Może użytkownik klikał stronę w frustracji w dowolnym miejscu, ponieważ strona wczytywała się zbyt długo, a może rzeczywiście klikał przycisk Zlokalizuj mnie. Niektóre witryny nauczyły się też bardzo dobrze nakłaniać użytkowników do klikania treści, aby wywołać prośbę.

Innym sposobem jest dodanie środków ograniczających nadużycia promptów, takich jak całkowite blokowanie funkcji na początku lub wyświetlanie promptu z prośbą o uprawnienia w sposób nieblokujący, mniej natrętny.

Przeglądarka Chrome z otwartą

Kontekstowe uprawnienia

Kolejnym wyzwaniem, zwłaszcza na dużych ekranach, jest sposób wyświetlania prośby o uprawnienia: nad linią śmierci, czyli poza obszarem okna przeglądarki, w którym aplikacja może rysować. Zdarza się, że użytkownicy nie zauważają komunikatu u góry okna przeglądarki, gdy klikną przycisk u dołu okna. Ten problem często nasila się, gdy w przeglądarce są włączone mechanizmy ograniczające spam.

Mapy Google z wyświetlonym komunikatem z prośbą o przyznanie uprawnień do określania lokalizacji. Przycisk dostępu do lokalizacji, który wywołał prośbę, jest daleko.

Nie można łatwo cofnąć

Wreszcie użytkownicy mogą łatwo trafić w ślepy zaułek. Na przykład po zablokowaniu dostępu do funkcji użytkownik musi wiedzieć, że w menu informacji o witrynie może zresetować uprawnienia lub ponownie włączyć zablokowane uprawnienia. W najgorszym przypadku obie opcje wymagają pełnego ponownego załadowania strony, zanim zaktualizowane ustawienie zacznie obowiązywać. Witryny nie mają możliwości zapewnienia użytkownikom łatwego skrótu do zmiany stanu istniejącego uprawnienia i muszą dokładnie wyjaśniać użytkownikom, jak zmienić ustawienia, co widać na dole zrzutu ekranu z Map Google poniżej.

Elementy sterujące witryny Chrome w Mapach Google, aby cofnąć uprawnienia.

Jeśli uprawnienie jest kluczowe dla działania aplikacji, np. dostęp do mikrofonu w przypadku aplikacji do rozmów wideo, takich jak Google Meet, wyświetlają one natrętne okna dialogowe z instrukcjami, jak odblokować uprawnienie.

Instrukcje Google Meet dotyczące otwierania elementów sterujących witryny w Chrome.

Element deklaratywny <permission>

Aby rozwiązać problemy opisane w tym poście, zespół ds. uprawnień w Chrome uruchomił test pochodzenia nowego elementu HTML, <permission>. Ten element umożliwia deweloperom deklaratywne proszenie o zezwolenie na korzystanie z podzbioru zaawansowanych funkcji dostępnych w witrynach. W najprostszej postaci używasz go tak jak w tym przykładzie:

<permission type="camera" />

To, czy <permission> powinien być elementem pustym, jest nadal przedmiotem aktywnej debaty. Element pusty to element samozamykający się w HTML-u, który nie może mieć żadnych węzłów podrzędnych, co w HTML-u oznacza, że nie może mieć tagu zamykającego.

Atrybut type

Atrybut type zawiera oddzieloną spacjami listę uprawnień, o które prosisz. W momencie pisania tego artykułu dozwolone wartości to 'camera', 'microphone'camera microphone (rozdzielone spacją). Ten element domyślnie renderuje się podobnie do przycisków z podstawowym stylem klienta użytkownika.

Przyciski różnych elementów uprawnień z uprawnieniami do korzystania z kamery, mikrofonu oraz kamery i mikrofonu.

Atrybut type-ext

W przypadku niektórych uprawnień, które dopuszczają dodatkowe parametry, atrybut type-ext akceptuje pary klucz-wartość rozdzielone spacjami, np.precise:true w przypadku uprawnień do geolokalizacji.

Atrybut lang

Tekst przycisku jest dostarczany przez przeglądarkę i ma być spójny, więc nie można go bezpośrednio dostosować. Przeglądarka zmienia język tekstu na podstawie odziedziczonego języka dokumentu lub łańcucha elementów nadrzędnych albo opcjonalnego atrybutu lang. Oznacza to, że deweloperzy nie muszą sami lokalizować elementu <permission>. Jeśli element <permission> przejdzie etap testowania w ramach programu Origin Trial, w przypadku każdego typu uprawnień może być obsługiwanych kilka ciągów tekstowych lub ikon, aby zwiększyć elastyczność. Jeśli chcesz używać elementu <permission> i potrzebujesz konkretnego ciągu znaków lub ikony, skontaktuj się z nami.

Zachowanie

Gdy użytkownik wejdzie w interakcję z elementem <permission>, może przechodzić przez różne etapy:

  • Jeśli użytkownik nie zezwolił wcześniej na korzystanie z danej funkcji, może zezwolić na to przy każdej wizycie lub tylko podczas bieżącej wizyty.

    Prośba o przyznanie uprawnień do korzystania z funkcji tym razem lub przy każdej wizycie.

  • Jeśli wcześniej zezwolili na korzystanie z tej funkcji, mogą nadal to robić lub zrezygnować z niej.

    Prośba o przyznanie uprawnień, aby nadal zezwalać lub przestać zezwalać.

  • Jeśli wcześniej nie zezwolili na korzystanie z danej funkcji, mogą nadal nie zezwalać na nią lub zezwolić na nią tym razem.

    Prośba o uprawnienia, aby nadal nie zezwalać lub zezwolić tym razem.

Tekst elementu <permission> jest automatycznie aktualizowany na podstawie stanu. Jeśli na przykład przyznano uprawnienia do korzystania z funkcji, tekst zmieni się na informację, że funkcja jest dozwolona. Jeśli najpierw trzeba przyznać uprawnienia, tekst zmieni się na zaproszenie użytkownika do korzystania z funkcji. Porównaj wcześniejszy zrzut ekranu z poniższym, aby zobaczyć oba stany.

Przyciski uprawnień z tekstem

Projekt CSS

Aby użytkownicy mogli łatwo rozpoznać przycisk jako miejsce dostępu do zaawansowanych funkcji, styl elementu <permission> jest ograniczony. Jeśli ograniczenia dotyczące stylizacji nie działają w Twoim przypadku, daj nam znać, jak i dlaczego. Nie wszystkie potrzeby związane ze stylem mogą zostać zaspokojone, ale mamy nadzieję, że po zakończeniu okresu próbnego znajdziemy bezpieczne sposoby na umożliwienie większej liczby stylów elementu <permission>. W tabeli poniżej znajdziesz szczegółowe informacje o właściwościach, które podlegają ograniczeniom lub specjalnym regułom. Jeśli któraś z reguł zostanie naruszona, element <permission> zostanie wyłączony i nie będzie można z nim wchodzić w interakcję. Wszelkie próby interakcji z nim spowodują wyjątki, które można przechwycić za pomocą JavaScriptu. Komunikat o błędzie będzie zawierać więcej informacji o wykrytym naruszeniu.

Właściwość Reguły

color, background-color

Można ich użyć do ustawienia odpowiednio koloru tekstu i tła. Kontrast między tymi dwoma kolorami musi być wystarczający, aby tekst był wyraźnie czytelny (współczynnik kontrastu co najmniej 3). Kanał alfa musi mieć wartość 1.

font-size, zoom

Musi być ustawiona w zakresie od small do xxxlarge. W przeciwnym razie element zostanie wyłączony. Powiększenie zostanie uwzględnione podczas obliczania wartości font-size.

outline-offset

Wartości ujemne zostaną skorygowane do 0.
margin (wszystkie) Wartości ujemne zostaną skorygowane do 0.

font-weight

Wartości poniżej 200 zostaną skorygowane do 200.

font-style

Wartości inne niż normalitalic zostaną skorygowane do wartości normal.

word-spacing

Wartości powyżej 0.5em zostaną skorygowane do 0.5em. Wartości poniżej 0 zostaną skorygowane do 0.

display

Wartości inne niż inline-blocknone zostaną skorygowane do wartości inline-block.

letter-spacing

Wartości powyżej 0.2em zostaną skorygowane do 0.2em. Wartości poniżej -0.05em zostaną skorygowane do -0.05em.

min-height

Będzie mieć wartość domyślną 1em. Jeśli podasz wartość, zostanie uwzględniona maksymalna obliczona wartość spośród wartości domyślnej i podanej.

max-height

Będzie mieć wartość domyślną 3em. Jeśli podasz wartość, zostanie uwzględniona mniejsza z wartości domyślnej i podanej.

min-width

Będzie mieć wartość domyślną fit-content. Jeśli zostanie podana, zostanie uwzględniona maksymalna obliczona wartość spośród wartości domyślnej i podanej.

max-width

Będzie mieć wartość domyślną 3 razy fit-content. Jeśli zostanie podana wartość, zostanie uwzględniona mniejsza z wartości domyślnej i podanej.

padding-top

Ma zastosowanie tylko wtedy, gdy zasada height ma wartość auto. W tym przypadku wartości powyżej 1em zostaną skorygowane do 1em, a wartość padding-bottom zostanie ustawiona na padding-top.

padding-left

Ma zastosowanie tylko wtedy, gdy zasada width ma wartość auto. W tym przypadku wartości powyżej 5em zostaną skorygowane do 5em, a wartość padding-right zostanie ustawiona na padding-left..

transform

Zniekształcające efekty wizualne będą niedozwolone. Obecnie akceptujemy tylko tłumaczenie 2D i proporcjonalne skalowanie w górę.

Możesz używać tych właściwości CSS w normalny sposób:

  • font-kerning
  • font-optical-sizing
  • font-stretch
  • font-synthesis-weight
  • font-synthesis-style
  • font-synthesis-small-caps
  • font-feature-settings
  • forced-color-adjust
  • text-rendering
  • align-self
  • anchor-name aspect-ratio
  • border (i wszystkie usługi border-*)
  • clear
  • color-scheme
  • contain
  • contain-intrinsic-width
  • contain-intrinsic-height
  • container-name
  • container-type
  • counter-*
  • flex-*
  • float
  • height
  • isolation
  • justify-self
  • left
  • order
  • orphans
  • outline-* (z wyjątkiem outline-offset, o którym wspomnieliśmy wcześniej)
  • overflow-anchor
  • overscroll-behavior-*
  • page
  • position
  • position-anchor
  • content-visibility
  • right
  • scroll-margin-*
  • scroll-padding-*
  • text-spacing-trim
  • top
  • visibility
  • x
  • y
  • ruby-position
  • user-select
  • width
  • will-change
  • z-index

Można też używać wszystkich właściwości logicznie równoważnych (np. inline-size jest równoważne z width), zgodnie z tymi samymi regułami co ich odpowiedniki.

Pseudo-classes

Istnieją 2 specjalne pseudoklasy, które umożliwiają stylowanie elementu <permission> w zależności od jego stanu:

  • :granted: Pseudoklasa :granted umożliwia specjalne stylowanie, gdy przyznano uprawnienia.
  • :invalid: pseudoklasa :invalid umożliwia specjalne stylowanie, gdy element jest w nieprawidłowym stanie, np. gdy jest wyświetlany w elemencie iframe z innej domeny.
permission {
  background-color: green;
}

permission:granted {
  background-color: light-green;
}

/* Not supported during the origin trial. */
permission:invalid {
  background-color: gray;
}

Zdarzenia JavaScript

Element <permission> jest przeznaczony do używania z interfejsem Permissions API. Możesz nasłuchiwać wielu zdarzeń:

  • onpromptdismiss: to zdarzenie jest wywoływane, gdy użytkownik zamknie prośbę o uprawnienia wywołaną przez element (np. klikając przycisk zamykania lub poza prośbą).

  • onpromptaction: to zdarzenie jest wywoływane, gdy użytkownik podejmie działanie w odpowiedzi na prośbę o uprawnienia wywołaną przez element. Nie musi to oznaczać, że stan uprawnień się zmienił. Użytkownik mógł wykonać działanie, które utrzymuje stan (np. nadal zezwalać na uprawnienia).

  • onvalidationstatuschange: to zdarzenie jest wywoływane, gdy element zmienia stan z "valid" na "invalid". Element jest uznawany za "valid", gdy przeglądarka ufa integralności sygnału, jeśli użytkownik go kliknie, a w przeciwnym razie za "invalid", np. gdy element jest częściowo zasłonięty przez inne treści HTML.

Rejestrować odbiorniki zdarzeń możesz bezpośrednio w kodzie HTML (<permission type="…" onpromptdismiss="alert('The prompt was dismissed');" />) lub za pomocą addEventListener() w elemencie <permission>, jak pokazano w tym przykładzie:

<permission type="camera" />
<script>
  const permission = document.querySelector('permission');
  permission.addEventListener('promptdismiss', showCameraWarning);

  function showCameraWarning() {
    // Show warning that the app isn't fully usable
    // unless the camera permission is granted.
  }

  const permissionStatus = await navigator.permissions.query({name: "camera"});
  
  permissionStatus.addEventListener('change', () => {
    // Run the check when the status changes.
    if (permissionStatus.state === "granted") {
      useCamera();
    }
  });

  // Run the initial check.
  if (permissionStatus.state === "granted") {
    useCamera();
  }
</script>

Wykrywanie cech

Jeśli przeglądarka nie obsługuje elementu HTML, nie będzie go wyświetlać. Oznacza to, że jeśli w kodzie HTML masz element <permission>, nic się nie stanie, jeśli przeglądarka go nie rozpozna. Możesz nadal wykrywać obsługę za pomocą JavaScriptu, np. aby utworzyć prośbę o uprawnienia wywoływaną kliknięciem zwykłego elementu <button>.

if ('HTMLPermissionElement' in window) {
  // The `<permission>` element is supported.
}

Wersja próbna origin

Aby wypróbować element <permission> w witrynie z udziałem prawdziwych użytkowników, zarejestruj się w programie testów źródła. Przeczytaj artykuł Wprowadzenie do testów pochodzenia, aby dowiedzieć się, jak przygotować witrynę do korzystania z testów pochodzenia. Testowanie origin będzie prowadzone od wersji Chrome 126 do 131 (od 19 lutego 2025 r.).

Prezentacja

Zapoznaj się z wersją demonstracyjną i sprawdź kod źródłowy na GitHubie. Oto zrzut ekranu przedstawiający działanie tej funkcji w obsługiwanej przeglądarce.

Prezentacja elementu uprawnień z 3 przyciskami uprawnień.

Prześlij opinię

Chętnie poznamy Twoją opinię o tym, jak funkcja <permission> sprawdza się w Twoim przypadku. Możesz odpowiedzieć na jeden z problemów w repozytorium lub zgłosić nowy. Sygnały publiczne w repozytorium elementu <permission> poinformują nas i inne przeglądarki o Twoim zainteresowaniu tym elementem.

Najczęstsze pytania

  • Dlaczego jest to lepsze rozwiązanie niż zwykły <button> w połączeniu z interfejsem Permissions API? Kliknięcie <button> to gest użytkownika, ale przeglądarki nie mają możliwości sprawdzenia, czy jest on powiązany z prośbą o uprawnienia. Jeśli użytkownik kliknie <permission>, przeglądarka może mieć pewność, że kliknięcie jest związane z prośbą o uprawnienia. Dzięki temu przeglądarka może ułatwiać procesy, które w innych okolicznościach byłyby znacznie bardziej ryzykowne. Możesz na przykład umożliwić użytkownikowi łatwe cofnięcie blokady uprawnień.
  • Co się stanie, jeśli inne przeglądarki nie będą obsługiwać elementu <permission>? Element <permission> może być używany jako ulepszenie progresywne. W przeglądarkach, które nie obsługują tej funkcji, można użyć klasycznego procesu przyznawania uprawnień. Na przykład na podstawie kliknięcia zwykłego znaku <button>. Zespół ds. uprawnień pracuje też nad polyfillem. Oznacz repozytorium GitHub gwiazdką, aby otrzymywać powiadomienia, gdy będzie gotowe.
  • Czy ten problem był omawiany z innymi dostawcami przeglądarek? Element <permission> był aktywnie omawiany podczas konferencji W3C TPAC w 2023 r. w ramach sesji tematycznej. Możesz przeczytać notatki z sesji publicznej. Zespół Chrome poprosił też obu dostawców o formalne stanowiska dotyczące standardów. Zobacz sekcję Powiązane linki. Element <permission> jest przedmiotem dyskusji z innymi przeglądarkami i mamy nadzieję, że uda nam się go ujednolicić.
  • Czy to powinien być element pusty? Trwa aktywna dyskusja, czy <permission> powinien być elementem pustym. Jeśli masz jakieś uwagi, dodaj je do zgłoszenia.

Podziękowania

Ten dokument został sprawdzony przez Balázsa Engedyego, Thomasa Nguyena, Penelope McLachlan, Mariana Harbacha, Davida Warrena i Rachel Andrew.