[module.json extensions] @UI.ToolbarItem.Provider Part 2

Bug: 1134103
Change-Id: I1674bd9bcc12f19aa51405d9fd8ef6a9c7965331
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2684120
Commit-Queue: Andres Olivares <[email protected]>
Reviewed-by: Tim van der Lippe <[email protected]>
diff --git a/front_end/elements/ClassesPaneWidget.js b/front_end/elements/ClassesPaneWidget.js
index bb23a5a..559a916 100644
--- a/front_end/elements/ClassesPaneWidget.js
+++ b/front_end/elements/ClassesPaneWidget.js
@@ -265,10 +265,14 @@
 /** @type {!WeakMap<!SDK.DOMModel.DOMNode, !Map<string, boolean>>} */
 const cachedClassesMap = new WeakMap();
 
+/** @type {!ButtonProvider} */
+let buttonProviderInstance;
+
 /**
  * @implements {UI.Toolbar.Provider}
  */
 export class ButtonProvider {
+  /** @private */
   constructor() {
     this._button = new UI.Toolbar.ToolbarToggle(Common.UIString.UIString('Element Classes'), '');
     this._button.setText('.cls');
@@ -277,6 +281,18 @@
     this._view = new ClassesPaneWidget();
   }
 
+  /**
+   * @param {{forceNew: ?boolean}} opts
+   */
+  static instance(opts = {forceNew: null}) {
+    const {forceNew} = opts;
+    if (!buttonProviderInstance || forceNew) {
+      buttonProviderInstance = new ButtonProvider();
+    }
+
+    return buttonProviderInstance;
+  }
+
   _clicked() {
     ElementsPanel.instance().showToolbarPane(!this._view.isShowing() ? this._view : null, this._button);
   }