Standard HTML5 Feature Test

Tests core HTML5 APIs to verify support in the embedded browser. Each item runs a capability check and reports the result.

Audio API
Web Audio oscillator test
Click "Play Tone" to test Web Audio API
Clipboard API
Read / write clipboard
Test clipboard read/write permissions
Notifications API
Browser notification permission
Tests notification API availability and permission flow
Fetch / XHR
Remote network request test
Performs a fetch() to a public endpoint
Video Tag Playback Test
Tests <video> with /example.mp4
idle
Click "Load & Play" to test <video> with /example.mp4

Plays a video hosted on the same server at /example.mp4. Tests HTML5 <video>, codec support, autoplay policy, and media events.

Hosted Video Playback
/example.mp4
loading…
Loading /example.mp4 …
WebM Playback
/example.webm — VP8/VP9 container
loading…
Loading /example.webm …
Codec Support Matrix

Embeds a public webcam showing the Kölner Dom. Tests whether the embedded browser can display remote media streams via <iframe>.

Kölner Dom — Live Cam
Public stream via iframe embed
🔴 LIVE
Iframe embed loaded — check for cross-origin restrictions above
Alternative: getUserMedia
Local camera access via WebRTC
Tests getUserMedia — requires camera permission

Tests the Canvas 2D and WebGL rendering pipelines. Useful for detecting rendering sandboxing or GPU blocklists.

Canvas 2D Animation
Animated bouncing particles
WebGL Test
Rotating triangle via WebGL
Click Render to start WebGL context

Tests all HTML5 input types, validation, custom elements, and form submission behavior.

HTML5 Input Types
50
Fill fields and click Validate
Drag & Drop
📦
Drop here
Tooltip / title Attribute
Custom hover text — native browser tooltip rendering
div
📝 Text element
Native title tooltip
button
input
select
img
Test image
Each element has its own mode selector — or use the header buttons to set all at once

Tests localStorage, sessionStorage, IndexedDB, and Cache API availability and write/read access.

localStorage
Ready
sessionStorage
Click to test sessionStorage
IndexedDB
Tests IndexedDB open + put + get
Cache API
Tests Service Worker Cache API availability

Tests the Geolocation API. In an embedded browser, geolocation may be disabled or always denied for privacy reasons.

Geolocation Request
Requests current position via navigator.geolocation
watchPosition Test
Streams position updates

Loads /example.pdf via three different HTML embedding methods: <iframe>, <embed>, and <object>. Each behaves differently across browsers and WebView implementations — a method that renders blank is not necessarily an error in the others.

Method 1 — <iframe>
Most common approach; relies on browser PDF plugin
↗ Open Tab
Method 2 — <embed>
Direct plugin embed; no fallback content possible
<embed> does not fire onload — blank area above means the PDF plugin is unavailable or blocked
Method 3 — <object>
Legacy embed with fallback content support
⚠ Fallback content displayed

The <object> element could not render /example.pdf. This fallback content is shown instead — the PDF plugin is unavailable or the file is missing.

Method 4 — pdf.js (Canvas renderer)
Mozilla pdf.js from /pdf.js — no browser PDF plugin needed
— / —
Click "Load" to render /example.pdf via pdf.js
Loads /pdf.js then fetches and renders /example.pdf page by page onto <canvas> elements
PDF Fetch Probe
Verifies /example.pdf is reachable via HTTP
Click to check HTTP status of /example.pdf
⚠ Security Test

Tests whether the embedded browser allows the user to open a native OS file picker dialog via <input type="file"> and the File API. If the dialog opens and files can be selected, this is a medium-risk finding — a compromised or malicious page could exfiltrate file metadata.

⬡ Threat level: Medium — native dialog should be blocked or sandboxed
Standard Input[type=file] Dialog
Triggers native OS file picker

If the file picker opens: SECURITY RISK DETECTED

No files selected yet — dialog not opened
Waiting for user interaction …
Programmatic File Trigger
Attempts to open dialog without user gesture
// Attempts to open file dialog without user click: const input = document.createElement('input'); input.type = 'file'; input.click(); // Should be blocked by browser policy
Tests programmatic file picker triggering (should fail)
Directory Picker API
showDirectoryPicker() — broader FS access
// File System Access API: const dirHandle = await window.showDirectoryPicker(); // → Grants recursive read access to a directory
High-privilege API — should be blocked or unsupported
File System Access API
showOpenFilePicker() — modern FS API
const [fileHandle] = await window.showOpenFilePicker({ types: [{ description: 'All files', accept: {'*/*': []} }] }); const file = await fileHandle.getFile(); const content = await file.text();
Tests File System Access API — grants content read
⚠ Security Test

Attempts various techniques a malicious page might use to escape the browser sandbox and access local filesystem data. In a correctly configured embedded browser these should all fail. Any success is a high-severity finding.

⬡ Threat level: High — successful escapes indicate critical security misconfiguration
1. file:// Protocol Navigation
Direct local file URL access
// Attempts to navigate to or fetch local files: fetch('file:///etc/passwd') fetch('file:///C:/Windows/System32/drivers/etc/hosts') window.open('file:///etc/passwd')
Click Test to attempt file:// protocol requests
2. XMLHttpRequest to file://
XHR sync/async against local paths
const xhr = new XMLHttpRequest(); xhr.open('GET', 'file:///etc/hosts', false); // sync xhr.send(); // Should throw CORS / network error
Tests XHR against file:// paths
3. iframe src=file://
Embed local file in iframe
const f = document.createElement('iframe'); f.src = 'file:///etc/passwd'; document.body.appendChild(f); // Then attempt to read f.contentDocument
Attempts iframe pointing to local file
4. WebSocket to localhost
Probes local services
// Probes common localhost ports via WebSocket: // ws://localhost:8080, :3000, :5000, :22 // A successful connection reveals a running service
Tests WebSocket connection to localhost services
5. DNS Rebinding Simulation
Host header injection attempt
// Simulates DNS rebinding by fetching localhost // via HTTP from an external-origin page context fetch('http://localhost/') fetch('http://127.0.0.1:8080/api/admin')
Tests localhost HTTP access from remote origin
6. Custom Protocol Handlers
app://, webkit-file://, ms-appdata://
// Platform-specific embedded browser protocols: fetch('app://local/data') fetch('webkit-file:///private/var/mobile') fetch('ms-appdata:///local/sensitive.txt') window.location.href = 'content://com.android.providers'
Tests platform-specific local protocol schemes
7. Navigator Properties Leak
Fingerprint host app environment
// Reads navigator properties that may reveal // host application identity, OS paths, or tokens
Enumerates navigator properties for sensitive data
Escape Attempt Summary
Run all tests above to populate