Document: WM-020 P. Webb
Category: Research 2017.11.14
Nintendo Switch browser capabilities
Abstract
Donβt get your hopes up
Body
Before the Switch, Nintendo had a nifty HTML5 framework for game
development called Nintendo Web Framework. It used to have its own
page on Wikipedia, no idea where it disappeared to.
Anyhoo, I was looking forward to its return so I could make games for
the Switch using my existing skillset. Due to Nintendoβs enthusiasm
for the Unity and Unreal game engines, it doesnβt seem like thatβs
happening anytime soon if ever, much to the chagrin of aspiring game
developers (and Switch owners) like myself. However, I was curious to
know what the built-in browser is capable of. Hereβs what I found[1],
with my Switchβs OS on version 4.0.1:
1. Parsing Rules
- β
<!DOCTYPE html> triggers standards mode
- β
HTML5 tokenizer
- β
HTML5 tree building
- β
Parsing inline SVG
- β
Parsing inline MathML
2. Elements
- β
Embedding custom non-visible data
2.1. New or modified elements
- β
Section elements
- β
section element
- β
nav element
- β
article element
- β
aside element
- β
header element
- β
footer element
- β
Grouping content elements
- β
main element
- β
figure element
- β
figcaption element
- β
reversed attribute on the ol element
- βͺοΈ Text-level semantic elements
- β download attribute on the a element
- β
ping attribute on the a element
- β
mark element
- β
ruby, rt, and rp elements
- β time element
- β data element
- β wbr element
- βͺοΈ Interactive elements
- β
details element
- β
summary element
- β menu element of type toolbar
- β menu element of type context
- β dialog element
2.2. Global attributes or methods
- β
hidden attribute
- β
Dynamic markup insertion
- β
outerHTML property
- β
insertAdjacentHTML function
3. Forms
3.1. Field types
- β
input type=text
- β
Minimal element support
- β
Selection Direction
- β
input type=search
- β
Minimal element support
- β
input type=tel
- β
Minimal element support
- β
input type=url
- β
Minimal element support
- β
Field validation
- β
input type=email
- β
Minimal element support
- β
Field validation
- β input type=date
- β Minimal element support
- β Custom user-interface
- β Value sanitization
- β min attribute
- β max attribute
- β step attribute
- β stepDown() method
- β stepUp() method
- β valueAsDate() method
- β valueAsNumber() method
- β input type=month
- β Minimal element support
- β Custom user-interface
- β Value sanitization
- β min attribute
- β max attribute
- β step attribute
- β stepDown() method
- β stepUp() method
- β valueAsDate() method
- β valueAsNumber() method
- β input type=week
- β Minimal element support
- β Custom user-interface
- β Value sanitization
- β min attribute
- β max attribute
- β step attribute
- β stepDown() method
- β stepUp() method
- β valueAsDate() method
- β valueAsNumber() method
- β input type=time
- β Minimal element support
- β Custom user-interface
- β Value sanitization
- β min attribute
- β max attribute
- β step attribute
- β stepDown() method
- β stepUp() method
- β valueAsDate() method
- β valueAsNumber() method
- β input type=datetime-local
- β Minimal element support
- β Custom user-interface
- β Value sanitization
- β min attribute
- β max attribute
- β step attribute
- β stepDown() method
- β stepUp() method
- β valueAsNumber() method
- β
input type=number
- β
Minimal element support
- β
Custom user-interface
- β
Value sanitization
- β
Field validation
- β
min attribute
- β
max attribute
- β
step attribute
- β
stepDown() method
- β
stepUp() method
- β
valueAsNumber() method
- β
input type=range
- β
Minimal element support
- β
Custom user-interface
- β
Value sanitization
- β
min attribute
- β
max attribute
- β
step attribute
- β
stepDown() method
- β
stepUp() method
- β
valueAsNumber() method
- β
input type=color
- β
Minimal element support
- β
Custom user-interface
- β
Value sanitization
- β
input type=checkbox
- β
Minimal element support
- β
indeterminate property
- β
input type=image
- β
Minimal element support
- β
width property
- β
height property
- βͺοΈ input type=file
- β
Minimal element support
- β
files property
- β Directory upload support
- β
textarea
- β
Minimal element support
- β
maxlength attribute
- β
wrap attribute
- β
select
- β
Minimal element support
- β
required attribute
- β
fieldset
- β
Minimal element support
- β
elements attribute
- β
disabled attribute
- β datalist
- β Minimal element support
- β list attribute for fields
- β
output
- β
Minimal element support
- β
progress
- β
Minimal element support
- β
meter
- β
Minimal element support
3.2. Fields
- β
Field validation
- β
pattern attribute
- β
required attribute
- β
Association of controls and forms
- β
control property on labels
- β
form property on fields
- β
formAction property on fields
- β
formEnctype property on fields
- β
formMethod property on fields
- β
formNoValidate property on fields
- β
formTarget property on fields
- β
labels property on fields
- β
Other attributes
- β
autofocus attribute
- β
autocomplete attribute
- β
placeholder attribute
- β
multiple attribute
- β
dirname attribute
- β
CSS selectors
- β
:valid selector
- β
:invalid selector
- β
:optional selector
- β
:required selector
- β
:in-range selector
- β
:out-of-range selector
- β
:read-write selector
- β
:read-only selector
- β
Events
- β
oninput event
- β
onchange event
- β
oninvalid event
3.3. Forms
- β
Form validation
- β
checkValidity method
- β
noValidate attribute
4. Web Components
- β Custom elements
- β Shadow DOM
- β
HTML templates
- β HTML imports
5. Location and Orientation
- β Geolocation
- β
Device Orientation
- β
Device Motion
6. Output
- β
Full screen support (prefixed)
- β Web Notifications
7. Input
- β
Gamepad control
- β Pointer Events
- β Pointer Lock support
8. Communication
- β
Server-Sent Events
- β Beacon
- β Fetch
8.1. XMLHttpRequest Level 2
- β
Upload files
- β
Response type support
- β
Text response type
- β
Document response type
- β
ArrayBuffer response type
- β
Blob response type
8.2. WebSocket
- β
Basic socket communication
- β
ArrayBuffer and Blob support
9. Streams
- β Readable streams
- β Writable streams
10. Peer to Peer
10.1. Connectivity
- β
WebRTC 1.0 (prefixed)
- β ObjectRTC API for WebRTC
- β Data channel
10.2. Input
- β
Access the webcam
- β Screen Capture
- β Enumerate devices
10.3. Recording
- β Media Stream recorder
11. User Interaction
11.1. Drag and drop
- β Attributes
- β draggable attribute
- β dropzone attribute
- β Events
- β ondrag event
- β ondragstart event
- β ondragenter event
- β ondragover event
- β ondragleave event
- β ondragend event
- β ondrop event
11.2. HTML editing
- β Editing elements
- β contentEditable attribute
- β isContentEditable property
- β Editing documents
- β designMode attribute
- β CSS selectors
- β :read-write selector
- β :read-only selector
- β APIs
- β execCommand method
- β queryCommandEnabled method
- β queryCommandIndeterm method
- β queryCommandState method
- β queryCommandSupported method
- β queryCommandValue method
11.3. Clipboard
- β Clipboard API and events
11.4. Spellcheck
- β
spellcheck attribute
12. Performance
- β
Workers
- β Web Workers
- β Shared Workers
12.1. Other
- β window.requestIdleCallback
13. Security
- β
Web Cryptography API
- β
Content Security Policy 1
- β
Content Security Policy 2
- β
Cross-Origin Resource Sharing
- β Subresource Integrity
- β
Cross-document messaging
13.1. Authentication
- β Web Authentication / FIDO 2
- β Credential Management
13.2. Iframes
- β
Sandboxed iframe
- β
iframe with inline contents
14. Payments
- β Web payments
15. Video
- β
video element
- β
Subtitles
- β
Audio track selection
- β
Video track selection
- β
Poster images
- β
Codec detection
15.1. Video codecs
- β MPEG-4 ASP support
- β
H.264 support
- β H.265 support
- β Ogg Theora support
- β WebM with VP8 support
- β WebM with VP9 support
16. Audio
- β
audio element
- β
Loop audio
- β
Preload in the background
16.1. Advanced
- β
Web Audio API (prefixed)
- β Speech Recognition
- β Speech Synthesis
16.2. Audio codecs
- β PCM audio support
- β MP3 support
- β AAC support
- β Dolby Digital support
- β Dolby Digital Plus support
- β Ogg Vorbis support
- β Ogg Opus support
- β WebM with Vorbis support
- β WebM with Opus support
17. Streaming
- β Media Source extensions
- β DRM support
17.1. Adaptive bit rate
- β Dynamic Adaptive Streaming / MPEG-DASH
- β
HTTP Live Streaming / HLS
17.2. Codecs
- β Video codecs
- β MP4 with H.264 support
- β MP4 with H.265 support
- β TS with H.264 support
- β TS with H.265 support
- β WebM with VP8 support
- β WebM with VP9 support
- β Audio codecs
- β MP4 with AAC support
- β MP4 with Dolby Digital support
- β MP4 with Dolby Digital Plus support
- β TS with AAC support
- β TS with Dolby Digital support
- β TS with Dolby Digital Plus support
- β WebM with Vorbis support
- β WebM with Opus support
18. Responsive Images
- β
picture element
- β
srcset attribute
- β
sizes attribute
19. 2D Graphics
- β
Canvas 2D graphics
19.1. Drawing primitives
- β
Text support
- β
Path support
- β
Ellipse support
- β
Dashed line support
- β
System focus ring support
19.2. Features
- β Hit testing support
- β
Blending modes
19.3. Image export formats
- β
PNG support
- β
JPEG support
- β JPEG-XR support
- β
WebP support
20. 3D and VR
20.1. 3D Graphics
- β WebGL
- β WebGL 2
20.2. VR Headset
- β WebVR
21. Animation
- β Web Animations API
- β
window.requestAnimationFrame
22. Web Applications
22.1. Offline resources
- β
Application Cache
- β Service Workers
- β Push Messages
22.2. Content and Scheme handlers
- β Custom scheme handlers
- β Custom content handlers
23. Storage
23.1. Key-value storage
- β
Session Storage
- β
Local Storage
23.2. Database storage
- β IndexedDB
- β Objectstore Blob support
- β Objectstore ArrayBuffer support
24. Files
24.1. Reading files
- β
Basic support for reading files
- β
Create a Blob from a file
- β
Create a Data URL from a Blob
- β
Create an ArrayBuffer from a Blob
- β
Create a Blob URL from a Blob
24.2. Accessing the file system
- β FileSystem API
25. Scripting
25.1. Script execution
- β
Asynchronous script execution
- β
Deferred script execution
- β Script execution events
- β
Runtime script error reporting
25.2. ECMAScript 5
- β
JSON encoding and decoding
25.3. ECMAScript 6
- β Modules
- β
Classes
- β
Arrow functions
- β
Promises
- β
Template strings
- β
Typed arrays
- β
Internationalization
25.4. ECMAScript 7
- β Async and Await
25.5. Other APIs
- β
Base64 encoding and decoding
- β
Mutation Observer
- β
URL API
- β Encoding API
26. Other
- β
Session history
- β
Page Visibility
- β
Text selection
- β
Scroll into view
And soβ¦
The Nintendo Switch browser scored 339 out of 555 potential
points. Not bad for browsing but it certainly isnβt equipped for
game development. Lack of support for WebGL, WebM, the Web
Animations API, and IndexedDB certainly inhibits the kinds of
games you could make, so this might explain their silence on the
NWF front.
Oh well.
If you have a Switch and want to see these results for yourself,
here are the steps needed to access the web browser:
1. Go to System Settings > Internet > Internet Settings
2. Select the network you want to join or are already connected to
3. Select Change Settings
4. Select DNS Settings and choose Manual
5. Under DNS Settings, select Primary DNS
6. Replace the contents with 045.055.142.122 and hit OK
7. Save!
8. Connect to the network you just modified DNS settings for, and
you should see a message saying "Registration is required to
use this network"
9. Proceed and youβll be redirected to Google, where you can
search for DuckDuckGo and use that search engine instead
Extra stuff
The useragent Nintendo is going with is Mozilla/5.0 (Nintendo
Switch; WifiWebAuthApplet) AppleWebKit/601.6 (KHTML, like Gecko)
NF/4.0.0.7.9 NintendoBrowser/5.1.0.15785. I am SO glad their
useragent isnβt the usual fugly spaghetti soup that most browsers
come up with. The screen size is 1280 by 720.
I remember when people made websites for the Nintendo DS, back
when the browser (made by Opera) came in a cartridge[2]. I still
have mine btw. It also came with RAM ("Memory Expansion Pak") you
put in the GBA slot for a whopping 8MB. IGN gave it a 3.5 out of
10. HAHAHAHAHAHA
Good times. πΈ