зеркало из https://github.com/mozilla/gecko-dev.git
Bug 808263 - Write profile creation time to the profile on creation. r=Mossop
This commit is contained in:
Родитель
3793b5dfd6
Коммит
07cf66e55e
|
@ -7,6 +7,9 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <prlong.h>
|
||||
#include <prprf.h>
|
||||
#include <prtime.h>
|
||||
#include "nsProfileLock.h"
|
||||
|
||||
#ifdef XP_WIN
|
||||
|
@ -122,6 +125,8 @@ private:
|
|||
|
||||
NS_HIDDEN_(nsresult) Init();
|
||||
|
||||
nsresult CreateTimesInternal(nsIFile *profileDir);
|
||||
|
||||
nsresult CreateProfileInternal(nsIFile* aRootDir,
|
||||
nsIFile* aLocalDir,
|
||||
const nsACString& aName,
|
||||
|
@ -813,6 +818,12 @@ nsToolkitProfileService::CreateProfileInternal(nsIFile* aRootDir,
|
|||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
// We created a new profile dir. Let's store a creation timestamp.
|
||||
// Note that this code path does not apply if the profile dir was
|
||||
// created prior to launching.
|
||||
rv = CreateTimesInternal(rootDir);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsToolkitProfile* last = aForExternalApp ? nullptr : mFirst;
|
||||
if (last) {
|
||||
while (last->mNext)
|
||||
|
@ -827,6 +838,40 @@ nsToolkitProfileService::CreateProfileInternal(nsIFile* aRootDir,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsToolkitProfileService::CreateTimesInternal(nsIFile* aProfileDir)
|
||||
{
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
nsCOMPtr<nsIFile> creationLog;
|
||||
rv = aProfileDir->Clone(getter_AddRefs(creationLog));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
rv = creationLog->AppendNative(NS_LITERAL_CSTRING("times.json"));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
bool exists = false;
|
||||
creationLog->Exists(&exists);
|
||||
if (exists) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
rv = creationLog->Create(nsIFile::NORMAL_FILE_TYPE, 0700);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// We don't care about microsecond resolution.
|
||||
PRInt64 msec;
|
||||
LL_DIV(msec, PR_Now(), PR_USEC_PER_MSEC);
|
||||
|
||||
// Write it out.
|
||||
PRFileDesc *writeFile;
|
||||
rv = creationLog->OpenNSPRFileDesc(PR_WRONLY, 0700, &writeFile);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
PR_fprintf(writeFile, "{\n\"created\": %lld\n}\n", msec);
|
||||
PR_Close(writeFile);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsToolkitProfileService::GetProfileCount(uint32_t *aResult)
|
||||
{
|
||||
|
|
|
@ -29,8 +29,12 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=543854
|
|||
const ASCIIName = "myprofile";
|
||||
const UnicodeName = "\u09A0\u09BE\u0995\u09C1\u09B0"; // A Bengali name
|
||||
|
||||
var gIOService;
|
||||
var gProfileService;
|
||||
|
||||
gIOService = Cc["@mozilla.org/network/io-service;1"].
|
||||
getService(Ci.nsIIOService);
|
||||
|
||||
gProfileService = Cc["@mozilla.org/toolkit/profile-service;1"].
|
||||
getService(Ci.nsIToolkitProfileService);
|
||||
|
||||
|
@ -38,24 +42,72 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=543854
|
|||
createProfile(UnicodeName);
|
||||
SimpleTest.finish();
|
||||
|
||||
function createProfile(profileName)
|
||||
{
|
||||
var profile = gProfileService.createProfile(null, null, profileName);
|
||||
/**
|
||||
* Read the contents of an nsIFile. Throws on error.
|
||||
|
||||
* @param file an nsIFile instance.
|
||||
* @return string contents.
|
||||
*/
|
||||
function readFile(file) {
|
||||
let fstream = Cc["@mozilla.org/network/file-input-stream;1"].
|
||||
createInstance(Ci.nsIFileInputStream);
|
||||
let sstream = Cc["@mozilla.org/scriptableinputstream;1"].
|
||||
createInstance(Components.interfaces.nsIScriptableInputStream);
|
||||
|
||||
const RO = 0x01;
|
||||
const READ_OTHERS = 4;
|
||||
|
||||
fstream.init(file, RO, READ_OTHERS, 0);
|
||||
sstream.init(fstream);
|
||||
let out = sstream.read(sstream.available());
|
||||
sstream.close();
|
||||
fstream.close();
|
||||
return out;
|
||||
}
|
||||
|
||||
function checkBounds(lowerBound, value, upperBound) {
|
||||
ok(lowerBound <= value, "value " + value +
|
||||
" is above lower bound " + lowerBound);
|
||||
ok(upperBound >= value, "value " + value +
|
||||
" is within upper bound " + upperBound);
|
||||
}
|
||||
|
||||
function createProfile(profileName) {
|
||||
// Filesystem precision is lower than Date precision.
|
||||
let lowerBound = Date.now() - 1000;
|
||||
|
||||
let profile = gProfileService.createProfile(null, null, profileName);
|
||||
|
||||
// check that the directory was created
|
||||
isnot(profile, null, "Profile " + profileName + " created");
|
||||
|
||||
var profileDir = profile.rootDir;
|
||||
let profileDir = profile.rootDir;
|
||||
|
||||
ok(profileDir.exists(), "Profile dir created");
|
||||
ok(profileDir.isDirectory(), "Profile dir is a directory");
|
||||
|
||||
var profileDirPath = profileDir.path;
|
||||
let profileDirPath = profileDir.path;
|
||||
|
||||
is(profileDirPath.substr(profileDirPath.length - profileName.length),
|
||||
profileName, "Profile dir has expected name");
|
||||
|
||||
// clean up the profile
|
||||
// Ensure that our timestamp file was created.
|
||||
let jsonFile = profileDir.clone();
|
||||
jsonFile.append("times.json");
|
||||
ok(jsonFile.path, "Path is " + jsonFile.path);
|
||||
ok(jsonFile.exists(), "Times file was created");
|
||||
ok(jsonFile.isFile(), "Times file is a file");
|
||||
let json = JSON.parse(readFile(jsonFile));
|
||||
|
||||
let upperBound = Date.now() + 1000;
|
||||
|
||||
let created = json.created;
|
||||
ok(created, "created is set");
|
||||
|
||||
// Check against real clock time.
|
||||
checkBounds(lowerBound, created, upperBound);
|
||||
|
||||
// Clean up the profile.
|
||||
profile.remove(true);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче