Skip to main content
Level 2
June 4, 2026
Question

Custom Widget for Advance link Builder Experience in AEM RTE Content Fragment Editor not working with getwidget / getcustombutton extensions using React adobe app

  • June 4, 2026
  • 6 replies
  • 117 views

I am trying to build a custom widget for external links in a new content fragment editor RTE and store those values into an anchor tag. I have tried both the options to use getwidget and getcustombutton options, but looks like the getcustombutton options is deprecated. I am able to run the build with my custom code using getwidget function and don’t see any errors in the console logs. Also, I don’t see an option to view the pop-up using the curly brace option. Can someone help me with the limitations with extensibility options?

6 replies

Adobe Employee
June 5, 2026

Hi ​@tiru35 

 

Yes— what you're seeing is consistent with the current limitations / transition state of the new Content Fragment Editor RTE.

Two important points:

  1. RTE widgets are not opened from a toolbar "curly brace" icon.
    The widget flow is: click into the RTE field, type {, then select your widget from the context menu. Add widgets to Rich Text Editor (RTE) Extensible Services Test Cases

  2. The old RTE extension APIs are in flux / deprecated for newer RTE implementations.
    Adobe introduced CF Editor RTE extensibility with toolbar buttons, widgets, and badges, and the older RTE extension endpoints as deprecated. AEM Content Fragments extensions Release Notes for 2026.3.0 release of Adobe Experience Manager as a Cloud Service.

tiru35Author
Level 2
June 5, 2026

Thanks for responding. I have not used the toolbar for option 1. I am using the RTE field to enter the curly braces to open the context menu but nothing happens as my AEM content fragment editor is not calling the widget extension after it’s successfully registered and my extension loaded.

Level 1
September 22, 2026

Any Update on this issue ? I am also facing the same issue 

AmitVishwakarma
Community Advisor
Community Advisor
September 22, 2026

Hi ​@vinodkumarV  ​@tiru35 

Typing { inside the Content Fragment RTE is the correct way to trigger an RTE widget; there is no separate curly-brace toolbar icon. However, if no context menu appears, the problem is occurring before the widget dialog route is loaded.

Please verify the following:

  • The method names are exact and case-sensitive: getWidgets() and getCustomButtons() — not getWidget or getCustomButton.
  • The methods are registered under methods.rte. ExtensionRegistration is loaded from the application's /index.html route.
  • The widget URL points to an actual React route, for example:
    methods: {
    rte: {
    getWidgets: () => [
    {
    id: "external-link-widget",
    label: "External Link",
    url: "/index.html#/external-link"
    }
    ]
    }
    }

    The React application must also contain a matching route:

    <Route
    path="/external-link"
    element={<ExternalLinkWidget />}
    />

For local or stage testing, make sure the extension is actually injected into the Content Fragment Editor using devMode=true&ext=<extension-url>. These parameters must be placed before the # hash route, followed by a hard refresh. A standalone successful App Builder build does not prove that the host editor has mounted the extension.

If getWidgets() is never called and the { context menu still does not appear after verifying the injection URL, please confirm which Content Fragment Editor RTE implementation and AEM release are being used. The Content Fragment Editor RTE was migrated from TinyMCE to TipTap in AEM as a Cloud Service 2026.3.0, so legacy RTE extension examples may not work unchanged with the newer RTE implementation.

In that situation, this is likely an editor/API compatibility limitation rather than a React routing issue. Please share the AEM release/build, the editor URL, the extension URL, and the browser console/network errors for further investigation.

Amit Vishwakarma - Adobe Commerce Champion 2025 | 17x Adobe certified | 6x Adobe SME
Level 1
September 22, 2026

Hi ​@AmitVishwakarma 

Thank for the reply, here are my finding 

**Title:** CF Editor RTE extension point: host never calls getWidgets / getCustomButtons / getBadges (handshake succeeds)

### Summary

An App Builder extension registered against the `aem/cf-editor/1` extension point connects
to the Content Fragment Editor successfully, but the host never invokes **any** method
registered under `methods.rte`. Typing `{` in a Rich Text field produces no context menu.
No errors appear in the console or network tab.

### Environment

| | |
|---|---|
| AEM | AEM as a Cloud Service, author — release `<FILL IN>` |
| Extension point | `aem/cf-editor/1` |
| SDK | `@adobe/uix-guest` 1.1.11 |
| Routing | `react-router-dom` 6.x, `HashRouter` |
| Editor URL | `https://experience.adobe.com/?devMode=true&ext=https://localhost:9080&repo=author-pXXXXX-eYYYYYY.adobeaemcloud.com#/@<org>/aem/cf/editor/...` |
| Extension URL | `https://localhost:9080` (cert accepted, hard refresh) |
| Field under test | Text Area, Default Type = Rich Text, confirmed rendering in Rich Text format |

### Registration

```js
import { register } from "@adobe/uix-guest";

async function init() {
const guestConnection = await register({
id: extensionId,
debug: true,
methods: {
rte: {
getCustomButtons: () => {
console.log("getCustomButtons CALLED"); // never logs
return [{ id: "my-button", tooltip: "My Button", icon: "Variable", onClick: () => [] }];
},
getBadges: () => {
console.log("getBadges CALLED"); // never logs
return [];
},
getWidgets: () => {
console.log("getWidgets CALLED"); // never logs
return [{ id: "my-widget", label: "My Widget", url: "/index.html#/my-widget" }];
}
}
}
});
}


App.js routes:

<Route index element={<ExtensionRegistration />} />
<Route path="/index.html" element={<ExtensionRegistration />} />
<Route path="/my-widget" element={<MyWidget />} />

What demonstrably works

The extension is mounted and fully connected. Console output (trimmed):

[ExtReg] register() resolved — handshake in progress
[ExtReg] guestConnection localMethods: {rte: {...}}
XGuest <id> Tunnel xxxxxxxx to parent window connected!
XGuest <id> connected GuestServer {...}
[ExtReg] CONNECTED — waiting for the host to call an rte method
[ExtReg] host API methods: ['getSharedContext', 'getConfiguration', 'invokeHostMethod']
[ExtReg] host.getSharedContext() answered:
{aemHost: 'author-pXXXXX-eYYYYYY.adobeaemcloud.com', locale: 'en-US',
theme: 'spectrum--lightest', auth: {...}}

 

So: the iframe is injected, the tunnel connects, the guest's rte APIs are handed to the host during the API exchange, and host methods respond with valid AEM context.

What does not happen

None of getWidgets, getCustomButtons, or getBadges is ever called — on page load, on clicking into the Rich Text field, or on typing {. No toolbar button appears either.

This is the key detail: getCustomButtons and getBadges are queried while the RTE initializes, independently of the { key. Their silence means the issue is upstream of the widget context menu, not in the { trigger or the widget dialog route.

Already ruled out

  • Method names are exact and case-sensitive, registered under methods.rte.
  • ExtensionRegistration is loaded from the index / /index.html route and confirmed to run.
  • Widget url is relative (/index.html#/my-widget) and matches a real React route.
  • Extension is injected with devMode=true&ext=... placed before the # hash, with a hard refresh — confirmed by the successful handshake above, not just by a successful build.
  • Field is a multi-line Text Area with Rich Text format.
  • No console errors, no failed network requests, no SDK version-mismatch warning.

Question

Is the rte extension point (getWidgets / getCustomButtons / getBadges) still supported in the Content Fragment Editor after the RTE was migrated from TinyMCE to TipTap in 2026.3.0?

AmitVishwakarma
Community Advisor
Community Advisor
September 28, 2026

Hi ​@vinodkumarV 
Your successful register() handshake confirms that the extension connects to the host, but it does not confirm that the current Rich Text Editor invokes the legacy RTE callbacks.

The Content Fragment Editor's RTE migrated from TinyMCE to TipTap in AEM as a Cloud Service 2026.3. Product guidance indicates that the previous RTE customizations—including callbacks such as getWidgets, getCustomButtons, and getBadges—are deprecated and should not be expected to work with the TipTap-based RTE. That would explain why none of the callbacks run; the { trigger and widget route are unlikely to be the cause if the methods themselves are never called.

For supported configuration of the built-in RTE toolbar and actions, see Content Fragment Cloud Configuration > Filters > RTE. This configures supported editor options; it is not a drop-in replacement for arbitrary custom JavaScript callbacks.

One documentation caveat: an existing Experience League example still shows getCustomButtons, so the public examples and current product guidance appear inconsistent. Could you confirm the exact AEM build and the specific authoring behavior the extension provides? That will help determine whether the built-in RTE configuration covers the use case or whether it needs a support/product-team clarification.
https://experienceleague.adobe.com/en/docs/experience-manager-cloud-service/content/release-notes/release-notes/2026/2026-3-0
https://experienceleague.adobe.com/en/docs/experience-manager-cloud-service/content/implementing/configuring-and-extending/content-fragments-cloud-configurations
https://experienceleague.adobe.com/en/docs/experience-manager-learn/cloud-service/developing/extensibility/ui/content-fragments/examples/editor-rte-toolbar

Amit Vishwakarma - Adobe Commerce Champion 2025 | 17x Adobe certified | 6x Adobe SME