1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
#filter substitution
#include @OBJDIR@/api_keys
/* 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/. */
/**
* @class nsURLFormatterService
*
* nsURLFormatterService exposes methods to substitute variables in URL formats.
*
* Mozilla Applications linking to Mozilla websites are strongly encouraged to use
* URLs of the following format:
*
* http[s]://%SERVICE%.mozilla.[com|org]/%LOCALE%/
*/
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
const PREF_APP_DISTRIBUTION = "distribution.id";
const PREF_APP_DISTRIBUTION_VERSION = "distribution.version";
XPCOMUtils.defineLazyModuleGetter(this, "UpdateUtils",
"resource://gre/modules/UpdateUtils.jsm");
function nsURLFormatterService() {
XPCOMUtils.defineLazyGetter(this, "appInfo", function UFS_appInfo() {
return Cc["@mozilla.org/xre/app-info;1"].
getService(Ci.nsIXULAppInfo).
QueryInterface(Ci.nsIXULRuntime);
});
XPCOMUtils.defineLazyGetter(this, "ABI", function UFS_ABI() {
let ABI = "default";
try {
ABI = this.appInfo.XPCOMABI;
if ("@mozilla.org/xpcom/mac-utils;1" in Cc) {
// Mac universal build should report a different ABI than either macppc
// or mactel.
let macutils = Cc["@mozilla.org/xpcom/mac-utils;1"]
.getService(Ci.nsIMacUtils);
if (macutils && macutils.isUniversalBinary) {
ABI = "Universal-gcc3";
}
}
} catch (e) {}
return ABI;
});
XPCOMUtils.defineLazyGetter(this, "OSVersion", function UFS_OSVersion() {
let OSVersion = "default";
let sysInfo = Cc["@mozilla.org/system-info;1"].
getService(Ci.nsIPropertyBag2);
try {
OSVersion = sysInfo.getProperty("name") + " " +
sysInfo.getProperty("version");
OSVersion += " (" + sysInfo.getProperty("secondaryLibrary") + ")";
} catch (e) {}
return encodeURIComponent(OSVersion);
});
XPCOMUtils.defineLazyGetter(this, "distribution", function UFS_distribution() {
let distribution = { id: "default", version: "default" };
let defaults = Services.prefs.getDefaultBranch(null);
try {
distribution.id = defaults.getCharPref(PREF_APP_DISTRIBUTION);
} catch (e) {}
try {
distribution.version = defaults.getCharPref(PREF_APP_DISTRIBUTION_VERSION);
} catch (e) {}
return distribution;
});
}
nsURLFormatterService.prototype = {
classID: Components.ID("{e6156350-2be8-11db-a98b-0800200c9a66}"),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIURLFormatter]),
_defaults: {
LOCALE: () => Cc["@mozilla.org/chrome/chrome-registry;1"].
getService(Ci.nsIXULChromeRegistry).
getSelectedLocale('global'),
REGION: function() {
try {
// When the geoip lookup failed to identify the region, we fallback to
// the 'ZZ' region code to mean 'unknown'.
return Services.prefs.getCharPref("browser.search.region") || "ZZ";
} catch(e) {
return "ZZ";
}
},
VENDOR: function() { return this.appInfo.vendor; },
NAME: function() { return this.appInfo.name; },
ID: function() { return this.appInfo.ID; },
VERSION: function() { return this.appInfo.version; },
MAJOR_VERSION: function() { return this.appInfo.version.replace(/^([^\.]+\.[0-9]+[a-z]*).*/gi, "$1"); },
APPBUILDID: function() { return this.appInfo.appBuildID; },
PLATFORMVERSION: function() { return this.appInfo.platformVersion; },
PLATFORMBUILDID: function() { return this.appInfo.platformBuildID; },
APP: function() { return this.appInfo.name.toLowerCase().replace(/ /, ""); },
OS: function() { return this.appInfo.OS; },
XPCOMABI: function() { return this.ABI; },
BUILD_TARGET: function() { return this.appInfo.OS + "_" + this.ABI; },
OS_VERSION: function() { return this.OSVersion; },
CHANNEL: () => UpdateUtils.UpdateChannel,
MOZILLA_API_KEY: () => "@MOZ_MOZILLA_API_KEY@",
GOOGLE_API_KEY: () => "@MOZ_GOOGLE_API_KEY@",
BING_API_CLIENTID:() => "@MOZ_BING_API_CLIENTID@",
BING_API_KEY: () => "@MOZ_BING_API_KEY@",
DISTRIBUTION: function() { return this.distribution.id; },
DISTRIBUTION_VERSION: function() { return this.distribution.version; }
},
formatURL: function uf_formatURL(aFormat) {
var _this = this;
var replacementCallback = function(aMatch, aKey) {
if (aKey in _this._defaults) {
return _this._defaults[aKey].call(_this);
}
Cu.reportError("formatURL: Couldn't find value for key: " + aKey);
return aMatch;
}
return aFormat.replace(/%([A-Z_]+)%/g, replacementCallback);
},
formatURLPref: function uf_formatURLPref(aPref) {
var format = null;
var PS = Cc['@mozilla.org/preferences-service;1'].
getService(Ci.nsIPrefBranch);
try {
format = PS.getComplexValue(aPref, Ci.nsISupportsString).data;
} catch(ex) {
Cu.reportError("formatURLPref: Couldn't get pref: " + aPref);
return "about:blank";
}
if (!PS.prefHasUserValue(aPref) &&
/^(data:text\/plain,.+=.+|chrome:\/\/.+\/locale\/.+\.properties)$/.test(format)) {
// This looks as if it might be a localised preference
try {
format = PS.getComplexValue(aPref, Ci.nsIPrefLocalizedString).data;
} catch(ex) {}
}
return this.formatURL(format);
},
trimSensitiveURLs: function uf_trimSensitiveURLs(aMsg) {
// Only the google API key is sensitive for now.
return "@MOZ_GOOGLE_API_KEY@" ? aMsg.replace(/@MOZ_GOOGLE_API_KEY@/g,
"[trimmed-google-api-key]")
: aMsg;
}
};
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([nsURLFormatterService]);
|