зеркало из https://github.com/mozilla/pjs.git
Bug 581065 - Allow searching for incompatible add-ons if compatibility checks are disabled. r=dtownsend
This commit is contained in:
Родитель
100e28e694
Коммит
1d47415833
|
@ -60,6 +60,15 @@ const PREF_GETADDONS_GETRECOMMENDED = "extensions.getAddons.recommended.url
|
||||||
const PREF_GETADDONS_BROWSESEARCHRESULTS = "extensions.getAddons.search.browseURL";
|
const PREF_GETADDONS_BROWSESEARCHRESULTS = "extensions.getAddons.search.browseURL";
|
||||||
const PREF_GETADDONS_GETSEARCHRESULTS = "extensions.getAddons.search.url";
|
const PREF_GETADDONS_GETSEARCHRESULTS = "extensions.getAddons.search.url";
|
||||||
|
|
||||||
|
const PREF_CHECK_COMPATIBILITY_BASE = "extensions.checkCompatibility";
|
||||||
|
#ifdef MOZ_COMPATIBILITY_NIGHTLY
|
||||||
|
const PREF_CHECK_COMPATIBILITY = PREF_CHECK_COMPATIBILITY_BASE +
|
||||||
|
".nightly";
|
||||||
|
#else
|
||||||
|
const PREF_CHECK_COMPATIBILITY = PREF_CHECK_COMPATIBILITY_BASE + "." +
|
||||||
|
Services.appinfo.version.replace(BRANCH_REGEXP, "$1");
|
||||||
|
#endif
|
||||||
|
|
||||||
const XMLURI_PARSE_ERROR = "http://www.mozilla.org/newlayout/xml/parsererror.xml";
|
const XMLURI_PARSE_ERROR = "http://www.mozilla.org/newlayout/xml/parsererror.xml";
|
||||||
|
|
||||||
const API_VERSION = "1.5";
|
const API_VERSION = "1.5";
|
||||||
|
@ -810,13 +819,23 @@ var AddonRepository = {
|
||||||
* The callback to pass results to
|
* The callback to pass results to
|
||||||
*/
|
*/
|
||||||
searchAddons: function(aSearchTerms, aMaxResults, aCallback) {
|
searchAddons: function(aSearchTerms, aMaxResults, aCallback) {
|
||||||
let url = this._formatURLPref(PREF_GETADDONS_GETSEARCHRESULTS, {
|
let substitutions = {
|
||||||
API_VERSION : API_VERSION,
|
API_VERSION : API_VERSION,
|
||||||
TERMS : encodeURIComponent(aSearchTerms),
|
TERMS : encodeURIComponent(aSearchTerms),
|
||||||
|
|
||||||
// Get twice as many results to account for potential filtering
|
// Get twice as many results to account for potential filtering
|
||||||
MAX_RESULTS : 2 * aMaxResults
|
MAX_RESULTS : 2 * aMaxResults
|
||||||
});
|
};
|
||||||
|
|
||||||
|
let checkCompatibility = true;
|
||||||
|
try {
|
||||||
|
checkCompatibility = Services.prefs.getBoolPref(PREF_CHECK_COMPATIBILITY);
|
||||||
|
} catch(e) { }
|
||||||
|
|
||||||
|
if (!checkCompatibility)
|
||||||
|
substitutions.VERSION = "";
|
||||||
|
|
||||||
|
let url = this._formatURLPref(PREF_GETADDONS_GETSEARCHRESULTS, substitutions);
|
||||||
|
|
||||||
let self = this;
|
let self = this;
|
||||||
function handleResults(aElements, aTotalResults) {
|
function handleResults(aElements, aTotalResults) {
|
||||||
|
@ -1079,17 +1098,26 @@ var AddonRepository = {
|
||||||
_parseAddons: function(aElements, aTotalResults, aSkip) {
|
_parseAddons: function(aElements, aTotalResults, aSkip) {
|
||||||
let self = this;
|
let self = this;
|
||||||
let results = [];
|
let results = [];
|
||||||
|
|
||||||
|
let checkCompatibility = true;
|
||||||
|
try {
|
||||||
|
checkCompatibility = Services.prefs.getBoolPref(PREF_CHECK_COMPATIBILITY);
|
||||||
|
} catch(e) { }
|
||||||
|
|
||||||
|
function isSameApplication(aAppNode) {
|
||||||
|
return self._getTextContent(aAppNode) == Services.appinfo.ID;
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < aElements.length && results.length < this._maxResults; i++) {
|
for (let i = 0; i < aElements.length && results.length < this._maxResults; i++) {
|
||||||
let element = aElements[i];
|
let element = aElements[i];
|
||||||
|
|
||||||
// Ignore add-ons not compatible with this Application
|
|
||||||
let tags = this._getUniqueDescendant(element, "compatible_applications");
|
let tags = this._getUniqueDescendant(element, "compatible_applications");
|
||||||
if (tags == null)
|
if (tags == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let applications = tags.getElementsByTagName("appID");
|
let applications = tags.getElementsByTagName("appID");
|
||||||
let compatible = Array.some(applications, function(aAppNode) {
|
let compatible = Array.some(applications, function(aAppNode) {
|
||||||
if (self._getTextContent(aAppNode) != Services.appinfo.ID)
|
if (!isSameApplication(aAppNode))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
let parent = aAppNode.parentNode;
|
let parent = aAppNode.parentNode;
|
||||||
|
@ -1103,8 +1131,14 @@ var AddonRepository = {
|
||||||
Services.vc.compare(currentVersion, maxVersion) <= 0);
|
Services.vc.compare(currentVersion, maxVersion) <= 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!compatible)
|
// Ignore add-ons not compatible with this Application
|
||||||
continue;
|
if (!compatible) {
|
||||||
|
if (checkCompatibility)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!Array.some(applications, isSameApplication))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Add-on meets all requirements, so parse out data
|
// Add-on meets all requirements, so parse out data
|
||||||
let result = this._parseAddon(element, aSkip);
|
let result = this._parseAddon(element, aSkip);
|
||||||
|
@ -1125,6 +1159,8 @@ var AddonRepository = {
|
||||||
if (!result.xpiURL && !result.addon.purchaseURL)
|
if (!result.xpiURL && !result.addon.purchaseURL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
result.addon.isCompatible = compatible;
|
||||||
|
|
||||||
results.push(result);
|
results.push(result);
|
||||||
// Ignore this add-on from now on by adding it to the skip array
|
// Ignore this add-on from now on by adding it to the skip array
|
||||||
aSkip.ids.push(result.addon.id);
|
aSkip.ids.push(result.addon.id);
|
||||||
|
|
|
@ -589,6 +589,22 @@ add_test(function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Tests that incompatible add-ons are shown with a warning if compatibility checking is disabled
|
||||||
|
add_test(function() {
|
||||||
|
Services.prefs.setBoolPref("extensions.checkCompatibility.nightly", false);
|
||||||
|
search("incompatible", false, function() {
|
||||||
|
var item = get_addon_item("remote5");
|
||||||
|
is_element_visible(item, "Incompatible addon should be visible");
|
||||||
|
is(item.getAttribute("notification"), "warning", "Compatibility warning should be shown");
|
||||||
|
|
||||||
|
var item = get_addon_item("remote6");
|
||||||
|
is(item, null, "Addon incompatible with the product should not be visible");
|
||||||
|
|
||||||
|
Services.prefs.clearUserPref("extensions.checkCompatibility.nightly");
|
||||||
|
run_next_test();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// Tests that restarting the manager doesn't change search results
|
// Tests that restarting the manager doesn't change search results
|
||||||
add_test(function() {
|
add_test(function() {
|
||||||
restart_manager(gManagerWindow, null, function(aWindow) {
|
restart_manager(gManagerWindow, null, function(aWindow) {
|
||||||
|
|
|
@ -186,5 +186,61 @@
|
||||||
<compatible_os>ALL</compatible_os>
|
<compatible_os>ALL</compatible_os>
|
||||||
<install size="4">http://example.com/remote4.xpi</install>
|
<install size="4">http://example.com/remote4.xpi</install>
|
||||||
</addon>
|
</addon>
|
||||||
|
<addon>
|
||||||
|
<name>PASS - i</name>
|
||||||
|
<type id='1'>Extension</type>
|
||||||
|
<guid>remote5@tests.mozilla.org</guid>
|
||||||
|
<version>6.0</version>
|
||||||
|
<authors>
|
||||||
|
<author>
|
||||||
|
<name>Test Creator</name>
|
||||||
|
<link>http://example.com/creator.html</link>
|
||||||
|
</author>
|
||||||
|
</authors>
|
||||||
|
<status id='4'>Public</status>
|
||||||
|
<summary>Incompatible test</summary>
|
||||||
|
<description>Test description</description>
|
||||||
|
<compatible_applications>
|
||||||
|
<application>
|
||||||
|
<name>Firefox</name>
|
||||||
|
<appID>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</appID>
|
||||||
|
<min_version>0</min_version>
|
||||||
|
<max_version>1</max_version>
|
||||||
|
</application>
|
||||||
|
<application>
|
||||||
|
<name>SeaMonkey</name>
|
||||||
|
<appID>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</appID>
|
||||||
|
<min_version>0</min_version>
|
||||||
|
<max_version>1</max_version>
|
||||||
|
</application>
|
||||||
|
</compatible_applications>
|
||||||
|
<compatible_os>ALL</compatible_os>
|
||||||
|
<install size="1">http://example.com/addon1.xpi</install>
|
||||||
|
</addon>
|
||||||
|
<addon>
|
||||||
|
<name>FAIL - j</name>
|
||||||
|
<type id='1'>Extension</type>
|
||||||
|
<guid>remote6@tests.mozilla.org</guid>
|
||||||
|
<version>6.0</version>
|
||||||
|
<authors>
|
||||||
|
<author>
|
||||||
|
<name>Test Creator</name>
|
||||||
|
<link>http://example.com/creator.html</link>
|
||||||
|
</author>
|
||||||
|
</authors>
|
||||||
|
<status id='4'>Public</status>
|
||||||
|
<summary>Incompatible test</summary>
|
||||||
|
<description>Test description</description>
|
||||||
|
<compatible_applications>
|
||||||
|
<application>
|
||||||
|
<name>Fake Product</name>
|
||||||
|
<appID>fakeproduct@mozilla.org</appID>
|
||||||
|
<min_version>0</min_version>
|
||||||
|
<max_version>1</max_version>
|
||||||
|
</application>
|
||||||
|
</compatible_applications>
|
||||||
|
<compatible_os>ALL</compatible_os>
|
||||||
|
<install size="1">http://example.com/addon1.xpi</install>
|
||||||
|
</addon>
|
||||||
</searchresults>
|
</searchresults>
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче