<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Iframe SDK Test</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css"
integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF"
crossorigin="anonymous"></script>
<style>
body { padding: 20px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
.result-card { margin-bottom: 15px; }
.result-value { font-family: monospace; font-size: 14px; word-break: break-all; }
.timing { font-size: 12px; color: #6c757d; }
.status-waiting { color: #ffc107; }
.status-success { color: #28a745; }
.status-error { color: #dc3545; }
.status-null { color: #6c757d; }
.method-badge { font-size: 11px; }
</style>
</head>
<body>
<div class="container-fluid">
<h4 class="mb-4">🧪 FirstId Iframe SDK - Test Panel</h4>
<div class="row">
<div class="col-md-6">
<div class="card result-card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>0. callbacksWhenIframeReceiveFirstId</span>
<span class="badge badge-primary method-badge">Async</span>
</div>
<div class="card-body">
<div id="result-iframe-receive" class="result-value status-waiting">⏳ En attente...</div>
<div id="timing-iframe-receive" class="timing"></div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card result-card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>1. Callback</span>
<span class="badge badge-primary method-badge">Async</span>
</div>
<div class="card-body">
<div id="result-callback" class="result-value status-waiting">⏳ En attente...</div>
<div id="timing-callback" class="timing"></div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card result-card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>2. Event DOM</span>
<span class="badge badge-primary method-badge">Async</span>
</div>
<div class="card-body">
<div id="result-event" class="result-value status-waiting">⏳ En attente...</div>
<div id="timing-event" class="timing"></div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card result-card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>3. getFirstId()</span>
<span class="badge badge-secondary method-badge">Sync</span>
</div>
<div class="card-body">
<div id="result-method" class="result-value status-waiting">⏳ En attente...</div>
<div id="timing-method" class="timing"></div>
<button class="btn btn-sm btn-outline-primary mt-2" onclick="testGetFirstIdMethod()">
Tester maintenant
</button>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card result-card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>4. Getter .firstId</span>
<span class="badge badge-secondary method-badge">Sync</span>
</div>
<div class="card-body">
<div id="result-getter" class="result-value status-waiting">⏳ En attente...</div>
<div id="timing-getter" class="timing"></div>
<button class="btn btn-sm btn-outline-primary mt-2" onclick="testGetterProperty()">
Tester maintenant
</button>
</div>
</div>
</div>
</div>
<div class="card mt-3">
<div class="card-header">📊 Informations SDK</div>
<div class="card-body">
<table class="table table-sm table-borderless mb-0">
<tr>
<td width="150">Version</td>
<td id="sdk-version" class="result-value">-</td>
</tr>
<tr>
<td>SDK Load Time</td>
<td id="sdk-load-time" class="result-value">-</td>
</tr>
<tr>
<td>Source</td>
<td id="sdk-source" class="result-value">-</td>
</tr>
<tr>
<td>Cookie Name</td>
<td id="sdk-cookie-name" class="result-value">-</td>
</tr>
<tr>
<td>window.__FIRSTID__</td>
<td id="sdk-global" class="result-value">-</td>
</tr>
</table>
</div>
</div>
<div class="card mt-3">
<div class="card-header">📝 Logs</div>
<div class="card-body p-0">
<pre id="logs" class="mb-0 p-3" style="max-height: 200px; overflow-y: auto; font-size: 12px; background: #f8f9fa;"></pre>
</div>
</div>
</div>
<script>
var PAGE_LOAD_TIME = performance.now();
var SDK_LOAD_TIME = null;
function log(message) {
var logsElement = document.getElementById('logs');
var timestamp = (performance.now() - PAGE_LOAD_TIME).toFixed(2);
logsElement.textContent += '[' + timestamp + 'ms] ' + message + '\n';
logsElement.scrollTop = logsElement.scrollHeight;
}
function displayAsyncResult(elementId, value, pageLoadTime, sdkLoadTime) {
var element = document.getElementById(elementId);
var timingElement = document.getElementById(elementId.replace('result-', 'timing-'));
var durationFromPage = (performance.now() - pageLoadTime).toFixed(2);
var durationFromSdk = sdkLoadTime ? (performance.now() - sdkLoadTime).toFixed(2) : null;
if (value) {
element.textContent = '✅ ' + value;
element.className = 'result-value status-success';
} else {
element.textContent = '⚠️ null (non disponible)';
element.className = 'result-value status-null';
}
var timingText = '⏱️ ' + durationFromPage + 'ms depuis page';
if (durationFromSdk) {
timingText += ' | ' + durationFromSdk + 'ms depuis SDK load';
}
timingElement.textContent = timingText;
}
function displaySyncResult(elementId, value, clickTime) {
var element = document.getElementById(elementId);
var timingElement = document.getElementById(elementId.replace('result-', 'timing-'));
var duration = (performance.now() - clickTime).toFixed(4);
if (value) {
element.textContent = '✅ ' + value;
element.className = 'result-value status-success';
} else {
element.textContent = '⚠️ null (non disponible)';
element.className = 'result-value status-null';
}
timingElement.textContent = '⏱️ ' + duration + 'ms depuis le click';
}
function testGetFirstIdMethod() {
var clickTime = performance.now();
if (window.FIRSTID) {
var firstId = window.FIRSTID.getFirstId();
displaySyncResult('result-method', firstId, clickTime);
log('getFirstId() appelé: ' + (firstId || 'null'));
} else {
document.getElementById('result-method').textContent = '❌ SDK non chargé';
document.getElementById('result-method').className = 'result-value status-error';
log('getFirstId() - SDK non disponible');
}
}
function testGetterProperty() {
var clickTime = performance.now();
if (window.FIRSTID) {
var firstId = window.FIRSTID.firstId;
displaySyncResult('result-getter', firstId, clickTime);
log('.firstId getter appelé: ' + (firstId || 'null'));
} else {
document.getElementById('result-getter').textContent = '❌ SDK non chargé';
document.getElementById('result-getter').className = 'result-value status-error';
log('.firstId getter - SDK non disponible');
}
}
function updateSdkInfo() {
if (window.FIRSTID) {
document.getElementById('sdk-version').textContent = window.FIRSTID.getVersion() || window.FIRSTID.version || '-';
document.getElementById('sdk-cookie-name').textContent = window.FIRSTID.config?.cookieName || '-';
}
document.getElementById('sdk-global').textContent = window.__FIRSTID__ || 'undefined';
}
log('Page chargée, initialisation du SDK...');
document.addEventListener('firstId:initialized', function(event) {
var firstId = event.detail.firstId;
displayAsyncResult('result-event', firstId, PAGE_LOAD_TIME, SDK_LOAD_TIME);
log('Event firstId:initialized reçu: ' + (firstId || 'null'));
document.getElementById('sdk-source').textContent = firstId
? (document.cookie.indexOf('firstid') > -1 ? 'Cookie ou Parent' : 'PostMessage Parent')
: 'Non trouvé';
updateSdkInfo();
});
window.firstId = {
debug: true,
callbacks: [
function(firstId) {
displayAsyncResult('result-callback', firstId, PAGE_LOAD_TIME, SDK_LOAD_TIME);
log('Callback exécuté: ' + (firstId || 'null'));
updateSdkInfo();
}
],
callbacksWhenIframeReceiveFirstId: [
function(firstId) {
displayAsyncResult('result-iframe-receive', firstId, PAGE_LOAD_TIME, SDK_LOAD_TIME);
log('callbacksWhenIframeReceiveFirstId exécuté: ' + (firstId || 'null'));
updateSdkInfo();
}
]
};
(function loadSdk() {
var script = document.createElement('script');
script.src = 'https://cdn.preprod.first-id.fr/sdk/script/iframe-latest.js';
script.async = true;
script.onload = function() {
SDK_LOAD_TIME = performance.now();
var loadDuration = (SDK_LOAD_TIME - PAGE_LOAD_TIME).toFixed(2);
log('SDK script chargé en ' + loadDuration + 'ms');
document.getElementById('sdk-load-time').textContent = loadDuration + 'ms';
};
script.onerror = function() {
log('Erreur lors du chargement du SDK');
};
document.head.appendChild(script);
})();
</script>
</body>
</html>