1) Installation
Install the extension, then keep it enabled. The extension requests tab access and host access; you still control what can be automated via the Allow-list.
No. Everything runs locally in your browser. Your page talks to the extension through a safe
postMessage bridge (no proxies, no cookie interception).
2) Detect the Extension
Use the official helper API (RTOForm) and handle EXT_NOT_DETECTED gracefully.
Minimal detect (v7.13.0)
<script src="/RTO_helpers/RTO_form_api.js"></script>
<script>
// Show a friendly banner if the extension is missing.
RTOForm.detect(2000)
.then(function(info){
console.log('RTO OK', (info && info.version) ? info.version : '');
})
.catch(function(err){
var code = (err && err.code) ? err.code : 'EXT_NOT_DETECTED';
console.warn('RTO not available:', code);
});
</script>
3) Allow-list (required)
- You must explicitly allow the target host(s) in the extension UI.
- If a host is not allow-listed, commands are rejected with
DOMAIN_NOT_ALLOWED. - Page-side requests now go through
allowlistAddRequest; the plugin shows the confirmation on the related master tab before adding the host. - Direct page-side
allowlistAddis no longer the public path; it stays reserved for plugin/internal actions. - Tip: show an “Allow-list this domain” CTA and retry once the user confirms on the master tab.
This makes the action visible to the user: the page can ask, but the plugin still owns the final allow-list change.
4) Remote Tab Control
Use tabKey to consistently target a named tab across your flow. In v7.13.0, openTab is serialized per key, so opening the same tabKey twice reuses the same controlled tab instead of racing into duplicates.
Open → Navigate → Focus
<script src="/RTO_helpers/RTO_form_api.js"></script>
<script>
var tabKey = 'auth';
RTOForm.openTab({ tabKey: tabKey, url: 'https://example.com/login', focus: true }, { timeoutMs: 20000 })
.then(function(){
return RTOForm.waitForNavigation({ tabKey: tabKey }, { timeoutMs: 15000 });
})
.then(function(){
return RTOForm.focusTab({ tabKey: tabKey }, { timeoutMs: 4000 });
})
.then(function(){
return RTOForm.getUrl({ tabKey: tabKey }, { timeoutMs: 8000 });
})
.then(function(res){
var data = (res && res.data) ? res.data : res;
console.log('Current URL:', (data && data.url) ? data.url : '');
})
.catch(function(err){
console.warn('Tab flow failed:', (err && err.code) ? err.code : err);
});
</script>
If you see NO_CONTROLLED_TAB, the tab is not available (closed, not adopted, or not on an allow-listed host).
5) Named DOM actions
DOM actions run inside the target tab via a content script. Prefer stable selectors and wait before acting.
Fill a login form safely
<script src="/RTO_helpers/RTO_form_api.js"></script>
<script>
var tabKey = 'auth';
RTOForm.waitForSelector({ tabKey: tabKey, selector: '#email' }, { timeoutMs: 10000 })
.then(function(){
return RTOForm.setValue({ tabKey: tabKey, selector: '#email', value: 'user@example.com' }, { timeoutMs: 8000 });
})
.then(function(){
return RTOForm.setValue({ tabKey: tabKey, selector: '#password', value: '***' }, { timeoutMs: 8000 }); // never log real passwords
})
.then(function(){
return RTOForm.click({ tabKey: tabKey, selector: 'button[type="submit"]' }, { timeoutMs: 8000 });
})
.catch(function(err){
var code = (err && err.code) ? err.code : 'ERROR';
if(code === 'ELEMENT_NOT_FOUND') console.warn('Selector not found — update selector or wait longer.');
else console.warn('DOM action failed:', code);
});
</script>
6) Errors & fixes
| Error | Meaning | Common fix |
|---|---|---|
EXT_NOT_DETECTED |
Extension is not installed / disabled / not responding. | Show install/enable CTA; retry RTOForm.detect(). |
DOMAIN_NOT_ALLOWED |
Target host is not in the Allow-list. | Ask the user to add the host in the extension UI, then retry. |
NO_CONTROLLED_TAB |
No tab matching tabKey is under control. |
Open/adopt again; verify allow-list; verify tab is not blocked/uninjectable. |
ELEMENT_NOT_FOUND |
Selector didn’t match any element. | Use a stable selector; call waitForSelector first. |
TIMEOUT |
No response within the configured time. | Increase timeout; confirm navigation happens; add intermediate waits. |
7) Privacy & Security
- Local-only: commands and results stay in your browser.
- Deny-by-default: Allow-list is required for cross-domain control.
- No arbitrary code execution: only documented tab and DOM commands.
8) Best practices
- Start with
detect, then show a clear status UI. - Keep
tabKeystable per workflow (auth, monitor, ops). - Prefer
waitForSelectorbeforeclick/setValue. - If you want ready-made client helpers, start with
/RTO_helpers/RTO_form_api.js; the current site release also references refreshed helper packs and the bundledRTO.min.js. - Never print secrets; treat form inputs as sensitive.