Closed
Bug 992185
Opened 11 years ago
Closed 11 years ago
Download location preference field is empty on reload
Categories
(Firefox :: Settings UI, defect)
Firefox
Settings UI
Tracking
()
VERIFIED
FIXED
Firefox 31
People
(Reporter: manishearth, Assigned: manishearth)
References
Details
Attachments
(1 file, 3 obsolete files)
1.45 KB,
patch
|
Gavin
:
review+
|
Details | Diff | Splinter Review |
See bug 738796 comment 82:
> Under General -> Downloads -> “Save files to” option selected, I see the next issue: if I selected any other folder: “/home/your_name/Folder_Name” appears. After reloading the tab, nothing appears.
So by default, the download location field shows "Downloads". However, when you change the directory to anything other than Downloads, the field shows the full path (probably not desired). When the preferences page is reloaded, the field is just empty.
Assignee | ||
Comment 1•11 years ago
|
||
Alright, I was able to fix the full path thing.
However, the emptyness issue is strange. I tracked it down to the `value` of the <preference> element being null on page load. This is strange, since I do see a value for the pref about:config.
When I looked at about:config, the pref was being stored as a string instead of as a "file": http://i.stack.imgur.com/DnTnL.png (chaîne is French for "string"). This might have something to do with the null value.
Assignee | ||
Comment 2•11 years ago
|
||
Figured it out.
The downloads field now loads correctly. It also no longer shows the cramped, full path, and only shows the folder name.
Attachment #8402128 -
Flags: review?(jaws)
Assignee | ||
Updated•11 years ago
|
QA Contact: camelia.badau
Comment 3•11 years ago
|
||
Comment on attachment 8402128 [details] [diff] [review]
Patch 1
>diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js
> _getDisplayNameOfFile: function (aFolder)
>- return aFolder ? aFolder.path : "";
>+ return aFolder ? aFolder.leafName : "";
Is this really wanted? Not sure that showing only the leafName makes sense, makes it hard to see what you picked. Regardless, should probably be done separately from your bugfix.
>diff --git a/browser/components/preferences/in-content/main.xul b/browser/components/preferences/in-content/main.xul
>+ <preference id="browser.download.folderList"
>+ name="browser.download.folderList"
>+ type="int"/>
> <preference id="browser.download.dir"
> name="browser.download.dir"
> type="file"
> onchange="gMainPane.displayDownloadDirPref();"/>
>- <preference id="browser.download.folderList"
>- name="browser.download.folderList"
>- type="int"/>
Why does this fix the weirdness?
Assignee | ||
Comment 4•11 years ago
|
||
(In reply to :Gavin Sharp (email gavin@gavinsharp.com) from comment #3)
> Is this really wanted? Not sure that showing only the leafName makes sense,
> makes it hard to see what you picked. Regardless, should probably be done
> separately from your bugfix.
Well, this was mentioned in Camelia's comment on the main bug. But yeah, this can be filed separately.
> Why does this fix the weirdness?
I'm not completely sure. It works, though.
As far as I can tell, when the tags are in the opposite order, and the onsyncfrompreference for forderList here[1] is called, the folderList preference has been loaded, but the dir preference has not, and calling the value in the method doesn't work.
[1]: http://mxr.mozilla.org/mozilla-central/source/browser/components/preferences/in-content/main.xul#173
Assignee | ||
Updated•11 years ago
|
Summary: Selecting a download location other than the default behaves strangely on Ubuntu → Download location preference field is empty on reload
Assignee | ||
Comment 5•11 years ago
|
||
Filed bug 992456 for the full path vs leaf name issue.
Assignee | ||
Comment 6•11 years ago
|
||
Attachment #8402128 -
Attachment is obsolete: true
Attachment #8402128 -
Flags: review?(jaws)
Attachment #8402140 -
Flags: review?(jaws)
Attachment #8402140 -
Flags: feedback?(gavin.sharp)
Comment 7•11 years ago
|
||
As I understand things, the preferences should both be initialized before any onsyncfrompreference handlers are called. Is that not happening?
Assignee | ||
Comment 8•11 years ago
|
||
As far as I can tell, it's not happening. Put a debugger; at the top of `displayDownloadDirPref()` in main.js and have a look at `document.getElementById('browser.download.dir').value` both with and without the patch. The <preference> element has a null value when the patch isn't applied. I'm not sure if that's by design -- it *shouldn't* be, but I'm not familiar with the code behind preferences. We can file a separate bug about this if necessary.
Updated•11 years ago
|
OS: Linux → All
Comment 9•11 years ago
|
||
(In reply to Manish Goregaokar [:manishearth] from comment #8)
> As far as I can tell, it's not happening. Put a debugger; at the top of
> `displayDownloadDirPref()` in main.js and have a look at
> `document.getElementById('browser.download.dir').value`
What does the call stack to displayDownloadDirPref look like when the error case occurs? I.e. which of the two displayDownloadDirPref calls in mail.xul are the problem, onchange or onsyncfrompreference?
Assignee | ||
Comment 10•11 years ago
|
||
It seems to be onsyncfrompreference
Call stack:
gMainPane.displayDownloadDirPref
anonymous (preferences.xml:1)
setElementValue (preferences.xml:403)
updateElements (preferences.xml:524)
_setValue (preferences.xml:168)
preference_XBL_constructor (preferences.xml:118)
setElementValue contains:
> var event = document.createEvent("Events");
> event.initEvent("syncfrompreference", true, true);
> var f = new Function ("event", aElement.getAttribute("onsyncfrompreference"));
> rv = f.call(aElement, event);
near line 403.
Also, the contents of updateElements:
> var elements = document.getElementsByAttribute("preference", this.id);
> for (var i = 0; i < elements.length; ++i)
> this.setElementValue(elements[i]);
So basically, the moment a <preference> object is constructed, all form controls on the page linked with that pref get instantiated too (either by copying the preference over, or by firing onsyncfrompreference). In this case, the latter is happening.
I guess this means that referring to preferences by id in an onsyncfrompreferences handler is not good, we should just load them via Services.
Comment 11•11 years ago
|
||
Cool, thanks for digging deeper - that makes sense. Do you want to adjust the patch to avoid using the pref element, then, and maybe add a clarifying comment?
Comment 12•11 years ago
|
||
(I'm surprised we don't run into this issue more often. Maybe we've just been lucky?)
Assignee | ||
Comment 13•11 years ago
|
||
I'm surprised we haven't run into this either, since the trick of referencing a <preference> element is used in almost all the onsyncfrompreferences, and it's rather convenient over using get*Pref.
I plan on adding a note to the MDN page that explicitly mentions this behavior of onsyncfrompreference.
I'm not sure if we should fix this by replacing it with a direct call to getComplexValue(), since the rest of the code seems to rely on precise ordering of <preference> elements anyway. I'll upload a patch for this case, though.
I think we should just swap the order for now, and then try and investigate ways of fixing onsyncfrompreference's strangeness in a separate bug. I haven't thought much about it yet, but there doesn't seem to be a straightforward alternate behavior for it, so this might require some discussion.
Assignee | ||
Comment 14•11 years ago
|
||
Here's the alternate patch, choose the one you like more :)
Attachment #8403516 -
Flags: review?(gavin.sharp)
Assignee | ||
Comment 15•11 years ago
|
||
Whoops, forgot to qref.
Attachment #8403516 -
Attachment is obsolete: true
Attachment #8403516 -
Flags: review?(gavin.sharp)
Attachment #8403519 -
Flags: review?(gavin.sharp)
Assignee | ||
Comment 16•11 years ago
|
||
I've left a note on the MDN page here: https://developer.mozilla.org/en-US/docs/Mozilla/Preferences/Preferences_system/New_attributes#onsyncfrompreference.2Fonsynctopreference
Let me know if it can be improved :)
Comment 17•11 years ago
|
||
Comment on attachment 8402140 [details] [diff] [review]
Patch 2 - split into two bugs
(clearing review request since Gavin has been working closer with you on this)
Attachment #8402140 -
Flags: review?(jaws)
Comment 18•11 years ago
|
||
Comment on attachment 8402140 [details] [diff] [review]
Patch 2 - split into two bugs
I changed my mind, let's use this for now. This seems like a huge footgun but I'm not sure how to solve it offhand. Perhaps file a bug about this general problem (to audit for other such situations, find a global solution, etc.)?
Attachment #8402140 -
Flags: feedback?(gavin.sharp) → review+
Updated•11 years ago
|
Attachment #8403519 -
Flags: review?(gavin.sharp)
Assignee | ||
Comment 19•11 years ago
|
||
Alright, thanks.
I'll file a detailed bug in a while. A fix might require some radical changes to the internals, though.
Keywords: checkin-needed
Updated•11 years ago
|
Attachment #8403519 -
Attachment is obsolete: true
Comment 20•11 years ago
|
||
Keywords: checkin-needed
Comment 21•11 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 11 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 31
Comment 22•11 years ago
|
||
Verified fixed on Windows 7 64bit, Ubuntu 13.10 32bit and Mac OSX 10.7.5 using Nightly 31.0a1 (buildID: 20140428030203).
Status: RESOLVED → VERIFIED
You need to log in
before you can comment on or make changes to this bug.
Description
•