Skip to content

bug(device): Android web model is reported as K with reduced User-Agent; use Client Hints when available #2634

Open

Description

@jsanjuanConsoft

Bug Report

Plugin(s)

@capacitor/device (web implementation). Observed with version 8.0.3; the current default-branch implementation in device/src/web.ts also still relies on User-Agent parsing and does not request Client Hints.

Capacitor Version

Relevant package versions: @capacitor/core 8.6.0 and @capacitor/device 8.0.3. A complete cap doctor report is not included; this report concerns the browser implementation only.

Platform(s)

Web, specifically Chrome/Chromium on Android with User-Agent reduction enabled, on HTTPS.

Current Behavior

Device.getInfo() derives model from navigator.userAgent. A reduced Android User-Agent such as:

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36

is parsed as model: "K". This is a generic value rather than the hardware model. On supported browsers, User-Agent Client Hints can expose a more accurate model, subject to browser policy.

Expected Behavior

Use the existing User-Agent parser as the baseline, and enhance the Android web model using navigator.userAgentData.getHighEntropyValues(["model"]) when available. Preserve the existing model if the API is unavailable, the request rejects, or the returned model is empty/invalid.

No native changes, public signature changes, or third-party dependencies should be needed: getInfo() already returns a Promise. Other fields could remain unchanged to keep the fix focused.

Code Reproduction

Run this in an HTTPS web application with @capacitor/device, using Chrome on an Android device:

import { Device } from "@capacitor/device";

const info = await Device.getInfo();
const hints = typeof navigator.userAgentData?.getHighEntropyValues === "function"
  ? await navigator.userAgentData.getHighEntropyValues(["model"])
  : null;

console.log({ userAgent: navigator.userAgent, parsedModel: info.model, hintedModel: hints?.model });

When Chrome exposes the hardware model via Client Hints, parsedModel can be K while hintedModel contains the actual model. If the browser withholds the hint, the current result should remain the fallback.

This is an inline reproduction; no standalone reproduction repository is attached.

Other Technical Details

Suggested tests: nonempty hinted model overrides the parsed model; missing API, rejected request, empty/whitespace/non-string model preserve the parsed result; other platforms remain unchanged.

Client Hints do not provide a unique device identifier and should not be documented as such.

Additional Context

This revisits #509, which requested the same progressive enhancement and was closed during backlog cleanup. The maintainer comment invited opening a new issue if it remained relevant. The reduced User-Agent behavior is now a practical issue rather than only an anticipated change.

Chrome documentation: https://developer.chrome.com/docs/privacy-security/user-agent-client-hints

Would a narrowly scoped PR implementing this model enhancement with fallback and tests be welcome?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions