From 8c34d810af95fae0ef846f54370a8c88bfab7123 Mon Sep 17 00:00:00 2001 From: "netop://ウィビ" Date: Sat, 11 Apr 2026 14:24:49 -0700 Subject: initial commit --- memos/WM-020.txt | 635 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 635 insertions(+) create mode 100644 memos/WM-020.txt (limited to 'memos/WM-020.txt') diff --git a/memos/WM-020.txt b/memos/WM-020.txt new file mode 100644 index 0000000..b2ceea5 --- /dev/null +++ b/memos/WM-020.txt @@ -0,0 +1,635 @@ + + + + + + + +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 + + - ✅ `` 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. 🕸 + +References + + [1] + [2] -- cgit v1.2.3