toolkit/crashreporter/test/browser/head.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 function create_subdir(dir, subdirname) {
     2   let subdir = dir.clone();
     3   subdir.append(subdirname);
     4   if (subdir.exists()) {
     5     subdir.remove(true);
     6   }
     7   subdir.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
     8   return subdir;
     9 }
    11 // need to hold on to this to unregister for cleanup
    12 let _provider = null;
    14 function make_fake_appdir() {
    15   // Create a directory inside the profile and register it as UAppData, so
    16   // we can stick fake crash reports inside there. We put it inside the profile
    17   // just because we know that will get cleaned up after the mochitest run.
    18   let dirSvc = Cc["@mozilla.org/file/directory_service;1"]
    19                .getService(Ci.nsIProperties);
    20   let profD = dirSvc.get("ProfD", Ci.nsILocalFile);
    21   // create a subdir just to keep our files out of the way
    22   let appD = create_subdir(profD, "UAppData");
    24   let crashesDir = create_subdir(appD, "Crash Reports");
    25   create_subdir(crashesDir, "pending");
    26   create_subdir(crashesDir, "submitted");
    28   _provider = {
    29     getFile: function(prop, persistent) {
    30       persistent.value = true;
    31       if (prop == "UAppData") {
    32         return appD.clone();
    33       }
    34       throw Components.results.NS_ERROR_FAILURE;
    35     },
    36     QueryInterface: function(iid) {
    37       if (iid.equals(Ci.nsIDirectoryServiceProvider) ||
    38           iid.equals(Ci.nsISupports)) {
    39         return this;
    40       }
    41       throw Components.results.NS_ERROR_NO_INTERFACE;
    42     }
    43   };
    44   // register our new provider
    45   dirSvc.QueryInterface(Ci.nsIDirectoryService)
    46         .registerProvider(_provider);
    47   // and undefine the old value
    48   try {
    49     dirSvc.undefine("UAppData");
    50   } catch(ex) {} // it's ok if this fails, the value might not be cached yet
    51   return appD.clone();
    52 }
    54 function cleanup_fake_appdir() {
    55   let dirSvc = Cc["@mozilla.org/file/directory_service;1"]
    56                .getService(Ci.nsIProperties);
    57   dirSvc.QueryInterface(Ci.nsIDirectoryService)
    58         .unregisterProvider(_provider);
    59   // undefine our value so future calls get the real value
    60   try {
    61     dirSvc.undefine("UAppData");
    62   } catch(ex) {
    63     dump("cleanup_fake_appdir: dirSvc.undefine failed: " + ex.message +"\n");
    64   }
    65 }
    67 function add_fake_crashes(crD, count) {
    68   let results = [];
    69   let uuidGenerator = Cc["@mozilla.org/uuid-generator;1"]
    70                       .getService(Ci.nsIUUIDGenerator);
    71   let submitdir = crD.clone();
    72   submitdir.append("submitted");
    73   // create them from oldest to newest, to ensure that about:crashes
    74   // displays them in the correct order
    75   let date = Date.now() - count * 60000;
    76   for (let i = 0; i < count; i++) {
    77     let uuid = uuidGenerator.generateUUID().toString();
    78     // ditch the {}
    79     uuid = "bp-" + uuid.substring(1, uuid.length - 2);
    80     let fn = uuid + ".txt";
    81     let file = submitdir.clone();
    82     file.append(fn);
    83     file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
    84     file.lastModifiedTime = date;
    85     results.push({'id': uuid, 'date': date, 'pending': false});
    87     date += 60000;
    88   }
    89   // we want them sorted newest to oldest, since that's the order
    90   // that about:crashes lists them in
    91   results.sort(function(a,b) b.date - a.date);
    92   return results;
    93 }
    95 function writeDataToFile(file, data) {
    96   var fstream = Cc["@mozilla.org/network/file-output-stream;1"]
    97                 .createInstance(Ci.nsIFileOutputStream);
    98   // open, write, truncate
    99   fstream.init(file, -1, -1, 0);
   100   var os = Cc["@mozilla.org/intl/converter-output-stream;1"]
   101            .createInstance(Ci.nsIConverterOutputStream);
   102   os.init(fstream, "UTF-8", 0, 0x0000);
   103   os.writeString(data);
   104   os.close();
   105   fstream.close();
   106 }
   108 function addPendingCrashreport(crD, date, extra) {
   109   let pendingdir = crD.clone();
   110   pendingdir.append("pending");
   111   let uuidGenerator = Cc["@mozilla.org/uuid-generator;1"]
   112                       .getService(Ci.nsIUUIDGenerator);
   113   let uuid = uuidGenerator.generateUUID().toString();
   114   // ditch the {}
   115   uuid = uuid.substring(1, uuid.length - 1);
   116   let dumpfile = pendingdir.clone();
   117   dumpfile.append(uuid + ".dmp");
   118   writeDataToFile(dumpfile, "MDMP"); // that's the start of a valid minidump, anyway
   119   let extrafile = pendingdir.clone();
   120   extrafile.append(uuid + ".extra");
   121   let extradata = "";
   122   for (let x in extra) {
   123     extradata += x + "=" + extra[x] + "\n";
   124   }
   125   writeDataToFile(extrafile, extradata);
   126   dumpfile.lastModifiedTime = date;
   127   extrafile.lastModifiedTime = date;
   128   return {'id': uuid, 'date': date, 'pending': true, 'extra': extra};
   129 }

mercurial