single-file-webdriver.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 */
  24. const fs = require("fs");
  25. const { Builder } = require("selenium-webdriver");
  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. let driver;
  47. try {
  48. driver = await new Builder().forBrowser(options.webdriverBrowser).build();
  49. await driver.get(options.url);
  50. await Promise.all(SCRIPTS.map(scriptPath => driver.executeScript(fs.readFileSync(require.resolve(scriptPath)).toString())));
  51. const pageData = await driver.executeAsyncScript(getPageDataScript(), options);
  52. return pageData;
  53. } finally {
  54. if (driver) {
  55. driver.quit();
  56. }
  57. }
  58. };
  59. function getPageDataScript() {
  60. return `
  61. const [options, callback] = arguments;
  62. getPageData().then(pageData => callback(pageData))
  63. async function getPageData() {
  64. options.removeFrames = true;
  65. const SingleFile = SingleFileBrowser.getClass();
  66. const singleFile = new SingleFile(options);
  67. await singleFile.initialize();
  68. await singleFile.run();
  69. const pageData = await singleFile.getPageData();
  70. return pageData;
  71. }
  72. `;
  73. }