FAQ & Troubleshooting

Docs for Remote Tab Opener v7.13.0.
Docs updated: 2026-03-24
v7.13.0 Home Copilot

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 allowlistAdd is 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

ErrorMeaningCommon 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 tabKey stable per workflow (auth, monitor, ops).
  • Prefer waitForSelector before click/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 bundled RTO.min.js.
  • Never print secrets; treat form inputs as sensitive.