From a5fc0970d21ccdbb1c71ee33358a6154d3b7cc9e Mon Sep 17 00:00:00 2001 From: Juan <15802531+jtsnova@users.noreply.github.com> Date: Mon, 21 Sep 2026 07:12:05 +0200 Subject: [PATCH 1/4] feat: add support for disabling plugins in configuration --- .../main/java/com/getcapacitor/Bridge.java | 10 ++++-- .../main/java/com/getcapacitor/Plugin.java | 2 ++ .../com/getcapacitor/ConfigBuildingTest.java | 7 +++++ cli/src/declarations.ts | 31 ++++++++++++++----- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java index 9a3c6e0739..b7ed76d5a0 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java @@ -706,7 +706,10 @@ private String getLegacyPluginName(Class pluginClass) { public void registerPlugin(Class pluginClass) { String pluginId = pluginId(pluginClass); if (pluginId == null) return; - + if (config.getPluginConfiguration(pluginId).getBoolean("disabled", false)) { + Logger.debug("Not registering disabled plugin: " + pluginId); + return; + } try { this.plugins.put(pluginId, new PluginHandle(this, pluginClass)); } catch (InvalidPluginException ex) { @@ -720,7 +723,10 @@ public void registerPluginInstance(Plugin plugin) { Class clazz = plugin.getClass(); String pluginId = pluginId(clazz); if (pluginId == null) return; - + if (config.getPluginConfiguration(pluginId).getBoolean("disabled", false)) { + Logger.debug("Not registering disabled plugin: " + pluginId); + return; + } try { this.plugins.put(pluginId, new PluginHandle(this, plugin)); } catch (InvalidPluginException ex) { diff --git a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java index f70cc4101d..8901b985d2 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java @@ -1052,4 +1052,6 @@ protected String getLogTag(String... subTags) { protected String getLogTag() { return Logger.tags(this.getClass().getSimpleName()); } + + protected Boolean } diff --git a/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java b/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java index 1af51039da..cea330dcdf 100644 --- a/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java +++ b/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java @@ -37,6 +37,7 @@ public void setup() { testPluginObject.put("var3", testPluginNestedObject); testPluginObject.put("var4", 2); testPluginObject.put("var5", testPluginArray); + testPluginObject.put("disabled", true); pluginConfig.put(TEST_PLUGIN_NAME, testPluginObject); @@ -89,6 +90,12 @@ public void getPluginBoolean() { assertTrue(testBool); } + @Test + public void getPluginDisabled() { + boolean disabled = config.getPluginConfiguration(TEST_PLUGIN_NAME).getBoolean("disabled", false); + assertTrue(disabled); + } + @Test public void getPluginInt() { int testInt = config.getPluginConfiguration(TEST_PLUGIN_NAME).getInt("var4", -1); diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 2cee84996b..448983c9d3 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -725,20 +725,25 @@ export interface PluginsConfig { /** * Plugin configuration by class name. * + * Set `disabled` to `true` in a plugin's configuration to prevent its native + * implementation from being registered and loaded. For example: + * `{ plugins: { MyPlugin: { disabled: true } } }`. + * + * This does not affect a plugin-specific `enabled` setting, which may have a + * different meaning. + * * @since 1.0.0 */ - [key: string]: - | { - [key: string]: any; - } - | undefined; + [key: string]: PluginConfig & { + [key: string]: any; +} | undefined; /** * Capacitor Cookies plugin configuration * * @since 4.3.0 */ - CapacitorCookies?: { + CapacitorCookies?: PluginConfig & { /** * Enable CapacitorCookies to override the global `document.cookie` on native. * @@ -752,7 +757,7 @@ export interface PluginsConfig { * * @since 4.3.0 */ - CapacitorHttp?: { + CapacitorHttp?: PluginConfig & { /** * Enable CapacitorHttp to override the global `fetch` and `XMLHttpRequest` on native. * @@ -766,7 +771,7 @@ export interface PluginsConfig { * * @since 8.0.0 */ - SystemBars?: { + SystemBars?: PluginConfig & { /** * Specifies how to handle problematic insets on Android. * @@ -827,6 +832,16 @@ export interface PluginsConfig { }; } +export interface PluginConfig { + /** + * Prevent this plugin's native implementation from being registered. + * + * @since 8.5.3 + */ + disabled?: boolean; + +} + export interface PackageOptions { /** * Create a symlink to the plugin folder instead of pointing to the plugin path. From 6dab82ba8cb3caeed839728e7ed210309bc12df3 Mon Sep 17 00:00:00 2001 From: Juan <15802531+jtsnova@users.noreply.github.com> Date: Mon, 21 Sep 2026 07:27:43 +0200 Subject: [PATCH 2/4] chore: remove noise --- android/capacitor/src/main/java/com/getcapacitor/Plugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java index 8901b985d2..383306705c 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java @@ -1053,5 +1053,4 @@ protected String getLogTag() { return Logger.tags(this.getClass().getSimpleName()); } - protected Boolean } From 9f9f39c8b63f8377944bc3eee57b5fb834b8e4b2 Mon Sep 17 00:00:00 2001 From: Juan <15802531+jtsnova@users.noreply.github.com> Date: Mon, 21 Sep 2026 07:28:15 +0200 Subject: [PATCH 3/4] chore: remove noise --- android/capacitor/src/main/java/com/getcapacitor/Plugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java index 383306705c..f70cc4101d 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java @@ -1052,5 +1052,4 @@ protected String getLogTag(String... subTags) { protected String getLogTag() { return Logger.tags(this.getClass().getSimpleName()); } - } From 2abb33725cb0d6165a354dfb01e07c1602e28840 Mon Sep 17 00:00:00 2001 From: Juan <15802531+jtsnova@users.noreply.github.com> Date: Mon, 21 Sep 2026 07:34:15 +0200 Subject: [PATCH 4/4] feat: ios - prevent registration of disabled plugins --- ios/Capacitor/Capacitor/CapacitorBridge.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ios/Capacitor/Capacitor/CapacitorBridge.swift b/ios/Capacitor/Capacitor/CapacitorBridge.swift index b240d5252a..22e2c9449b 100644 --- a/ios/Capacitor/Capacitor/CapacitorBridge.swift +++ b/ios/Capacitor/Capacitor/CapacitorBridge.swift @@ -378,6 +378,10 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { if plugins[pluginInstance.jsName] != nil { CAPLog.print("⚡️ Overriding existing registered plugin \(pluginInstance.classForCoder)") } + guard !config.getPluginConfig(plugin.jsName).getBoolean("disabled", false) else { + CAPLog.print("⚡️ Not registering disabled plugin \(plugin.jsName)") + return + } plugins[pluginInstance.jsName] = pluginInstance pluginInstance.load(on: self) @@ -398,6 +402,10 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { CAPLog.print("⚡️ Unable to load plugin \(type.classForCoder()). No such module found.") return nil } + guard !config.getPluginConfig(plugin.jsName).getBoolean("disabled", false) else { + CAPLog.print("⚡️ Not registering disabled plugin \(plugin.jsName)") + return nil + } plugin.load(on: self) plugins[plugin.jsName] = plugin return plugin