toolkit/mozapps/extensions/test/xpcshell/test_locked_strictcompat.js

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /* Any copyright is dedicated to the Public Domain.
     2  * http://creativecommons.org/publicdomain/zero/1.0/
     3  */
     5 // Checks that we rebuild something sensible from a corrupt database
     7 Components.utils.import("resource://testing-common/httpd.js");
     8 Components.utils.import("resource://gre/modules/osfile.jsm");
    10 var testserver = new HttpServer();
    11 testserver.start(-1);
    12 gPort = testserver.identity.primaryPort;
    13 mapFile("/data/test_corrupt.rdf", testserver);
    14 testserver.registerDirectory("/addons/", do_get_file("addons"));
    16 // The test extension uses an insecure update url.
    17 Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
    18 Services.prefs.setBoolPref(PREF_EM_STRICT_COMPATIBILITY, true);
    20 // Will be enabled
    21 var addon1 = {
    22   id: "addon1@tests.mozilla.org",
    23   version: "1.0",
    24   name: "Test 1",
    25   targetApplications: [{
    26     id: "xpcshell@tests.mozilla.org",
    27     minVersion: "2",
    28     maxVersion: "2"
    29   }]
    30 };
    32 // Will be disabled
    33 var addon2 = {
    34   id: "addon2@tests.mozilla.org",
    35   version: "1.0",
    36   name: "Test 2",
    37   targetApplications: [{
    38     id: "xpcshell@tests.mozilla.org",
    39     minVersion: "2",
    40     maxVersion: "2"
    41   }]
    42 };
    44 // Will get a compatibility update and be enabled
    45 var addon3 = {
    46   id: "addon3@tests.mozilla.org",
    47   version: "1.0",
    48   name: "Test 3",
    49   updateURL: "http://localhost:" + gPort + "/data/test_corrupt.rdf",
    50   targetApplications: [{
    51     id: "xpcshell@tests.mozilla.org",
    52     minVersion: "1",
    53     maxVersion: "1"
    54   }]
    55 };
    57 // Will get a compatibility update and be disabled
    58 var addon4 = {
    59   id: "addon4@tests.mozilla.org",
    60   version: "1.0",
    61   name: "Test 4",
    62   updateURL: "http://localhost:" + gPort + "/data/test_corrupt.rdf",
    63   targetApplications: [{
    64     id: "xpcshell@tests.mozilla.org",
    65     minVersion: "1",
    66     maxVersion: "1"
    67   }]
    68 };
    70 // Stays incompatible
    71 var addon5 = {
    72   id: "addon5@tests.mozilla.org",
    73   version: "1.0",
    74   name: "Test 5",
    75   targetApplications: [{
    76     id: "xpcshell@tests.mozilla.org",
    77     minVersion: "1",
    78     maxVersion: "1"
    79   }]
    80 };
    82 // Enabled bootstrapped
    83 var addon6 = {
    84   id: "addon6@tests.mozilla.org",
    85   version: "1.0",
    86   name: "Test 6",
    87   bootstrap: "true",
    88   targetApplications: [{
    89     id: "xpcshell@tests.mozilla.org",
    90     minVersion: "2",
    91     maxVersion: "2"
    92   }]
    93 };
    95 // Disabled bootstrapped
    96 var addon7 = {
    97   id: "addon7@tests.mozilla.org",
    98   version: "1.0",
    99   name: "Test 7",
   100   bootstrap: "true",
   101   targetApplications: [{
   102     id: "xpcshell@tests.mozilla.org",
   103     minVersion: "2",
   104     maxVersion: "2"
   105   }]
   106 };
   108 // The default theme
   109 var theme1 = {
   110   id: "theme1@tests.mozilla.org",
   111   version: "1.0",
   112   name: "Theme 1",
   113   internalName: "classic/1.0",
   114   targetApplications: [{
   115     id: "xpcshell@tests.mozilla.org",
   116     minVersion: "2",
   117     maxVersion: "2"
   118   }]
   119 };
   121 // The selected theme
   122 var theme2 = {
   123   id: "theme2@tests.mozilla.org",
   124   version: "1.0",
   125   name: "Theme 2",
   126   internalName: "test/1.0",
   127   targetApplications: [{
   128     id: "xpcshell@tests.mozilla.org",
   129     minVersion: "2",
   130     maxVersion: "2"
   131   }]
   132 };
   134 const profileDir = gProfD.clone();
   135 profileDir.append("extensions");
   137 add_task(function* init() {
   138   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "2", "2");
   140   writeInstallRDFForExtension(addon1, profileDir);
   141   writeInstallRDFForExtension(addon2, profileDir);
   142   writeInstallRDFForExtension(addon3, profileDir);
   143   writeInstallRDFForExtension(addon4, profileDir);
   144   writeInstallRDFForExtension(addon5, profileDir);
   145   writeInstallRDFForExtension(addon6, profileDir);
   146   writeInstallRDFForExtension(addon7, profileDir);
   147   writeInstallRDFForExtension(theme1, profileDir);
   148   writeInstallRDFForExtension(theme2, profileDir);
   150   // Startup the profile and setup the initial state
   151   startupManager();
   153   // New profile so new add-ons are ignored
   154   check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   156   let a1, a2, a3, a4, a5, a6, a7, t1, t2;
   158   [a2, a3, a4, a7, t2] =
   159     yield promiseAddonsByIDs(["addon2@tests.mozilla.org",
   160                               "addon3@tests.mozilla.org",
   161                               "addon4@tests.mozilla.org",
   162                               "addon7@tests.mozilla.org",
   163                               "theme2@tests.mozilla.org"]);
   165   // Set up the initial state
   166   let deferredUpdateFinished = Promise.defer();
   168   a2.userDisabled = true;
   169   a4.userDisabled = true;
   170   a7.userDisabled = true;
   171   t2.userDisabled = false;
   172   a3.findUpdates({
   173     onUpdateFinished: function() {
   174       a4.findUpdates({
   175         onUpdateFinished: function() {
   176           deferredUpdateFinished.resolve();
   177         }
   178       }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
   179     }
   180   }, AddonManager.UPDATE_WHEN_PERIODIC_UPDATE);
   181   yield deferredUpdateFinished.promise;
   182 });
   184 add_task(function* run_test_1() {
   185   let a1, a2, a3, a4, a5, a6, a7, t1, t2;
   187   restartManager();
   188   [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   189     yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   190                              "addon2@tests.mozilla.org",
   191                              "addon3@tests.mozilla.org",
   192                              "addon4@tests.mozilla.org",
   193                              "addon5@tests.mozilla.org",
   194                              "addon6@tests.mozilla.org",
   195                              "addon7@tests.mozilla.org",
   196                              "theme1@tests.mozilla.org",
   197                              "theme2@tests.mozilla.org"]);
   199   do_check_neq(a1, null);
   200   do_check_true(a1.isActive);
   201   do_check_false(a1.userDisabled);
   202   do_check_false(a1.appDisabled);
   203   do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   204   do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   206   do_check_neq(a2, null);
   207   do_check_false(a2.isActive);
   208   do_check_true(a2.userDisabled);
   209   do_check_false(a2.appDisabled);
   210   do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   211   do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   213   do_check_neq(a3, null);
   214   do_check_true(a3.isActive);
   215   do_check_false(a3.userDisabled);
   216   do_check_false(a3.appDisabled);
   217   do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   218   do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   220   do_check_neq(a4, null);
   221   do_check_false(a4.isActive);
   222   do_check_true(a4.userDisabled);
   223   do_check_false(a4.appDisabled);
   224   do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   225   do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   227   do_check_neq(a5, null);
   228   do_check_false(a5.isActive);
   229   do_check_false(a5.userDisabled);
   230   do_check_true(a5.appDisabled);
   231   do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   232   do_check_false(isExtensionInAddonsList(profileDir, a5.id));
   234   do_check_neq(a6, null);
   235   do_check_true(a6.isActive);
   236   do_check_false(a6.userDisabled);
   237   do_check_false(a6.appDisabled);
   238   do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   240   do_check_neq(a7, null);
   241   do_check_false(a7.isActive);
   242   do_check_true(a7.userDisabled);
   243   do_check_false(a7.appDisabled);
   244   do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   246   do_check_neq(t1, null);
   247   do_check_false(t1.isActive);
   248   do_check_true(t1.userDisabled);
   249   do_check_false(t1.appDisabled);
   250   do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   251   do_check_false(isThemeInAddonsList(profileDir, t1.id));
   253   do_check_neq(t2, null);
   254   do_check_true(t2.isActive);
   255   do_check_false(t2.userDisabled);
   256   do_check_false(t2.appDisabled);
   257   do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   258   do_check_true(isThemeInAddonsList(profileDir, t2.id));
   260   // Open another handle on the JSON DB with as much Unix and Windows locking
   261   // as we can to simulate some other process interfering with it
   262   shutdownManager();
   263   do_print("Locking " + gExtensionsJSON.path);
   264   let options = {
   265     winShare: 0
   266   };
   267   if (OS.Constants.libc.O_EXLOCK)
   268     options.unixFlags = OS.Constants.libc.O_EXLOCK;
   270   let file = yield OS.File.open(gExtensionsJSON.path, {read:true, write:true, existing:true}, options);
   272   let filePermissions = gExtensionsJSON.permissions;
   273   if (!OS.Constants.Win) {
   274     gExtensionsJSON.permissions = 0;
   275   }
   276   startupManager(false);
   278   // Shouldn't have seen any startup changes
   279   check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   281   // Accessing the add-ons should open and recover the database
   282   [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   283     yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   284                               "addon2@tests.mozilla.org",
   285                               "addon3@tests.mozilla.org",
   286                               "addon4@tests.mozilla.org",
   287                               "addon5@tests.mozilla.org",
   288                               "addon6@tests.mozilla.org",
   289                               "addon7@tests.mozilla.org",
   290                               "theme1@tests.mozilla.org",
   291                               "theme2@tests.mozilla.org"]);
   293   // Should be correctly recovered
   294   do_check_neq(a1, null);
   295   do_check_true(a1.isActive);
   296   do_check_false(a1.userDisabled);
   297   do_check_false(a1.appDisabled);
   298   do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   299   do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   301   // Should be correctly recovered
   302   do_check_neq(a2, null);
   303   do_check_false(a2.isActive);
   304   do_check_true(a2.userDisabled);
   305   do_check_false(a2.appDisabled);
   306   do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   307   do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   309   // The compatibility update won't be recovered but it should still be
   310   // active for this session
   311   do_check_neq(a3, null);
   312   do_check_true(a3.isActive);
   313   do_check_false(a3.userDisabled);
   314   do_check_true(a3.appDisabled);
   315   do_check_eq(a3.pendingOperations, AddonManager.PENDING_DISABLE);
   316   do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   318   // The compatibility update won't be recovered and it will not have been
   319   // able to tell that it was previously userDisabled
   320   do_check_neq(a4, null);
   321   do_check_false(a4.isActive);
   322   do_check_false(a4.userDisabled);
   323   do_check_true(a4.appDisabled);
   324   do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   325   do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   327   do_check_neq(a5, null);
   328   do_check_false(a5.isActive);
   329   do_check_false(a5.userDisabled);
   330   do_check_true(a5.appDisabled);
   331   do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   332   do_check_false(isExtensionInAddonsList(profileDir, a5.id));
   334   do_check_neq(a6, null);
   335   do_check_true(a6.isActive);
   336   do_check_false(a6.userDisabled);
   337   do_check_false(a6.appDisabled);
   338   do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   340   do_check_neq(a7, null);
   341   do_check_false(a7.isActive);
   342   do_check_true(a7.userDisabled);
   343   do_check_false(a7.appDisabled);
   344   do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   346   // Should be correctly recovered
   347   do_check_neq(t1, null);
   348   do_check_false(t1.isActive);
   349   do_check_true(t1.userDisabled);
   350   do_check_false(t1.appDisabled);
   351   do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   352   do_check_false(isThemeInAddonsList(profileDir, t1.id));
   354   // Should be correctly recovered
   355   do_check_neq(t2, null);
   356   do_check_true(t2.isActive);
   357   do_check_false(t2.userDisabled);
   358   do_check_false(t2.appDisabled);
   359   do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   360   do_check_true(isThemeInAddonsList(profileDir, t2.id));
   362   // Restarting will actually apply changes to extensions.ini which will
   363   // then be put into the in-memory database when we next fail to load the
   364   // real thing
   365   restartManager();
   367   // Shouldn't have seen any startup changes
   368   check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   370   [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   371     yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   372                                "addon2@tests.mozilla.org",
   373                                "addon3@tests.mozilla.org",
   374                                "addon4@tests.mozilla.org",
   375                                "addon5@tests.mozilla.org",
   376                                "addon6@tests.mozilla.org",
   377                                "addon7@tests.mozilla.org",
   378                                "theme1@tests.mozilla.org",
   379                                "theme2@tests.mozilla.org"]);
   381   do_check_neq(a1, null);
   382   do_check_true(a1.isActive);
   383   do_check_false(a1.userDisabled);
   384   do_check_false(a1.appDisabled);
   385   do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   386   do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   388   do_check_neq(a2, null);
   389   do_check_false(a2.isActive);
   390   do_check_true(a2.userDisabled);
   391   do_check_false(a2.appDisabled);
   392   do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   393   do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   395   do_check_neq(a3, null);
   396   do_check_false(a3.isActive);
   397   do_check_false(a3.userDisabled);
   398   do_check_true(a3.appDisabled);
   399   do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   400   do_check_false(isExtensionInAddonsList(profileDir, a3.id));
   402   do_check_neq(a4, null);
   403   do_check_false(a4.isActive);
   404   do_check_false(a4.userDisabled);
   405   do_check_true(a4.appDisabled);
   406   do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   407   do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   409   do_check_neq(a5, null);
   410   do_check_false(a5.isActive);
   411   do_check_false(a5.userDisabled);
   412   do_check_true(a5.appDisabled);
   413   do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   414   do_check_false(isExtensionInAddonsList(profileDir, a5.id));
   416   do_check_neq(a6, null);
   417   do_check_true(a6.isActive);
   418   do_check_false(a6.userDisabled);
   419   do_check_false(a6.appDisabled);
   420   do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   422   do_check_neq(a7, null);
   423   do_check_false(a7.isActive);
   424   do_check_true(a7.userDisabled);
   425   do_check_false(a7.appDisabled);
   426   do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   428   do_check_neq(t1, null);
   429   do_check_false(t1.isActive);
   430   do_check_true(t1.userDisabled);
   431   do_check_false(t1.appDisabled);
   432   do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   433   do_check_false(isThemeInAddonsList(profileDir, t1.id));
   435   do_check_neq(t2, null);
   436   do_check_true(t2.isActive);
   437   do_check_false(t2.userDisabled);
   438   do_check_false(t2.appDisabled);
   439   do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   440   do_check_true(isThemeInAddonsList(profileDir, t2.id));
   442   // After allowing access to the original DB things should go back to as
   443   // back how they were before the lock
   444   shutdownManager();
   445   do_print("Unlocking " + gExtensionsJSON.path);
   446   yield file.close();
   447   gExtensionsJSON.permissions = filePermissions;
   448   startupManager(false);
   450   // Shouldn't have seen any startup changes
   451   check_startup_changes(AddonManager.STARTUP_CHANGE_INSTALLED, []);
   453   [a1, a2, a3, a4, a5, a6, a7, t1, t2] =
   454     yield promiseAddonsByIDs(["addon1@tests.mozilla.org",
   455                               "addon2@tests.mozilla.org",
   456                               "addon3@tests.mozilla.org",
   457                               "addon4@tests.mozilla.org",
   458                               "addon5@tests.mozilla.org",
   459                               "addon6@tests.mozilla.org",
   460                               "addon7@tests.mozilla.org",
   461                               "theme1@tests.mozilla.org",
   462                               "theme2@tests.mozilla.org"]);
   464   do_check_neq(a1, null);
   465   do_check_true(a1.isActive);
   466   do_check_false(a1.userDisabled);
   467   do_check_false(a1.appDisabled);
   468   do_check_eq(a1.pendingOperations, AddonManager.PENDING_NONE);
   469   do_check_true(isExtensionInAddonsList(profileDir, a1.id));
   471   do_check_neq(a2, null);
   472   do_check_false(a2.isActive);
   473   do_check_true(a2.userDisabled);
   474   do_check_false(a2.appDisabled);
   475   do_check_eq(a2.pendingOperations, AddonManager.PENDING_NONE);
   476   do_check_false(isExtensionInAddonsList(profileDir, a2.id));
   478   do_check_neq(a3, null);
   479   do_check_false(a3.userDisabled);
   480   // On Unix, we may be able to save our changes over the locked DB so we
   481   // remember that this extension was changed to disabled. On Windows we
   482   // couldn't replace the old DB so we read the older version of the DB
   483   // where the extension is enabled
   484   if (gXPISaveError) {
   485     do_print("XPI save failed");
   486     do_check_true(a3.isActive);
   487     do_check_false(a3.appDisabled);
   488     do_check_true(isExtensionInAddonsList(profileDir, a3.id));
   489   }
   490   else {
   491     do_print("XPI save succeeded");
   492     do_check_false(a3.isActive);
   493     do_check_true(a3.appDisabled);
   494     do_check_false(isExtensionInAddonsList(profileDir, a3.id));
   495   }
   496   do_check_eq(a3.pendingOperations, AddonManager.PENDING_NONE);
   498   do_check_neq(a4, null);
   499   do_check_false(a4.isActive);
   500   // The reverse of the platform difference for a3 - Unix should
   501   // stay the same as the last iteration because the save succeeded,
   502   // Windows should still say userDisabled
   503   if (OS.Constants.Win) {
   504     do_check_true(a4.userDisabled);
   505     do_check_false(a4.appDisabled);
   506   }
   507   else {
   508     do_check_false(a4.userDisabled);
   509     do_check_true(a4.appDisabled);
   510   }
   511   do_check_false(isExtensionInAddonsList(profileDir, a4.id));
   512   do_check_eq(a4.pendingOperations, AddonManager.PENDING_NONE);
   514   do_check_neq(a5, null);
   515   do_check_false(a5.isActive);
   516   do_check_false(a5.userDisabled);
   517   do_check_true(a5.appDisabled);
   518   do_check_eq(a5.pendingOperations, AddonManager.PENDING_NONE);
   519   do_check_false(isExtensionInAddonsList(profileDir, a5.id));
   521   do_check_neq(a6, null);
   522   do_check_true(a6.isActive);
   523   do_check_false(a6.userDisabled);
   524   do_check_false(a6.appDisabled);
   525   do_check_eq(a6.pendingOperations, AddonManager.PENDING_NONE);
   527   do_check_neq(a7, null);
   528   do_check_false(a7.isActive);
   529   do_check_true(a7.userDisabled);
   530   do_check_false(a7.appDisabled);
   531   do_check_eq(a7.pendingOperations, AddonManager.PENDING_NONE);
   533   do_check_neq(t1, null);
   534   do_check_false(t1.isActive);
   535   do_check_true(t1.userDisabled);
   536   do_check_false(t1.appDisabled);
   537   do_check_eq(t1.pendingOperations, AddonManager.PENDING_NONE);
   538   do_check_false(isThemeInAddonsList(profileDir, t1.id));
   540   do_check_neq(t2, null);
   541   do_check_true(t2.isActive);
   542   do_check_false(t2.userDisabled);
   543   do_check_false(t2.appDisabled);
   544   do_check_eq(t2.pendingOperations, AddonManager.PENDING_NONE);
   545   do_check_true(isThemeInAddonsList(profileDir, t2.id));
   546 });
   548 function run_test() {
   549   run_next_test();
   550 }

mercurial