single-file-puppeteer.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright 2010-2019 Gildas Lormeau
  3. * contact : gildas.lormeau <at> gmail.com
  4. *
  5. * This file is part of SingleFile.
  6. *
  7. * The code in this file is free software: you can redistribute it and/or
  8. * modify it under the terms of the GNU Affero General Public License
  9. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  10. * of the License, or (at your option) any later version.
  11. *
  12. * The code in this file is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  15. * General Public License for more details.
  16. *
  17. * As additional permission under GNU AGPL version 3 section 7, you may
  18. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  19. * AGPL normally required by section 4, provided you include this license
  20. * notice and a URL through which recipients can access the Corresponding
  21. * Source.
  22. */
  23. /* global require, exports, SingleFileBrowser */
  24. const fs = require("fs");
  25. const puppeteer = require("puppeteer-core");
  26. const SCRIPTS = [
  27. "../lib/single-file/util/doc-util.js",
  28. "../lib/single-file/util/doc-helper.js",
  29. "../lib/single-file/vendor/css-tree.js",
  30. "../lib/single-file/vendor/html-srcset-parser.js",
  31. "../lib/single-file/vendor/css-minifier.js",
  32. "../lib/single-file/vendor/css-font-property-parser.js",
  33. "../lib/single-file/vendor/css-media-query-parser.js",
  34. "../lib/single-file/modules/html-minifier.js",
  35. "../lib/single-file/modules/css-fonts-minifier.js",
  36. "../lib/single-file/modules/css-fonts-alt-minifier.js",
  37. "../lib/single-file/modules/css-matched-rules.js",
  38. "../lib/single-file/modules/css-medias-alt-minifier.js",
  39. "../lib/single-file/modules/css-rules-minifier.js",
  40. "../lib/single-file/modules/html-images-alt-minifier.js",
  41. "../lib/single-file/modules/html-serializer.js",
  42. "../lib/single-file/single-file-core.js",
  43. "../lib/single-file/single-file-browser.js"
  44. ];
  45. exports.getPageData = async options => {
  46. const browserOptions = {
  47. headless: options.puppeteerHeadless === undefined ? true : options.puppeteerHeadless
  48. };
  49. if (options.puppeteerExecutablePath) {
  50. browserOptions.executablePath = options.puppeteerExecutablePath;
  51. }
  52. const browser = await puppeteer.launch(browserOptions);
  53. const page = await browser.newPage();
  54. if (options.userAgent) {
  55. await page.setUserAgent(options.userAgent);
  56. }
  57. await page.setBypassCSP(true);
  58. await page.goto(options.url, {
  59. waitUntil: options.puppeteerWaitUntil || "networkidle0"
  60. });
  61. await Promise.all(SCRIPTS.map(scriptPath => page.evaluate(fs.readFileSync(require.resolve(scriptPath)).toString())));
  62. const pageData = await page.evaluate(async options => {
  63. options.removeFrames = true;
  64. const SingleFile = SingleFileBrowser.getClass();
  65. const singleFile = new SingleFile(options);
  66. await singleFile.initialize();
  67. await singleFile.run();
  68. return singleFile.getPageData();
  69. }, options);
  70. page.close();
  71. return pageData;
  72. };