Bug 1365419 - Allow to apply manifest entries for all non-(Darwin,Windows,Android) OSes. r=bsmedberg
☠☠ backed out by 28dff773a7ae ☠ ☠
authorMike Hommey <mh+mozilla@glandium.org>
Fri, 26 May 2017 08:56:18 +0900
changeset 410007 1d9b50fadc050ba8fa1f7c76f99f12b3be19dd00
parent 410006 18b819dd5afc1b7af098076343487f4e5ef3d08e
child 410008 261eecf8497f6a1e3cbe8a1e93d6af81e7afdc64
push id7391
push usermtabara@mozilla.com
push dateMon, 12 Jun 2017 13:08:53 +0000
treeherdermozilla-beta@2191d7f87e2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbsmedberg
bugs1365419
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1365419 - Allow to apply manifest entries for all non-(Darwin,Windows,Android) OSes. r=bsmedberg Manifest entries can contain flags, one of which allows to match on the os running Gecko. The match is performed against the value returned by nsIXULRuntime.getOS, which itself comes from the build-system's OS_TARGET. In practice, this means that things like os=WINNT, os=Darwin, os=Android, os=Linux are valid filters, but the latter is too specific, and most of the time, one would want something that is "any OS but WINNT, Darwin, Android", which can't be expressed with manifest entry flags (there is no "and" for them, only "or"). For convenience, we add the keyword "LikeUnix", which has that meaning.
xpcom/components/ManifestParser.cpp
--- a/xpcom/components/ManifestParser.cpp
+++ b/xpcom/components/ManifestParser.cpp
@@ -314,16 +314,29 @@ CheckStringFlag(const nsSubstring& aFlag
     } else {
       aResult = comparison ? eBad : eOK;
     }
   }
 
   return true;
 }
 
+static bool
+CheckOsFlag(const nsSubstring& aFlag, const nsSubstring& aData,
+            const nsSubstring& aValue, TriState& aResult)
+{
+  bool result = CheckStringFlag(aFlag, aData, aValue, aResult);
+#if defined(XP_UNIX) && !defined(XP_DARWIN) && !defined(ANDROID)
+  if (result && aResult == eBad) {
+    result = CheckStringFlag(aFlag, aData, NS_LITERAL_STRING("likeunix"), aResult);
+  }
+#endif
+  return result;
+}
+
 /**
  * Check for a modifier flag of the following form:
  *   "flag=version"
  *   "flag<=version"
  *   "flag<version"
  *   "flag>=version"
  *   "flag>version"
  * @param aFlag The flag to compare.
@@ -660,17 +673,17 @@ ParseManifest(NSLocationType aType, File
     int flags = 0;
 
     while ((token = nsCRT::strtok(whitespace, kWhitespace, &whitespace)) &&
            ok) {
       ToLowerCase(token);
       NS_ConvertASCIItoUTF16 wtoken(token);
 
       if (CheckStringFlag(kApplication, wtoken, appID, stApp) ||
-          CheckStringFlag(kOs, wtoken, osTarget, stOs) ||
+          CheckOsFlag(kOs, wtoken, osTarget, stOs) ||
           CheckStringFlag(kABI, wtoken, abi, stABI) ||
           CheckStringFlag(kProcess, wtoken, process, stProcess) ||
           CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) ||
           CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) ||
           CheckVersionFlag(kGeckoVersion, wtoken, geckoVersion, stGeckoVersion)) {
         continue;
       }