_onMutation(records, self) {
    for (let record of records) {
      const target = record.target;
      if (record.type === 'childList') {
        // Manage added nodes
        for (let node of Array.from(record.addedNodes))
          this._makeSubtreeUnfocusable(node);

        // Un-manage removed nodes
        for (let node of Array.from(record.removedNodes))
          this._unmanageSubtree(node);
      } else if (record.type === 'attributes') {
        if (record.attributeName === 'tabindex') {
          // Re-initialise inert node if tabindex changes
          this._manageNode(target);
        } else if (target !== this._rootElement &&
                   record.attributeName === 'inert' &&
                   target.hasAttribute('inert')) {
          // If a new inert root is added, adopt its managed nodes and make sure it knows about the
          // already managed nodes from this inert subroot.
          this._adoptInertRoot(target);
          const inertSubroot = this._inertManager.getInertRoot(target);
          for (let managedNode of this._managedNodes) {
            if (target.contains(managedNode.node))
              inertSubroot._manageNode(managedNode.node);
          }
        }
      }
    }
  }
Callback used when mutation observer detects subtree additions, removals, or attribute changes.
@param {MutationRecord} records
@param {MutationObserver} self