Web Share API: límites de permisos y respaldos seguros
Diseña controles Web Share con comprobaciones de capacidad, activación transitoria, validación, cancelación y respaldo accesible.
BotBrowser Team
Quieres la documentación estructurada de Plataforma?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
Web Share es una transferencia mediada por el usuario. La página propone título, texto, URL o archivos compatibles y el navegador puede abrir una superficie del sistema tras una acción visible. La página no elige destinatario, inspecciona la lista ni recibe prueba de entrega. BotBrowser permite probar la UI de capacidad y los respaldos en contextos controlados, pero no puede seleccionar destinos, controlar la hoja del sistema ni eludir la mediación del navegador.
TL;DR
- Detecta Web Share y conserva copia, descarga o enlace normal.
- Llama a
navigator.share()solo desde una acción deliberada con activación transitoria. - Valida con
navigator.canShare()cuando exista, sin tratarlo como prueba de entrega. - Maneja cancelación y errores sin borrar la tarea.
- Web Share no enumera destinatarios, concede permisos ni establece identidad.
Contenido
- Capacidad y activación
- Validación de datos y privacidad
- Cancelación y respaldo accesible
- Pruebas con BotBrowser
- Política de permisos y contextos incrustados
- Preguntas frecuentes
- Conclusión
Capacidad y activación
La especificación Web Share del W3C y la guía MDN Web Share API describen una capacidad condicional. Contexto seguro, política, documento e integración del sistema afectan la disponibilidad. Comprueba navigator.share al usarlo: puede existir al cargar y rechazar después.
La activación transitoria es breve. Llama desde el clic o teclado del botón, no desde temporizador, red no relacionada o carga. Prepara datos seguros antes del clic y deja solo validación síncrona acotada dentro del manejador.
La activación no concede permiso. Una promesa resuelta solo informa del traspaso local expuesto a la página; no prueba superficie nativa, destinatario ni entrega. Cancelar es normal: conserva página, encabezado, formulario y control iniciador.
Describe el estado del producto, no la identidad del navegador. «Compartir disponible» habilita el control; «no disponible aquí» muestra copia o descarga. No conviertas método ausente, rechazo o distinta activación en clasificación del usuario o dispositivo.
Validación de datos y privacidad
Los datos incluyen title, text, url y archivos compatibles. Constrúyelos desde el objeto visible, elimina tokens y consultas privadas, y no añadas identificadores ocultos. MDN Navigator.share() documenta el método; navigator.canShare() comprueba aceptación en el contexto actual.
canShare() comprueba capacidad, no destinatario. No revela aplicaciones, contactos ni fin de transferencia. Se ignoran miembros desconocidos del diccionario; una propiedad extra no prueba rechazo. No uses resultados como huella: archivos, tamaño, política y plataforma pueden cambiar el resultado.
Separa autorización y compartir. Revalida lectura antes de crear URL o exportación; explica la caducidad de un enlace. El receptor autentica cada solicitud: una hoja de compartir no autoriza al servidor.
Registra solo resultados acotados como share-request-resolved, share-cancelled, share-rejected, copy-success o download-started. No guardes texto, URL privadas, archivos ni nombres. Los Principios de privacidad del W3C respaldan finalidad limitada y minimización.
Cancelación y respaldo accesible
La promesa puede rechazar AbortError cuando la persona cancela o cuando no hay un destino utilizable. Es un retorno seguro a la tarea, no prueba de decisión. Otros errores indican datos inválidos, archivos, política o plataforma. Muestra estado breve y conserva copia, descarga y enlace; no recargues, borres borradores ni reintentes en bucle.
El respaldo conserva intención: copia una URL elegida, descarga representación autorizada o expón enlace normal. Cada acción necesita etiqueta visible y teclado. Si falla el portapapeles, deja la URL seleccionable; si genera archivo, muestra progreso, reintento y cancelación.
Usa nombres accesibles, orden de foco y texto de estado; devuelve foco al iniciador salvo que la persona se haya movido. Anuncia «Compartir cancelado» o «Enlace listo para copiar», nunca excepción ni URL privada. Mantén zoom, contraste, lector de pantalla e icono con nombre y tooltip.
Marcos y modo sin conexión mantienen el mismo contrato: ofrece enlace o descarga, explica qué queda local y no supongas superficie superior dentro de cada frame. Prueba títulos largos, escrituras no latinas, bidi y mensajes traducidos; no uses locale para elegir destinatario o ubicación.
Pruebas con BotBrowser
BotBrowser valida UI de capacidad y respaldos, pero no destino, hoja del sistema, mediación, identidad ni entrega. Una fixture puede quitar navigator.share, producir AbortError, variar canShare() y comprobar copia/descarga. Usa datos sintéticos y registra compilación, contexto seguro, activación, clase de datos, resultado y revisión, nunca cuentas, URL privadas, exportaciones completas o destinatarios. Repite con método ausente, canShare ausente, datos inválidos, cancelación y éxito; interpreta éxito solo como aceptación local y conservación del respaldo.
Contrato práctico de decisión.
Define el objeto compartido antes de conectar el botón. Nombra el elemento visible que se comparte, los campos de datos que necesita, la regla de autorización de cada campo y el respaldo que mantiene posible la tarea. Una página de producto puede compartir su URL canónica pública. Un espacio de trabajo privado puede necesitar un enlace de corta duración con acceso comprobado o una exportación ofrecida solo después de que la persona confirme su alcance. Son decisiones del producto; la transferencia del navegador no las vuelve seguras automáticamente.
Mantén un único responsable de preparar la representación. Si una página construye un archivo, debe indicar cuándo está listo, si permanece local hasta que la persona inicia el compartir y cómo se descarta después de la cancelación. Si la preparación falla, deja legible la tarea original y expón un reintento. Un botón desactivado sin explicación no es un respaldo. Una acción clara de «Preparar descarga» o «Copiar enlace» ofrece una alternativa sin suponer que aparecerá una superficie de compartir del sistema.
Separa el estado del control del estado del resultado. El control puede estar disponible, no disponible, preparándose u ocupado temporalmente. El resultado puede ser cancelado, rechazado, copiado, descargado o estar esperando la transferencia del navegador. Una promesa de compartir resuelta no debe etiquetarse como «entregado», porque la página no sabe qué ocurrió después de que el navegador remitiera la solicitud. Una promesa cancelada debe devolver el control a su estado normal disponible, en vez de dejar una insignia de error pegada a la tarea.
Usa una ruta acotada para cada clase de datos. La URL de una página normalmente puede comprobarse de inmediato. Un archivo puede requerir una llamada específica a canShare() y una alternativa de descarga accesible. El texto puede necesitar una revisión de longitud o privacidad antes de proponerse. Cuando un elemento no supera la comprobación de capacidad actual, no lo modifiques repetidamente hasta que el navegador lo acepte. Muestra el respaldo elegido y deja que la persona decida si copia un enlace, descarga una representación o continúa sin compartir.
El botón de compartir no debe crear silenciosamente una nueva relación de cuenta. «Invitar» puede enviar una solicitud del servidor y necesita reglas separadas de autorización, confirmación y auditoría. «Copiar enlace» puede permanecer local hasta que la persona lo pegue en otro lugar. «Descargar» crea un archivo local bajo los controles normales del navegador. «Compartir» pide al navegador que abra una transferencia elegida por la persona. Agrupar visualmente estas opciones puede ser útil, pero sus límites de datos y significados de éxito son distintos.
Revisa los enlaces antes de que salgan de la página actual. Elimina tokens de acceso, datos de rutas internas y valores que revelen información de otra persona. Prefiere una URL canónica pública cuando ese sea el objeto previsto. Si una URL concede acceso limitado en el tiempo, muestra su caducidad y regla de audiencia antes de la acción. Una aplicación receptora puede conservar o reenviar el enlace, por lo que el servicio que lo respalda debe validar cada solicitud posterior. Web Share no sustituye un diseño normal de control de acceso.
El texto de estado debe ser factual y reversible. No uses «Hoja de compartir abierta» como resultado de una promesa: la resolución no demuestra de forma uniforme una presentación nativa. «Compartir cancelado» indica que la página no ha cambiado. «Copiar enlace no disponible» debe ir seguido de un enlace seleccionable o una descarga. Evita expresiones que supongan que existe un destino del sistema operativo, que se seleccionó un contacto o que otra aplicación aceptó el contenido. Un lenguaje claro también reduce ambigüedades de soporte entre plataformas.
Trata la variación del navegador como una entrada esperada. Un navegador puede admitir URL pero no archivos, otro puede requerir una ruta de activación más estricta y un documento incrustado puede carecer de una superficie de compartir utilizable. El producto debe mantener disponible la misma tarea esencial en cada estado. Prueba los controles visibles, no el diseño de una hoja específica del proveedor. Así se obtiene un contrato de interfaz estable aunque una actualización del navegador cambie la disponibilidad.
La revisión de accesibilidad debe incluir la cancelación además de la activación. Verifica que una persona que usa teclado pueda iniciar la acción, volver al mismo control y elegir un respaldo sin puntero. Verifica que el estado del lector de pantalla no anuncie contenido privado. Verifica que un título localizado largo se ajuste sin ocultar la acción de respaldo. Verifica que los colores forzados y el zoom alto conserven el límite entre el control principal de compartir y las opciones secundarias.
La revisión de privacidad debe preguntar qué aprende la aplicación de un intento. Normalmente la respuesta se limita al clic deliberado de la persona y a un resultado local acotado. No es un inventario de destinatarios, un grafo de contactos, un perfil del sistema operativo ni una confirmación de entrega. Si las analíticas del producto no pueden mejorar una decisión concreta a partir de un campo, no lo recojas. Mantén el esquema de eventos independiente de los metadatos de cuenta y elimina los diagnósticos de corta duración cuando termine su finalidad de soporte.
Una fixture de compatibilidad propia puede ejercitar los estados normales sin fingir que automatiza un destinatario. Empieza con una página que no tenga método de compartir y verifica la copia o descarga. Restaura el método y verifica que una llamada fuera del manejador de clic previsto deja la página en su ruta de respaldo. Después prueba datos válidos, cancelación, un archivo no compatible y un error. Cada caso debe conservar el documento y hacer evidente la siguiente acción de la persona.
El mismo contrato sirve después de un cambio de implementación. Cuando el producto añade archivos, cambia el formato de un enlace, incrusta el control o cambia su política de acceso, vuelve a ejecutar la fixture con la nueva representación. Compara los resultados visibles y el registro diagnóstico mínimo. No infieras que un éxito anterior demuestra que funcionarán un nuevo tipo de archivo o un nuevo contexto de frame. Conserva el respaldo mientras se valida la ruta actualizada.
El manejo de archivos necesita un límite concreto. Comprueba el tipo y el tamaño antes de presentar la acción principal y explica cuándo un archivo es demasiado grande o no está disponible en el contexto actual. Un respaldo de copiar enlace puede conservar la tarea cuando la ruta del archivo no puede continuar. Si la aplicación crea un archivo temporal, asígnale una vida útil controlada por la aplicación, libéralo después de la cancelación o finalización y conserva una forma de regenerarlo. Nunca resuelvas un rechazo de tamaño subiendo silenciosamente el archivo a un servicio nuevo ni cambiando su audiencia.
Las comprobaciones de contexto seguro deben estar junto a las de capacidad. Una página HTTP normal, un documento incrustado con política restrictiva y una página HTTPS superior pueden exponer resultados diferentes aunque dibujen el mismo botón. Trata cada contexto como un estado de producto compatible o no compatible y muestra el mismo respaldo esencial. No describas la diferencia como una elección de permisos de la persona cuando es una condición del documento o del navegador.
Las pruebas de cancelación deben incluir el momento. Cancela antes de que termine la preparación de datos, después de que se abra la superficie del navegador y después de que esté disponible un respaldo. La página no debe dejar un control desactivado, duplicar una descarga ni perder un campo editado en ningún caso. Una segunda activación tras la cancelación debe iniciar un intento nuevo con validación nueva. Estas comprobaciones son especialmente importantes en dispositivos táctiles, donde una superficie del sistema puede cubrir la página durante un intervalo impredecible.
Mantén el estado final local a la acción. Un intento de compartir puede actualizar una región dinámica, la etiqueta de un botón o una pequeña línea de estado, pero no debe cambiar el estado de la cuenta ni marcar un registro del servidor como entregado. Si el producto necesita una invitación del servidor, ejecútala como una operación confirmada separada, con su propia respuesta y regla de auditoría. La transferencia del navegador puede seguir siendo una comodidad junto a esa operación, en lugar de convertirse en un paso de autorización implícito.
Política de permisos y contextos incrustados
Web Share puede variar entre documento superior e iframe. La lista predeterminada de la función es self; un iframe del mismo origen quizá no necesite delegación, pero uno cross-origin requiere permiso explícito cuando la política superior lo permite. Una inserción mínima usa allow="web-share"; no selecciona destinatario ni concede permiso, solo participa en la decisión de política.
<iframe src="https://share.example.test/panel" title="Panel para compartir" allow="web-share"></iframe>
Cabecera, atributo, contexto seguro e implementación importan. Permissions-Policy: web-share=() desactiva la función y no puede reabrirse con allow. El método puede faltar, canShare() rechazar o navigator.share() producir NotAllowedError por política, activación o archivo bloqueado. No llames a todo NotAllowedError denegación del usuario; prueba iframe delegado y no delegado por separado.
Máquina de estados de compartir copiable
Mantén explícitas capacidad, activación, cancelación y concurrencia. No simula hoja nativa ni entrega.
const shareState = { value: 'idle' };
async function runShare(data, render, fallback) {
if (shareState.value === 'sharing') return;
if (!window.isSecureContext || typeof navigator.share !== 'function') return fallback('unavailable');
if (navigator.canShare && !navigator.canShare(data)) return fallback('unsupported-data');
shareState.value = 'sharing';
render(shareState.value);
try {
await navigator.share(data);
shareState.value = 'complete';
} catch (error) {
shareState.value = error?.name === 'AbortError' ? 'cancelled' : 'failed';
fallback(shareState.value);
}
render(shareState.value);
}
La protección contra segunda solicitud es estado de aplicación. InvalidStateError difiere de NotAllowedError: el primero corresponde a solicitud activa o inválida; el segundo suele reflejar política, activación o archivo bloqueado. Restaura control y respaldo. El tiempo y la superficie varían; informa solo resultado local, nunca «entregado».
Tabla de decisión y resultados esperados
| Condición | Decisión | Resultado visible |
|---|---|---|
| HTTPS superior, método presente, URL válida y clic reciente | Llamar share() una vez | Ocupado, luego completo o cancelado; respaldo permanece |
| HTTP o contexto incrustado restringido | No llamar | Explicar indisponibilidad y mostrar copia/descarga |
| Iframe sin política delegada | Capacidad no disponible | Mismo respaldo accesible, sin avisos repetidos |
| Campos conocidos inválidos/no compatibles | Mantener datos | Enlace o descarga compatible |
NotAllowedError | Clasificar política, activación o archivo bloqueado | Restaurar control y estado de respaldo |
InvalidStateError o concurrencia | Un único dueño | Ocupado/reintento sin duplicados |
Cancelado o sin destino (AbortError) | Estado local cancelled | Conservar tarea, respaldo y volver a idle |
Es un contrato de producto, no promesa de una hoja. Repite autorización para recursos privados, comprueba tipo/tamaño y conserva descarga. Miembros desconocidos se ignoran; canShare() depende de campos conocidos. Un campo inválido deja intacta la tarea.
Preguntas frecuentes
¿allow="web-share" concede permiso?
No. Delega la función si la política lo permite; activación, contexto seguro, datos, navegador y sistema siguen aplicándose.
¿Una promesa resuelta prueba entrega?
No. Solo expone el resultado a la página; puede resolverse tras aceptar el traspaso sin destinatario ni transferencia completa. Conserva estado factual y respaldo.
¿Por qué dos botones válidos producen NotAllowedError?
Pueden diferir en activación, política de frame, contexto seguro o archivo bloqueado. Una solicitud activa/inválida es InvalidStateError. Registra contexto y restaura respaldo; ningún error prueba identidad o permiso.
Conclusión
Web Share es una transferencia iniciada por usuario con capacidad condicional y sin garantía de destinatario o entrega. Comprueba al usar, conserva activación, valida datos, trata cancelación normalmente y mantén copia, descarga o enlace como primera clase. BotBrowser hace repetibles las comprobaciones controladas; destino, mediación, autorización y privacidad pertenecen a sus sistemas.
Lecturas relacionadas
- Web Share API y compartir iniciado por el usuario
- Huella digital de permisos del navegador
- Compatibilidad de funciones frente a calidad
Fuentes
Artículos Relacionados
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.