in src/main/js/bmap.js [358:486]
BrowserMap.forwardRequest = function () {
var currentURL = window.location.href,
deviceOverride = BrowserMapUtil.Url.getValueForParameter(currentURL, deviceOverrideParameter),
detectedDeviceGroups = [],
urlSelectors = [],
oCookie = BrowserMapUtil.CookieManager.getCookie('o_' + cookiePrefix + deviceGroupCookieName),
cookie = BrowserMapUtil.CookieManager.getCookie(cookiePrefix + deviceGroupCookieName),
dgs = [],
i,
g,
registeredDeviceGroups,
dgName,
domain,
aTags,
url,
parameters,
newURL,
canonicalURL = BrowserMapUtil.Url.getCanonicalURL();
if (BrowserMap.isEnabled()) {
languageOverride = BrowserMapUtil.Url.getValueForParameter(currentURL, languageOverrideParameter);
if (deviceOverride) {
// override detected
detectedDeviceGroups = deviceOverride.split(',');
if (detectedDeviceGroups.length > 0) {
if (BrowserMapUtil.CookieManager.cookiesEnabled()) {
if (!oCookie && !cookie) {
// tried to access resource directly with override parameter without passing through detection
// run detection code to detect the original device groups
oCookie = new Cookie();
oCookie.name = 'o_' + cookiePrefix + deviceGroupCookieName;
oCookie.path = '/';
BrowserMap.matchDeviceGroups();
for (g in matchedDeviceGroups) {
if (matchedDeviceGroups.hasOwnProperty(g)) {
dgs.push(matchedDeviceGroups[g].name);
}
}
if (deviceOverride !== dgs.join(',')) {
oCookie.value = dgs.join(',');
BrowserMapUtil.CookieManager.setCookie(oCookie);
}
}
else if (!oCookie) {
// detection has been performed; override detected; store original values
if (cookie.value !== detectedDeviceGroups.join(',')) {
cookie.name = 'o_' + cookie.name;
cookie.path = '/';
BrowserMapUtil.CookieManager.setCookie(cookie);
}
}
// store the override
cookie = new Cookie();
cookie.name = cookiePrefix + deviceGroupCookieName;
cookie.value = detectedDeviceGroups.join(',');
cookie.path = '/';
BrowserMapUtil.CookieManager.setCookie(cookie);
if (oCookie) {
if (oCookie.value == cookie.value) {
BrowserMapUtil.CookieManager.removeCookie(oCookie.name);
}
}
}
}
}
if (cookie !== null || deviceOverride) {
/**
* cookie was either set by the detection code before, or we have an override;
*
* in either case, the matchDeviceGroups must match the detectedDeviceGroups which can come from the cookie or from the
* override parameter
*/
registeredDeviceGroups = BrowserMap.getDeviceGroups();
if (detectedDeviceGroups.length === 0) {
detectedDeviceGroups = cookie.value.split(',');
}
matchedDeviceGroups = { };
for (i = 0 ; i < detectedDeviceGroups.length; i++) {
dgName = detectedDeviceGroups[i].trim();
if (registeredDeviceGroups.hasOwnProperty(dgName)) {
if (registeredDeviceGroups[dgName].isSelector) {
urlSelectors.push(dgName);
}
matchedDeviceGroups[dgName] = registeredDeviceGroups[dgName];
}
}
// add the device override parameter to links using the same domain if a device override was detected
if (deviceOverride && cookie === null && enableForwardingWhenCookiesDisabled) {
domain = BrowserMapUtil.Url.getDomainFromURL(window.location.href);
aTags = document.getElementsByTagName('a');
for (i = 0; i < aTags.length; i++) {
url = aTags[i].href;
if (url && url.indexOf(domain) !== -1) {
parameters = BrowserMapUtil.Url.getURLParametersString(url);
if (parameters) {
if (parameters.indexOf(languageOverrideParameter + '=' + deviceOverride) == -1) {
aTags[i].href = url + '&' + deviceOverrideParameter + '=' + deviceOverride;
}
}
else {
aTags[i].href = url + '?' + deviceOverrideParameter + '=' + deviceOverride;
}
}
}
}
}
else {
// no override has been detected, nor a cookie has been set previous to this call
// perform the match and then set the cookie
BrowserMap.matchDeviceGroups();
for (g in matchedDeviceGroups) {
if (matchedDeviceGroups.hasOwnProperty(g)) {
if (matchedDeviceGroups[g].isSelector) {
urlSelectors.push(matchedDeviceGroups[g].name);
}
detectedDeviceGroups.push(matchedDeviceGroups[g].name);
}
}
cookie = new Cookie();
cookie.name = cookiePrefix + deviceGroupCookieName;
cookie.value = detectedDeviceGroups.join(',');
cookie.path = '/';
BrowserMapUtil.CookieManager.setCookie(cookie);
}
newURL = BrowserMap.getNewURL(currentURL, detectedDeviceGroups, urlSelectors);
if (currentURL !== newURL && canonicalURL !== newURL) {
window.location = newURL;
}
}
};