roxxie-proxy-u-prod 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +123 -0
  3. package/SOURCE.md +29 -0
  4. package/THIRD_PARTY_NOTICES.md +24 -0
  5. package/dist/assets/filters-Bu_3nHVy.bin +0 -0
  6. package/dist/assets/index-BdRlQ7d_.css +1 -0
  7. package/dist/assets/index-DcvPYWS3.js +3621 -0
  8. package/dist/assets/inject-BnVzMVpl.js +40 -0
  9. package/dist/assets/scramjet-C9HLwI-y.wasm +0 -0
  10. package/dist/defaultfavicon.png +0 -0
  11. package/dist/icon.png +0 -0
  12. package/dist/roxxie-icon.svg +12 -0
  13. package/embed.js +70 -0
  14. package/examples/single-page.html +25 -0
  15. package/package.json +42 -0
  16. package/runtime/controller.sw.js +273 -0
  17. package/runtime/index.html +18 -0
  18. package/runtime/localcontrollersw.js +7 -0
  19. package/runtime/roxxie-network.json +13 -0
  20. package/runtime/sw.js +6 -0
  21. package/scripts/build.mjs +344 -0
  22. package/scripts/smoke.mjs +123 -0
  23. package/scripts/verify.mjs +122 -0
  24. package/source/external/dreamlandjs/LICENSE +21 -0
  25. package/source/external/dreamlandjs/README.md +22 -0
  26. package/source/external/dreamlandjs/dist/core.d.ts +167 -0
  27. package/source/external/dreamlandjs/dist/core.js +2 -0
  28. package/source/external/dreamlandjs/dist/core.js.map +1 -0
  29. package/source/external/dreamlandjs/dist/core.size.html +4950 -0
  30. package/source/external/dreamlandjs/dist/js-runtime.d.ts +3 -0
  31. package/source/external/dreamlandjs/dist/js-runtime.js +2 -0
  32. package/source/external/dreamlandjs/dist/js-runtime.js.map +1 -0
  33. package/source/external/dreamlandjs/dist/jsx-runtime.d.ts +1 -0
  34. package/source/external/dreamlandjs/dist/jsx-runtime.js +2 -0
  35. package/source/external/dreamlandjs/dist/jsx-runtime.js.map +1 -0
  36. package/source/external/dreamlandjs/dist/motion.d.ts +19 -0
  37. package/source/external/dreamlandjs/dist/motion.js +2 -0
  38. package/source/external/dreamlandjs/dist/motion.js.map +1 -0
  39. package/source/external/dreamlandjs/dist/router.d.ts +48 -0
  40. package/source/external/dreamlandjs/dist/router.js +2 -0
  41. package/source/external/dreamlandjs/dist/router.js.map +1 -0
  42. package/source/external/dreamlandjs/dist/ssr.client.d.ts +3 -0
  43. package/source/external/dreamlandjs/dist/ssr.client.js +2 -0
  44. package/source/external/dreamlandjs/dist/ssr.client.js.map +1 -0
  45. package/source/external/dreamlandjs/dist/ssr.client.size.html +4950 -0
  46. package/source/external/dreamlandjs/dist/ssr.hybrid.d.ts +7 -0
  47. package/source/external/dreamlandjs/dist/ssr.hybrid.js +2 -0
  48. package/source/external/dreamlandjs/dist/ssr.hybrid.js.map +1 -0
  49. package/source/external/dreamlandjs/dist/ssr.hybrid.size.html +4950 -0
  50. package/source/external/dreamlandjs/dist/ssr.server.d.ts +11 -0
  51. package/source/external/dreamlandjs/dist/ssr.server.js +2373 -0
  52. package/source/external/dreamlandjs/dist/ssr.server.js.map +1 -0
  53. package/source/external/dreamlandjs/dist/types/core/consts.d.ts +16 -0
  54. package/source/external/dreamlandjs/dist/types/core/css/index.d.ts +11 -0
  55. package/source/external/dreamlandjs/dist/types/core/css/selectorParser.d.ts +50 -0
  56. package/source/external/dreamlandjs/dist/types/core/delegate.d.ts +10 -0
  57. package/source/external/dreamlandjs/dist/types/core/index.d.ts +9 -0
  58. package/source/external/dreamlandjs/dist/types/core/jsx/child.d.ts +2 -0
  59. package/source/external/dreamlandjs/dist/types/core/jsx/definitions.d.ts +76 -0
  60. package/source/external/dreamlandjs/dist/types/core/jsx/dom.d.ts +28 -0
  61. package/source/external/dreamlandjs/dist/types/core/jsx/index.d.ts +14 -0
  62. package/source/external/dreamlandjs/dist/types/core/state/index.d.ts +1 -0
  63. package/source/external/dreamlandjs/dist/types/core/state/pointers.d.ts +37 -0
  64. package/source/external/dreamlandjs/dist/types/core/state/state.d.ts +13 -0
  65. package/source/external/dreamlandjs/dist/types/core/state/use.d.ts +11 -0
  66. package/source/external/dreamlandjs/dist/types/core/utils.d.ts +4 -0
  67. package/source/external/dreamlandjs/dist/types/js-runtime/index.d.ts +1 -0
  68. package/source/external/dreamlandjs/dist/types/jsx-runtime/index.d.ts +2 -0
  69. package/source/external/dreamlandjs/dist/types/motion/index.d.ts +15 -0
  70. package/source/external/dreamlandjs/dist/types/router/index.d.ts +45 -0
  71. package/source/external/dreamlandjs/dist/types/ssr/client/index.d.ts +1 -0
  72. package/source/external/dreamlandjs/dist/types/ssr/common/consts.d.ts +4 -0
  73. package/source/external/dreamlandjs/dist/types/ssr/common/serialize.d.ts +4 -0
  74. package/source/external/dreamlandjs/dist/types/ssr/common/types.d.ts +21 -0
  75. package/source/external/dreamlandjs/dist/types/ssr/hybrid/index.d.ts +4 -0
  76. package/source/external/dreamlandjs/dist/types/ssr/server/index.d.ts +7 -0
  77. package/source/external/dreamlandjs/dist/types/ssr/server/vdom.d.ts +71 -0
  78. package/source/external/dreamlandjs/dist/types/util/index.d.ts +1 -0
  79. package/source/external/dreamlandjs/dist/types/util/store.d.ts +26 -0
  80. package/source/external/dreamlandjs/dist/types/vite/css-minifier.d.ts +7 -0
  81. package/source/external/dreamlandjs/dist/types/vite/index.d.ts +11 -0
  82. package/source/external/dreamlandjs/dist/util.d.ts +29 -0
  83. package/source/external/dreamlandjs/dist/util.js +2 -0
  84. package/source/external/dreamlandjs/dist/util.js.map +1 -0
  85. package/source/external/dreamlandjs/dist/vite.d.ts +19 -0
  86. package/source/external/dreamlandjs/dist/vite.js +2 -0
  87. package/source/external/dreamlandjs/dist/vite.js.map +1 -0
  88. package/source/external/dreamlandjs/package.json +101 -0
  89. package/source/external/dreamlandjs/rollup.config.ts +302 -0
  90. package/source/external/dreamlandjs/rollup.plugins.ts +1134 -0
  91. package/source/external/dreamlandjs/src/core/consts.d.ts +16 -0
  92. package/source/external/dreamlandjs/src/core/consts.js +18 -0
  93. package/source/external/dreamlandjs/src/core/css/index.ts +111 -0
  94. package/source/external/dreamlandjs/src/core/css/selectorParser.ts +313 -0
  95. package/source/external/dreamlandjs/src/core/delegate.ts +28 -0
  96. package/source/external/dreamlandjs/src/core/index.ts +31 -0
  97. package/source/external/dreamlandjs/src/core/jsx/child.ts +91 -0
  98. package/source/external/dreamlandjs/src/core/jsx/definitions.ts +125 -0
  99. package/source/external/dreamlandjs/src/core/jsx/dom.ts +49 -0
  100. package/source/external/dreamlandjs/src/core/jsx/index.ts +289 -0
  101. package/source/external/dreamlandjs/src/core/state/index.ts +1 -0
  102. package/source/external/dreamlandjs/src/core/state/pointers.ts +310 -0
  103. package/source/external/dreamlandjs/src/core/state/state.ts +112 -0
  104. package/source/external/dreamlandjs/src/core/state/use.ts +82 -0
  105. package/source/external/dreamlandjs/src/core/utils.ts +48 -0
  106. package/source/external/dreamlandjs/src/js-runtime/index.ts +4 -0
  107. package/source/external/dreamlandjs/src/jsx-runtime/index.ts +3 -0
  108. package/source/external/dreamlandjs/src/motion/index.ts +156 -0
  109. package/source/external/dreamlandjs/src/router/index.tsx +394 -0
  110. package/source/external/dreamlandjs/src/router/tsconfig.json +9 -0
  111. package/source/external/dreamlandjs/src/ssr/client/index.ts +193 -0
  112. package/source/external/dreamlandjs/src/ssr/common/consts.ts +5 -0
  113. package/source/external/dreamlandjs/src/ssr/common/serialize.ts +115 -0
  114. package/source/external/dreamlandjs/src/ssr/common/types.ts +28 -0
  115. package/source/external/dreamlandjs/src/ssr/hybrid/index.ts +144 -0
  116. package/source/external/dreamlandjs/src/ssr/server/index.ts +157 -0
  117. package/source/external/dreamlandjs/src/ssr/server/tsconfig.json +7 -0
  118. package/source/external/dreamlandjs/src/ssr/server/vdom.ts +285 -0
  119. package/source/external/dreamlandjs/src/util/index.ts +10 -0
  120. package/source/external/dreamlandjs/src/util/store.ts +134 -0
  121. package/source/external/dreamlandjs/src/vite/css-minifier.ts +222 -0
  122. package/source/external/dreamlandjs/src/vite/index.ts +60 -0
  123. package/source/external/dreamlandjs/src/vite/tsconfig.json +7 -0
  124. package/source/external/dreamlandjs/tsconfig.json +15 -0
  125. package/source/package.json +48 -0
  126. package/source/packages/adrift-protocol/package.json +31 -0
  127. package/source/packages/adrift-protocol/src/index.ts +348 -0
  128. package/source/packages/adrift-protocol/tsconfig.json +18 -0
  129. package/source/packages/cdp/LICENSE +21 -0
  130. package/source/packages/cdp/README.md +47 -0
  131. package/source/packages/cdp/dist/chobitsu.js +2 -0
  132. package/source/packages/cdp/dist/chobitsu.js.map +1 -0
  133. package/source/packages/cdp/package.json +73 -0
  134. package/source/packages/cdp/script/build.js +15 -0
  135. package/source/packages/cdp/src/Chobitsu.ts +110 -0
  136. package/source/packages/cdp/src/domains/CSS.ts +378 -0
  137. package/source/packages/cdp/src/domains/CacheStorage.ts +8 -0
  138. package/source/packages/cdp/src/domains/DOM.ts +487 -0
  139. package/source/packages/cdp/src/domains/DOMDebugger.ts +109 -0
  140. package/source/packages/cdp/src/domains/DOMStorage.ts +122 -0
  141. package/source/packages/cdp/src/domains/Debugger.ts +25 -0
  142. package/source/packages/cdp/src/domains/IndexedDB.ts +207 -0
  143. package/source/packages/cdp/src/domains/Input.ts +177 -0
  144. package/source/packages/cdp/src/domains/Network.ts +251 -0
  145. package/source/packages/cdp/src/domains/Overlay.ts +230 -0
  146. package/source/packages/cdp/src/domains/Page.ts +296 -0
  147. package/source/packages/cdp/src/domains/Runtime.ts +273 -0
  148. package/source/packages/cdp/src/domains/Storage.ts +71 -0
  149. package/source/packages/cdp/src/index.d.ts +8 -0
  150. package/source/packages/cdp/src/index.ts +153 -0
  151. package/source/packages/cdp/src/lib/connector.ts +15 -0
  152. package/source/packages/cdp/src/lib/constants.ts +1 -0
  153. package/source/packages/cdp/src/lib/evaluate.ts +59 -0
  154. package/source/packages/cdp/src/lib/mutationObserver.ts +39 -0
  155. package/source/packages/cdp/src/lib/nodeManager.ts +142 -0
  156. package/source/packages/cdp/src/lib/objManager.ts +422 -0
  157. package/source/packages/cdp/src/lib/request.ts +313 -0
  158. package/source/packages/cdp/src/lib/resources.ts +59 -0
  159. package/source/packages/cdp/src/lib/scriptMananger.ts +62 -0
  160. package/source/packages/cdp/src/lib/stylesheet.ts +146 -0
  161. package/source/packages/cdp/src/lib/util.ts +105 -0
  162. package/source/packages/cdp/tsconfig.json +16 -0
  163. package/source/packages/cdp/webpack.config.js +48 -0
  164. package/source/packages/chrome/index.html +17 -0
  165. package/source/packages/chrome/package.json +41 -0
  166. package/source/packages/chrome/public/ROXXIE_NETWORK.md +22 -0
  167. package/source/packages/chrome/public/controller.sw.js +273 -0
  168. package/source/packages/chrome/public/defaultfavicon.png +0 -0
  169. package/source/packages/chrome/public/icon.png +0 -0
  170. package/source/packages/chrome/public/localcontrollersw.js +7 -0
  171. package/source/packages/chrome/public/roxxie-icon.svg +12 -0
  172. package/source/packages/chrome/public/roxxie-network.json +13 -0
  173. package/source/packages/chrome/public/sw.js +6 -0
  174. package/source/packages/chrome/src/App.tsx +269 -0
  175. package/source/packages/chrome/src/CDP.ts +285 -0
  176. package/source/packages/chrome/src/Tab/History.ts +186 -0
  177. package/source/packages/chrome/src/Tab/Tab.tsx +219 -0
  178. package/source/packages/chrome/src/Tab/screenshot.ts +66 -0
  179. package/source/packages/chrome/src/Tab/serialize.ts +221 -0
  180. package/source/packages/chrome/src/adblock/AdBlockPlugin.test.ts +159 -0
  181. package/source/packages/chrome/src/adblock/AdBlockPlugin.ts +232 -0
  182. package/source/packages/chrome/src/adblock/AdBlockService.test.ts +148 -0
  183. package/source/packages/chrome/src/adblock/AdBlockService.ts +166 -0
  184. package/source/packages/chrome/src/adblock/NOTICE.md +14 -0
  185. package/source/packages/chrome/src/adblock/assets/filters.bin +0 -0
  186. package/source/packages/chrome/src/adblock/index.ts +18 -0
  187. package/source/packages/chrome/src/assets/favicon.ts +4 -0
  188. package/source/packages/chrome/src/components/BookmarkPopup.tsx +101 -0
  189. package/source/packages/chrome/src/components/BookmarksStrip.tsx +150 -0
  190. package/source/packages/chrome/src/components/Button.tsx +99 -0
  191. package/source/packages/chrome/src/components/Checkbox.tsx +89 -0
  192. package/source/packages/chrome/src/components/DownloadsPopup.tsx +230 -0
  193. package/source/packages/chrome/src/components/Favicon.tsx +65 -0
  194. package/source/packages/chrome/src/components/Icon.tsx +29 -0
  195. package/source/packages/chrome/src/components/Input.tsx +82 -0
  196. package/source/packages/chrome/src/components/Menu.tsx +287 -0
  197. package/source/packages/chrome/src/components/Omnibar/BookmarkButton.tsx +73 -0
  198. package/source/packages/chrome/src/components/Omnibar/CircularProgress.tsx +83 -0
  199. package/source/packages/chrome/src/components/Omnibar/Omnibar.tsx +455 -0
  200. package/source/packages/chrome/src/components/Omnibar/OmnibarButton.tsx +48 -0
  201. package/source/packages/chrome/src/components/Omnibar/Omnibox.tsx +466 -0
  202. package/source/packages/chrome/src/components/Omnibar/SiteOptionsButton.tsx +52 -0
  203. package/source/packages/chrome/src/components/Omnibar/Suggestion.tsx +186 -0
  204. package/source/packages/chrome/src/components/Omnibar/UrlInput.tsx +198 -0
  205. package/source/packages/chrome/src/components/Omnibar/suggestions.ts +468 -0
  206. package/source/packages/chrome/src/components/Omnibar/utils.ts +11 -0
  207. package/source/packages/chrome/src/components/ReportBrokenSiteModal.tsx +279 -0
  208. package/source/packages/chrome/src/components/Shell.tsx +191 -0
  209. package/source/packages/chrome/src/components/SiteInformationPopup.tsx +96 -0
  210. package/source/packages/chrome/src/components/SmallIconButton.tsx +36 -0
  211. package/source/packages/chrome/src/components/StartScreen.tsx +386 -0
  212. package/source/packages/chrome/src/components/TabStrip/DragTab.tsx +546 -0
  213. package/source/packages/chrome/src/components/TabStrip/Sidebar.tsx +820 -0
  214. package/source/packages/chrome/src/components/TabStrip/TabHoverCard.tsx +87 -0
  215. package/source/packages/chrome/src/components/TabStrip/TabStrip.tsx +510 -0
  216. package/source/packages/chrome/src/components/TopSiteButton.tsx +234 -0
  217. package/source/packages/chrome/src/consts.ts +3 -0
  218. package/source/packages/chrome/src/icons.ts +70 -0
  219. package/source/packages/chrome/src/index.ts +168 -0
  220. package/source/packages/chrome/src/migrations/0-from-legacy.ts +6 -0
  221. package/source/packages/chrome/src/migrations/1-vertical-tab-settings.ts +15 -0
  222. package/source/packages/chrome/src/migrations/index.ts +42 -0
  223. package/source/packages/chrome/src/pages/AboutPage.tsx +37 -0
  224. package/source/packages/chrome/src/pages/DownloadsPage.tsx +133 -0
  225. package/source/packages/chrome/src/pages/HistoryPage.tsx +99 -0
  226. package/source/packages/chrome/src/pages/NewTabPage.tsx +264 -0
  227. package/source/packages/chrome/src/pages/PlaygroundPage.tsx +43 -0
  228. package/source/packages/chrome/src/pages/SettingsPage.tsx +1931 -0
  229. package/source/packages/chrome/src/proxy/Controller.ts +331 -0
  230. package/source/packages/chrome/src/proxy/ProxyFrame.ts +26 -0
  231. package/source/packages/chrome/src/proxy/cache.ts +487 -0
  232. package/source/packages/chrome/src/proxy/codec.ts +11 -0
  233. package/source/packages/chrome/src/proxy/contextitems.ts +180 -0
  234. package/source/packages/chrome/src/proxy/index.ts +5 -0
  235. package/source/packages/chrome/src/proxy/roxxie.ts +85 -0
  236. package/source/packages/chrome/src/proxy/scramjet.ts +642 -0
  237. package/source/packages/chrome/src/reset.css +124 -0
  238. package/source/packages/chrome/src/runtime-base.ts +16 -0
  239. package/source/packages/chrome/src/sentry.tsx +45 -0
  240. package/source/packages/chrome/src/services/DownloadsService.ts +136 -0
  241. package/source/packages/chrome/src/services/FaviconService.ts +161 -0
  242. package/source/packages/chrome/src/services/KVWrapper.ts +169 -0
  243. package/source/packages/chrome/src/services/ProfileService.ts +94 -0
  244. package/source/packages/chrome/src/services/Service.ts +10 -0
  245. package/source/packages/chrome/src/services/SettingsService.ts +108 -0
  246. package/source/packages/chrome/src/services/TabsService.ts +161 -0
  247. package/source/packages/chrome/src/startup.test.ts +129 -0
  248. package/source/packages/chrome/src/startup.ts +161 -0
  249. package/source/packages/chrome/src/style.css +229 -0
  250. package/source/packages/chrome/src/themes.ts +756 -0
  251. package/source/packages/chrome/src/util/StatefulClass.ts +31 -0
  252. package/source/packages/chrome/src/util/index.ts +74 -0
  253. package/source/packages/chrome/src/util/memoize.ts +13 -0
  254. package/source/packages/chrome/src/vite-env.d.ts +16 -0
  255. package/source/packages/chrome/tsconfig.json +30 -0
  256. package/source/packages/chrome/vite.config.ts +47 -0
  257. package/source/packages/inject/package.json +20 -0
  258. package/source/packages/inject/src/context.ts +194 -0
  259. package/source/packages/inject/src/emulators/alwaysLastBubble.ts +168 -0
  260. package/source/packages/inject/src/emulators/anchors.ts +55 -0
  261. package/source/packages/inject/src/emulators/contextmenu.ts +46 -0
  262. package/source/packages/inject/src/emulators/history.ts +51 -0
  263. package/source/packages/inject/src/emulators/titlewatcher.ts +42 -0
  264. package/source/packages/inject/src/emulators/windowopen.ts +134 -0
  265. package/source/packages/inject/src/errorpage/errorpage.css +234 -0
  266. package/source/packages/inject/src/errorpage/errorpage.html +29 -0
  267. package/source/packages/inject/src/errorpage/errorpage.ts +76 -0
  268. package/source/packages/inject/src/index.ts +62 -0
  269. package/source/packages/inject/src/transport.ts +97 -0
  270. package/source/packages/inject/src/types.d.ts +136 -0
  271. package/source/packages/roxxie-transport/package.json +36 -0
  272. package/source/packages/roxxie-transport/src/binary.ts +398 -0
  273. package/source/packages/roxxie-transport/src/config.ts +254 -0
  274. package/source/packages/roxxie-transport/src/connection.ts +767 -0
  275. package/source/packages/roxxie-transport/src/index.ts +5 -0
  276. package/source/packages/roxxie-transport/src/tracker.ts +651 -0
  277. package/source/packages/roxxie-transport/src/transport.ts +414 -0
  278. package/source/packages/roxxie-transport/tsconfig.json +18 -0
  279. package/source/packages/scramjet/packages/controller/package.json +37 -0
  280. package/source/packages/scramjet/packages/controller/src/index.ts +861 -0
  281. package/source/packages/scramjet/packages/controller/src/inject.ts +365 -0
  282. package/source/packages/scramjet/packages/controller/src/sw.ts +231 -0
  283. package/source/packages/scramjet/packages/controller/src/symbols.ts +1 -0
  284. package/source/packages/scramjet/packages/controller/src/types.d.ts +140 -0
  285. package/source/packages/scramjet/packages/controller/src/typesEntry.ts +6 -0
  286. package/source/packages/scramjet/packages/controller/src/version.ts +30 -0
  287. package/source/packages/scramjet/packages/controller/tsconfig.json +24 -0
  288. package/source/packages/scramjet/packages/core/dist/scramjet-external.mjs +57 -0
  289. package/source/packages/scramjet/packages/core/dist/scramjet.js +13599 -0
  290. package/source/packages/scramjet/packages/core/dist/scramjet.js.map +1 -0
  291. package/source/packages/scramjet/packages/core/dist/scramjet.mjs +13649 -0
  292. package/source/packages/scramjet/packages/core/dist/scramjet.mjs.map +1 -0
  293. package/source/packages/scramjet/packages/core/dist/scramjet.wasm +0 -0
  294. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js +13601 -0
  295. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.js.map +1 -0
  296. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs +13651 -0
  297. package/source/packages/scramjet/packages/core/dist/scramjet_bundled.mjs.map +1 -0
  298. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js +23 -0
  299. package/source/packages/scramjet/packages/core/dist/temp-types-build/index.js.map +1 -0
  300. package/source/packages/scramjet/packages/core/dist/types/Tap.d.ts +39 -0
  301. package/source/packages/scramjet/packages/core/dist/types/client/client.d.ts +115 -0
  302. package/source/packages/scramjet/packages/core/dist/types/client/entry.d.ts +5 -0
  303. package/source/packages/scramjet/packages/core/dist/types/client/events.d.ts +10 -0
  304. package/source/packages/scramjet/packages/core/dist/types/client/helpers.d.ts +1 -0
  305. package/source/packages/scramjet/packages/core/dist/types/client/index.d.ts +7 -0
  306. package/source/packages/scramjet/packages/core/dist/types/client/location.d.ts +2 -0
  307. package/source/packages/scramjet/packages/core/dist/types/client/shared/eval.d.ts +3 -0
  308. package/source/packages/scramjet/packages/core/dist/types/client/shared/sourcemaps.d.ts +19 -0
  309. package/source/packages/scramjet/packages/core/dist/types/client/shared/wrap.d.ts +4 -0
  310. package/source/packages/scramjet/packages/core/dist/types/client/singletonbox.d.ts +18 -0
  311. package/source/packages/scramjet/packages/core/dist/types/fetch/body.d.ts +3 -0
  312. package/source/packages/scramjet/packages/core/dist/types/fetch/fetch.d.ts +7 -0
  313. package/source/packages/scramjet/packages/core/dist/types/fetch/headers.d.ts +19 -0
  314. package/source/packages/scramjet/packages/core/dist/types/fetch/index.d.ts +128 -0
  315. package/source/packages/scramjet/packages/core/dist/types/fetch/parse.d.ts +23 -0
  316. package/source/packages/scramjet/packages/core/dist/types/fetch/util.d.ts +7 -0
  317. package/source/packages/scramjet/packages/core/dist/types/index.d.ts +12 -0
  318. package/source/packages/scramjet/packages/core/dist/types/shared/cookie.d.ts +26 -0
  319. package/source/packages/scramjet/packages/core/dist/types/shared/headers.d.ts +13 -0
  320. package/source/packages/scramjet/packages/core/dist/types/shared/htmlRules.d.ts +6 -0
  321. package/source/packages/scramjet/packages/core/dist/types/shared/index.d.ts +50 -0
  322. package/source/packages/scramjet/packages/core/dist/types/shared/mime.d.ts +53 -0
  323. package/source/packages/scramjet/packages/core/dist/types/shared/refresh.d.ts +7 -0
  324. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/css.d.ts +4 -0
  325. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/html.d.ts +33 -0
  326. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/index.d.ts +6 -0
  327. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/js.d.ts +11 -0
  328. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/url.d.ts +24 -0
  329. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/wasm.d.ts +7 -0
  330. package/source/packages/scramjet/packages/core/dist/types/shared/rewriters/worker.d.ts +3 -0
  331. package/source/packages/scramjet/packages/core/dist/types/shared/set-cookie-parser.d.ts +20 -0
  332. package/source/packages/scramjet/packages/core/dist/types/shared/snapshot.d.ts +186 -0
  333. package/source/packages/scramjet/packages/core/dist/types/shared/sniffEncoding.d.ts +65 -0
  334. package/source/packages/scramjet/packages/core/dist/types/shared/util.d.ts +2 -0
  335. package/source/packages/scramjet/packages/core/dist/types/symbols.d.ts +6 -0
  336. package/source/packages/scramjet/packages/core/dist/types/types.d.ts +60 -0
  337. package/source/packages/scramjet/packages/core/dist/types/typesEntry.d.ts +5 -0
  338. package/source/packages/scramjet/packages/core/lib/index.cjs +7 -0
  339. package/source/packages/scramjet/packages/core/lib/index.d.ts +8 -0
  340. package/source/packages/scramjet/packages/core/package.json +69 -0
  341. package/source/packages/scramjet/packages/core/rewriter/Cargo.lock +1985 -0
  342. package/source/packages/scramjet/packages/core/rewriter/Cargo.toml +20 -0
  343. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/Cargo.toml +15 -0
  344. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/analyze.rs +1118 -0
  345. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/ast_table.rs +927 -0
  346. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/helper_index.rs +556 -0
  347. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/lib.rs +455 -0
  348. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/reachability.rs +85 -0
  349. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/templates.rs +192 -0
  350. package/source/packages/scramjet/packages/core/rewriter/coverage-macro/src/witness.rs +597 -0
  351. package/source/packages/scramjet/packages/core/rewriter/js/Cargo.toml +18 -0
  352. package/source/packages/scramjet/packages/core/rewriter/js/src/cfg.rs +45 -0
  353. package/source/packages/scramjet/packages/core/rewriter/js/src/changes.rs +379 -0
  354. package/source/packages/scramjet/packages/core/rewriter/js/src/lib.rs +171 -0
  355. package/source/packages/scramjet/packages/core/rewriter/js/src/rewrite.rs +290 -0
  356. package/source/packages/scramjet/packages/core/rewriter/js/src/visitor.rs +967 -0
  357. package/source/packages/scramjet/packages/core/rewriter/native/Cargo.toml +22 -0
  358. package/source/packages/scramjet/packages/core/rewriter/native/src/main.rs +166 -0
  359. package/source/packages/scramjet/packages/core/rewriter/native/src/rewriter.rs +161 -0
  360. package/source/packages/scramjet/packages/core/rewriter/native/src/test_runner.rs +156 -0
  361. package/source/packages/scramjet/packages/core/rewriter/rust-toolchain.toml +5 -0
  362. package/source/packages/scramjet/packages/core/rewriter/rustfmt.toml +2 -0
  363. package/source/packages/scramjet/packages/core/rewriter/transform/Cargo.toml +16 -0
  364. package/source/packages/scramjet/packages/core/rewriter/transform/src/lib.rs +242 -0
  365. package/source/packages/scramjet/packages/core/rewriter/transform/src/transform.rs +123 -0
  366. package/source/packages/scramjet/packages/core/rewriter/wasm/Cargo.toml +22 -0
  367. package/source/packages/scramjet/packages/core/rewriter/wasm/build.sh +128 -0
  368. package/source/packages/scramjet/packages/core/rewriter/wasm/src/error.rs +56 -0
  369. package/source/packages/scramjet/packages/core/rewriter/wasm/src/jsr.rs +125 -0
  370. package/source/packages/scramjet/packages/core/rewriter/wasm/src/lib.rs +144 -0
  371. package/source/packages/scramjet/packages/core/src/Tap.ts +166 -0
  372. package/source/packages/scramjet/packages/core/src/client/client.ts +916 -0
  373. package/source/packages/scramjet/packages/core/src/client/dom/attr.ts +94 -0
  374. package/source/packages/scramjet/packages/core/src/client/dom/beacon.ts +11 -0
  375. package/source/packages/scramjet/packages/core/src/client/dom/cookie.ts +21 -0
  376. package/source/packages/scramjet/packages/core/src/client/dom/css.ts +106 -0
  377. package/source/packages/scramjet/packages/core/src/client/dom/document.ts +140 -0
  378. package/source/packages/scramjet/packages/core/src/client/dom/element.ts +783 -0
  379. package/source/packages/scramjet/packages/core/src/client/dom/fontface.ts +11 -0
  380. package/source/packages/scramjet/packages/core/src/client/dom/fragments.ts +32 -0
  381. package/source/packages/scramjet/packages/core/src/client/dom/history.ts +35 -0
  382. package/source/packages/scramjet/packages/core/src/client/dom/open.ts +59 -0
  383. package/source/packages/scramjet/packages/core/src/client/dom/origin.ts +13 -0
  384. package/source/packages/scramjet/packages/core/src/client/dom/performance.ts +50 -0
  385. package/source/packages/scramjet/packages/core/src/client/dom/protocol.ts +17 -0
  386. package/source/packages/scramjet/packages/core/src/client/dom/storage.ts +107 -0
  387. package/source/packages/scramjet/packages/core/src/client/entry.ts +12 -0
  388. package/source/packages/scramjet/packages/core/src/client/events.ts +10 -0
  389. package/source/packages/scramjet/packages/core/src/client/helpers.ts +7 -0
  390. package/source/packages/scramjet/packages/core/src/client/index.ts +7 -0
  391. package/source/packages/scramjet/packages/core/src/client/location.ts +139 -0
  392. package/source/packages/scramjet/packages/core/src/client/shared/antiantidebugger.ts +20 -0
  393. package/source/packages/scramjet/packages/core/src/client/shared/blob.ts +35 -0
  394. package/source/packages/scramjet/packages/core/src/client/shared/caches.ts +31 -0
  395. package/source/packages/scramjet/packages/core/src/client/shared/chrome.ts +90 -0
  396. package/source/packages/scramjet/packages/core/src/client/shared/err.ts +55 -0
  397. package/source/packages/scramjet/packages/core/src/client/shared/error.ts +42 -0
  398. package/source/packages/scramjet/packages/core/src/client/shared/eval.ts +40 -0
  399. package/source/packages/scramjet/packages/core/src/client/shared/event.ts +215 -0
  400. package/source/packages/scramjet/packages/core/src/client/shared/function.ts +59 -0
  401. package/source/packages/scramjet/packages/core/src/client/shared/import.ts +46 -0
  402. package/source/packages/scramjet/packages/core/src/client/shared/indexeddb.ts +18 -0
  403. package/source/packages/scramjet/packages/core/src/client/shared/opfs.ts +27 -0
  404. package/source/packages/scramjet/packages/core/src/client/shared/postmessage.ts +113 -0
  405. package/source/packages/scramjet/packages/core/src/client/shared/realm.ts +26 -0
  406. package/source/packages/scramjet/packages/core/src/client/shared/requests/eventsource.ts +17 -0
  407. package/source/packages/scramjet/packages/core/src/client/shared/requests/fetch.ts +67 -0
  408. package/source/packages/scramjet/packages/core/src/client/shared/requests/websocket.ts +389 -0
  409. package/source/packages/scramjet/packages/core/src/client/shared/requests/xmlhttprequest.ts +163 -0
  410. package/source/packages/scramjet/packages/core/src/client/shared/settimeout.ts +20 -0
  411. package/source/packages/scramjet/packages/core/src/client/shared/sourcemaps.ts +203 -0
  412. package/source/packages/scramjet/packages/core/src/client/shared/worker.ts +72 -0
  413. package/source/packages/scramjet/packages/core/src/client/shared/wrap.ts +197 -0
  414. package/source/packages/scramjet/packages/core/src/client/singletonbox.ts +52 -0
  415. package/source/packages/scramjet/packages/core/src/client/worker/importScripts.ts +13 -0
  416. package/source/packages/scramjet/packages/core/src/fetch/body.ts +93 -0
  417. package/source/packages/scramjet/packages/core/src/fetch/fetch.ts +323 -0
  418. package/source/packages/scramjet/packages/core/src/fetch/headers.ts +528 -0
  419. package/source/packages/scramjet/packages/core/src/fetch/index.ts +198 -0
  420. package/source/packages/scramjet/packages/core/src/fetch/parse.ts +149 -0
  421. package/source/packages/scramjet/packages/core/src/fetch/util.ts +81 -0
  422. package/source/packages/scramjet/packages/core/src/global.d.ts +32 -0
  423. package/source/packages/scramjet/packages/core/src/index.ts +78 -0
  424. package/source/packages/scramjet/packages/core/src/log.ts +117 -0
  425. package/source/packages/scramjet/packages/core/src/shared/cookie.ts +199 -0
  426. package/source/packages/scramjet/packages/core/src/shared/headers.ts +76 -0
  427. package/source/packages/scramjet/packages/core/src/shared/htmlRules.ts +154 -0
  428. package/source/packages/scramjet/packages/core/src/shared/index.ts +79 -0
  429. package/source/packages/scramjet/packages/core/src/shared/mime.ts +234 -0
  430. package/source/packages/scramjet/packages/core/src/shared/refresh.ts +164 -0
  431. package/source/packages/scramjet/packages/core/src/shared/rewriters/css.ts +67 -0
  432. package/source/packages/scramjet/packages/core/src/shared/rewriters/html.ts +603 -0
  433. package/source/packages/scramjet/packages/core/src/shared/rewriters/index.ts +6 -0
  434. package/source/packages/scramjet/packages/core/src/shared/rewriters/js.ts +158 -0
  435. package/source/packages/scramjet/packages/core/src/shared/rewriters/url.ts +248 -0
  436. package/source/packages/scramjet/packages/core/src/shared/rewriters/wasm.ts +58 -0
  437. package/source/packages/scramjet/packages/core/src/shared/rewriters/worker.ts +37 -0
  438. package/source/packages/scramjet/packages/core/src/shared/set-cookie-parser.ts +195 -0
  439. package/source/packages/scramjet/packages/core/src/shared/snapshot.ts +245 -0
  440. package/source/packages/scramjet/packages/core/src/shared/sniffEncoding.ts +1061 -0
  441. package/source/packages/scramjet/packages/core/src/shared/util.ts +35 -0
  442. package/source/packages/scramjet/packages/core/src/symbols.ts +9 -0
  443. package/source/packages/scramjet/packages/core/src/sync.ts +63 -0
  444. package/source/packages/scramjet/packages/core/src/types.ts +66 -0
  445. package/source/packages/scramjet/packages/core/src/typesEntry.ts +6 -0
  446. package/source/packages/scramjet/packages/core/tsconfig.json +21 -0
  447. package/source/packages/scramjet/packages/rpc/index.ts +100 -0
  448. package/source/packages/scramjet/packages/rpc/package.json +7 -0
  449. package/source/packages/scramjet/packages/utils/package.json +39 -0
  450. package/source/packages/scramjet/packages/utils/src/alwaysLastBubble.ts +172 -0
  451. package/source/packages/scramjet/packages/utils/src/catch-escaped-links.ts +34 -0
  452. package/source/packages/scramjet/packages/utils/src/event-handler-plugin.ts +86 -0
  453. package/source/packages/scramjet/packages/utils/src/global.d.ts +8 -0
  454. package/source/packages/scramjet/packages/utils/src/http-cache-plugin.ts +475 -0
  455. package/source/packages/scramjet/packages/utils/src/index.ts +26 -0
  456. package/source/packages/scramjet/packages/utils/src/link-handler-plugin.ts +75 -0
  457. package/source/packages/scramjet/packages/utils/src/typesEntry.ts +5 -0
  458. package/source/packages/scramjet/packages/utils/src/url-watcher.ts +37 -0
  459. package/source/packages/scramjet/packages/utils/src/version.ts +40 -0
  460. package/source/packages/scramjet/packages/utils/tsconfig.json +11 -0
  461. package/source/packages/scramjet/patches/htmlparser2@12.0.0.patch +124 -0
  462. package/source/packages/scramjet/rspack.config.ts +613 -0
  463. package/source/packages/scramjet/tsconfig.json +11 -0
  464. package/source/packages/tracker-protocol/package.json +31 -0
  465. package/source/packages/tracker-protocol/src/index.ts +745 -0
  466. package/source/packages/tracker-protocol/tsconfig.json +18 -0
  467. package/source/pnpm-lock.yaml +12018 -0
  468. package/source/pnpm-workspace.yaml +31 -0
  469. package/source/rspack.config.ts +103 -0
  470. package/source/scripts/update-adblock-assets.mjs +164 -0
  471. package/third_party/filter-lists/LICENSE-CC-BY-SA-3.0.txt +359 -0
  472. package/third_party/filter-lists/LICENSE-GPL-3.0.txt +674 -0
  473. package/third_party/filter-lists/LICENSE-MPL-2.0.txt +375 -0
  474. package/third_party/filter-lists/README.md +24 -0
  475. package/third_party/filter-lists/easylist.txt +83088 -0
  476. package/third_party/filter-lists/easyprivacy.txt +56361 -0
  477. package/third_party/filter-lists/manifest.json +56 -0
  478. package/third_party/filter-lists/ublock-filters.txt +10937 -0
  479. package/third_party/filter-lists/ublock-privacy.txt +3209 -0
  480. package/third_party/filter-lists/ublock-resources.json +1852 -0
  481. package/third_party/filter-lists/ublock-unbreak.txt +6026 -0
@@ -0,0 +1,31 @@
1
+ import { createState, stateListen, type Stateful } from "dreamland/core";
2
+
3
+ export class StatefulClass {
4
+ ownedby: Set<StatefulClass> = null!;
5
+ constructor() {
6
+ const state = createState(Object.create(new.target.prototype));
7
+ state.ownedby = new Set();
8
+ return state;
9
+ }
10
+
11
+ autodirty() {
12
+ let oldvalues: Map<any, any> = new Map();
13
+ stateListen(this as Stateful<this>, (newvalue, prop) => {
14
+ if (oldvalues.get(prop) === newvalue) return;
15
+ this.markDirty(false);
16
+ oldvalues.set(prop, newvalue);
17
+ });
18
+ }
19
+
20
+ own(obj: StatefulClass) {
21
+ obj.ownedby.add(this);
22
+ }
23
+
24
+ disown(obj: StatefulClass) {
25
+ obj.ownedby.delete(this);
26
+ }
27
+
28
+ markDirty(urgent: boolean = false) {
29
+ this.ownedby.forEach((obj) => obj.markDirty(urgent));
30
+ }
31
+ }
@@ -0,0 +1,74 @@
1
+ import { parse } from "tldts";
2
+
3
+ export function formatBytes(bytes: number, decimals: number = 2): string {
4
+ if (bytes === 0) return "0 Bytes";
5
+
6
+ const k = 1024;
7
+ const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
8
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
9
+
10
+ return (
11
+ parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + " " + sizes[i]
12
+ );
13
+ }
14
+
15
+ export function emToPx(
16
+ em: number | string,
17
+ element: HTMLElement = document.body
18
+ ): number {
19
+ const computedStyle = getComputedStyle(element);
20
+
21
+ // Handle CSS variable input like var(--some-variable)
22
+ if (typeof em === "string" && em.startsWith("var(") && em.endsWith(")")) {
23
+ // Extract the variable name from var(--name)
24
+ const varName = em.substring(4, em.length - 1);
25
+ // Get the computed value of the CSS variable
26
+ const varValue = computedStyle.getPropertyValue(varName).trim();
27
+
28
+ if (varValue) {
29
+ // If the value ends with 'em', parse it as em
30
+ if (varValue.endsWith("em")) {
31
+ em = parseFloat(varValue);
32
+ }
33
+ // If the value is in px, return it directly
34
+ else if (varValue.endsWith("px")) {
35
+ return parseFloat(varValue);
36
+ }
37
+ // For other units or invalid values, default to 0
38
+ else {
39
+ return 0;
40
+ }
41
+ } else {
42
+ return 0; // CSS variable not found
43
+ }
44
+ }
45
+
46
+ const fontSize = parseFloat(computedStyle.fontSize);
47
+ return (typeof em === "number" ? em : 0) * fontSize;
48
+ }
49
+
50
+ // subdomain, domain+tld+port, path+search+query
51
+ export function splitUrl(url: URL): [string, string, string] {
52
+ let last = url.pathname + url.search + url.hash;
53
+ if (last == "/") last = "";
54
+
55
+ let results = parse(url.href);
56
+ let domain = results.domain || results.hostname;
57
+ if (domain && url.port) {
58
+ domain += ":" + url.port;
59
+ }
60
+ let subdomain = results.subdomain;
61
+ if (subdomain) {
62
+ subdomain += ".";
63
+ }
64
+
65
+ return [subdomain || "", domain || "", last];
66
+ }
67
+
68
+ export const isFirefox =
69
+ navigator.userAgent.includes("Gecko/") &&
70
+ !navigator.userAgent.includes("Chrome");
71
+
72
+ export function uuid(prefix: string = ""): string {
73
+ return prefix + Math.random().toString(36).substring(2, 15);
74
+ }
@@ -0,0 +1,13 @@
1
+ export function memoize<T extends HTMLElement>(
2
+ fn: () => T,
3
+ key: any,
4
+ cache: Record<string, T>
5
+ ): T {
6
+ if (cache[key]) {
7
+ return cache[key];
8
+ }
9
+ const element = fn();
10
+ cache[key] = element;
11
+
12
+ return element;
13
+ }
@@ -0,0 +1,16 @@
1
+ /// <reference types="vite/client" />
2
+ /// <reference types="@mercuryworkshop/scramjet" />
3
+
4
+ interface ImportMetaEnv {
5
+ readonly VITE_PUTER_BRANDING: boolean;
6
+ readonly VITE_SENTRY_URL: string;
7
+ readonly VITE_ISOLATION_ORIGIN: string;
8
+ readonly VITE_RUNTIME_BASE?: string;
9
+ }
10
+
11
+ interface ImportMeta {
12
+ readonly env: ImportMetaEnv;
13
+ }
14
+
15
+ declare const puter: any;
16
+ declare const __COPYRIGHT_YEAR__: number;
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "useDefineForClassFields": true,
5
+ "module": "ESNext",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "types": [],
8
+ "skipLibCheck": true,
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "verbatimModuleSyntax": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+ /* Linting */
16
+ "strict": true,
17
+ "noUnusedLocals": true,
18
+ "noUnusedParameters": false,
19
+ "erasableSyntaxOnly": false,
20
+ "noFallthroughCasesInSwitch": true,
21
+ "noUncheckedSideEffectImports": true,
22
+ "jsx": "react-jsx",
23
+ "jsxImportSource": "dreamland",
24
+ "paths": {
25
+ "@components/*": ["./src/components/*"]
26
+ }
27
+ },
28
+ "include": ["src"],
29
+ "exclude": ["src/**/*.test.ts"]
30
+ }
@@ -0,0 +1,47 @@
1
+ import { defineConfig } from "vite";
2
+ import path from "path";
3
+
4
+ import { viteSingleFile } from "vite-plugin-singlefile";
5
+ import { viteStaticCopy } from "vite-plugin-static-copy";
6
+ import { jsxPlugin } from "dreamland/vite";
7
+
8
+ export default defineConfig({
9
+ base: process.env.VITE_BASE ?? "./",
10
+ plugins: [
11
+ process.env.VITE_SINGLEFILE ? viteSingleFile() : null,
12
+ // cssHmrPlugin(),
13
+ jsxPlugin(),
14
+ // ssr({ entry: "/src/main-server.ts" }),
15
+ // viteStaticCopy({
16
+ // structured: false,
17
+ // targets: [
18
+ // {
19
+ // src: scramjetPath + "/*",
20
+ // dest: "scram/",
21
+ // },
22
+ // {
23
+ // src: "../inject/dist/inject.js",
24
+ // dest: ".",
25
+ // },
26
+ // // {
27
+ // // src: "../chii/public/*",
28
+ // // dest: "chii",
29
+ // // },
30
+ // ],
31
+ // }),
32
+ ],
33
+ define: {
34
+ __COPYRIGHT_YEAR__: JSON.stringify(new Date().getFullYear()),
35
+ },
36
+ resolve: {
37
+ alias: {
38
+ "@components": path.resolve(__dirname, "./src/components"),
39
+ },
40
+ },
41
+ esbuild: {
42
+ keepNames: true,
43
+ },
44
+ build: {
45
+ sourcemap: process.env.VITE_SOURCEMAP !== "0",
46
+ },
47
+ });
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "inject",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "type": "module",
10
+ "keywords": [],
11
+ "author": "",
12
+ "license": "AGPL-3.0-only",
13
+ "packageManager": "pnpm@10.12.1",
14
+ "dependencies": {
15
+ "@mercuryworkshop/scramjet": "workspace:*",
16
+ "@mercuryworkshop/rpc": "workspace:*",
17
+ "chobitsu": "workspace:*",
18
+ "html-to-image": "^1.11.13"
19
+ }
20
+ }
@@ -0,0 +1,194 @@
1
+ import {
2
+ CookieJar,
3
+ iswindow,
4
+ SCRAMJETCLIENT,
5
+ ScramjetClient,
6
+ setWasm,
7
+ } from "@mercuryworkshop/scramjet/bundled";
8
+ import {
9
+ Chromebound,
10
+ Framebound,
11
+ FrameSequence,
12
+ InjectScramjetInit,
13
+ } from "./types";
14
+
15
+ import { RpcHelper } from "@mercuryworkshop/rpc";
16
+ import { applyTheme } from "./errorpage/errorpage";
17
+ import { chromeframe, wasm } from ".";
18
+ import { setupContextMenu } from "./emulators/contextmenu";
19
+ import { setupHistoryEmulation } from "./emulators/history";
20
+ import { setupTitleWatcher } from "./emulators/titlewatcher";
21
+ import { setupAnchorHandler } from "./emulators/anchors";
22
+ import { setupWindowOpen } from "./emulators/windowopen";
23
+ import { RemoteTransport } from "./transport";
24
+ import { setupAlwaysLastBubble } from "./emulators/alwaysLastBubble";
25
+
26
+ function makeContextId(): string {
27
+ return "context-" + Math.random().toString(36).substring(2, 10);
28
+ }
29
+
30
+ function findSequence(
31
+ top: Window,
32
+ target: Window,
33
+ path: FrameSequence = []
34
+ ): FrameSequence | null {
35
+ if (top == target) {
36
+ return path;
37
+ } else {
38
+ for (let i = 0; i < top.frames.length; i++) {
39
+ const child = top.frames[i];
40
+ const res = findSequence(child, target, [...path, i]);
41
+ if (res) return res;
42
+ }
43
+ return null;
44
+ }
45
+ }
46
+
47
+ // const realFetch = fetch;
48
+
49
+ export class ExecutionContextWrapper {
50
+ public rpc!: RpcHelper<Framebound, Chromebound>;
51
+ public client!: ScramjetClient;
52
+ private cookieJar = new CookieJar();
53
+ constructor(
54
+ public self: typeof globalThis,
55
+ private init: InjectScramjetInit
56
+ ) {
57
+ const realFetch = self.fetch.bind(self);
58
+ this.cookieJar.load(init.cookies);
59
+ this.loadScramjet();
60
+
61
+ // this entry point is still called in web workers
62
+ if (!iswindow) return;
63
+
64
+ const history_replaceState = self.History.prototype.replaceState;
65
+ this.rpc = new RpcHelper(
66
+ {
67
+ navigate: async ({ url }) => {
68
+ window.location.href = url;
69
+ },
70
+ popstate: async ({ url, state, title }) => {
71
+ history_replaceState.call(history, state, title, url);
72
+ const popStateEvent = new PopStateEvent("popstate", { state });
73
+ window.dispatchEvent(popStateEvent);
74
+ },
75
+ fetchBlob: async (
76
+ url
77
+ ): Promise<
78
+ [{ body: ArrayBuffer; contentType: string }, Transferable[]]
79
+ > => {
80
+ const response = await realFetch(url);
81
+ const ab = await response.arrayBuffer();
82
+ return [
83
+ {
84
+ body: ab,
85
+ contentType:
86
+ response.headers.get("Content-Type") ||
87
+ "application/octet-stream",
88
+ },
89
+ [ab],
90
+ ];
91
+ },
92
+ setCookies: async ({ cookies }) => {
93
+ for (const { url, cookie } of cookies) {
94
+ this.cookieJar.setCookies(cookie, new URL(url));
95
+ }
96
+ },
97
+ updateTheme: async (theme) => {
98
+ applyTheme(theme);
99
+ },
100
+ },
101
+ init.id,
102
+ (message, transfer) => {
103
+ this.client.natives.call(
104
+ "window.postMessage",
105
+ chromeframe,
106
+ message,
107
+ "*",
108
+ transfer
109
+ );
110
+ }
111
+ );
112
+ addEventListener("message", (event) => {
113
+ // if (event.source !== chromeframe) return;
114
+ this.rpc.recieve(event.data);
115
+ });
116
+
117
+ const addAlwaysLastEventListener = setupAlwaysLastBubble(this, [
118
+ "click",
119
+ "auxclick",
120
+ "contextmenu",
121
+ ]);
122
+ setupTitleWatcher(this);
123
+ setupContextMenu(this, addAlwaysLastEventListener);
124
+ setupHistoryEmulation(this);
125
+ setupAnchorHandler(this, addAlwaysLastEventListener);
126
+ setupWindowOpen(this);
127
+ // inform chrome of the current url
128
+ // will happen if you get redirected/click on a link, etc, the chrome will have no idea otherwise
129
+
130
+ this.rpc.call("load", {
131
+ url: this.client.url.href,
132
+ sequence: findSequence(top!, self as any)!,
133
+ });
134
+ }
135
+
136
+ loadScramjet() {
137
+ const transport = new RemoteTransport(this);
138
+ this.client = new ScramjetClient(this.self, {
139
+ context: {
140
+ interface: {
141
+ getInjectScripts: this.init.getInjectScripts,
142
+ codecEncode: this.init.codecEncode,
143
+ codecDecode: this.init.codecDecode,
144
+ },
145
+ config: this.init.config,
146
+ cookieJar: this.cookieJar,
147
+ prefix: new URL(this.init.prefix),
148
+ },
149
+ transport,
150
+ hookSubcontext: (frameself, frame) => {
151
+ if (!frame) {
152
+ throw new Error(
153
+ "hookSubcontext was called, but a frame null was passed. It shouldn't be possible for a window.open to happen here"
154
+ );
155
+ }
156
+
157
+ // recalculate chromeframe's sequence just in case
158
+ const newseq = findSequence(top!, chromeframe);
159
+ if (!newseq) {
160
+ throw new Error("could not find chromeframe in top?");
161
+ }
162
+ const childId = makeContextId();
163
+ void this.rpc.call("registerFrameContext", { id: childId });
164
+ const context = new ExecutionContextWrapper(frameself, {
165
+ sequence: newseq,
166
+ id: childId,
167
+ config: this.init.config,
168
+ cookies: this.cookieJar.dump(),
169
+ getInjectScripts: this.init.getInjectScripts,
170
+ prefix: this.init.prefix,
171
+ codecEncode: this.init.codecEncode,
172
+ codecDecode: this.init.codecDecode,
173
+ // TODO: what should be the behavior here? is inheriting correct?
174
+ initHeaders: this.init.initHeaders,
175
+ history: this.init.history,
176
+ });
177
+
178
+ return context.client;
179
+ },
180
+ sendSetCookie: async (cookies, _options) => {
181
+ if (cookies.length === 0) return;
182
+ await this.rpc.call("setCookies", {
183
+ cookies: cookies.map(({ url, cookie }) => ({
184
+ url: url.href,
185
+ cookie,
186
+ })),
187
+ });
188
+ },
189
+ initHeaders: this.init.initHeaders,
190
+ history: this.init.history,
191
+ });
192
+ this.client.hook();
193
+ }
194
+ }
@@ -0,0 +1,168 @@
1
+ import { ExecutionContextWrapper } from "../context";
2
+
3
+ export function setupAlwaysLastBubble(
4
+ { self, rpc, client }: ExecutionContextWrapper,
5
+ whatToCapture: string[]
6
+ ) {
7
+ // goal is to override the default behavior of clicking on an <a> link
8
+ // if the link is target=_blank it needs to open in a new browser.js tab instead of a native tab
9
+ // the browser does not provide a neat way of knowing when a link is clicked through
10
+ //
11
+ // so the only solution left is to addEventListener("click") on every single <a> element
12
+ // however, this presents an issue
13
+ // if the page has its *own* event listener, and it calls e.preventDefault(), we need to not open the tab, since we're essentially acting as the new default
14
+ // since events bubble down and can have non trivial control flows, this gets complicated fast
15
+ //
16
+ // the only solution is to register both the first and last event listeners, so that you control the entire call stack
17
+ // registering the first is easy, you just need to call it immediately after creation
18
+ // registering the *last* is extremely difficult
19
+
20
+ type EvtDesc = {
21
+ originalcb: ((e: Event) => void) | EventListenerObject;
22
+ injectafter?: (e: Event) => void;
23
+ type: string;
24
+ };
25
+ let currentlyExecutingDesc: EvtDesc | null = null;
26
+ const eventListeners: Map<EventTarget, EvtDesc[]> = new Map();
27
+
28
+ // start by recording every event registered so that we can rebuild the bubble path later
29
+ client.Proxy("EventTarget.prototype.addEventListener", {
30
+ apply(ctx) {
31
+ const eventName = ctx.args[0] as string;
32
+ const cb = ctx.args[1] as ((e: Event) => void) | EventListenerObject;
33
+ const options = ctx.args[2] as AddEventListenerOptions;
34
+ const target = ctx.this as EventTarget;
35
+ if (!whatToCapture.includes(eventName)) return;
36
+ // capture events don't go through the bubble process so we shouldn't include them
37
+ if (
38
+ (typeof options === "boolean" && options) ||
39
+ (typeof options === "object" && options.capture)
40
+ )
41
+ return;
42
+
43
+ ctx.args[1] = function (...args: any) {
44
+ // will always exist since we set it just below
45
+ const descs = eventListeners.get(target)!;
46
+ // find the one talking about us
47
+ const desc = descs.find((d) => d.originalcb === cb)!;
48
+
49
+ // have a flag for the event that's currently running so that we know where we are in the stack if preventDefault() or stopPropagation() is called
50
+ currentlyExecutingDesc = desc;
51
+ if (typeof cb === "function") {
52
+ Reflect.apply(cb, this, args);
53
+ } else if (typeof cb === "object" && cb !== null && cb.handleEvent) {
54
+ Reflect.apply(cb.handleEvent, cb, args);
55
+ }
56
+
57
+ if (desc.injectafter) {
58
+ desc.injectafter(args[0]);
59
+ delete desc.injectafter;
60
+ }
61
+ currentlyExecutingDesc = null;
62
+ };
63
+
64
+ const desc: EvtDesc = {
65
+ originalcb: cb,
66
+ type: eventName,
67
+ };
68
+
69
+ if (eventListeners.has(target)) {
70
+ eventListeners.get(target)!.push(desc);
71
+ } else {
72
+ eventListeners.set(target, [desc]);
73
+ }
74
+ },
75
+ });
76
+
77
+ return function addAlwaysLastEventListener<T extends Event>(
78
+ target: EventTarget,
79
+ eventName: string,
80
+ listener: (e: T) => void
81
+ ) {
82
+ // this event will always run before all other ones, since it was registered at injectHistoryEmulation
83
+ // * unless you registered the event before appending to the dom
84
+ // * unless there's something inside of the <a> that has a listener on it
85
+ // * unless there's a capture listener
86
+ // TODO fix those cases
87
+
88
+ const callListener = (e: T) => {
89
+ // this goes into our code, so restore the original methods
90
+ // TODO: we probably shouldnt do it like this
91
+ e.stopPropagation =
92
+ client.natives.store["Event.prototype.stopPropagation"];
93
+ e.stopImmediatePropagation =
94
+ client.natives.store["Event.prototype.stopImmediatePropagation"];
95
+ listener(e);
96
+ };
97
+
98
+ client.natives.call(
99
+ "EventTarget.prototype.addEventListener",
100
+ target,
101
+ eventName,
102
+ (e: T) => {
103
+ let lastlistener;
104
+ const path = e.composedPath();
105
+
106
+ // travel the path, from the <a> all the way to Window
107
+ for (const elm of path) {
108
+ let descriptors = eventListeners.get(elm);
109
+ if (descriptors) {
110
+ descriptors = descriptors.filter((d) => d.type === eventName);
111
+ // last descriptor was last added and will be called last
112
+ lastlistener = descriptors[descriptors.length - 1];
113
+ }
114
+ }
115
+
116
+ // TODO: if a listener is added to a lower level of the dom inside the listener of a higher level, our lastlistener will not be correct
117
+ if (!lastlistener) {
118
+ // there are no other event listeners! great
119
+ callListener(e);
120
+ } else {
121
+ // we know what the last listener is. run this to inject after it
122
+ lastlistener.injectafter = (e) => {
123
+ callListener(e);
124
+ };
125
+ }
126
+
127
+ // except, if stopPropagation is called, it never gets to the lastlistener
128
+ client.RawProxy(e, "stopImmediatePropagation", {
129
+ apply() {
130
+ if (!currentlyExecutingDesc)
131
+ throw new Error(
132
+ "stopImmediatePropagation called but no desc found?"
133
+ );
134
+ // for stopImmediatePropagation this is the last one
135
+ currentlyExecutingDesc.injectafter = (e) => {
136
+ // in case preventDefault is called after stopImmediatePropagation(), wait for the event handler to be done
137
+ callListener(e as T);
138
+ };
139
+ },
140
+ });
141
+ client.RawProxy(e, "stopPropagation", {
142
+ apply(ctx) {
143
+ if (!currentlyExecutingDesc)
144
+ throw new Error("stopPropagation called but no desc found?");
145
+ // stopPropagation means there might still be more listeners on the same element
146
+ // find whatever the last one is on the this element and then inject after it too
147
+
148
+ const ev = ctx.this as Event;
149
+ if (!ev.target) throw new Error("no target");
150
+ const descs = eventListeners.get(ev.target);
151
+ if (!descs) throw new Error("no descs found in stopPropagation()");
152
+ const idx = descs.indexOf(currentlyExecutingDesc);
153
+ if (idx == -1)
154
+ throw new Error("couldn't find currentlyExecutingDesc");
155
+ const remaining = descs.slice(idx + 1, descs.length);
156
+ if (remaining.length > 0) {
157
+ const last = remaining[remaining.length - 1];
158
+ // finally we have the last in the chain after propagation is cut off
159
+ last.injectafter = (e) => {
160
+ callListener(e as T);
161
+ };
162
+ }
163
+ },
164
+ });
165
+ }
166
+ );
167
+ };
168
+ }
@@ -0,0 +1,55 @@
1
+ import { ExecutionContextWrapper } from "../context";
2
+ import { setupAlwaysLastBubble } from "./alwaysLastBubble";
3
+
4
+ export function setupAnchorHandler(
5
+ { self, rpc, client }: ExecutionContextWrapper,
6
+ addAlwaysLastEventListener: ReturnType<typeof setupAlwaysLastBubble>
7
+ ) {
8
+ const anchorObserver = new MutationObserver((mutations) => {
9
+ mutations.forEach((mutation) => {
10
+ // https://issues.chromium.org/issues/440360422
11
+ setTimeout(() => {
12
+ mutation.addedNodes.forEach((_node) => {
13
+ if (client.box.instanceof(_node, "HTMLAnchorElement")) {
14
+ const node = _node as HTMLAnchorElement;
15
+ const openInNewTab = () => {
16
+ // note that this is the intercepted version
17
+ const href = node.href;
18
+
19
+ rpc.call("newtab", {
20
+ url: href,
21
+ });
22
+ };
23
+
24
+ addAlwaysLastEventListener(node, "click", (e: MouseEvent) => {
25
+ if (e.defaultPrevented) return;
26
+ if (e.button !== 0) return; // left click
27
+ if (node.target !== "_blank") return;
28
+ e.preventDefault();
29
+ e.stopPropagation();
30
+ e.stopImmediatePropagation();
31
+ openInNewTab();
32
+ });
33
+
34
+ addAlwaysLastEventListener(node, "auxclick", (e: MouseEvent) => {
35
+ if (e.defaultPrevented) return;
36
+ if (e.button !== 1) return; // middle click
37
+ e.preventDefault();
38
+ e.stopPropagation();
39
+ e.stopImmediatePropagation();
40
+ openInNewTab();
41
+ });
42
+ }
43
+ });
44
+ }, 2000);
45
+ });
46
+ });
47
+ anchorObserver.observe(self.document, {
48
+ childList: true,
49
+ subtree: true,
50
+ });
51
+
52
+ self.addEventListener("load", () => {
53
+ self.document.querySelectorAll("*").forEach((e) => e);
54
+ });
55
+ }