background.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* https://stackoverflow.com/a/71604665 */
  2. const imageUrlToBase64 = async url => {
  3. const response = await fetch(url);
  4. const blob = await response.blob();
  5. return new Promise((onSuccess, onError) => {
  6. try {
  7. const reader = new FileReader() ;
  8. reader.onload = function(){ onSuccess(this.result) } ;
  9. reader.readAsDataURL(blob) ;
  10. } catch(e) {
  11. onError(e);
  12. }
  13. });
  14. };
  15. /* https://stackoverflow.com/a/48032528 */
  16. async function replaceAsync(str, regex, asyncFn) {
  17. const promises = [];
  18. str.replace(regex, (match, ...args) => {
  19. const promise = asyncFn(match, ...args);
  20. promises.push(promise);
  21. });
  22. const data = await Promise.all(promises);
  23. return str.replace(regex, () => data.shift());
  24. }
  25. browser.browserAction.onClicked.addListener(async (tab) => {
  26. try {
  27. const result = await browser.tabs.executeScript(tab.id, {
  28. file: "/Readability.js"
  29. });
  30. const articleHtml = result[0]["body"];
  31. const pageUrl = result[0]["url"];
  32. const baseUrl = result[0]["baseurl"];
  33. //console.log("Obtained result: ", baseUrl, articleHtml);
  34. // Replace all URLs with data-urls
  35. const srcRegexp = /src="(https?:\/\/.+?)"/g;
  36. const inlinedImageHtml = await replaceAsync(articleHtml, srcRegexp, async function(match, src) {
  37. let absoluteUrl;
  38. if (src.startsWith('http://') || src.startsWith('https://')) {
  39. absoluteUrl = src;
  40. } else {
  41. absoluteUrl = baseUrl + "/" + src;
  42. }
  43. //console.log("Fetching ", absoluteUrl);
  44. const dataUrl = await imageUrlToBase64(absoluteUrl);
  45. console.log(src + " becomes " + dataUrl);
  46. return "src=\"" + dataUrl + "\"";
  47. });
  48. //for (const [_, source] of articleHtml.matchAll(srcRegexp)) {
  49. // fetch(source)
  50. //}
  51. console.log("All matching done", inlinedImageHtml)
  52. await fetch("http://192.168.15.244:17144", {
  53. method: 'POST',
  54. body: inlinedImageHtml
  55. });
  56. } catch(err) {
  57. console.error("Problem while running script: ", err);
  58. }
  59. })
  60. //browser.tabs.onCreated.addListener(() => {
  61. // browser.browserAction.disable()
  62. //})
  63. //browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  64. // console.log("Tab updated!", tab)
  65. // if (tab.isInReaderMode) {
  66. // browser.browserAction.enable()
  67. // } else {
  68. // browser.browserAction.disable()
  69. // }
  70. //
  71. //})