templates/iframe/iframe_content.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html lang="fr">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Iframe SDK Test</title>
  7.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css"
  8.           integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
  9.     <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
  10.         integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
  11.         crossorigin="anonymous"></script>
  12.     <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"
  13.         integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF"
  14.         crossorigin="anonymous"></script>
  15.     <style>
  16.         body { padding: 20px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
  17.         .result-card { margin-bottom: 15px; }
  18.         .result-value { font-family: monospace; font-size: 14px; word-break: break-all; }
  19.         .timing { font-size: 12px; color: #6c757d; }
  20.         .status-waiting { color: #ffc107; }
  21.         .status-success { color: #28a745; }
  22.         .status-error { color: #dc3545; }
  23.         .status-null { color: #6c757d; }
  24.         .method-badge { font-size: 11px; }
  25.     </style>
  26. </head>
  27. <body>
  28.     <div class="container-fluid">
  29.         <h4 class="mb-4">🧪 FirstId Iframe SDK - Test Panel</h4>
  30.         <div class="row">
  31.             <div class="col-md-6">
  32.                 <div class="card result-card">
  33.                     <div class="card-header d-flex justify-content-between align-items-center">
  34.                         <span>0. callbacksWhenIframeReceiveFirstId</span>
  35.                         <span class="badge badge-primary method-badge">Async</span>
  36.                     </div>
  37.                     <div class="card-body">
  38.                         <div id="result-iframe-receive" class="result-value status-waiting">⏳ En attente...</div>
  39.                         <div id="timing-iframe-receive" class="timing"></div>
  40.                     </div>
  41.                 </div>
  42.             </div>
  43.             <div class="col-md-6">
  44.                 <div class="card result-card">
  45.                     <div class="card-header d-flex justify-content-between align-items-center">
  46.                         <span>1. Callback</span>
  47.                         <span class="badge badge-primary method-badge">Async</span>
  48.                     </div>
  49.                     <div class="card-body">
  50.                         <div id="result-callback" class="result-value status-waiting">⏳ En attente...</div>
  51.                         <div id="timing-callback" class="timing"></div>
  52.                     </div>
  53.                 </div>
  54.             </div>
  55.             <div class="col-md-6">
  56.                 <div class="card result-card">
  57.                     <div class="card-header d-flex justify-content-between align-items-center">
  58.                         <span>2. Event DOM</span>
  59.                         <span class="badge badge-primary method-badge">Async</span>
  60.                     </div>
  61.                     <div class="card-body">
  62.                         <div id="result-event" class="result-value status-waiting">⏳ En attente...</div>
  63.                         <div id="timing-event" class="timing"></div>
  64.                     </div>
  65.                 </div>
  66.             </div>
  67.             <div class="col-md-6">
  68.                 <div class="card result-card">
  69.                     <div class="card-header d-flex justify-content-between align-items-center">
  70.                         <span>3. getFirstId()</span>
  71.                         <span class="badge badge-secondary method-badge">Sync</span>
  72.                     </div>
  73.                     <div class="card-body">
  74.                         <div id="result-method" class="result-value status-waiting">⏳ En attente...</div>
  75.                         <div id="timing-method" class="timing"></div>
  76.                         <button class="btn btn-sm btn-outline-primary mt-2" onclick="testGetFirstIdMethod()">
  77.                             Tester maintenant
  78.                         </button>
  79.                     </div>
  80.                 </div>
  81.             </div>
  82.             <div class="col-md-6">
  83.                 <div class="card result-card">
  84.                     <div class="card-header d-flex justify-content-between align-items-center">
  85.                         <span>4. Getter .firstId</span>
  86.                         <span class="badge badge-secondary method-badge">Sync</span>
  87.                     </div>
  88.                     <div class="card-body">
  89.                         <div id="result-getter" class="result-value status-waiting">⏳ En attente...</div>
  90.                         <div id="timing-getter" class="timing"></div>
  91.                         <button class="btn btn-sm btn-outline-primary mt-2" onclick="testGetterProperty()">
  92.                             Tester maintenant
  93.                         </button>
  94.                     </div>
  95.                 </div>
  96.             </div>
  97.         </div>
  98.         <div class="card mt-3">
  99.             <div class="card-header">📊 Informations SDK</div>
  100.             <div class="card-body">
  101.                 <table class="table table-sm table-borderless mb-0">
  102.                     <tr>
  103.                         <td width="150">Version</td>
  104.                         <td id="sdk-version" class="result-value">-</td>
  105.                     </tr>
  106.                     <tr>
  107.                         <td>SDK Load Time</td>
  108.                         <td id="sdk-load-time" class="result-value">-</td>
  109.                     </tr>
  110.                     <tr>
  111.                         <td>Source</td>
  112.                         <td id="sdk-source" class="result-value">-</td>
  113.                     </tr>
  114.                     <tr>
  115.                         <td>Cookie Name</td>
  116.                         <td id="sdk-cookie-name" class="result-value">-</td>
  117.                     </tr>
  118.                     <tr>
  119.                         <td>window.__FIRSTID__</td>
  120.                         <td id="sdk-global" class="result-value">-</td>
  121.                     </tr>
  122.                 </table>
  123.             </div>
  124.         </div>
  125.         <div class="card mt-3">
  126.             <div class="card-header">📝 Logs</div>
  127.             <div class="card-body p-0">
  128.                 <pre id="logs" class="mb-0 p-3" style="max-height: 200px; overflow-y: auto; font-size: 12px; background: #f8f9fa;"></pre>
  129.             </div>
  130.         </div>
  131.     </div>
  132. <script>
  133.     var PAGE_LOAD_TIME = performance.now();
  134.     var SDK_LOAD_TIME = null;
  135.     function log(message) {
  136.         var logsElement = document.getElementById('logs');
  137.         var timestamp = (performance.now() - PAGE_LOAD_TIME).toFixed(2);
  138.         logsElement.textContent += '[' + timestamp + 'ms] ' + message + '\n';
  139.         logsElement.scrollTop = logsElement.scrollHeight;
  140.     }
  141.     function displayAsyncResult(elementId, value, pageLoadTime, sdkLoadTime) {
  142.         var element = document.getElementById(elementId);
  143.         var timingElement = document.getElementById(elementId.replace('result-', 'timing-'));
  144.         var durationFromPage = (performance.now() - pageLoadTime).toFixed(2);
  145.         var durationFromSdk = sdkLoadTime ? (performance.now() - sdkLoadTime).toFixed(2) : null;
  146.         if (value) {
  147.             element.textContent = '✅ ' + value;
  148.             element.className = 'result-value status-success';
  149.         } else {
  150.             element.textContent = '⚠️ null (non disponible)';
  151.             element.className = 'result-value status-null';
  152.         }
  153.         var timingText = '⏱️ ' + durationFromPage + 'ms depuis page';
  154.         if (durationFromSdk) {
  155.             timingText += ' | ' + durationFromSdk + 'ms depuis SDK load';
  156.         }
  157.         timingElement.textContent = timingText;
  158.     }
  159.     function displaySyncResult(elementId, value, clickTime) {
  160.         var element = document.getElementById(elementId);
  161.         var timingElement = document.getElementById(elementId.replace('result-', 'timing-'));
  162.         var duration = (performance.now() - clickTime).toFixed(4);
  163.         if (value) {
  164.             element.textContent = '✅ ' + value;
  165.             element.className = 'result-value status-success';
  166.         } else {
  167.             element.textContent = '⚠️ null (non disponible)';
  168.             element.className = 'result-value status-null';
  169.         }
  170.         timingElement.textContent = '⏱️ ' + duration + 'ms depuis le click';
  171.     }
  172.     function testGetFirstIdMethod() {
  173.         var clickTime = performance.now();
  174.         if (window.FIRSTID) {
  175.             var firstId = window.FIRSTID.getFirstId();
  176.             displaySyncResult('result-method', firstId, clickTime);
  177.             log('getFirstId() appelé: ' + (firstId || 'null'));
  178.         } else {
  179.             document.getElementById('result-method').textContent = '❌ SDK non chargé';
  180.             document.getElementById('result-method').className = 'result-value status-error';
  181.             log('getFirstId() - SDK non disponible');
  182.         }
  183.     }
  184.     function testGetterProperty() {
  185.         var clickTime = performance.now();
  186.         if (window.FIRSTID) {
  187.             var firstId = window.FIRSTID.firstId;
  188.             displaySyncResult('result-getter', firstId, clickTime);
  189.             log('.firstId getter appelé: ' + (firstId || 'null'));
  190.         } else {
  191.             document.getElementById('result-getter').textContent = '❌ SDK non chargé';
  192.             document.getElementById('result-getter').className = 'result-value status-error';
  193.             log('.firstId getter - SDK non disponible');
  194.         }
  195.     }
  196.     function updateSdkInfo() {
  197.         if (window.FIRSTID) {
  198.             document.getElementById('sdk-version').textContent = window.FIRSTID.getVersion() || window.FIRSTID.version || '-';
  199.             document.getElementById('sdk-cookie-name').textContent = window.FIRSTID.config?.cookieName || '-';
  200.         }
  201.         document.getElementById('sdk-global').textContent = window.__FIRSTID__ || 'undefined';
  202.     }
  203.     log('Page chargée, initialisation du SDK...');
  204.     document.addEventListener('firstId:initialized', function(event) {
  205.         var firstId = event.detail.firstId;
  206.         displayAsyncResult('result-event', firstId, PAGE_LOAD_TIME, SDK_LOAD_TIME);
  207.         log('Event firstId:initialized reçu: ' + (firstId || 'null'));
  208.         document.getElementById('sdk-source').textContent = firstId
  209.             ? (document.cookie.indexOf('firstid') > -1 ? 'Cookie ou Parent' : 'PostMessage Parent')
  210.             : 'Non trouvé';
  211.         updateSdkInfo();
  212.     });
  213.     window.firstId = {
  214.         debug: true,
  215.         callbacks: [
  216.             function(firstId) {
  217.                 displayAsyncResult('result-callback', firstId, PAGE_LOAD_TIME, SDK_LOAD_TIME);
  218.                 log('Callback exécuté: ' + (firstId || 'null'));
  219.                 updateSdkInfo();
  220.             }
  221.         ],
  222.         callbacksWhenIframeReceiveFirstId: [
  223.             function(firstId) {
  224.                 displayAsyncResult('result-iframe-receive', firstId, PAGE_LOAD_TIME, SDK_LOAD_TIME);
  225.                 log('callbacksWhenIframeReceiveFirstId exécuté: ' + (firstId || 'null'));
  226.                 updateSdkInfo();
  227.             }
  228.         ]
  229.     };
  230.     (function loadSdk() {
  231.         var script = document.createElement('script');
  232.         script.src = 'https://cdn.preprod.first-id.fr/sdk/script/iframe-latest.js';
  233.         script.async = true;
  234.         script.onload = function() {
  235.             SDK_LOAD_TIME = performance.now();
  236.             var loadDuration = (SDK_LOAD_TIME - PAGE_LOAD_TIME).toFixed(2);
  237.             log('SDK script chargé en ' + loadDuration + 'ms');
  238.             document.getElementById('sdk-load-time').textContent = loadDuration + 'ms';
  239.         };
  240.         script.onerror = function() {
  241.             log('Erreur lors du chargement du SDK');
  242.         };
  243.         document.head.appendChild(script);
  244.     })();
  245. </script>
  246. </body>
  247. </html>