media/js/base/search-params.js (76 lines of code) (raw):
/*
* 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 https://mozilla.org/MPL/2.0/.
*/
(function () {
'use strict';
// Retrieve search params as a object for easier access
// This is a simple version of https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
var _SearchParams = function (search) {
search = search || location.search || '';
this.params = _SearchParams.queryStringToObject(search);
};
// takes an object of key/value pairs and converts it to a querystring, e.g.
// key1=val1&key2=val2&key3=val3 etc
_SearchParams.objectToQueryString = function (obj) {
var searchStrings = [];
for (var param in obj) {
if (Object.prototype.hasOwnProperty.call(obj, param)) {
searchStrings.push(
[
encodeURIComponent(param),
encodeURIComponent(obj[param])
].join('=')
);
}
}
return searchStrings.join('&');
};
// takes a querystring and converts it to an object of key/value pairs
_SearchParams.queryStringToObject = function (qs) {
var params = {};
qs = qs.match(/^\??(.*)/)[1];
qs = qs ? qs.split(/[&;]/m) : [];
for (var i = 0; i < qs.length; i++) {
var param = qs[i].split('=');
var key = param[0];
var value = param[1];
params[key] = !isNaN(value) ? parseFloat(value) : value;
}
return params;
};
_SearchParams.prototype.get = function (key) {
return this.params[key];
};
_SearchParams.prototype.set = function (key, value) {
this.params[key] = !isNaN(value) ? parseFloat(value) : value;
};
_SearchParams.prototype.has = function (key) {
return key in this.params;
};
_SearchParams.prototype.remove = function (key) {
delete this.params[key];
};
_SearchParams.prototype.toString = function () {
return _SearchParams.objectToQueryString(this.params);
};
_SearchParams.prototype.utmParams = function () {
var utms = {};
var params = this.params;
for (var param in params) {
if (Object.prototype.hasOwnProperty.call(params, param)) {
if (param.indexOf('utm_') === 0) {
utms[param] = params[param];
}
}
}
return utms;
};
_SearchParams.prototype.utmParamsFxA = function (pathname) {
pathname = pathname || window.location.pathname || '';
var utms = this.utmParams();
// set to default value if not specified in URL
if (!utms.utm_campaign) {
// utm_* values will be encoded on the product side, so no need to
// pre-emptively encode here
utms.utm_campaign = 'page referral - not part of a campaign';
}
// remove locale from pathname and store result in utm_content
// e.g. https://www.mozilla.org/it/firefox/sync/?foo=bar should
// have utm_content value of /firefox/sync/.
var matches = pathname.match(/\/[\w-]+(\/.*)$/);
if (matches && matches.length > 1) {
// no need to encode - will be done on product side
utms.utm_content = matches[1];
}
// ensure all values are strings, as no numeric values are allowed
// into UITour.showFirefoxAccounts
Object.keys(utms).forEach(function (key) {
utms[key] = utms[key].toString();
});
return utms;
};
window._SearchParams = _SearchParams;
})();