205 lines
4 KiB
JavaScript
205 lines
4 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/**
|
|
* Bug 1714431 - Shim Optimizely
|
|
*
|
|
* This shim stubs out window.optimizely for those sites which
|
|
* break when it is not successfully loaded.
|
|
*/
|
|
|
|
if (!window.optimizely?.state) {
|
|
const behavior = {
|
|
query: () => [],
|
|
};
|
|
|
|
const dcp = {
|
|
getAttributeValue() {},
|
|
waitForAttributeValue: () => Promise.resolve(),
|
|
};
|
|
|
|
const data = {
|
|
accountId: "",
|
|
audiences: {},
|
|
campaigns: {},
|
|
clientName: "js",
|
|
clientVersion: "0.166.0",
|
|
dcpServiceId: null,
|
|
events: {},
|
|
experiments: {},
|
|
groups: {},
|
|
pages: {},
|
|
projectId: "",
|
|
revision: "",
|
|
snippetId: null,
|
|
variations: {},
|
|
};
|
|
|
|
const activationId = String(Date.now());
|
|
|
|
const state = {
|
|
getActivationId() {
|
|
return activationId;
|
|
},
|
|
getActiveExperimentIds() {
|
|
return [];
|
|
},
|
|
getCampaignStateLists() {
|
|
return {};
|
|
},
|
|
getCampaignStates() {
|
|
return {};
|
|
},
|
|
getDecisionObject() {
|
|
return null;
|
|
},
|
|
getDecisionString() {
|
|
return null;
|
|
},
|
|
getExperimentStates() {
|
|
return {};
|
|
},
|
|
getPageStates() {
|
|
return {};
|
|
},
|
|
getRedirectInfo() {
|
|
return null;
|
|
},
|
|
getVariationMap() {
|
|
return {};
|
|
},
|
|
isGlobalHoldback() {
|
|
return false;
|
|
},
|
|
};
|
|
|
|
const poll = (fn, to) => {
|
|
setInterval(() => {
|
|
try {
|
|
fn();
|
|
} catch (_) {}
|
|
}, to);
|
|
};
|
|
|
|
const waitUntil = test => {
|
|
let interval, resolve;
|
|
function check() {
|
|
try {
|
|
if (test()) {
|
|
clearInterval(interval);
|
|
resolve?.();
|
|
return true;
|
|
}
|
|
} catch (_) {}
|
|
return false;
|
|
}
|
|
return new Promise(r => {
|
|
resolve = r;
|
|
if (check()) {
|
|
resolve();
|
|
return;
|
|
}
|
|
interval = setInterval(check, 250);
|
|
});
|
|
};
|
|
|
|
const waitForElement = sel => {
|
|
return waitUntil(() => {
|
|
document.querySelector(sel);
|
|
});
|
|
};
|
|
|
|
const observeSelector = (sel, fn, opts) => {
|
|
let interval;
|
|
const observed = new Set();
|
|
function check() {
|
|
try {
|
|
for (const e of document.querySelectorAll(sel)) {
|
|
if (observed.has(e)) {
|
|
continue;
|
|
}
|
|
observed.add(e);
|
|
try {
|
|
fn(e);
|
|
} catch (_) {}
|
|
if (opts.once) {
|
|
clearInterval(interval);
|
|
}
|
|
}
|
|
} catch (_) {}
|
|
}
|
|
interval = setInterval(check, 250);
|
|
const timeout = { opts };
|
|
if (timeout) {
|
|
setTimeout(() => {
|
|
clearInterval(interval);
|
|
}, timeout);
|
|
}
|
|
};
|
|
|
|
const utils = {
|
|
Promise: window.Promise,
|
|
observeSelector,
|
|
poll,
|
|
waitForElement,
|
|
waitUntil,
|
|
};
|
|
|
|
const visitorId = {
|
|
randomId: "",
|
|
};
|
|
|
|
let browserVersion = "";
|
|
try {
|
|
browserVersion = navigator.userAgent.match(/rv:(.*)\)/)[1];
|
|
} catch (_) {}
|
|
|
|
const visitor = {
|
|
browserId: "ff",
|
|
browserVersion,
|
|
currentTimestamp: Date.now(),
|
|
custom: {},
|
|
customBehavior: {},
|
|
device: "desktop",
|
|
device_type: "desktop_laptop",
|
|
events: [],
|
|
first_session: true,
|
|
offset: 240,
|
|
referrer: null,
|
|
source_type: "direct",
|
|
visitorId,
|
|
};
|
|
|
|
window.optimizely = {
|
|
data: {
|
|
note: "Obsolete, use optimizely.get('data') instead",
|
|
},
|
|
get(e) {
|
|
switch (e) {
|
|
case "behavior":
|
|
return behavior;
|
|
case "data":
|
|
return data;
|
|
case "dcp":
|
|
return dcp;
|
|
case "jquery":
|
|
throw new Error("jQuery not implemented");
|
|
case "session":
|
|
return undefined;
|
|
case "state":
|
|
return state;
|
|
case "utils":
|
|
return utils;
|
|
case "visitor":
|
|
return visitor;
|
|
case "visitor_id":
|
|
return visitorId;
|
|
}
|
|
return undefined;
|
|
},
|
|
initialized: true,
|
|
push() {},
|
|
state: {},
|
|
};
|
|
}
|