Skip to content

Commit c708015

Browse files
davemacaulayStanislav Idolov
authored andcommitted
MC-4014: PageBuilder Performance Is Bad With Minimal Content
- Update dom-observer to allow for certain nodes to be ignored
1 parent d7df468 commit c708015

File tree

1 file changed

+62
-4
lines changed

1 file changed

+62
-4
lines changed

app/code/Magento/Ui/view/base/web/js/lib/view/utils/dom-observer.js

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ define([
1212

1313
var counter = 1,
1414
watchers,
15-
globalObserver;
15+
globalObserver,
16+
disabledNodes = [];
1617

1718
watchers = {
1819
selectors: {},
@@ -238,11 +239,58 @@ define([
238239
};
239240
}
240241

242+
/**
243+
* Verify if the DOM node is a child of a defined disabled node, if so we shouldn't observe provided mutation.
244+
*
245+
* @param {Object} mutation - a single mutation
246+
* @returns {Boolean}
247+
*/
248+
function shouldObserveMutation(mutation) {
249+
var isDisabled;
250+
251+
if (disabledNodes.length > 0) {
252+
// Iterate through the disabled nodes and determine if this mutation is occurring inside one of them
253+
isDisabled = _.find(disabledNodes, function (node) {
254+
return node === mutation.target || $.contains(node, mutation.target);
255+
});
256+
257+
// If we find a matching node we should not observe the mutation
258+
return !isDisabled;
259+
}
260+
261+
return true;
262+
}
263+
264+
/**
265+
* Should we observe these mutations? Check the first and last mutation to determine if this is a disabled mutation,
266+
* we check both the first and last in case one has been removed from the DOM during the process of the mutation.
267+
*
268+
* @param {Array} mutations - An array of mutation records.
269+
* @returns {Boolean}
270+
*/
271+
function shouldObserveMutations(mutations) {
272+
var firstMutation,
273+
lastMutation;
274+
275+
if (mutations.length > 0) {
276+
firstMutation = mutations[0];
277+
lastMutation = mutations[mutations.length - 1];
278+
279+
return shouldObserveMutation(firstMutation) && shouldObserveMutation(lastMutation);
280+
}
281+
282+
return true;
283+
}
284+
241285
globalObserver = new MutationObserver(function (mutations) {
242-
var changes = formChangesLists(mutations);
286+
var changes;
287+
288+
if (shouldObserveMutations(mutations)) {
289+
changes = formChangesLists(mutations);
243290

244-
changes.removed.forEach(processRemoved);
245-
changes.added.forEach(processAdded);
291+
changes.removed.forEach(processRemoved);
292+
changes.added.forEach(processAdded);
293+
}
246294
});
247295

248296
globalObserver.observe(document.body, {
@@ -251,6 +299,16 @@ define([
251299
});
252300

253301
return {
302+
/**
303+
* Disable a node from being observed by the mutations, you may want to disable specific aspects of the
304+
* application which are heavy on DOM changes. The observer running on some actions could cause significant
305+
* delays and degrade the performance of that specific part of the application exponentially.
306+
*
307+
* @param {HTMLElement} node - a HTML node within the document
308+
*/
309+
disableNode: function (node) {
310+
disabledNodes.push(node);
311+
},
254312

255313
/**
256314
* Adds listener for the appearance of nodes that matches provided

0 commit comments

Comments
 (0)