Closed Bug 233850 Opened 21 years ago Closed 21 years ago

localstore.rdf is not created in user profile if it doesn't present in application default/profile dir

Categories

(Core Graveyard :: Profile: BackEnd, defect)

x86
All
defect
Not set
minor

Tracking

(Not tracked)

RESOLVED FIXED
mozilla1.7beta

People

(Reporter: ph0enix, Assigned: benjamin)

Details

Attachments

(1 file, 2 obsolete files)

User-Agent:       
Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

I've created mozilla based application and noticed, that if there is no
<app_dir>/default/profile/localstore.rdf file, it is not creating in user
profile dir, so persistent attributes are not stored

Reproducible: Always
Steps to Reproduce:
1. create mozilla based app (using toolkit/xre and xpfe/bootstrap from mozilla
sources)
2. make sure there is no <app_dir>/default/profile/localstore.rdf
3. make window size persistent
4. run app, change window size and close app
5. run it again - size is not restored since there is no localstore.rdf in user
porfile

Actual Results:  
persistent attributes are not persistent

Expected Results:  
attributes to be persistent
Code to create the file is at:
http://lxr.mozilla.org/mozilla/source/rdf/datasource/src/nsLocalStore.cpp#406

Do you have a debug build (or can you create one) and step through this function
to see what's going wrong?
(In reply to comment #1)
> Code to create the file is at:
> http://lxr.mozilla.org/mozilla/source/rdf/datasource/src/nsLocalStore.cpp#406
> 
> Do you have a debug build (or can you create one) and step through this function
> to see what's going wrong?

it gets into 
1. NS_GetSpecialDirectory(NS_APP_LOCALSTORE_50_FILE, getter_AddRefs(aFile));
2. nsDirectoryService::Get("LclSt", ...)
3. nsSupportsArray::EnumerateBackwards
4. nsProfileDirServiceProvider::GetFile, match inAtom == sApp_LocalStore50
5. nsProfileDirServiceProvider::EnsureProfileFileExists gets to the end and calls
defaultsFile->CopyTo(destDir, nsString());
where defaultsFile is <app_dir>/default/profile/localstore.rdf and destDir is
correct path to profile
6. fails in nsLocalFile::ResolveAndStat trying to stat
<app_dir>/default/profile/localstore.rdf with rv=NS_ERROR_FILE_NOT_FOUND
also fails in XREDirProvider and in nsAppFileLocationProvider

so, if there is no <app_dir>/default/profile/localstore.rdf, it won't be created
in user profile. but if I create even empty localstore.rdf, after exiting user's
localstore.rdf will be filled with necessary data

another branch:
3. FindProviderFile
4. nsDirectoryService::GetFile
creates nsIAtom from "LclSt"
compares it with a number of nsDirectoryService::s*
nothing finds


---
I suppose NS_GetSpecialDirectory should return some code non-matched with
NS_FAILED if file is not exists, because there is file existing check in
nsLocalStore.cpp#417 and it seems will create localstore.rdf
Excellent debugging.
Assignee: nobody → bsmedberg
Status: UNCONFIRMED → ASSIGNED
Attachment #141242 - Flags: superreview?(darin)
Attachment #141242 - Flags: review?(ccarlen)
Comment on attachment 141242 [details] [diff] [review]
profile dir service provider doesn't need to check for existence of localstore file

This does more than eliminate the existance check. With this patch,
localstore.rdf will never be copied from the defaults, even when it exists.
(Except by some code in nsProfile.cpp, which we shouldn't depend upon)

Instead, I would do this:

       rv = localFile->AppendNative(LOCAL_STORE_FILE_50_NAME);
       if (NS_SUCCEEDED(rv))
-	 rv = EnsureProfileFileExists(localFile, domainDir);
+	 (void)EnsureProfileFileExists(localFile, domainDir);

That will still allow the file to copied if it exists but will succeed as long
as it returns a valid file location.

This is one unfortunate thing about directory service that wasn't caught before
being frozen: there should be a "createIfNotExist" flag with which callers
could make this explicit :-/
Attachment #141242 - Flags: review?(ccarlen) → review-
Attachment #141242 - Flags: superreview?(darin)
Attached patch take 2 (obsolete) — Splinter Review
Attachment #141242 - Attachment is obsolete: true
Attachment #141987 - Flags: superreview?(darin)
Attachment #141987 - Flags: review?(ccarlen)
       rv = localFile->AppendNative(LOCAL_STORE_FILE_50_NAME);
-      if (NS_SUCCEEDED(rv))
-        rv = EnsureProfileFileExists(localFile, domainDir);
-    }
+      EnsureProfileFileExists(localFile, domainDir);

Why disregard the rv from AppendNative before the call to
EnsureProfileFileExists? Also, if you're ignoring an rv for a good reason (this
bug), cast it to void to make it explicit. Better yet, cast it to void and leave
a comment as to why.
Comment on attachment 141987 [details] [diff] [review]
take 2

minusing based on ccarlen's comments.
Attachment #141987 - Flags: superreview?(darin) → superreview-
Attachment #141987 - Attachment is obsolete: true
Attachment #142328 - Flags: superreview?(darin)
Attachment #142328 - Flags: review?(ccarlen)
Attachment #141987 - Flags: review?(ccarlen)
Comment on attachment 142328 [details] [diff] [review]
updated with (void) etc

r=ccarlen
Attachment #142328 - Flags: review?(ccarlen) → review+
Attachment #142328 - Flags: superreview?(darin) → superreview+
fixed on trunk
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla1.7beta
Does this mean we can clean out all the junk and not ship localstore.rdf?
Neil: no... at least, not without some work. The localstore.rdf files that we
ship contain various default values that (as I understand it) are not
auto-generated if they don't exist. It's weird.
Actually I think they could all be auto-generated, it's just that nobody wrote
the xul correctly before...
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: