html2canvas-pro 1.6.0 → 1.6.2
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.
- package/dist/html2canvas-pro.esm.js +2509 -3036
- package/dist/html2canvas-pro.esm.js.map +1 -1
- package/dist/html2canvas-pro.js +2517 -3040
- package/dist/html2canvas-pro.js.map +1 -1
- package/dist/html2canvas-pro.min.js +6 -2
- package/dist/lib/__tests__/index.js +57 -122
- package/dist/lib/__tests__/index.js.map +1 -1
- package/dist/lib/core/__mocks__/cache-storage.js +2 -5
- package/dist/lib/core/__mocks__/cache-storage.js.map +1 -1
- package/dist/lib/core/__mocks__/context.js +7 -10
- package/dist/lib/core/__mocks__/context.js.map +1 -1
- package/dist/lib/core/__mocks__/logger.js +9 -17
- package/dist/lib/core/__mocks__/logger.js.map +1 -1
- package/dist/lib/core/__tests__/cache-storage.js +153 -351
- package/dist/lib/core/__tests__/cache-storage.js.map +1 -1
- package/dist/lib/core/__tests__/logger.js +12 -13
- package/dist/lib/core/__tests__/logger.js.map +1 -1
- package/dist/lib/core/bitwise.js +1 -1
- package/dist/lib/core/bitwise.js.map +1 -1
- package/dist/lib/core/cache-storage.js +92 -155
- package/dist/lib/core/cache-storage.js.map +1 -1
- package/dist/lib/core/context.js +8 -10
- package/dist/lib/core/context.js.map +1 -1
- package/dist/lib/core/debugger.js +5 -5
- package/dist/lib/core/debugger.js.map +1 -1
- package/dist/lib/core/features.js +65 -68
- package/dist/lib/core/features.js.map +1 -1
- package/dist/lib/core/logger.js +21 -56
- package/dist/lib/core/logger.js.map +1 -1
- package/dist/lib/css/index.js +98 -103
- package/dist/lib/css/index.js.map +1 -1
- package/dist/lib/css/layout/__mocks__/bounds.js +1 -1
- package/dist/lib/css/layout/__mocks__/bounds.js.map +1 -1
- package/dist/lib/css/layout/bounds.js +20 -21
- package/dist/lib/css/layout/bounds.js.map +1 -1
- package/dist/lib/css/layout/text.js +50 -58
- package/dist/lib/css/layout/text.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/background-tests.js +24 -29
- package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/font-family.js +14 -20
- package/dist/lib/css/property-descriptors/__tests__/font-family.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/paint-order.js +61 -83
- package/dist/lib/css/property-descriptors/__tests__/paint-order.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/text-shadow.js +75 -87
- package/dist/lib/css/property-descriptors/__tests__/text-shadow.js.map +1 -1
- package/dist/lib/css/property-descriptors/__tests__/transform-tests.js +9 -13
- package/dist/lib/css/property-descriptors/__tests__/transform-tests.js.map +1 -1
- package/dist/lib/css/property-descriptors/background-clip.js +3 -3
- package/dist/lib/css/property-descriptors/background-clip.js.map +1 -1
- package/dist/lib/css/property-descriptors/background-color.js +1 -1
- package/dist/lib/css/property-descriptors/background-image.js +6 -6
- package/dist/lib/css/property-descriptors/background-image.js.map +1 -1
- package/dist/lib/css/property-descriptors/background-origin.js +3 -3
- package/dist/lib/css/property-descriptors/background-origin.js.map +1 -1
- package/dist/lib/css/property-descriptors/background-position.js +6 -6
- package/dist/lib/css/property-descriptors/background-position.js.map +1 -1
- package/dist/lib/css/property-descriptors/background-repeat.js +7 -9
- package/dist/lib/css/property-descriptors/background-repeat.js.map +1 -1
- package/dist/lib/css/property-descriptors/background-size.js +5 -7
- package/dist/lib/css/property-descriptors/background-size.js.map +1 -1
- package/dist/lib/css/property-descriptors/border-color.js +3 -3
- package/dist/lib/css/property-descriptors/border-color.js.map +1 -1
- package/dist/lib/css/property-descriptors/border-radius.js +5 -7
- package/dist/lib/css/property-descriptors/border-radius.js.map +1 -1
- package/dist/lib/css/property-descriptors/border-style.js +4 -4
- package/dist/lib/css/property-descriptors/border-style.js.map +1 -1
- package/dist/lib/css/property-descriptors/border-width.js +5 -5
- package/dist/lib/css/property-descriptors/border-width.js.map +1 -1
- package/dist/lib/css/property-descriptors/box-shadow.js +10 -10
- package/dist/lib/css/property-descriptors/box-shadow.js.map +1 -1
- package/dist/lib/css/property-descriptors/color.js +1 -1
- package/dist/lib/css/property-descriptors/content.js +2 -2
- package/dist/lib/css/property-descriptors/content.js.map +1 -1
- package/dist/lib/css/property-descriptors/counter-increment.js +10 -10
- package/dist/lib/css/property-descriptors/counter-increment.js.map +1 -1
- package/dist/lib/css/property-descriptors/counter-reset.js +9 -9
- package/dist/lib/css/property-descriptors/counter-reset.js.map +1 -1
- package/dist/lib/css/property-descriptors/direction.js +1 -1
- package/dist/lib/css/property-descriptors/direction.js.map +1 -1
- package/dist/lib/css/property-descriptors/display.js +4 -4
- package/dist/lib/css/property-descriptors/display.js.map +1 -1
- package/dist/lib/css/property-descriptors/duration.js +4 -4
- package/dist/lib/css/property-descriptors/duration.js.map +1 -1
- package/dist/lib/css/property-descriptors/float.js +1 -1
- package/dist/lib/css/property-descriptors/float.js.map +1 -1
- package/dist/lib/css/property-descriptors/font-family.js +6 -6
- package/dist/lib/css/property-descriptors/font-family.js.map +1 -1
- package/dist/lib/css/property-descriptors/font-size.js +1 -1
- package/dist/lib/css/property-descriptors/font-style.js +1 -1
- package/dist/lib/css/property-descriptors/font-style.js.map +1 -1
- package/dist/lib/css/property-descriptors/font-variant.js +3 -3
- package/dist/lib/css/property-descriptors/font-variant.js.map +1 -1
- package/dist/lib/css/property-descriptors/font-weight.js +2 -2
- package/dist/lib/css/property-descriptors/font-weight.js.map +1 -1
- package/dist/lib/css/property-descriptors/letter-spacing.js +1 -1
- package/dist/lib/css/property-descriptors/letter-spacing.js.map +1 -1
- package/dist/lib/css/property-descriptors/line-break.js +1 -1
- package/dist/lib/css/property-descriptors/line-break.js.map +1 -1
- package/dist/lib/css/property-descriptors/line-height.js +3 -3
- package/dist/lib/css/property-descriptors/line-height.js.map +1 -1
- package/dist/lib/css/property-descriptors/list-style-image.js +2 -2
- package/dist/lib/css/property-descriptors/list-style-image.js.map +1 -1
- package/dist/lib/css/property-descriptors/list-style-position.js +1 -1
- package/dist/lib/css/property-descriptors/list-style-position.js.map +1 -1
- package/dist/lib/css/property-descriptors/list-style-type.js +1 -1
- package/dist/lib/css/property-descriptors/list-style-type.js.map +1 -1
- package/dist/lib/css/property-descriptors/margin.js +3 -3
- package/dist/lib/css/property-descriptors/margin.js.map +1 -1
- package/dist/lib/css/property-descriptors/object-fit.js +4 -4
- package/dist/lib/css/property-descriptors/object-fit.js.map +1 -1
- package/dist/lib/css/property-descriptors/opacity.js +2 -2
- package/dist/lib/css/property-descriptors/opacity.js.map +1 -1
- package/dist/lib/css/property-descriptors/overflow-wrap.js +1 -1
- package/dist/lib/css/property-descriptors/overflow-wrap.js.map +1 -1
- package/dist/lib/css/property-descriptors/overflow.js +3 -3
- package/dist/lib/css/property-descriptors/overflow.js.map +1 -1
- package/dist/lib/css/property-descriptors/padding.js +3 -3
- package/dist/lib/css/property-descriptors/padding.js.map +1 -1
- package/dist/lib/css/property-descriptors/paint-order.js +6 -6
- package/dist/lib/css/property-descriptors/paint-order.js.map +1 -1
- package/dist/lib/css/property-descriptors/position.js +1 -1
- package/dist/lib/css/property-descriptors/position.js.map +1 -1
- package/dist/lib/css/property-descriptors/quotes.js +11 -11
- package/dist/lib/css/property-descriptors/quotes.js.map +1 -1
- package/dist/lib/css/property-descriptors/rotate.js +3 -3
- package/dist/lib/css/property-descriptors/rotate.js.map +1 -1
- package/dist/lib/css/property-descriptors/text-align.js +1 -1
- package/dist/lib/css/property-descriptors/text-align.js.map +1 -1
- package/dist/lib/css/property-descriptors/text-decoration-color.js +1 -1
- package/dist/lib/css/property-descriptors/text-decoration-line.js +4 -4
- package/dist/lib/css/property-descriptors/text-decoration-line.js.map +1 -1
- package/dist/lib/css/property-descriptors/text-shadow.js +10 -10
- package/dist/lib/css/property-descriptors/text-shadow.js.map +1 -1
- package/dist/lib/css/property-descriptors/text-transform.js +1 -1
- package/dist/lib/css/property-descriptors/text-transform.js.map +1 -1
- package/dist/lib/css/property-descriptors/transform-origin.js +6 -6
- package/dist/lib/css/property-descriptors/transform-origin.js.map +1 -1
- package/dist/lib/css/property-descriptors/transform.js +15 -15
- package/dist/lib/css/property-descriptors/transform.js.map +1 -1
- package/dist/lib/css/property-descriptors/visibility.js +1 -1
- package/dist/lib/css/property-descriptors/visibility.js.map +1 -1
- package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +1 -1
- package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +3 -3
- package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js.map +1 -1
- package/dist/lib/css/property-descriptors/word-break.js +1 -1
- package/dist/lib/css/property-descriptors/word-break.js.map +1 -1
- package/dist/lib/css/property-descriptors/z-index.js +3 -3
- package/dist/lib/css/property-descriptors/z-index.js.map +1 -1
- package/dist/lib/css/syntax/__tests__/tokernizer-tests.js +17 -25
- package/dist/lib/css/syntax/__tests__/tokernizer-tests.js.map +1 -1
- package/dist/lib/css/syntax/parser.js +50 -55
- package/dist/lib/css/syntax/parser.js.map +1 -1
- package/dist/lib/css/syntax/tokenizer.js +205 -214
- package/dist/lib/css/syntax/tokenizer.js.map +1 -1
- package/dist/lib/css/types/__tests__/color-tests.js +103 -167
- package/dist/lib/css/types/__tests__/color-tests.js.map +1 -1
- package/dist/lib/css/types/__tests__/image-tests.js +192 -217
- package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
- package/dist/lib/css/types/angle.js +13 -13
- package/dist/lib/css/types/angle.js.map +1 -1
- package/dist/lib/css/types/color-spaces/a98.js +18 -22
- package/dist/lib/css/types/color-spaces/a98.js.map +1 -1
- package/dist/lib/css/types/color-spaces/p3.js +17 -22
- package/dist/lib/css/types/color-spaces/p3.js.map +1 -1
- package/dist/lib/css/types/color-spaces/pro-photo.js +17 -21
- package/dist/lib/css/types/color-spaces/pro-photo.js.map +1 -1
- package/dist/lib/css/types/color-spaces/rec2020.js +15 -19
- package/dist/lib/css/types/color-spaces/rec2020.js.map +1 -1
- package/dist/lib/css/types/color-spaces/srgb.js +17 -23
- package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
- package/dist/lib/css/types/color-utilities.js +80 -103
- package/dist/lib/css/types/color-utilities.js.map +1 -1
- package/dist/lib/css/types/color.js +72 -66
- package/dist/lib/css/types/color.js.map +1 -1
- package/dist/lib/css/types/functions/-prefix-linear-gradient.js +11 -11
- package/dist/lib/css/types/functions/-prefix-linear-gradient.js.map +1 -1
- package/dist/lib/css/types/functions/-prefix-radial-gradient.js +16 -16
- package/dist/lib/css/types/functions/-prefix-radial-gradient.js.map +1 -1
- package/dist/lib/css/types/functions/-webkit-gradient.js +26 -26
- package/dist/lib/css/types/functions/-webkit-gradient.js.map +1 -1
- package/dist/lib/css/types/functions/__tests__/radial-gradient.js +57 -65
- package/dist/lib/css/types/functions/__tests__/radial-gradient.js.map +1 -1
- package/dist/lib/css/types/functions/counter.js +59 -65
- package/dist/lib/css/types/functions/counter.js.map +1 -1
- package/dist/lib/css/types/functions/gradient.js +51 -52
- package/dist/lib/css/types/functions/gradient.js.map +1 -1
- package/dist/lib/css/types/functions/linear-gradient.js +10 -10
- package/dist/lib/css/types/functions/linear-gradient.js.map +1 -1
- package/dist/lib/css/types/functions/radial-gradient.js +17 -17
- package/dist/lib/css/types/functions/radial-gradient.js.map +1 -1
- package/dist/lib/css/types/image.js +14 -14
- package/dist/lib/css/types/image.js.map +1 -1
- package/dist/lib/css/types/length-percentage.js +19 -27
- package/dist/lib/css/types/length-percentage.js.map +1 -1
- package/dist/lib/css/types/length.js +1 -3
- package/dist/lib/css/types/length.js.map +1 -1
- package/dist/lib/css/types/time.js +2 -2
- package/dist/lib/css/types/time.js.map +1 -1
- package/dist/lib/dom/__mocks__/document-cloner.js +7 -8
- package/dist/lib/dom/__mocks__/document-cloner.js.map +1 -1
- package/dist/lib/dom/document-cloner.js +195 -219
- package/dist/lib/dom/document-cloner.js.map +1 -1
- package/dist/lib/dom/element-container.js +8 -9
- package/dist/lib/dom/element-container.js.map +1 -1
- package/dist/lib/dom/elements/li-element-container.js +6 -24
- package/dist/lib/dom/elements/li-element-container.js.map +1 -1
- package/dist/lib/dom/elements/ol-element-container.js +7 -25
- package/dist/lib/dom/elements/ol-element-container.js.map +1 -1
- package/dist/lib/dom/elements/select-element-container.js +7 -25
- package/dist/lib/dom/elements/select-element-container.js.map +1 -1
- package/dist/lib/dom/elements/textarea-element-container.js +6 -24
- package/dist/lib/dom/elements/textarea-element-container.js.map +1 -1
- package/dist/lib/dom/node-parser.js +42 -46
- package/dist/lib/dom/node-parser.js.map +1 -1
- package/dist/lib/dom/replaced-elements/canvas-element-container.js +8 -26
- package/dist/lib/dom/replaced-elements/canvas-element-container.js.map +1 -1
- package/dist/lib/dom/replaced-elements/iframe-element-container.js +17 -35
- package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
- package/dist/lib/dom/replaced-elements/image-element-container.js +9 -27
- package/dist/lib/dom/replaced-elements/image-element-container.js.map +1 -1
- package/dist/lib/dom/replaced-elements/input-element-container.js +47 -59
- package/dist/lib/dom/replaced-elements/input-element-container.js.map +1 -1
- package/dist/lib/dom/replaced-elements/svg-element-container.js +14 -32
- package/dist/lib/dom/replaced-elements/svg-element-container.js.map +1 -1
- package/dist/lib/dom/text-container.js +7 -8
- package/dist/lib/dom/text-container.js.map +1 -1
- package/dist/lib/index.js +101 -156
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/invariant.js +1 -1
- package/dist/lib/invariant.js.map +1 -1
- package/dist/lib/render/background.js +44 -47
- package/dist/lib/render/background.js.map +1 -1
- package/dist/lib/render/bezier-curve.js +18 -19
- package/dist/lib/render/bezier-curve.js.map +1 -1
- package/dist/lib/render/border.js +9 -9
- package/dist/lib/render/border.js.map +1 -1
- package/dist/lib/render/bound-curves.js +35 -36
- package/dist/lib/render/bound-curves.js.map +1 -1
- package/dist/lib/render/box-sizing.js +11 -11
- package/dist/lib/render/box-sizing.js.map +1 -1
- package/dist/lib/render/canvas/canvas-renderer.js +639 -918
- package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
- package/dist/lib/render/canvas/foreignobject-renderer.js +35 -101
- package/dist/lib/render/canvas/foreignobject-renderer.js.map +1 -1
- package/dist/lib/render/effects.js +12 -17
- package/dist/lib/render/effects.js.map +1 -1
- package/dist/lib/render/font-metrics.js +17 -18
- package/dist/lib/render/font-metrics.js.map +1 -1
- package/dist/lib/render/path.js +4 -4
- package/dist/lib/render/path.js.map +1 -1
- package/dist/lib/render/renderer.js +3 -4
- package/dist/lib/render/renderer.js.map +1 -1
- package/dist/lib/render/stacking-context.js +71 -73
- package/dist/lib/render/stacking-context.js.map +1 -1
- package/dist/lib/render/vector.js +6 -7
- package/dist/lib/render/vector.js.map +1 -1
- package/dist/types/dom/replaced-elements/input-element-container.d.ts +2 -0
- package/dist/types/index.d.ts +1 -0
- package/eslint.config.js +35 -0
- package/jest.config.cjs +5 -0
- package/karma.conf.cjs +295 -0
- package/package.json +32 -20
|
@@ -1,52 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
3
|
exports.copyCSSStyles = exports.DocumentCloner = void 0;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
4
|
+
const node_parser_1 = require("./node-parser");
|
|
5
|
+
const parser_1 = require("../css/syntax/parser");
|
|
6
|
+
const counter_1 = require("../css/types/functions/counter");
|
|
7
|
+
const list_style_type_1 = require("../css/property-descriptors/list-style-type");
|
|
8
|
+
const index_1 = require("../css/index");
|
|
9
|
+
const quotes_1 = require("../css/property-descriptors/quotes");
|
|
10
|
+
const debugger_1 = require("../core/debugger");
|
|
11
|
+
const IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';
|
|
12
|
+
class DocumentCloner {
|
|
13
|
+
constructor(context, element, options) {
|
|
50
14
|
this.context = context;
|
|
51
15
|
this.options = options;
|
|
52
16
|
this.scrolledElements = [];
|
|
@@ -58,66 +22,53 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
58
22
|
}
|
|
59
23
|
this.documentElement = this.cloneNode(element.ownerDocument.documentElement, false);
|
|
60
24
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
var iframe = createIFrameContainer(ownerDocument, windowSize);
|
|
25
|
+
toIFrame(ownerDocument, windowSize) {
|
|
26
|
+
const iframe = createIFrameContainer(ownerDocument, windowSize);
|
|
64
27
|
if (!iframe.contentWindow) {
|
|
65
|
-
return Promise.reject(
|
|
28
|
+
return Promise.reject(`Unable to find iframe window`);
|
|
66
29
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
30
|
+
const scrollX = ownerDocument.defaultView.pageXOffset;
|
|
31
|
+
const scrollY = ownerDocument.defaultView.pageYOffset;
|
|
32
|
+
const cloneWindow = iframe.contentWindow;
|
|
33
|
+
const documentClone = cloneWindow.document;
|
|
71
34
|
/* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle
|
|
72
35
|
if window url is about:blank, we can assign the url to current by writing onto the document
|
|
73
36
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) &&
|
|
83
|
-
(cloneWindow.scrollY !== windowSize.top || cloneWindow.scrollX !== windowSize.left)) {
|
|
84
|
-
this.context.logger.warn('Unable to restore scroll position for cloned document');
|
|
85
|
-
this.context.windowBounds = this.context.windowBounds.add(cloneWindow.scrollX - windowSize.left, cloneWindow.scrollY - windowSize.top, 0, 0);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
onclone = this.options.onclone;
|
|
89
|
-
referenceElement = this.clonedReferenceElement;
|
|
90
|
-
if (typeof referenceElement === 'undefined') {
|
|
91
|
-
return [2 /*return*/, Promise.reject("Error finding the ".concat(this.referenceElement.nodeName, " in the cloned document"))];
|
|
92
|
-
}
|
|
93
|
-
if (!(documentClone.fonts && documentClone.fonts.ready)) return [3 /*break*/, 2];
|
|
94
|
-
return [4 /*yield*/, documentClone.fonts.ready];
|
|
95
|
-
case 1:
|
|
96
|
-
_a.sent();
|
|
97
|
-
_a.label = 2;
|
|
98
|
-
case 2:
|
|
99
|
-
if (!/(AppleWebKit)/g.test(navigator.userAgent)) return [3 /*break*/, 4];
|
|
100
|
-
return [4 /*yield*/, imagesReady(documentClone)];
|
|
101
|
-
case 3:
|
|
102
|
-
_a.sent();
|
|
103
|
-
_a.label = 4;
|
|
104
|
-
case 4:
|
|
105
|
-
if (typeof onclone === 'function') {
|
|
106
|
-
return [2 /*return*/, Promise.resolve()
|
|
107
|
-
.then(function () { return onclone(documentClone, referenceElement); })
|
|
108
|
-
.then(function () { return iframe; })];
|
|
109
|
-
}
|
|
110
|
-
return [2 /*return*/, iframe];
|
|
37
|
+
const iframeLoad = iframeLoader(iframe).then(async () => {
|
|
38
|
+
this.scrolledElements.forEach(restoreNodeScroll);
|
|
39
|
+
if (cloneWindow) {
|
|
40
|
+
cloneWindow.scrollTo(windowSize.left, windowSize.top);
|
|
41
|
+
if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) &&
|
|
42
|
+
(cloneWindow.scrollY !== windowSize.top || cloneWindow.scrollX !== windowSize.left)) {
|
|
43
|
+
this.context.logger.warn('Unable to restore scroll position for cloned document');
|
|
44
|
+
this.context.windowBounds = this.context.windowBounds.add(cloneWindow.scrollX - windowSize.left, cloneWindow.scrollY - windowSize.top, 0, 0);
|
|
111
45
|
}
|
|
112
|
-
}
|
|
113
|
-
|
|
46
|
+
}
|
|
47
|
+
const onclone = this.options.onclone;
|
|
48
|
+
const referenceElement = this.clonedReferenceElement;
|
|
49
|
+
if (typeof referenceElement === 'undefined') {
|
|
50
|
+
return Promise.reject(`Error finding the ${this.referenceElement.nodeName} in the cloned document`);
|
|
51
|
+
}
|
|
52
|
+
if (documentClone.fonts && documentClone.fonts.ready) {
|
|
53
|
+
await documentClone.fonts.ready;
|
|
54
|
+
}
|
|
55
|
+
if (/(AppleWebKit)/g.test(navigator.userAgent)) {
|
|
56
|
+
await imagesReady(documentClone);
|
|
57
|
+
}
|
|
58
|
+
if (typeof onclone === 'function') {
|
|
59
|
+
return Promise.resolve()
|
|
60
|
+
.then(() => onclone(documentClone, referenceElement))
|
|
61
|
+
.then(() => iframe);
|
|
62
|
+
}
|
|
63
|
+
return iframe;
|
|
64
|
+
});
|
|
114
65
|
/**
|
|
115
66
|
* The baseURI of the document will be lost after documentClone.open().
|
|
116
67
|
* We save it before open() to preserve the original base URI for resource resolution.
|
|
117
68
|
* */
|
|
118
|
-
|
|
69
|
+
const baseUri = documentClone.baseURI;
|
|
119
70
|
documentClone.open();
|
|
120
|
-
documentClone.write(
|
|
71
|
+
documentClone.write(`${serializeDoctype(document.doctype)}<html></html>`);
|
|
121
72
|
// Chrome scrolls the parent document for some reason after the write to the cloned window???
|
|
122
73
|
restoreOwnerScroll(this.referenceElement.ownerDocument, scrollX, scrollY);
|
|
123
74
|
/**
|
|
@@ -130,13 +81,13 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
130
81
|
* - Make sure adoptNode() is called after documentClone.open() and close()
|
|
131
82
|
* - This allows Chrome to properly match and apply all CSS rules including mixed-case class selectors.
|
|
132
83
|
* */
|
|
133
|
-
|
|
84
|
+
const adoptedNode = documentClone.adoptNode(this.documentElement);
|
|
134
85
|
addBase(adoptedNode, baseUri);
|
|
135
86
|
documentClone.replaceChild(adoptedNode, documentClone.documentElement);
|
|
136
87
|
documentClone.close();
|
|
137
88
|
return iframeLoad;
|
|
138
|
-
}
|
|
139
|
-
|
|
89
|
+
}
|
|
90
|
+
createElementClone(node) {
|
|
140
91
|
if ((0, debugger_1.isDebugging)(node, 2 /* DebuggerType.CLONE */)) {
|
|
141
92
|
debugger;
|
|
142
93
|
}
|
|
@@ -149,7 +100,7 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
149
100
|
if ((0, node_parser_1.isStyleElement)(node)) {
|
|
150
101
|
return this.createStyleClone(node);
|
|
151
102
|
}
|
|
152
|
-
|
|
103
|
+
const clone = node.cloneNode(false);
|
|
153
104
|
if ((0, node_parser_1.isImageElement)(clone)) {
|
|
154
105
|
if ((0, node_parser_1.isImageElement)(node) && node.currentSrc && node.currentSrc !== node.src) {
|
|
155
106
|
clone.src = node.currentSrc;
|
|
@@ -163,23 +114,49 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
163
114
|
return this.createCustomElementClone(clone);
|
|
164
115
|
}
|
|
165
116
|
return clone;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
117
|
+
}
|
|
118
|
+
createCustomElementClone(node) {
|
|
119
|
+
// Ensure html2canvascustomelement is defined
|
|
120
|
+
if (typeof window !== 'undefined' && !customElements.get('html2canvascustomelement')) {
|
|
121
|
+
try {
|
|
122
|
+
customElements.define('html2canvascustomelement', class extends HTMLElement {
|
|
123
|
+
constructor() {
|
|
124
|
+
super();
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
// Already defined or cannot define
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const clone = document.createElement('html2canvascustomelement');
|
|
169
133
|
(0, exports.copyCSSStyles)(node.style, clone);
|
|
134
|
+
// Clone shadow DOM if it exists
|
|
135
|
+
// Fix for Issue #108: This is critical for Web Components with slots to work correctly
|
|
136
|
+
if (node.shadowRoot) {
|
|
137
|
+
try {
|
|
138
|
+
clone.attachShadow({ mode: 'open' });
|
|
139
|
+
// The actual shadow DOM content will be cloned in cloneChildNodes
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
// Some elements cannot have shadow roots attached
|
|
143
|
+
// This can happen if the element doesn't support shadow DOM
|
|
144
|
+
this.context.logger.error('Failed to attach shadow root to custom element clone:', e);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
170
147
|
return clone;
|
|
171
|
-
}
|
|
172
|
-
|
|
148
|
+
}
|
|
149
|
+
createStyleClone(node) {
|
|
173
150
|
try {
|
|
174
|
-
|
|
151
|
+
const sheet = node.sheet;
|
|
175
152
|
if (sheet && sheet.cssRules) {
|
|
176
|
-
|
|
153
|
+
const css = [].slice.call(sheet.cssRules, 0).reduce((css, rule) => {
|
|
177
154
|
if (rule && typeof rule.cssText === 'string') {
|
|
178
155
|
return css + rule.cssText;
|
|
179
156
|
}
|
|
180
157
|
return css;
|
|
181
158
|
}, '');
|
|
182
|
-
|
|
159
|
+
const style = node.cloneNode(false);
|
|
183
160
|
style.textContent = css;
|
|
184
161
|
return style;
|
|
185
162
|
}
|
|
@@ -192,34 +169,33 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
192
169
|
}
|
|
193
170
|
}
|
|
194
171
|
return node.cloneNode(false);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
var _a;
|
|
172
|
+
}
|
|
173
|
+
createCanvasClone(canvas) {
|
|
198
174
|
if (this.options.inlineImages && canvas.ownerDocument) {
|
|
199
|
-
|
|
175
|
+
const img = canvas.ownerDocument.createElement('img');
|
|
200
176
|
try {
|
|
201
177
|
img.src = canvas.toDataURL();
|
|
202
178
|
return img;
|
|
203
179
|
}
|
|
204
180
|
catch (e) {
|
|
205
|
-
this.context.logger.info(
|
|
181
|
+
this.context.logger.info(`Unable to inline canvas contents, canvas is tainted`, canvas);
|
|
206
182
|
}
|
|
207
183
|
}
|
|
208
|
-
|
|
184
|
+
const clonedCanvas = canvas.cloneNode(false);
|
|
209
185
|
try {
|
|
210
186
|
clonedCanvas.width = canvas.width;
|
|
211
187
|
clonedCanvas.height = canvas.height;
|
|
212
|
-
|
|
213
|
-
|
|
188
|
+
const ctx = canvas.getContext('2d');
|
|
189
|
+
const clonedCtx = clonedCanvas.getContext('2d', { willReadFrequently: true });
|
|
214
190
|
if (clonedCtx) {
|
|
215
191
|
if (!this.options.allowTaint && ctx) {
|
|
216
192
|
clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);
|
|
217
193
|
}
|
|
218
194
|
else {
|
|
219
|
-
|
|
195
|
+
const gl = canvas.getContext('webgl2') ?? canvas.getContext('webgl');
|
|
220
196
|
if (gl) {
|
|
221
|
-
|
|
222
|
-
if (
|
|
197
|
+
const attribs = gl.getContextAttributes();
|
|
198
|
+
if (attribs?.preserveDrawingBuffer === false) {
|
|
223
199
|
this.context.logger.warn('Unable to clone WebGL context as it has preserveDrawingBuffer=false', canvas);
|
|
224
200
|
}
|
|
225
201
|
}
|
|
@@ -229,15 +205,15 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
229
205
|
return clonedCanvas;
|
|
230
206
|
}
|
|
231
207
|
catch (e) {
|
|
232
|
-
this.context.logger.info(
|
|
208
|
+
this.context.logger.info(`Unable to clone canvas as it is tainted`, canvas);
|
|
233
209
|
}
|
|
234
210
|
return clonedCanvas;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
|
|
211
|
+
}
|
|
212
|
+
createVideoClone(video) {
|
|
213
|
+
const canvas = video.ownerDocument.createElement('canvas');
|
|
238
214
|
canvas.width = video.offsetWidth;
|
|
239
215
|
canvas.height = video.offsetHeight;
|
|
240
|
-
|
|
216
|
+
const ctx = canvas.getContext('2d');
|
|
241
217
|
try {
|
|
242
218
|
if (ctx) {
|
|
243
219
|
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|
@@ -248,14 +224,14 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
248
224
|
return canvas;
|
|
249
225
|
}
|
|
250
226
|
catch (e) {
|
|
251
|
-
this.context.logger.info(
|
|
227
|
+
this.context.logger.info(`Unable to clone video as it is tainted`, video);
|
|
252
228
|
}
|
|
253
|
-
|
|
229
|
+
const blankCanvas = video.ownerDocument.createElement('canvas');
|
|
254
230
|
blankCanvas.width = video.offsetWidth;
|
|
255
231
|
blankCanvas.height = video.offsetHeight;
|
|
256
232
|
return blankCanvas;
|
|
257
|
-
}
|
|
258
|
-
|
|
233
|
+
}
|
|
234
|
+
appendChildNode(clone, child, copyStyles) {
|
|
259
235
|
if (!(0, node_parser_1.isElementNode)(child) ||
|
|
260
236
|
(!(0, node_parser_1.isScriptElement)(child) &&
|
|
261
237
|
!child.hasAttribute(IGNORE_ATTRIBUTE) &&
|
|
@@ -264,43 +240,43 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
264
240
|
clone.appendChild(this.cloneNode(child, copyStyles));
|
|
265
241
|
}
|
|
266
242
|
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
this.appendChildNode(clone, child, copyStyles);
|
|
243
|
+
}
|
|
244
|
+
cloneChildNodes(node, clone, copyStyles) {
|
|
245
|
+
// Clone shadow DOM content if it exists
|
|
246
|
+
if (node.shadowRoot && clone.shadowRoot) {
|
|
247
|
+
for (let child = node.shadowRoot.firstChild; child; child = child.nextSibling) {
|
|
248
|
+
// Clone all shadow DOM children including <slot> elements
|
|
249
|
+
// The browser will automatically handle slot assignment
|
|
250
|
+
clone.shadowRoot.appendChild(this.cloneNode(child, copyStyles));
|
|
279
251
|
}
|
|
280
252
|
}
|
|
281
|
-
|
|
282
|
-
|
|
253
|
+
// Clone light DOM content (always, even if shadow DOM exists)
|
|
254
|
+
for (let child = node.firstChild; child; child = child.nextSibling) {
|
|
255
|
+
this.appendChildNode(clone, child, copyStyles);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
cloneNode(node, copyStyles) {
|
|
283
259
|
if ((0, node_parser_1.isTextNode)(node)) {
|
|
284
260
|
return document.createTextNode(node.data);
|
|
285
261
|
}
|
|
286
262
|
if (!node.ownerDocument) {
|
|
287
263
|
return node.cloneNode(false);
|
|
288
264
|
}
|
|
289
|
-
|
|
265
|
+
const window = node.ownerDocument.defaultView;
|
|
290
266
|
if (window && (0, node_parser_1.isElementNode)(node) && ((0, node_parser_1.isHTMLElementNode)(node) || (0, node_parser_1.isSVGElementNode)(node))) {
|
|
291
|
-
|
|
267
|
+
const clone = this.createElementClone(node);
|
|
292
268
|
clone.style.transitionProperty = 'none';
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
269
|
+
const style = window.getComputedStyle(node);
|
|
270
|
+
const styleBefore = window.getComputedStyle(node, ':before');
|
|
271
|
+
const styleAfter = window.getComputedStyle(node, ':after');
|
|
296
272
|
if (this.referenceElement === node && (0, node_parser_1.isHTMLElementNode)(clone)) {
|
|
297
273
|
this.clonedReferenceElement = clone;
|
|
298
274
|
}
|
|
299
275
|
if ((0, node_parser_1.isBodyElement)(clone)) {
|
|
300
276
|
createPseudoHideStyles(clone);
|
|
301
277
|
}
|
|
302
|
-
|
|
303
|
-
|
|
278
|
+
const counters = this.counters.parse(new index_1.CSSParsedCounterDeclaration(this.context, style));
|
|
279
|
+
const before = this.resolvePseudoContent(node, clone, styleBefore, PseudoElementType.BEFORE);
|
|
304
280
|
if ((0, node_parser_1.isCustomElement)(node)) {
|
|
305
281
|
copyStyles = true;
|
|
306
282
|
}
|
|
@@ -310,7 +286,7 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
310
286
|
if (before) {
|
|
311
287
|
clone.insertBefore(before, clone.firstChild);
|
|
312
288
|
}
|
|
313
|
-
|
|
289
|
+
const after = this.resolvePseudoContent(node, clone, styleAfter, PseudoElementType.AFTER);
|
|
314
290
|
if (after) {
|
|
315
291
|
clone.appendChild(after);
|
|
316
292
|
}
|
|
@@ -329,58 +305,57 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
329
305
|
return clone;
|
|
330
306
|
}
|
|
331
307
|
return node.cloneNode(false);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
var _this = this;
|
|
308
|
+
}
|
|
309
|
+
resolvePseudoContent(node, clone, style, pseudoElt) {
|
|
335
310
|
if (!style) {
|
|
336
311
|
return;
|
|
337
312
|
}
|
|
338
|
-
|
|
339
|
-
|
|
313
|
+
const value = style.content;
|
|
314
|
+
const document = clone.ownerDocument;
|
|
340
315
|
if (!document || !value || value === 'none' || value === '-moz-alt-content' || style.display === 'none') {
|
|
341
316
|
return;
|
|
342
317
|
}
|
|
343
318
|
this.counters.parse(new index_1.CSSParsedCounterDeclaration(this.context, style));
|
|
344
|
-
|
|
345
|
-
|
|
319
|
+
const declaration = new index_1.CSSParsedPseudoDeclaration(this.context, style);
|
|
320
|
+
const anonymousReplacedElement = document.createElement('html2canvaspseudoelement');
|
|
346
321
|
(0, exports.copyCSSStyles)(style, anonymousReplacedElement);
|
|
347
|
-
declaration.content.forEach(
|
|
322
|
+
declaration.content.forEach((token) => {
|
|
348
323
|
if (token.type === 0 /* TokenType.STRING_TOKEN */) {
|
|
349
324
|
anonymousReplacedElement.appendChild(document.createTextNode(token.value));
|
|
350
325
|
}
|
|
351
326
|
else if (token.type === 22 /* TokenType.URL_TOKEN */) {
|
|
352
|
-
|
|
327
|
+
const img = document.createElement('img');
|
|
353
328
|
img.src = token.value;
|
|
354
329
|
img.style.opacity = '1';
|
|
355
330
|
anonymousReplacedElement.appendChild(img);
|
|
356
331
|
}
|
|
357
332
|
else if (token.type === 18 /* TokenType.FUNCTION */) {
|
|
358
333
|
if (token.name === 'attr') {
|
|
359
|
-
|
|
334
|
+
const attr = token.values.filter(parser_1.isIdentToken);
|
|
360
335
|
if (attr.length) {
|
|
361
336
|
anonymousReplacedElement.appendChild(document.createTextNode(node.getAttribute(attr[0].value) || ''));
|
|
362
337
|
}
|
|
363
338
|
}
|
|
364
339
|
else if (token.name === 'counter') {
|
|
365
|
-
|
|
340
|
+
const [counter, counterStyle] = token.values.filter(parser_1.nonFunctionArgSeparator);
|
|
366
341
|
if (counter && (0, parser_1.isIdentToken)(counter)) {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
? list_style_type_1.listStyleType.parse(
|
|
342
|
+
const counterState = this.counters.getCounterValue(counter.value);
|
|
343
|
+
const counterType = counterStyle && (0, parser_1.isIdentToken)(counterStyle)
|
|
344
|
+
? list_style_type_1.listStyleType.parse(this.context, counterStyle.value)
|
|
370
345
|
: 3 /* LIST_STYLE_TYPE.DECIMAL */;
|
|
371
346
|
anonymousReplacedElement.appendChild(document.createTextNode((0, counter_1.createCounterText)(counterState, counterType, false)));
|
|
372
347
|
}
|
|
373
348
|
}
|
|
374
349
|
else if (token.name === 'counters') {
|
|
375
|
-
|
|
350
|
+
const [counter, delim, counterStyle] = token.values.filter(parser_1.nonFunctionArgSeparator);
|
|
376
351
|
if (counter && (0, parser_1.isIdentToken)(counter)) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
? list_style_type_1.listStyleType.parse(
|
|
352
|
+
const counterStates = this.counters.getCounterValues(counter.value);
|
|
353
|
+
const counterType = counterStyle && (0, parser_1.isIdentToken)(counterStyle)
|
|
354
|
+
? list_style_type_1.listStyleType.parse(this.context, counterStyle.value)
|
|
380
355
|
: 3 /* LIST_STYLE_TYPE.DECIMAL */;
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
.map(
|
|
356
|
+
const separator = delim && delim.type === 0 /* TokenType.STRING_TOKEN */ ? delim.value : '';
|
|
357
|
+
const text = counterStates
|
|
358
|
+
.map((value) => (0, counter_1.createCounterText)(value, counterType, false))
|
|
384
359
|
.join(separator);
|
|
385
360
|
anonymousReplacedElement.appendChild(document.createTextNode(text));
|
|
386
361
|
}
|
|
@@ -392,10 +367,10 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
392
367
|
else if (token.type === 20 /* TokenType.IDENT_TOKEN */) {
|
|
393
368
|
switch (token.value) {
|
|
394
369
|
case 'open-quote':
|
|
395
|
-
anonymousReplacedElement.appendChild(document.createTextNode((0, quotes_1.getQuote)(declaration.quotes,
|
|
370
|
+
anonymousReplacedElement.appendChild(document.createTextNode((0, quotes_1.getQuote)(declaration.quotes, this.quoteDepth++, true)));
|
|
396
371
|
break;
|
|
397
372
|
case 'close-quote':
|
|
398
|
-
anonymousReplacedElement.appendChild(document.createTextNode((0, quotes_1.getQuote)(declaration.quotes, --
|
|
373
|
+
anonymousReplacedElement.appendChild(document.createTextNode((0, quotes_1.getQuote)(declaration.quotes, --this.quoteDepth, false)));
|
|
399
374
|
break;
|
|
400
375
|
default:
|
|
401
376
|
// safari doesn't parse string tokens correctly because of lack of quotes
|
|
@@ -403,10 +378,10 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
403
378
|
}
|
|
404
379
|
}
|
|
405
380
|
});
|
|
406
|
-
anonymousReplacedElement.className =
|
|
407
|
-
|
|
408
|
-
?
|
|
409
|
-
:
|
|
381
|
+
anonymousReplacedElement.className = `${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE} ${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}`;
|
|
382
|
+
const newClassName = pseudoElt === PseudoElementType.BEFORE
|
|
383
|
+
? ` ${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE}`
|
|
384
|
+
: ` ${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}`;
|
|
410
385
|
if ((0, node_parser_1.isSVGElementNode)(clone)) {
|
|
411
386
|
clone.className.baseValue += newClassName;
|
|
412
387
|
}
|
|
@@ -414,24 +389,23 @@ var DocumentCloner = /** @class */ (function () {
|
|
|
414
389
|
clone.className += newClassName;
|
|
415
390
|
}
|
|
416
391
|
return anonymousReplacedElement;
|
|
417
|
-
}
|
|
418
|
-
|
|
392
|
+
}
|
|
393
|
+
static destroy(container) {
|
|
419
394
|
if (container.parentNode) {
|
|
420
395
|
container.parentNode.removeChild(container);
|
|
421
396
|
return true;
|
|
422
397
|
}
|
|
423
398
|
return false;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
}());
|
|
399
|
+
}
|
|
400
|
+
}
|
|
427
401
|
exports.DocumentCloner = DocumentCloner;
|
|
428
402
|
var PseudoElementType;
|
|
429
403
|
(function (PseudoElementType) {
|
|
430
404
|
PseudoElementType[PseudoElementType["BEFORE"] = 0] = "BEFORE";
|
|
431
405
|
PseudoElementType[PseudoElementType["AFTER"] = 1] = "AFTER";
|
|
432
406
|
})(PseudoElementType || (PseudoElementType = {}));
|
|
433
|
-
|
|
434
|
-
|
|
407
|
+
const createIFrameContainer = (ownerDocument, bounds) => {
|
|
408
|
+
const cloneIframeContainer = ownerDocument.createElement('iframe');
|
|
435
409
|
cloneIframeContainer.className = 'html2canvas-container';
|
|
436
410
|
cloneIframeContainer.style.visibility = 'hidden';
|
|
437
411
|
cloneIframeContainer.style.position = 'fixed';
|
|
@@ -445,8 +419,8 @@ var createIFrameContainer = function (ownerDocument, bounds) {
|
|
|
445
419
|
ownerDocument.body.appendChild(cloneIframeContainer);
|
|
446
420
|
return cloneIframeContainer;
|
|
447
421
|
};
|
|
448
|
-
|
|
449
|
-
return new Promise(
|
|
422
|
+
const imageReady = (img) => {
|
|
423
|
+
return new Promise((resolve) => {
|
|
450
424
|
if (img.complete) {
|
|
451
425
|
resolve();
|
|
452
426
|
return;
|
|
@@ -459,19 +433,19 @@ var imageReady = function (img) {
|
|
|
459
433
|
img.onerror = resolve;
|
|
460
434
|
});
|
|
461
435
|
};
|
|
462
|
-
|
|
436
|
+
const imagesReady = (document) => {
|
|
463
437
|
return Promise.all([].slice.call(document.images, 0).map(imageReady));
|
|
464
438
|
};
|
|
465
|
-
|
|
466
|
-
return new Promise(
|
|
467
|
-
|
|
439
|
+
const iframeLoader = (iframe) => {
|
|
440
|
+
return new Promise((resolve, reject) => {
|
|
441
|
+
const cloneWindow = iframe.contentWindow;
|
|
468
442
|
if (!cloneWindow) {
|
|
469
|
-
return reject(
|
|
443
|
+
return reject(`No window assigned for iframe`);
|
|
470
444
|
}
|
|
471
|
-
|
|
472
|
-
cloneWindow.onload = iframe.onload =
|
|
445
|
+
const documentClone = cloneWindow.document;
|
|
446
|
+
cloneWindow.onload = iframe.onload = () => {
|
|
473
447
|
cloneWindow.onload = iframe.onload = null;
|
|
474
|
-
|
|
448
|
+
const interval = setInterval(() => {
|
|
475
449
|
if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {
|
|
476
450
|
clearInterval(interval);
|
|
477
451
|
resolve(iframe);
|
|
@@ -480,15 +454,15 @@ var iframeLoader = function (iframe) {
|
|
|
480
454
|
};
|
|
481
455
|
});
|
|
482
456
|
};
|
|
483
|
-
|
|
457
|
+
const ignoredStyleProperties = [
|
|
484
458
|
'all', // #2476
|
|
485
459
|
'd', // #2483
|
|
486
460
|
'content' // Safari shows pseudoelements if content is set
|
|
487
461
|
];
|
|
488
|
-
|
|
462
|
+
const copyCSSStyles = (style, target) => {
|
|
489
463
|
// Edge does not provide value for cssText
|
|
490
|
-
for (
|
|
491
|
-
|
|
464
|
+
for (let i = style.length - 1; i >= 0; i--) {
|
|
465
|
+
const property = style.item(i);
|
|
492
466
|
// fix: Chrome_138 ignore custom properties
|
|
493
467
|
if (ignoredStyleProperties.indexOf(property) === -1 && !property.startsWith('--')) {
|
|
494
468
|
target.style.setProperty(property, style.getPropertyValue(property));
|
|
@@ -497,8 +471,8 @@ var copyCSSStyles = function (style, target) {
|
|
|
497
471
|
return target;
|
|
498
472
|
};
|
|
499
473
|
exports.copyCSSStyles = copyCSSStyles;
|
|
500
|
-
|
|
501
|
-
|
|
474
|
+
const serializeDoctype = (doctype) => {
|
|
475
|
+
let str = '';
|
|
502
476
|
if (doctype) {
|
|
503
477
|
str += '<!DOCTYPE ';
|
|
504
478
|
if (doctype.name) {
|
|
@@ -508,48 +482,50 @@ var serializeDoctype = function (doctype) {
|
|
|
508
482
|
str += doctype.internalSubset;
|
|
509
483
|
}
|
|
510
484
|
if (doctype.publicId) {
|
|
511
|
-
str += "
|
|
485
|
+
str += `"${doctype.publicId}"`;
|
|
512
486
|
}
|
|
513
487
|
if (doctype.systemId) {
|
|
514
|
-
str += "
|
|
488
|
+
str += `"${doctype.systemId}"`;
|
|
515
489
|
}
|
|
516
490
|
str += '>';
|
|
517
491
|
}
|
|
518
492
|
return str;
|
|
519
493
|
};
|
|
520
|
-
|
|
494
|
+
const restoreOwnerScroll = (ownerDocument, x, y) => {
|
|
521
495
|
if (ownerDocument &&
|
|
522
496
|
ownerDocument.defaultView &&
|
|
523
497
|
(x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {
|
|
524
498
|
ownerDocument.defaultView.scrollTo(x, y);
|
|
525
499
|
}
|
|
526
500
|
};
|
|
527
|
-
|
|
528
|
-
var element = _a[0], x = _a[1], y = _a[2];
|
|
501
|
+
const restoreNodeScroll = ([element, x, y]) => {
|
|
529
502
|
element.scrollLeft = x;
|
|
530
503
|
element.scrollTop = y;
|
|
531
504
|
};
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
505
|
+
const PSEUDO_BEFORE = ':before';
|
|
506
|
+
const PSEUDO_AFTER = ':after';
|
|
507
|
+
const PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';
|
|
508
|
+
const PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';
|
|
509
|
+
const PSEUDO_HIDE_ELEMENT_STYLE = `{
|
|
510
|
+
content: "" !important;
|
|
511
|
+
display: none !important;
|
|
512
|
+
}`;
|
|
513
|
+
const createPseudoHideStyles = (body) => {
|
|
514
|
+
createStyles(body, `.${PSEUDO_HIDE_ELEMENT_CLASS_BEFORE}${PSEUDO_BEFORE}${PSEUDO_HIDE_ELEMENT_STYLE}
|
|
515
|
+
.${PSEUDO_HIDE_ELEMENT_CLASS_AFTER}${PSEUDO_AFTER}${PSEUDO_HIDE_ELEMENT_STYLE}`);
|
|
539
516
|
};
|
|
540
|
-
|
|
541
|
-
|
|
517
|
+
const createStyles = (body, styles) => {
|
|
518
|
+
const document = body.ownerDocument;
|
|
542
519
|
if (document) {
|
|
543
|
-
|
|
520
|
+
const style = document.createElement('style');
|
|
544
521
|
style.textContent = styles;
|
|
545
522
|
body.appendChild(style);
|
|
546
523
|
}
|
|
547
524
|
};
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
var baseNode = targetELement.ownerDocument.createElement('base');
|
|
525
|
+
const addBase = (targetELement, baseUri) => {
|
|
526
|
+
const baseNode = targetELement.ownerDocument.createElement('base');
|
|
551
527
|
baseNode.href = baseUri;
|
|
552
|
-
|
|
553
|
-
headEle
|
|
528
|
+
const headEle = targetELement.getElementsByTagName('head').item(0);
|
|
529
|
+
headEle?.insertBefore(baseNode, headEle?.firstChild ?? null);
|
|
554
530
|
};
|
|
555
531
|
//# sourceMappingURL=document-cloner.js.map
|