@atlaskit/react-ufo 2.2.1 → 2.2.3
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/CHANGELOG.md +16 -0
- package/dist/cjs/vc/vc-observer/observers/editor-lnv/index.js +187 -0
- package/dist/cjs/vc/vc-observer/observers/editor-lnv/test-utils.js +69 -0
- package/dist/cjs/vc/vc-observer/observers/index.js +17 -4
- package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +0 -1
- package/dist/es2019/vc/vc-observer/observers/editor-lnv/index.js +140 -0
- package/dist/es2019/vc/vc-observer/observers/editor-lnv/test-utils.js +41 -0
- package/dist/es2019/vc/vc-observer/observers/index.js +14 -0
- package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +0 -1
- package/dist/esm/vc/vc-observer/observers/editor-lnv/index.js +181 -0
- package/dist/esm/vc/vc-observer/observers/editor-lnv/test-utils.js +59 -0
- package/dist/esm/vc/vc-observer/observers/index.js +17 -4
- package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +0 -1
- package/dist/types/common/vc/types.d.ts +1 -1
- package/dist/types/interaction-metrics/index.d.ts +2 -0
- package/dist/types/vc/vc-observer/observers/editor-lnv/index.d.ts +24 -0
- package/dist/types/vc/vc-observer/observers/editor-lnv/test-utils.d.ts +35 -0
- package/dist/types/vc/vc-observer/observers/index.d.ts +1 -0
- package/dist/types/vc/vc-observer/observers/ssr-placeholders/index.d.ts +9 -7
- package/dist/types-ts4.5/common/vc/types.d.ts +1 -1
- package/dist/types-ts4.5/interaction-metrics/index.d.ts +2 -0
- package/dist/types-ts4.5/vc/vc-observer/observers/editor-lnv/index.d.ts +24 -0
- package/dist/types-ts4.5/vc/vc-observer/observers/editor-lnv/test-utils.d.ts +35 -0
- package/dist/types-ts4.5/vc/vc-observer/observers/index.d.ts +1 -0
- package/dist/types-ts4.5/vc/vc-observer/observers/ssr-placeholders/index.d.ts +9 -7
- package/package.json +6 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @atlaskit/ufo-interaction-ignore
|
|
2
2
|
|
|
3
|
+
## 2.2.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#163513](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/163513)
|
|
8
|
+
[`740148acc161b`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/740148acc161b) -
|
|
9
|
+
add feature flag override support for Criterion
|
|
10
|
+
|
|
11
|
+
## 2.2.2
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [#160261](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/160261)
|
|
16
|
+
[`f147e45fb1a5a`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/f147e45fb1a5a) -
|
|
17
|
+
Extends VC90 detector to include editor lazy node view accomodations
|
|
18
|
+
|
|
3
19
|
## 2.2.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.EditorLnvHandler = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var placeholderDataKey = 'editorLnvPlaceholder'; // data-editor-lnv-placeholder
|
|
12
|
+
var replaceDataKey = 'editorLnvPlaceholderReplace'; // data-editor-lnv-placeholder-replace
|
|
13
|
+
var EditorLnvHandler = exports.EditorLnvHandler = /*#__PURE__*/function () {
|
|
14
|
+
function EditorLnvHandler() {
|
|
15
|
+
var _this = this;
|
|
16
|
+
(0, _classCallCheck2.default)(this, EditorLnvHandler);
|
|
17
|
+
(0, _defineProperty2.default)(this, "placeholders", new Map());
|
|
18
|
+
(0, _defineProperty2.default)(this, "getSizeCallbacks", new Map());
|
|
19
|
+
(0, _defineProperty2.default)(this, "isAddedPlaceholderMatchingSizeCallbacks", new Map());
|
|
20
|
+
(0, _defineProperty2.default)(this, "isAddedReplaceMatchingSizeCallbacks", new Map());
|
|
21
|
+
(0, _defineProperty2.default)(this, "intersectionObserverCallback", function (_ref) {
|
|
22
|
+
var _target$dataset, _target$dataset2;
|
|
23
|
+
var target = _ref.target,
|
|
24
|
+
boundingClientRect = _ref.boundingClientRect;
|
|
25
|
+
_this.intersectionObserver.unobserve(target);
|
|
26
|
+
if (!(target instanceof HTMLElement)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
var placeholderId = (_target$dataset = target.dataset) === null || _target$dataset === void 0 ? void 0 : _target$dataset[placeholderDataKey];
|
|
30
|
+
if (placeholderId && _this.getSizeCallbacks.has(placeholderId)) {
|
|
31
|
+
var _resolve = _this.getSizeCallbacks.get(placeholderId);
|
|
32
|
+
_this.getSizeCallbacks.delete(placeholderId);
|
|
33
|
+
if (!_resolve) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
_resolve({
|
|
37
|
+
x: boundingClientRect.x,
|
|
38
|
+
y: boundingClientRect.y,
|
|
39
|
+
width: boundingClientRect.width,
|
|
40
|
+
height: boundingClientRect.height
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (placeholderId && _this.isAddedPlaceholderMatchingSizeCallbacks.has(placeholderId)) {
|
|
45
|
+
var _resolve2 = _this.isAddedPlaceholderMatchingSizeCallbacks.get(placeholderId);
|
|
46
|
+
_this.isAddedPlaceholderMatchingSizeCallbacks.delete(placeholderId);
|
|
47
|
+
if (!_resolve2) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
var placeholder = _this.placeholders.get(placeholderId);
|
|
51
|
+
if (!placeholder) {
|
|
52
|
+
_resolve2(false);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
_resolve2(_this.areRectsSameSize(placeholder, boundingClientRect));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
var replaceId = (_target$dataset2 = target.dataset) === null || _target$dataset2 === void 0 ? void 0 : _target$dataset2[replaceDataKey];
|
|
59
|
+
if (replaceId && _this.isAddedReplaceMatchingSizeCallbacks.has(replaceId)) {
|
|
60
|
+
var _resolve3 = _this.isAddedReplaceMatchingSizeCallbacks.get(replaceId);
|
|
61
|
+
_this.isAddedReplaceMatchingSizeCallbacks.delete(replaceId);
|
|
62
|
+
if (!_resolve3) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
var _placeholder = _this.placeholders.get(replaceId);
|
|
66
|
+
if (!_placeholder) {
|
|
67
|
+
_resolve3(false);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
_this.placeholders.delete(replaceId);
|
|
71
|
+
_resolve3(_this.areRectsSameSize(_placeholder, boundingClientRect));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
this.intersectionObserver = new IntersectionObserver(function (entries) {
|
|
76
|
+
return entries.filter(function (entry) {
|
|
77
|
+
return entry.intersectionRatio > 0;
|
|
78
|
+
}).forEach(_this.intersectionObserverCallback);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
(0, _createClass2.default)(EditorLnvHandler, [{
|
|
82
|
+
key: "shouldHandleAddedNode",
|
|
83
|
+
value: function shouldHandleAddedNode(el) {
|
|
84
|
+
var _el$dataset, _el$dataset2;
|
|
85
|
+
return ((_el$dataset = el.dataset) === null || _el$dataset === void 0 ? void 0 : _el$dataset[placeholderDataKey]) || ((_el$dataset2 = el.dataset) === null || _el$dataset2 === void 0 ? void 0 : _el$dataset2[replaceDataKey]);
|
|
86
|
+
}
|
|
87
|
+
}, {
|
|
88
|
+
key: "handleAddedNode",
|
|
89
|
+
value: function handleAddedNode(el) {
|
|
90
|
+
var _el$dataset3, _el$dataset4;
|
|
91
|
+
// If it placeholder does not already exist, add it to the map
|
|
92
|
+
var placeholderId = (_el$dataset3 = el.dataset) === null || _el$dataset3 === void 0 ? void 0 : _el$dataset3[placeholderDataKey];
|
|
93
|
+
if (placeholderId) {
|
|
94
|
+
return this.handleAddedPlaceholderNode(el, placeholderId);
|
|
95
|
+
}
|
|
96
|
+
var replaceId = (_el$dataset4 = el.dataset) === null || _el$dataset4 === void 0 ? void 0 : _el$dataset4[replaceDataKey];
|
|
97
|
+
if (replaceId) {
|
|
98
|
+
return this.handleAddedReplaceNode(el, replaceId);
|
|
99
|
+
}
|
|
100
|
+
return Promise.resolve({
|
|
101
|
+
shouldIgnore: false
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
key: "clear",
|
|
106
|
+
value: function clear() {
|
|
107
|
+
this.placeholders.clear();
|
|
108
|
+
this.intersectionObserver.disconnect();
|
|
109
|
+
}
|
|
110
|
+
}, {
|
|
111
|
+
key: "handleAddedPlaceholderNode",
|
|
112
|
+
value: function handleAddedPlaceholderNode(el, placeholderId) {
|
|
113
|
+
if (this.isExistingPlaceholder(placeholderId)) {
|
|
114
|
+
return this.isAddedPlaceholderMatchingSize(el, placeholderId).then(function (isMatching) {
|
|
115
|
+
return {
|
|
116
|
+
shouldIgnore: isMatching
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return this.registerPlaceholder(el, placeholderId).then(function () {
|
|
121
|
+
return {
|
|
122
|
+
shouldIgnore: false
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}, {
|
|
127
|
+
key: "handleAddedReplaceNode",
|
|
128
|
+
value: function handleAddedReplaceNode(el, placeholderId) {
|
|
129
|
+
if (this.isExistingPlaceholder(placeholderId)) {
|
|
130
|
+
return this.isAddedReplaceMatchingSize(el, placeholderId).then(function (isMatching) {
|
|
131
|
+
return {
|
|
132
|
+
shouldIgnore: isMatching
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return Promise.resolve({
|
|
137
|
+
shouldIgnore: false
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}, {
|
|
141
|
+
key: "isExistingPlaceholder",
|
|
142
|
+
value: function isExistingPlaceholder(placeholderId) {
|
|
143
|
+
return this.placeholders.has(placeholderId);
|
|
144
|
+
}
|
|
145
|
+
}, {
|
|
146
|
+
key: "registerPlaceholder",
|
|
147
|
+
value: function registerPlaceholder(el, placeholderId) {
|
|
148
|
+
var _this2 = this;
|
|
149
|
+
return this.getSize(el, placeholderId).then(function (size) {
|
|
150
|
+
_this2.placeholders.set(placeholderId, size);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}, {
|
|
154
|
+
key: "getSize",
|
|
155
|
+
value: function getSize(el, placeholderId) {
|
|
156
|
+
var _this3 = this;
|
|
157
|
+
return new Promise(function (resolve) {
|
|
158
|
+
_this3.getSizeCallbacks.set(placeholderId, resolve);
|
|
159
|
+
_this3.intersectionObserver.observe(el);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}, {
|
|
163
|
+
key: "isAddedPlaceholderMatchingSize",
|
|
164
|
+
value: function isAddedPlaceholderMatchingSize(el, placeholderId) {
|
|
165
|
+
var _this4 = this;
|
|
166
|
+
return new Promise(function (resolve) {
|
|
167
|
+
_this4.isAddedPlaceholderMatchingSizeCallbacks.set(placeholderId, resolve);
|
|
168
|
+
_this4.intersectionObserver.observe(el);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}, {
|
|
172
|
+
key: "isAddedReplaceMatchingSize",
|
|
173
|
+
value: function isAddedReplaceMatchingSize(el, placeholderId) {
|
|
174
|
+
var _this5 = this;
|
|
175
|
+
return new Promise(function (resolve) {
|
|
176
|
+
_this5.isAddedReplaceMatchingSizeCallbacks.set(placeholderId, resolve);
|
|
177
|
+
_this5.intersectionObserver.observe(el);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}, {
|
|
181
|
+
key: "areRectsSameSize",
|
|
182
|
+
value: function areRectsSameSize(a, b) {
|
|
183
|
+
return Math.abs(a.width - b.width) < 1 && Math.abs(a.height - b.height) < 1;
|
|
184
|
+
}
|
|
185
|
+
}]);
|
|
186
|
+
return EditorLnvHandler;
|
|
187
|
+
}();
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.createMockIntersectionObserver = createMockIntersectionObserver;
|
|
8
|
+
exports.createPlaceholderElement = createPlaceholderElement;
|
|
9
|
+
exports.createReplaceElement = createReplaceElement;
|
|
10
|
+
exports.handleElements = handleElements;
|
|
11
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
12
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
14
|
+
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
function createPlaceholderElement(id) {
|
|
18
|
+
var el = document.createElement('div');
|
|
19
|
+
el.dataset.editorLnvPlaceholder = id;
|
|
20
|
+
return el;
|
|
21
|
+
}
|
|
22
|
+
function createReplaceElement(id) {
|
|
23
|
+
var el = document.createElement('div');
|
|
24
|
+
el.dataset.editorLnvPlaceholderReplace = id;
|
|
25
|
+
return el;
|
|
26
|
+
}
|
|
27
|
+
function handleElements(elements, handler, observerCallback, callback) {
|
|
28
|
+
var _elements = (0, _toArray2.default)(elements),
|
|
29
|
+
first = _elements[0],
|
|
30
|
+
rest = _elements.slice(1);
|
|
31
|
+
handler.handleAddedNode(first.element).then(function (result) {
|
|
32
|
+
if (!rest.length) {
|
|
33
|
+
// Recursion terminating condition
|
|
34
|
+
callback(result);
|
|
35
|
+
} else {
|
|
36
|
+
// Recursively handle the rest of the elements
|
|
37
|
+
handleElements(rest, handler, observerCallback, callback);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
observerCallback([{
|
|
41
|
+
target: first.element,
|
|
42
|
+
boundingClientRect: first.rect
|
|
43
|
+
}]);
|
|
44
|
+
}
|
|
45
|
+
function createMockIntersectionObserver(cbRef) {
|
|
46
|
+
return /*#__PURE__*/function () {
|
|
47
|
+
function _class(fn) {
|
|
48
|
+
(0, _classCallCheck2.default)(this, _class);
|
|
49
|
+
cbRef.current = function (entries) {
|
|
50
|
+
return fn(entries.map(function (entry) {
|
|
51
|
+
return _objectSpread(_objectSpread({}, entry), {}, {
|
|
52
|
+
intersectionRatio: 1
|
|
53
|
+
});
|
|
54
|
+
}));
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
(0, _createClass2.default)(_class, [{
|
|
58
|
+
key: "observe",
|
|
59
|
+
value: function observe() {}
|
|
60
|
+
}, {
|
|
61
|
+
key: "unobserve",
|
|
62
|
+
value: function unobserve() {}
|
|
63
|
+
}, {
|
|
64
|
+
key: "disconnect",
|
|
65
|
+
value: function disconnect() {}
|
|
66
|
+
}]);
|
|
67
|
+
return _class;
|
|
68
|
+
}();
|
|
69
|
+
}
|
|
@@ -9,7 +9,9 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
|
|
|
9
9
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
10
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
11
11
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
12
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
12
13
|
var _vcUtils = require("../media-wrapper/vc-utils");
|
|
14
|
+
var _editorLnv = require("./editor-lnv");
|
|
13
15
|
var _ssrPlaceholders = require("./ssr-placeholders");
|
|
14
16
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
15
17
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
@@ -59,6 +61,7 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
|
|
|
59
61
|
this.intersectionObserver = this.getIntersectionObserver();
|
|
60
62
|
this.mutationObserver = this.getMutationObserver();
|
|
61
63
|
this.ssrPlaceholderHandler = new _ssrPlaceholders.SSRPlaceholderHandlers();
|
|
64
|
+
this.editorLnvHandler = new _editorLnv.EditorLnvHandler();
|
|
62
65
|
}
|
|
63
66
|
(0, _createClass2.default)(Observers, [{
|
|
64
67
|
key: "isBrowserSupported",
|
|
@@ -95,6 +98,7 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
|
|
|
95
98
|
this.callbacks = new Set();
|
|
96
99
|
this.ssr.reactRootElement = null;
|
|
97
100
|
this.ssrPlaceholderHandler.clear();
|
|
101
|
+
this.editorLnvHandler.clear();
|
|
98
102
|
}
|
|
99
103
|
}, {
|
|
100
104
|
key: "getTotalTime",
|
|
@@ -168,6 +172,15 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
|
|
|
168
172
|
});
|
|
169
173
|
return;
|
|
170
174
|
}
|
|
175
|
+
if ((0, _platformFeatureFlags.fg)('platform_editor_ed-25557_lnv_add_ssr_placeholder')) {
|
|
176
|
+
if (_this2.editorLnvHandler.shouldHandleAddedNode(node)) {
|
|
177
|
+
_this2.editorLnvHandler.handleAddedNode(node).then(function (_ref) {
|
|
178
|
+
var shouldIgnore = _ref.shouldIgnore;
|
|
179
|
+
_this2.observeElement(node, mutation, 'html', shouldIgnore ? 'editor-lazy-node-view' : ignoreReason);
|
|
180
|
+
});
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
171
184
|
_this2.observeElement(node, mutation, 'html', ignoreReason);
|
|
172
185
|
}
|
|
173
186
|
if (node instanceof Text && node.parentElement != null) {
|
|
@@ -264,10 +277,10 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
|
|
|
264
277
|
var _this3 = this;
|
|
265
278
|
return this.isBrowserSupported() ? new IntersectionObserver(function (entries) {
|
|
266
279
|
_this3.measureStart();
|
|
267
|
-
entries.forEach(function (
|
|
268
|
-
var isIntersecting =
|
|
269
|
-
ir =
|
|
270
|
-
target =
|
|
280
|
+
entries.forEach(function (_ref2) {
|
|
281
|
+
var isIntersecting = _ref2.isIntersecting,
|
|
282
|
+
ir = _ref2.intersectionRect,
|
|
283
|
+
target = _ref2.target;
|
|
271
284
|
var data = _this3.observedMutations.get(target);
|
|
272
285
|
_this3.observedMutations.delete(target);
|
|
273
286
|
if (isIntersecting && ir.width > 0 && ir.height > 0) {
|
|
@@ -40,7 +40,6 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
|
|
|
40
40
|
_this.callbacks.delete(staticKey);
|
|
41
41
|
}
|
|
42
42
|
} else {
|
|
43
|
-
// react component check
|
|
44
43
|
var key = target.dataset.ssrPlaceholderReplace || '';
|
|
45
44
|
var _resolve2 = _this.reactValidateCallbacks.get(key);
|
|
46
45
|
if (!_resolve2) {
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
const placeholderDataKey = 'editorLnvPlaceholder'; // data-editor-lnv-placeholder
|
|
3
|
+
const replaceDataKey = 'editorLnvPlaceholderReplace'; // data-editor-lnv-placeholder-replace
|
|
4
|
+
|
|
5
|
+
export class EditorLnvHandler {
|
|
6
|
+
constructor() {
|
|
7
|
+
_defineProperty(this, "placeholders", new Map());
|
|
8
|
+
_defineProperty(this, "getSizeCallbacks", new Map());
|
|
9
|
+
_defineProperty(this, "isAddedPlaceholderMatchingSizeCallbacks", new Map());
|
|
10
|
+
_defineProperty(this, "isAddedReplaceMatchingSizeCallbacks", new Map());
|
|
11
|
+
_defineProperty(this, "intersectionObserverCallback", ({
|
|
12
|
+
target,
|
|
13
|
+
boundingClientRect
|
|
14
|
+
}) => {
|
|
15
|
+
var _target$dataset, _target$dataset2;
|
|
16
|
+
this.intersectionObserver.unobserve(target);
|
|
17
|
+
if (!(target instanceof HTMLElement)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const placeholderId = (_target$dataset = target.dataset) === null || _target$dataset === void 0 ? void 0 : _target$dataset[placeholderDataKey];
|
|
21
|
+
if (placeholderId && this.getSizeCallbacks.has(placeholderId)) {
|
|
22
|
+
const resolve = this.getSizeCallbacks.get(placeholderId);
|
|
23
|
+
this.getSizeCallbacks.delete(placeholderId);
|
|
24
|
+
if (!resolve) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
resolve({
|
|
28
|
+
x: boundingClientRect.x,
|
|
29
|
+
y: boundingClientRect.y,
|
|
30
|
+
width: boundingClientRect.width,
|
|
31
|
+
height: boundingClientRect.height
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (placeholderId && this.isAddedPlaceholderMatchingSizeCallbacks.has(placeholderId)) {
|
|
36
|
+
const resolve = this.isAddedPlaceholderMatchingSizeCallbacks.get(placeholderId);
|
|
37
|
+
this.isAddedPlaceholderMatchingSizeCallbacks.delete(placeholderId);
|
|
38
|
+
if (!resolve) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const placeholder = this.placeholders.get(placeholderId);
|
|
42
|
+
if (!placeholder) {
|
|
43
|
+
resolve(false);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
resolve(this.areRectsSameSize(placeholder, boundingClientRect));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const replaceId = (_target$dataset2 = target.dataset) === null || _target$dataset2 === void 0 ? void 0 : _target$dataset2[replaceDataKey];
|
|
50
|
+
if (replaceId && this.isAddedReplaceMatchingSizeCallbacks.has(replaceId)) {
|
|
51
|
+
const resolve = this.isAddedReplaceMatchingSizeCallbacks.get(replaceId);
|
|
52
|
+
this.isAddedReplaceMatchingSizeCallbacks.delete(replaceId);
|
|
53
|
+
if (!resolve) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const placeholder = this.placeholders.get(replaceId);
|
|
57
|
+
if (!placeholder) {
|
|
58
|
+
resolve(false);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.placeholders.delete(replaceId);
|
|
62
|
+
resolve(this.areRectsSameSize(placeholder, boundingClientRect));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
this.intersectionObserver = new IntersectionObserver(entries => entries.filter(entry => entry.intersectionRatio > 0).forEach(this.intersectionObserverCallback));
|
|
67
|
+
}
|
|
68
|
+
shouldHandleAddedNode(el) {
|
|
69
|
+
var _el$dataset, _el$dataset2;
|
|
70
|
+
return ((_el$dataset = el.dataset) === null || _el$dataset === void 0 ? void 0 : _el$dataset[placeholderDataKey]) || ((_el$dataset2 = el.dataset) === null || _el$dataset2 === void 0 ? void 0 : _el$dataset2[replaceDataKey]);
|
|
71
|
+
}
|
|
72
|
+
handleAddedNode(el) {
|
|
73
|
+
var _el$dataset3, _el$dataset4;
|
|
74
|
+
// If it placeholder does not already exist, add it to the map
|
|
75
|
+
const placeholderId = (_el$dataset3 = el.dataset) === null || _el$dataset3 === void 0 ? void 0 : _el$dataset3[placeholderDataKey];
|
|
76
|
+
if (placeholderId) {
|
|
77
|
+
return this.handleAddedPlaceholderNode(el, placeholderId);
|
|
78
|
+
}
|
|
79
|
+
const replaceId = (_el$dataset4 = el.dataset) === null || _el$dataset4 === void 0 ? void 0 : _el$dataset4[replaceDataKey];
|
|
80
|
+
if (replaceId) {
|
|
81
|
+
return this.handleAddedReplaceNode(el, replaceId);
|
|
82
|
+
}
|
|
83
|
+
return Promise.resolve({
|
|
84
|
+
shouldIgnore: false
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
clear() {
|
|
88
|
+
this.placeholders.clear();
|
|
89
|
+
this.intersectionObserver.disconnect();
|
|
90
|
+
}
|
|
91
|
+
handleAddedPlaceholderNode(el, placeholderId) {
|
|
92
|
+
if (this.isExistingPlaceholder(placeholderId)) {
|
|
93
|
+
return this.isAddedPlaceholderMatchingSize(el, placeholderId).then(isMatching => ({
|
|
94
|
+
shouldIgnore: isMatching
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
return this.registerPlaceholder(el, placeholderId).then(() => ({
|
|
98
|
+
shouldIgnore: false
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
handleAddedReplaceNode(el, placeholderId) {
|
|
102
|
+
if (this.isExistingPlaceholder(placeholderId)) {
|
|
103
|
+
return this.isAddedReplaceMatchingSize(el, placeholderId).then(isMatching => ({
|
|
104
|
+
shouldIgnore: isMatching
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
return Promise.resolve({
|
|
108
|
+
shouldIgnore: false
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
isExistingPlaceholder(placeholderId) {
|
|
112
|
+
return this.placeholders.has(placeholderId);
|
|
113
|
+
}
|
|
114
|
+
registerPlaceholder(el, placeholderId) {
|
|
115
|
+
return this.getSize(el, placeholderId).then(size => {
|
|
116
|
+
this.placeholders.set(placeholderId, size);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
getSize(el, placeholderId) {
|
|
120
|
+
return new Promise(resolve => {
|
|
121
|
+
this.getSizeCallbacks.set(placeholderId, resolve);
|
|
122
|
+
this.intersectionObserver.observe(el);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
isAddedPlaceholderMatchingSize(el, placeholderId) {
|
|
126
|
+
return new Promise(resolve => {
|
|
127
|
+
this.isAddedPlaceholderMatchingSizeCallbacks.set(placeholderId, resolve);
|
|
128
|
+
this.intersectionObserver.observe(el);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
isAddedReplaceMatchingSize(el, placeholderId) {
|
|
132
|
+
return new Promise(resolve => {
|
|
133
|
+
this.isAddedReplaceMatchingSizeCallbacks.set(placeholderId, resolve);
|
|
134
|
+
this.intersectionObserver.observe(el);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
areRectsSameSize(a, b) {
|
|
138
|
+
return Math.abs(a.width - b.width) < 1 && Math.abs(a.height - b.height) < 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function createPlaceholderElement(id) {
|
|
2
|
+
const el = document.createElement('div');
|
|
3
|
+
el.dataset.editorLnvPlaceholder = id;
|
|
4
|
+
return el;
|
|
5
|
+
}
|
|
6
|
+
export function createReplaceElement(id) {
|
|
7
|
+
const el = document.createElement('div');
|
|
8
|
+
el.dataset.editorLnvPlaceholderReplace = id;
|
|
9
|
+
return el;
|
|
10
|
+
}
|
|
11
|
+
export function handleElements(elements, handler, observerCallback, callback) {
|
|
12
|
+
const [first, ...rest] = elements;
|
|
13
|
+
handler.handleAddedNode(first.element).then(result => {
|
|
14
|
+
if (!rest.length) {
|
|
15
|
+
// Recursion terminating condition
|
|
16
|
+
callback(result);
|
|
17
|
+
} else {
|
|
18
|
+
// Recursively handle the rest of the elements
|
|
19
|
+
handleElements(rest, handler, observerCallback, callback);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
observerCallback([{
|
|
23
|
+
target: first.element,
|
|
24
|
+
boundingClientRect: first.rect
|
|
25
|
+
}]);
|
|
26
|
+
}
|
|
27
|
+
export function createMockIntersectionObserver(cbRef) {
|
|
28
|
+
return class {
|
|
29
|
+
constructor(fn) {
|
|
30
|
+
cbRef.current = entries => fn(entries.map(entry => {
|
|
31
|
+
return {
|
|
32
|
+
...entry,
|
|
33
|
+
intersectionRatio: 1
|
|
34
|
+
};
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
observe() {}
|
|
38
|
+
unobserve() {}
|
|
39
|
+
disconnect() {}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
2
3
|
import { isContainedWithinMediaWrapper } from '../media-wrapper/vc-utils';
|
|
4
|
+
import { EditorLnvHandler } from './editor-lnv';
|
|
3
5
|
import { SSRPlaceholderHandlers } from './ssr-placeholders';
|
|
4
6
|
const state = {
|
|
5
7
|
normal: 1,
|
|
@@ -45,6 +47,7 @@ export class Observers {
|
|
|
45
47
|
this.intersectionObserver = this.getIntersectionObserver();
|
|
46
48
|
this.mutationObserver = this.getMutationObserver();
|
|
47
49
|
this.ssrPlaceholderHandler = new SSRPlaceholderHandlers();
|
|
50
|
+
this.editorLnvHandler = new EditorLnvHandler();
|
|
48
51
|
}
|
|
49
52
|
isBrowserSupported() {
|
|
50
53
|
return typeof window.IntersectionObserver === 'function' && typeof window.MutationObserver === 'function';
|
|
@@ -75,6 +78,7 @@ export class Observers {
|
|
|
75
78
|
this.callbacks = new Set();
|
|
76
79
|
this.ssr.reactRootElement = null;
|
|
77
80
|
this.ssrPlaceholderHandler.clear();
|
|
81
|
+
this.editorLnvHandler.clear();
|
|
78
82
|
}
|
|
79
83
|
getTotalTime() {
|
|
80
84
|
return this.totalTime;
|
|
@@ -135,6 +139,16 @@ export class Observers {
|
|
|
135
139
|
});
|
|
136
140
|
return;
|
|
137
141
|
}
|
|
142
|
+
if (fg('platform_editor_ed-25557_lnv_add_ssr_placeholder')) {
|
|
143
|
+
if (this.editorLnvHandler.shouldHandleAddedNode(node)) {
|
|
144
|
+
this.editorLnvHandler.handleAddedNode(node).then(({
|
|
145
|
+
shouldIgnore
|
|
146
|
+
}) => {
|
|
147
|
+
this.observeElement(node, mutation, 'html', shouldIgnore ? 'editor-lazy-node-view' : ignoreReason);
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
138
152
|
this.observeElement(node, mutation, 'html', ignoreReason);
|
|
139
153
|
}
|
|
140
154
|
if (node instanceof Text && node.parentElement != null) {
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
var placeholderDataKey = 'editorLnvPlaceholder'; // data-editor-lnv-placeholder
|
|
5
|
+
var replaceDataKey = 'editorLnvPlaceholderReplace'; // data-editor-lnv-placeholder-replace
|
|
6
|
+
|
|
7
|
+
export var EditorLnvHandler = /*#__PURE__*/function () {
|
|
8
|
+
function EditorLnvHandler() {
|
|
9
|
+
var _this = this;
|
|
10
|
+
_classCallCheck(this, EditorLnvHandler);
|
|
11
|
+
_defineProperty(this, "placeholders", new Map());
|
|
12
|
+
_defineProperty(this, "getSizeCallbacks", new Map());
|
|
13
|
+
_defineProperty(this, "isAddedPlaceholderMatchingSizeCallbacks", new Map());
|
|
14
|
+
_defineProperty(this, "isAddedReplaceMatchingSizeCallbacks", new Map());
|
|
15
|
+
_defineProperty(this, "intersectionObserverCallback", function (_ref) {
|
|
16
|
+
var _target$dataset, _target$dataset2;
|
|
17
|
+
var target = _ref.target,
|
|
18
|
+
boundingClientRect = _ref.boundingClientRect;
|
|
19
|
+
_this.intersectionObserver.unobserve(target);
|
|
20
|
+
if (!(target instanceof HTMLElement)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
var placeholderId = (_target$dataset = target.dataset) === null || _target$dataset === void 0 ? void 0 : _target$dataset[placeholderDataKey];
|
|
24
|
+
if (placeholderId && _this.getSizeCallbacks.has(placeholderId)) {
|
|
25
|
+
var _resolve = _this.getSizeCallbacks.get(placeholderId);
|
|
26
|
+
_this.getSizeCallbacks.delete(placeholderId);
|
|
27
|
+
if (!_resolve) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
_resolve({
|
|
31
|
+
x: boundingClientRect.x,
|
|
32
|
+
y: boundingClientRect.y,
|
|
33
|
+
width: boundingClientRect.width,
|
|
34
|
+
height: boundingClientRect.height
|
|
35
|
+
});
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (placeholderId && _this.isAddedPlaceholderMatchingSizeCallbacks.has(placeholderId)) {
|
|
39
|
+
var _resolve2 = _this.isAddedPlaceholderMatchingSizeCallbacks.get(placeholderId);
|
|
40
|
+
_this.isAddedPlaceholderMatchingSizeCallbacks.delete(placeholderId);
|
|
41
|
+
if (!_resolve2) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
var placeholder = _this.placeholders.get(placeholderId);
|
|
45
|
+
if (!placeholder) {
|
|
46
|
+
_resolve2(false);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
_resolve2(_this.areRectsSameSize(placeholder, boundingClientRect));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
var replaceId = (_target$dataset2 = target.dataset) === null || _target$dataset2 === void 0 ? void 0 : _target$dataset2[replaceDataKey];
|
|
53
|
+
if (replaceId && _this.isAddedReplaceMatchingSizeCallbacks.has(replaceId)) {
|
|
54
|
+
var _resolve3 = _this.isAddedReplaceMatchingSizeCallbacks.get(replaceId);
|
|
55
|
+
_this.isAddedReplaceMatchingSizeCallbacks.delete(replaceId);
|
|
56
|
+
if (!_resolve3) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
var _placeholder = _this.placeholders.get(replaceId);
|
|
60
|
+
if (!_placeholder) {
|
|
61
|
+
_resolve3(false);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
_this.placeholders.delete(replaceId);
|
|
65
|
+
_resolve3(_this.areRectsSameSize(_placeholder, boundingClientRect));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
this.intersectionObserver = new IntersectionObserver(function (entries) {
|
|
70
|
+
return entries.filter(function (entry) {
|
|
71
|
+
return entry.intersectionRatio > 0;
|
|
72
|
+
}).forEach(_this.intersectionObserverCallback);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
_createClass(EditorLnvHandler, [{
|
|
76
|
+
key: "shouldHandleAddedNode",
|
|
77
|
+
value: function shouldHandleAddedNode(el) {
|
|
78
|
+
var _el$dataset, _el$dataset2;
|
|
79
|
+
return ((_el$dataset = el.dataset) === null || _el$dataset === void 0 ? void 0 : _el$dataset[placeholderDataKey]) || ((_el$dataset2 = el.dataset) === null || _el$dataset2 === void 0 ? void 0 : _el$dataset2[replaceDataKey]);
|
|
80
|
+
}
|
|
81
|
+
}, {
|
|
82
|
+
key: "handleAddedNode",
|
|
83
|
+
value: function handleAddedNode(el) {
|
|
84
|
+
var _el$dataset3, _el$dataset4;
|
|
85
|
+
// If it placeholder does not already exist, add it to the map
|
|
86
|
+
var placeholderId = (_el$dataset3 = el.dataset) === null || _el$dataset3 === void 0 ? void 0 : _el$dataset3[placeholderDataKey];
|
|
87
|
+
if (placeholderId) {
|
|
88
|
+
return this.handleAddedPlaceholderNode(el, placeholderId);
|
|
89
|
+
}
|
|
90
|
+
var replaceId = (_el$dataset4 = el.dataset) === null || _el$dataset4 === void 0 ? void 0 : _el$dataset4[replaceDataKey];
|
|
91
|
+
if (replaceId) {
|
|
92
|
+
return this.handleAddedReplaceNode(el, replaceId);
|
|
93
|
+
}
|
|
94
|
+
return Promise.resolve({
|
|
95
|
+
shouldIgnore: false
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}, {
|
|
99
|
+
key: "clear",
|
|
100
|
+
value: function clear() {
|
|
101
|
+
this.placeholders.clear();
|
|
102
|
+
this.intersectionObserver.disconnect();
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
key: "handleAddedPlaceholderNode",
|
|
106
|
+
value: function handleAddedPlaceholderNode(el, placeholderId) {
|
|
107
|
+
if (this.isExistingPlaceholder(placeholderId)) {
|
|
108
|
+
return this.isAddedPlaceholderMatchingSize(el, placeholderId).then(function (isMatching) {
|
|
109
|
+
return {
|
|
110
|
+
shouldIgnore: isMatching
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return this.registerPlaceholder(el, placeholderId).then(function () {
|
|
115
|
+
return {
|
|
116
|
+
shouldIgnore: false
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}, {
|
|
121
|
+
key: "handleAddedReplaceNode",
|
|
122
|
+
value: function handleAddedReplaceNode(el, placeholderId) {
|
|
123
|
+
if (this.isExistingPlaceholder(placeholderId)) {
|
|
124
|
+
return this.isAddedReplaceMatchingSize(el, placeholderId).then(function (isMatching) {
|
|
125
|
+
return {
|
|
126
|
+
shouldIgnore: isMatching
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return Promise.resolve({
|
|
131
|
+
shouldIgnore: false
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}, {
|
|
135
|
+
key: "isExistingPlaceholder",
|
|
136
|
+
value: function isExistingPlaceholder(placeholderId) {
|
|
137
|
+
return this.placeholders.has(placeholderId);
|
|
138
|
+
}
|
|
139
|
+
}, {
|
|
140
|
+
key: "registerPlaceholder",
|
|
141
|
+
value: function registerPlaceholder(el, placeholderId) {
|
|
142
|
+
var _this2 = this;
|
|
143
|
+
return this.getSize(el, placeholderId).then(function (size) {
|
|
144
|
+
_this2.placeholders.set(placeholderId, size);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}, {
|
|
148
|
+
key: "getSize",
|
|
149
|
+
value: function getSize(el, placeholderId) {
|
|
150
|
+
var _this3 = this;
|
|
151
|
+
return new Promise(function (resolve) {
|
|
152
|
+
_this3.getSizeCallbacks.set(placeholderId, resolve);
|
|
153
|
+
_this3.intersectionObserver.observe(el);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}, {
|
|
157
|
+
key: "isAddedPlaceholderMatchingSize",
|
|
158
|
+
value: function isAddedPlaceholderMatchingSize(el, placeholderId) {
|
|
159
|
+
var _this4 = this;
|
|
160
|
+
return new Promise(function (resolve) {
|
|
161
|
+
_this4.isAddedPlaceholderMatchingSizeCallbacks.set(placeholderId, resolve);
|
|
162
|
+
_this4.intersectionObserver.observe(el);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}, {
|
|
166
|
+
key: "isAddedReplaceMatchingSize",
|
|
167
|
+
value: function isAddedReplaceMatchingSize(el, placeholderId) {
|
|
168
|
+
var _this5 = this;
|
|
169
|
+
return new Promise(function (resolve) {
|
|
170
|
+
_this5.isAddedReplaceMatchingSizeCallbacks.set(placeholderId, resolve);
|
|
171
|
+
_this5.intersectionObserver.observe(el);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}, {
|
|
175
|
+
key: "areRectsSameSize",
|
|
176
|
+
value: function areRectsSameSize(a, b) {
|
|
177
|
+
return Math.abs(a.width - b.width) < 1 && Math.abs(a.height - b.height) < 1;
|
|
178
|
+
}
|
|
179
|
+
}]);
|
|
180
|
+
return EditorLnvHandler;
|
|
181
|
+
}();
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
4
|
+
import _toArray from "@babel/runtime/helpers/toArray";
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
|
+
export function createPlaceholderElement(id) {
|
|
8
|
+
var el = document.createElement('div');
|
|
9
|
+
el.dataset.editorLnvPlaceholder = id;
|
|
10
|
+
return el;
|
|
11
|
+
}
|
|
12
|
+
export function createReplaceElement(id) {
|
|
13
|
+
var el = document.createElement('div');
|
|
14
|
+
el.dataset.editorLnvPlaceholderReplace = id;
|
|
15
|
+
return el;
|
|
16
|
+
}
|
|
17
|
+
export function handleElements(elements, handler, observerCallback, callback) {
|
|
18
|
+
var _elements = _toArray(elements),
|
|
19
|
+
first = _elements[0],
|
|
20
|
+
rest = _elements.slice(1);
|
|
21
|
+
handler.handleAddedNode(first.element).then(function (result) {
|
|
22
|
+
if (!rest.length) {
|
|
23
|
+
// Recursion terminating condition
|
|
24
|
+
callback(result);
|
|
25
|
+
} else {
|
|
26
|
+
// Recursively handle the rest of the elements
|
|
27
|
+
handleElements(rest, handler, observerCallback, callback);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
observerCallback([{
|
|
31
|
+
target: first.element,
|
|
32
|
+
boundingClientRect: first.rect
|
|
33
|
+
}]);
|
|
34
|
+
}
|
|
35
|
+
export function createMockIntersectionObserver(cbRef) {
|
|
36
|
+
return /*#__PURE__*/function () {
|
|
37
|
+
function _class(fn) {
|
|
38
|
+
_classCallCheck(this, _class);
|
|
39
|
+
cbRef.current = function (entries) {
|
|
40
|
+
return fn(entries.map(function (entry) {
|
|
41
|
+
return _objectSpread(_objectSpread({}, entry), {}, {
|
|
42
|
+
intersectionRatio: 1
|
|
43
|
+
});
|
|
44
|
+
}));
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
_createClass(_class, [{
|
|
48
|
+
key: "observe",
|
|
49
|
+
value: function observe() {}
|
|
50
|
+
}, {
|
|
51
|
+
key: "unobserve",
|
|
52
|
+
value: function unobserve() {}
|
|
53
|
+
}, {
|
|
54
|
+
key: "disconnect",
|
|
55
|
+
value: function disconnect() {}
|
|
56
|
+
}]);
|
|
57
|
+
return _class;
|
|
58
|
+
}();
|
|
59
|
+
}
|
|
@@ -7,7 +7,9 @@ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r)
|
|
|
7
7
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
8
8
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
9
9
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
10
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
10
11
|
import { isContainedWithinMediaWrapper } from '../media-wrapper/vc-utils';
|
|
12
|
+
import { EditorLnvHandler } from './editor-lnv';
|
|
11
13
|
import { SSRPlaceholderHandlers } from './ssr-placeholders';
|
|
12
14
|
var state = {
|
|
13
15
|
normal: 1,
|
|
@@ -52,6 +54,7 @@ export var Observers = /*#__PURE__*/function () {
|
|
|
52
54
|
this.intersectionObserver = this.getIntersectionObserver();
|
|
53
55
|
this.mutationObserver = this.getMutationObserver();
|
|
54
56
|
this.ssrPlaceholderHandler = new SSRPlaceholderHandlers();
|
|
57
|
+
this.editorLnvHandler = new EditorLnvHandler();
|
|
55
58
|
}
|
|
56
59
|
_createClass(Observers, [{
|
|
57
60
|
key: "isBrowserSupported",
|
|
@@ -88,6 +91,7 @@ export var Observers = /*#__PURE__*/function () {
|
|
|
88
91
|
this.callbacks = new Set();
|
|
89
92
|
this.ssr.reactRootElement = null;
|
|
90
93
|
this.ssrPlaceholderHandler.clear();
|
|
94
|
+
this.editorLnvHandler.clear();
|
|
91
95
|
}
|
|
92
96
|
}, {
|
|
93
97
|
key: "getTotalTime",
|
|
@@ -161,6 +165,15 @@ export var Observers = /*#__PURE__*/function () {
|
|
|
161
165
|
});
|
|
162
166
|
return;
|
|
163
167
|
}
|
|
168
|
+
if (fg('platform_editor_ed-25557_lnv_add_ssr_placeholder')) {
|
|
169
|
+
if (_this2.editorLnvHandler.shouldHandleAddedNode(node)) {
|
|
170
|
+
_this2.editorLnvHandler.handleAddedNode(node).then(function (_ref) {
|
|
171
|
+
var shouldIgnore = _ref.shouldIgnore;
|
|
172
|
+
_this2.observeElement(node, mutation, 'html', shouldIgnore ? 'editor-lazy-node-view' : ignoreReason);
|
|
173
|
+
});
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
164
177
|
_this2.observeElement(node, mutation, 'html', ignoreReason);
|
|
165
178
|
}
|
|
166
179
|
if (node instanceof Text && node.parentElement != null) {
|
|
@@ -257,10 +270,10 @@ export var Observers = /*#__PURE__*/function () {
|
|
|
257
270
|
var _this3 = this;
|
|
258
271
|
return this.isBrowserSupported() ? new IntersectionObserver(function (entries) {
|
|
259
272
|
_this3.measureStart();
|
|
260
|
-
entries.forEach(function (
|
|
261
|
-
var isIntersecting =
|
|
262
|
-
ir =
|
|
263
|
-
target =
|
|
273
|
+
entries.forEach(function (_ref2) {
|
|
274
|
+
var isIntersecting = _ref2.isIntersecting,
|
|
275
|
+
ir = _ref2.intersectionRect,
|
|
276
|
+
target = _ref2.target;
|
|
264
277
|
var data = _this3.observedMutations.get(target);
|
|
265
278
|
_this3.observedMutations.delete(target);
|
|
266
279
|
if (isIntersecting && ir.width > 0 && ir.height > 0) {
|
|
@@ -33,7 +33,6 @@ export var SSRPlaceholderHandlers = /*#__PURE__*/function () {
|
|
|
33
33
|
_this.callbacks.delete(staticKey);
|
|
34
34
|
}
|
|
35
35
|
} else {
|
|
36
|
-
// react component check
|
|
37
36
|
var key = target.dataset.ssrPlaceholderReplace || '';
|
|
38
37
|
var _resolve2 = _this.reactValidateCallbacks.get(key);
|
|
39
38
|
if (!_resolve2) {
|
|
@@ -35,7 +35,7 @@ export type VCEntryType = {
|
|
|
35
35
|
vc: number;
|
|
36
36
|
elements: string[];
|
|
37
37
|
};
|
|
38
|
-
export type VCIgnoreReason = 'image' | 'ssr-hydration' | '';
|
|
38
|
+
export type VCIgnoreReason = 'image' | 'ssr-hydration' | 'editor-lazy-node-view' | '';
|
|
39
39
|
export type ComponentsLogEntry = {
|
|
40
40
|
targetName: string;
|
|
41
41
|
__debug__element: WeakRef<Element> | null;
|
|
@@ -60,6 +60,8 @@ declare global {
|
|
|
60
60
|
addFeatureFlagAccessed?: (flagName: string, flagValue: FeatureFlagValue) => void;
|
|
61
61
|
addUFOHold?: (id: string, name: string, labelStack: string, startTime: number) => void;
|
|
62
62
|
removeUFOHold?: (id: string) => void;
|
|
63
|
+
getFeatureFlagOverride?: (flagName: string) => boolean | undefined;
|
|
64
|
+
getExperimentValueOverride?: <T>(experimentName: string, parameterName: string) => T;
|
|
63
65
|
};
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type HandlerResult = {
|
|
2
|
+
shouldIgnore: boolean;
|
|
3
|
+
};
|
|
4
|
+
export declare class EditorLnvHandler {
|
|
5
|
+
private placeholders;
|
|
6
|
+
private intersectionObserver;
|
|
7
|
+
private getSizeCallbacks;
|
|
8
|
+
private isAddedPlaceholderMatchingSizeCallbacks;
|
|
9
|
+
private isAddedReplaceMatchingSizeCallbacks;
|
|
10
|
+
constructor();
|
|
11
|
+
shouldHandleAddedNode(el: HTMLElement): string | undefined;
|
|
12
|
+
handleAddedNode(el: HTMLElement): Promise<HandlerResult>;
|
|
13
|
+
clear(): void;
|
|
14
|
+
private handleAddedPlaceholderNode;
|
|
15
|
+
private handleAddedReplaceNode;
|
|
16
|
+
private isExistingPlaceholder;
|
|
17
|
+
private registerPlaceholder;
|
|
18
|
+
private getSize;
|
|
19
|
+
private isAddedPlaceholderMatchingSize;
|
|
20
|
+
private isAddedReplaceMatchingSize;
|
|
21
|
+
private areRectsSameSize;
|
|
22
|
+
private intersectionObserverCallback;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EditorLnvHandler } from './index';
|
|
2
|
+
type MockIntersectionObserverEntry = {
|
|
3
|
+
target: HTMLElement;
|
|
4
|
+
boundingClientRect: {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export type MockIntersectionObserverCallback = (entries: MockIntersectionObserverEntry[]) => void;
|
|
12
|
+
export type MockIntersectionObserverCallbackRef = {
|
|
13
|
+
current: MockIntersectionObserverCallback | null;
|
|
14
|
+
};
|
|
15
|
+
export declare function createPlaceholderElement(id: string): HTMLDivElement;
|
|
16
|
+
export declare function createReplaceElement(id: string): HTMLDivElement;
|
|
17
|
+
export declare function handleElements(elements: {
|
|
18
|
+
element: HTMLElement;
|
|
19
|
+
rect: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
};
|
|
25
|
+
}[], handler: EditorLnvHandler, observerCallback: MockIntersectionObserverCallback, callback: (result: {
|
|
26
|
+
shouldIgnore: boolean;
|
|
27
|
+
}) => void): void;
|
|
28
|
+
export declare function createMockIntersectionObserver(cbRef: MockIntersectionObserverCallbackRef): {
|
|
29
|
+
new (fn: MockIntersectionObserverCallback): {
|
|
30
|
+
observe(): void;
|
|
31
|
+
unobserve(): void;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
@@ -19,6 +19,7 @@ export declare class Observers implements BrowserObservers {
|
|
|
19
19
|
private totalTime;
|
|
20
20
|
private _startMeasureTimestamp;
|
|
21
21
|
private ssrPlaceholderHandler;
|
|
22
|
+
private editorLnvHandler;
|
|
22
23
|
private ssr;
|
|
23
24
|
private selectorConfig;
|
|
24
25
|
constructor(opts: ConstructorOptions);
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
type Rect = {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
};
|
|
1
7
|
export declare class SSRPlaceholderHandlers {
|
|
2
8
|
private staticPlaceholders;
|
|
3
9
|
private callbacks;
|
|
@@ -11,13 +17,9 @@ export declare class SSRPlaceholderHandlers {
|
|
|
11
17
|
isPlaceholderIgnored(element: HTMLElement): boolean;
|
|
12
18
|
findNearestPlaceholderContainerIfIgnored(element: HTMLElement): HTMLElement;
|
|
13
19
|
checkIfExistedAndSizeMatching(el: HTMLElement): Promise<unknown>;
|
|
14
|
-
getSize(el: HTMLElement): Promise<
|
|
20
|
+
getSize(el: HTMLElement): Promise<Rect>;
|
|
15
21
|
validateReactComponentMatchToPlaceholder(el: HTMLElement): Promise<unknown>;
|
|
16
|
-
hasSameSizePosition(rect:
|
|
17
|
-
x: number;
|
|
18
|
-
y: number;
|
|
19
|
-
width: number;
|
|
20
|
-
height: number;
|
|
21
|
-
} | undefined, boundingClientRect: DOMRectReadOnly): boolean;
|
|
22
|
+
hasSameSizePosition(rect: Rect | undefined, boundingClientRect: DOMRectReadOnly): boolean;
|
|
22
23
|
intersectionObserverCallback: ({ target, boundingClientRect }: IntersectionObserverEntry) => void;
|
|
23
24
|
}
|
|
25
|
+
export {};
|
|
@@ -35,7 +35,7 @@ export type VCEntryType = {
|
|
|
35
35
|
vc: number;
|
|
36
36
|
elements: string[];
|
|
37
37
|
};
|
|
38
|
-
export type VCIgnoreReason = 'image' | 'ssr-hydration' | '';
|
|
38
|
+
export type VCIgnoreReason = 'image' | 'ssr-hydration' | 'editor-lazy-node-view' | '';
|
|
39
39
|
export type ComponentsLogEntry = {
|
|
40
40
|
targetName: string;
|
|
41
41
|
__debug__element: WeakRef<Element> | null;
|
|
@@ -60,6 +60,8 @@ declare global {
|
|
|
60
60
|
addFeatureFlagAccessed?: (flagName: string, flagValue: FeatureFlagValue) => void;
|
|
61
61
|
addUFOHold?: (id: string, name: string, labelStack: string, startTime: number) => void;
|
|
62
62
|
removeUFOHold?: (id: string) => void;
|
|
63
|
+
getFeatureFlagOverride?: (flagName: string) => boolean | undefined;
|
|
64
|
+
getExperimentValueOverride?: <T>(experimentName: string, parameterName: string) => T;
|
|
63
65
|
};
|
|
64
66
|
}
|
|
65
67
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type HandlerResult = {
|
|
2
|
+
shouldIgnore: boolean;
|
|
3
|
+
};
|
|
4
|
+
export declare class EditorLnvHandler {
|
|
5
|
+
private placeholders;
|
|
6
|
+
private intersectionObserver;
|
|
7
|
+
private getSizeCallbacks;
|
|
8
|
+
private isAddedPlaceholderMatchingSizeCallbacks;
|
|
9
|
+
private isAddedReplaceMatchingSizeCallbacks;
|
|
10
|
+
constructor();
|
|
11
|
+
shouldHandleAddedNode(el: HTMLElement): string | undefined;
|
|
12
|
+
handleAddedNode(el: HTMLElement): Promise<HandlerResult>;
|
|
13
|
+
clear(): void;
|
|
14
|
+
private handleAddedPlaceholderNode;
|
|
15
|
+
private handleAddedReplaceNode;
|
|
16
|
+
private isExistingPlaceholder;
|
|
17
|
+
private registerPlaceholder;
|
|
18
|
+
private getSize;
|
|
19
|
+
private isAddedPlaceholderMatchingSize;
|
|
20
|
+
private isAddedReplaceMatchingSize;
|
|
21
|
+
private areRectsSameSize;
|
|
22
|
+
private intersectionObserverCallback;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EditorLnvHandler } from './index';
|
|
2
|
+
type MockIntersectionObserverEntry = {
|
|
3
|
+
target: HTMLElement;
|
|
4
|
+
boundingClientRect: {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export type MockIntersectionObserverCallback = (entries: MockIntersectionObserverEntry[]) => void;
|
|
12
|
+
export type MockIntersectionObserverCallbackRef = {
|
|
13
|
+
current: MockIntersectionObserverCallback | null;
|
|
14
|
+
};
|
|
15
|
+
export declare function createPlaceholderElement(id: string): HTMLDivElement;
|
|
16
|
+
export declare function createReplaceElement(id: string): HTMLDivElement;
|
|
17
|
+
export declare function handleElements(elements: {
|
|
18
|
+
element: HTMLElement;
|
|
19
|
+
rect: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
};
|
|
25
|
+
}[], handler: EditorLnvHandler, observerCallback: MockIntersectionObserverCallback, callback: (result: {
|
|
26
|
+
shouldIgnore: boolean;
|
|
27
|
+
}) => void): void;
|
|
28
|
+
export declare function createMockIntersectionObserver(cbRef: MockIntersectionObserverCallbackRef): {
|
|
29
|
+
new (fn: MockIntersectionObserverCallback): {
|
|
30
|
+
observe(): void;
|
|
31
|
+
unobserve(): void;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
@@ -19,6 +19,7 @@ export declare class Observers implements BrowserObservers {
|
|
|
19
19
|
private totalTime;
|
|
20
20
|
private _startMeasureTimestamp;
|
|
21
21
|
private ssrPlaceholderHandler;
|
|
22
|
+
private editorLnvHandler;
|
|
22
23
|
private ssr;
|
|
23
24
|
private selectorConfig;
|
|
24
25
|
constructor(opts: ConstructorOptions);
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
type Rect = {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
};
|
|
1
7
|
export declare class SSRPlaceholderHandlers {
|
|
2
8
|
private staticPlaceholders;
|
|
3
9
|
private callbacks;
|
|
@@ -11,13 +17,9 @@ export declare class SSRPlaceholderHandlers {
|
|
|
11
17
|
isPlaceholderIgnored(element: HTMLElement): boolean;
|
|
12
18
|
findNearestPlaceholderContainerIfIgnored(element: HTMLElement): HTMLElement;
|
|
13
19
|
checkIfExistedAndSizeMatching(el: HTMLElement): Promise<unknown>;
|
|
14
|
-
getSize(el: HTMLElement): Promise<
|
|
20
|
+
getSize(el: HTMLElement): Promise<Rect>;
|
|
15
21
|
validateReactComponentMatchToPlaceholder(el: HTMLElement): Promise<unknown>;
|
|
16
|
-
hasSameSizePosition(rect:
|
|
17
|
-
x: number;
|
|
18
|
-
y: number;
|
|
19
|
-
width: number;
|
|
20
|
-
height: number;
|
|
21
|
-
} | undefined, boundingClientRect: DOMRectReadOnly): boolean;
|
|
22
|
+
hasSameSizePosition(rect: Rect | undefined, boundingClientRect: DOMRectReadOnly): boolean;
|
|
22
23
|
intersectionObserverCallback: ({ target, boundingClientRect }: IntersectionObserverEntry) => void;
|
|
23
24
|
}
|
|
25
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/react-ufo",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.3",
|
|
4
4
|
"description": "Parts of React UFO that are publicly available",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -122,5 +122,10 @@
|
|
|
122
122
|
"import-no-extraneous-disable-for-examples-and-docs"
|
|
123
123
|
]
|
|
124
124
|
}
|
|
125
|
+
},
|
|
126
|
+
"platform-feature-flags": {
|
|
127
|
+
"platform_editor_ed-25557_lnv_add_ssr_placeholder": {
|
|
128
|
+
"type": "boolean"
|
|
129
|
+
}
|
|
125
130
|
}
|
|
126
131
|
}
|