How Fugu is the Web?
āĻ
āĻŦāϞā§āĻāύ
An extension to shine light on the Project Fugu đĄ APIs web apps want to use.
How it works API data The raw data for the different Project Fugu đĄ APIs is curated in a spreadsheet, which is then turned into JavaScript, so keeping the list of APIs updated is hopefully a straightforward task. API detection The extension monitors the requests a page makes via the chrome.webRequest.onBeforeRequest.addListener() API. Each response body, grouped by main frame, JavaScript, and Web App Manifest response bodies, is then run through a set of regular expressions like /navigator\.hid\.requestDevice\s*\(/g to determine if the code hints at a Project Fugu đĄ API potentially being used. Browser support detection Most Project Fugu đĄ APIs are easily feature-detectable by checking for the existence of interfaces or properties, for example, as in 'BarcodeDetector' in window. Other APIs require a ServiceWorkerRegistration, but luckily the popup window in Manifest V3 extensions uses a service worker, so it can be used via an IIFE that can be run in the client or the service worker. An example is (async () => 'periodicSync' in (await navigator.serviceWorker?.ready || self.registration))(). The support categories are listed below: âī¸ Supported by your browser. đĢ Not supported by your browser. 𤡠Support unknown for your browser. (The only way to know would be user-agent sniffing.) Deep-linking The extension makes use of Text Fragment URLs to deep-link to the occurrence of a detected API, for example https://airhorner.com/scripts/main.min.js#:~:text=navigator.setAppBadge(. For main frame documents, the source code gets rendered in a helper HTML page controlled by the extension, since it is impossible to link to view-source: protocol links. Limitations âĸ The chrome.webRequest.onBeforeRequest.addListener() API unfortunately does not "see" requests that are handled by a service worker (crbug.com/766433). There are three possible workarounds for this: - Hard-reload via â/ctrl+shift+r. - Open DevTools and check the Bypass for network checkbox in the Service Worker section of the Application tab. - Clear storage in the Storage section of the Application tab. âĸ The extension only does static code analysis, that is, there is no guarantee that the app actually uses the code snippet where a Project Fugu đĄ API was detected. âĸ Heavily minified code will not be detected. For example, if an app minifies navigator.clipboard.write() to const nav = navigator; nav.clipboard.write(), the extension will not detect this. License Apache 2.0.
ā§Ģ-āĻāϰ āĻŽāϧā§āϝ⧠ā§ĻāĻā§āύāĻ āϰā§āĻāĻŋāĻ āύā§āĻ
āĻĢāϞāĻžāĻĢāϞ āĻāĻŦāĻ āϰāĻŋāĻāĻŋāĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻžāύā§āύāĨ¤
āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāϰāĻŖ
- āĻāĻžāϰā§āϏāύ1.24.0
- āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§ā§§ā§Ļ āĻĄāĻŋāϏā§āĻŽā§āĻŦāϰ, ⧍ā§Ļ⧍ā§Ģ
- āύāĻŋā§ā§ āĻāϏā§āĻā§Thomas Steiner
- āϏāĻžāĻāĻ125KiB
- āĻāĻžāώāĻžāϏāĻŽā§āĻšEnglish
- āĻĄā§āĻā§āϞāĻĒāĻžāϰThomas Steiner
Neanderstr. 3 Hamburg 20459 GermanyāĻāĻŽā§āϞ
steiner.thomas@gmail.com - āĻŦā§āϝāĻŦāϏāĻžā§ā§ āύāύāĻāĻ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āύāĻŋāĻā§āĻā§ āĻāĻāĻāύ āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧā§ āĻšāĻŋāϏā§āĻŦā§ āĻļāύāĻžāĻā§āϤ āĻāϰā§āύāύāĻŋāĨ¤ āĻāĻāϰā§āĻĒā§āϝāĻŧ āĻāĻāύāĻŋāϝāĻŧāύā§āϰ āĻā§āϰāĻžāĻšāĻāĻĻā§āϰ āĻāύā§āϝ, āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻā§āϰāĻžāĻšāĻā§āϰ āĻ āϧāĻŋāĻāĻžāϰ āĻāĻĒāύāĻžāϰ āĻāĻŦāĻ āĻāĻ āĻĄā§āĻā§āϞāĻĒāĻžāϰā§āϰ āĻŽāϧā§āϝ⧠āĻā§āĻā§āϤāĻŋāϰ āĻā§āώā§āϤā§āϰ⧠āĻĒā§āϰāϝā§āĻā§āϝ āύā§āĨ¤
āĻā§āĻĒāύā§ā§āϤāĻž
āĻāĻ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻāĻĒāύāĻžāϰ āĻĄā§āĻāĻž āĻĒā§āϰāϏāĻā§āĻā§ āϝāĻž āĻā§āώāĻŖāĻž āĻāϰā§āĻā§āύ
- āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻā§āώā§āϤā§āϰ āĻāĻžāĻĄāĻŧāĻž āĻŦāĻžāĻāϰā§āϰ āĻā§āύāĻ āĻĨāĻžāϰā§āĻĄ-āĻĒāĻžāϰā§āĻāĻŋāϰ āĻāĻžāĻā§ āĻĄā§āĻāĻž āĻŦāĻŋāĻā§āϰāĻŋ āĻāϰāĻž āĻšā§ āύāĻž
- āĻāĻāĻā§āĻŽā§āϰ āĻŽā§āĻā§āϝ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻžāϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāϰā§āĻ āύā§āĻ āĻāĻŽāύ āĻā§āύāĻ āĻāĻĻā§āĻĻā§āĻļā§āϝ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻŦāĻž āĻā§āϰāĻžāύā§āϏāĻĢāĻžāϰ āĻāϰāĻž āĻšāĻā§āĻā§ āύāĻž
- āϧāĻžāϰ āύā§āĻā§āĻžāϰ āϝā§āĻā§āϝāϤāĻž āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻŦāĻž āϧāĻžāϰ āĻĻā§āĻā§āĻžāϰ āĻāĻĻā§āĻĻā§āĻļā§āϝ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻŦāĻž āĻā§āϰāĻžāύā§āϏāĻĢāĻžāϰ āĻāϰāĻž āĻšāĻā§āĻā§ āύāĻž
āϏāĻŽāϰā§āĻĨāύ
āĻĒā§āϰāĻļā§āύ, āϏāĻžāĻā§āĻļāύ āĻŦāĻž āϏāĻŽāϏā§āϝāĻžāϰ āĻāύā§āϝ āϏāĻžāĻšāĻžāϝā§āϝā§āϰ āĻĒā§āϰā§ā§āĻāύ āĻšāϞā§, āĻāĻĒāύāĻžāϰ āĻĄā§āϏā§āĻāĻāĻĒ āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻāĻ āĻĒā§āώā§āĻ āĻž āĻā§āϞā§āύ