Open Bug 1017919 Opened 10 years ago Updated 2 years ago

Reset Firefox: Preserve extensions but disable all of them

Categories

(Firefox :: Migration, enhancement, P2)

enhancement

Tracking

()

Firefox 57

People

(Reporter: MattN, Unassigned)

References

(Blocks 1 open bug, )

Details

(Keywords: feature, Whiteboard: [fxgrowth])

A part of the initial Reset Firefox work that didn't get implemented was preserving the extensions but disabling them.
Flags: firefox-backlog?
Yes. This is the last deterrent to using or recommending reset. If a user has a legitimate add-on that they use, a reset deletes it and all of its data. It would be great if we can do this.
Flags: firefox-backlog? → firefox-backlog+
Depends on: 1053594
Whiteboard: [fxgrowth]
(In reply to Verdi [:verdi] from comment #1) > Yes. This is the last deterrent to using or recommending reset. If a user > has a legitimate add-on that they use, a reset deletes it and all of its > data. It would be great if we can do this. We would still be deleting all of the add-on's data because we remove prefs (except for the homepage pref, IIRC) and don't copy over extra sqlite tables that they might create, or any other data. Keeping all the prefs would quite often lead to re-breaking the thing people use reset for. There is no way to really distinguish the add-on prefs, and some add-ons modify built-in Firefox prefs, where if we reset those but keep the add-on prefs and they keep track of "did we do first run stuff", we'll likely break that kind of mechanism. So I would prefer not to (try to) migrate add-on prefs. If people re-enable add-ons, they can/will then set up the same prefs they had in the add-ons, and/or could copy over files from the backed up profile.
When Matt and I talked about this, I understood that there was a way to preserve an add-on's data. For example, if you were using something like Zotero we would be able to keep your research data.
Flags: needinfo?(MattN+bmo)
From the URL linked in the bug: > do we want to migrate their add-on prefs as well? – Asa > We don't know which add-on prefs are safe so I suggest not –– MattN Refresh Firefox generally follows a minimalist approach to avoid carrying issues over to the fresh profile. The more we migrate, the bigger chance that a Refresh doesn't solve the user's problem. We could theoretically provide a hook to tell extensions we are doing a refresh and let them stash some data or give us data to stash in the new profile. Then we could also notify them we just finished a refresh in the new profile so they should restore data. Add-ons can already use a Firefox Account/Sync to store data instead. I also prefer that we don't migrate data (at least for an initial implementation) for the above reasons and perhaps this gets easier with WebExtensions in the future.
Flags: needinfo?(MattN+bmo)
Matt, I thought we worked out that it was possible in Bug 1053594.
Flags: needinfo?(MattN+bmo)
That doesn't really say much new other than reminding me about default/preferences/foo.js[1] in bug 1053594 comment 1 but I'm not that familiar with it and don't think it will address the problems we listed. I also already said a way we could implement migration of settings in comment 4 here. I wonder what happens if default/preferences/*.js defines a new value for our built-in prefs… I'm confused about your insistence on migrating settings when it will make reset less effective (depending on the extensions installed). [1] https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Handling_Preferences#Adding_preferences_to_an_extension
Flags: needinfo?(MattN+bmo)
Matt and I talked and thought we should discard the requirement to migrate add-on data at this time. Let's look into that again with when we have a new add-on system.
Priority: -- → P3
Whiteboard: [fxgrowth] → [fxgrowth][Onboarding]
Priority: P3 → P2
Dão, we talked about this bug last meeting - are you currently working on it? If not, I think I could take a look at it, but I don't want to steal what isn't mine. Could you let me know? Thanks! :-)
Flags: needinfo?(dao)
I haven't started, feel free to take this.
Flags: needinfo?(dao)
Assignee: nobody → gijskruitbosch+bugs
Status: NEW → ASSIGNED
22:36 Gijs_away Mossop: is there documentation about how we store add-on enabled states in the profile? 22:36 Mossop Gijs_away: Not really, why do you ask? 22:37 Mossop Because it's pretty awful 22:37 Gijs_away Mossop: we want to basically copy add-ons over for firefox refresh, but disable all of them 22:37 Gijs_away (and I expect that really means: all of the non-system ones) 22:37 Gijs_away Mossop: so fx refresh works by just creating a new profile, and then copying what we want, leaving out all the stuff we don't want 22:38 Mossop Gijs_away: Oh, well that should be easy. Copy the extensions folder over but not the database and then they'll automatically be disabled on startup 22:38 Gijs_away Mossop: copying the extensions/ dir is pretty easy... 22:38 Gijs_away Mossop: oh. Um, OK. 22:38 Gijs_away Mossop: how do we determine that they exist? Do we just check that dir on startup? 22:38 Gijs_away won't they appear to be sideloaded? 22:38 Mossop Hrm, I guess though we'll label them as foreignInstalls in that case. Maybe you do want to do the database and mangle it. It's just a json bloc 22:38 Mossop s/bloc/blob/ 22:39 Gijs_away Mossop: I see a sqlite file in this one profile I have... is that just old? 22:39 Mossop Yes 22:39 Gijs_away ok 22:39 Gijs_away the other thing is obviously not all add-ons will be in that folder 22:39 Mossop You want to set userDisabled and active properties to true and false respectively 22:39 Gijs_away Right, OK 22:40 Mossop Oh 22:40 Mossop Gijs_away: Except that will disable the default theme too! So don't do it for that one! 22:40 Gijs_away lol 22:40 Gijs_away yet another place where we get to hardcode the uuid, wheee 22:41 Mossop I think we have safeguards to correct in that case, but I don't know how good they are 22:41 Gijs_away Mossop: and I guess there's a pref for the theme in use... 22:41 Gijs_away though we don't copy prefs 22:41 Gijs_away and the default should be classic/1.0 22:41 Gijs_away or whatever that is 22:41 Gijs_away so that should be OK 22:41 Gijs_away Mossop: lightweight themes? Where are those? 22:41 Mossop Yeah, and there is also extensions.ini 22:41 Mossop I think we rebuild if that is missing on startup though 22:42 Mossop Gijs_away: They're in prefs 22:42 Gijs_away Oh. 22:42 Mossop Horribly 22:42 Gijs_away So I guess I get to prod around prefs for those 22:42 Gijs_away that's suboptimal 22:42 Gijs_away also I bet we cache the images 22:42 Gijs_away and so quite conceivably you get the cached images 22:42 Gijs_away move on with life 22:43 Gijs_away and 2 years later you refresh Firefox and the original lwt is gone for whatever reason 22:43 Gijs_away hrmpf 22:44 Mossop Gijs_away: We cache them as files in the profile IIRC 22:45 Gijs_away oh, and we reuse the filenames... 22:45 * Gijs_away is reading https://dxr.mozilla.org/mozilla-ce...ghtweightThemeImageOptimizer.jsm 22:47 Gijs_away gah 22:47 Gijs_away this might need to be followup material :s 22:58 Mossop Gijs_away: Hmm. Do you want experiments too? It's probably a bad idea to copy them over and they're in the extensions directory 22:59 Gijs_away Mossop: not particularly, no... 22:59 Gijs_away Mossop: I think we really only care about user-installed add-ons 23:00 Mossop Then you'll want to filter the experiments out. The database will also contain updated system add-ons but it will auto-correct when it spots they are missing 23:00 Mossop Gijs_away: Maybe you should needinfo me on the bug, I'm bound to think of a few problems given some time --> ni for Mossop.
Flags: needinfo?(dtownsend)
This is challenging because we have all kinds of restrictions in place to attempt to block other applications from injecting add-ons into a profile. In one aspect that is ideal, sideloaded add-ons are automatically marked as disabled. But we also flag them in the database as forever sideloaded and currently require a higher level of signing (though that is going away in bug 1245956) and it may cause other behaviours in the future. So I think we want to avoid that, but that means bypassing the sideloading detection code somehow. Since we periodically make changes to that to catch bad actors unless we have good testing in place for this feature we're likely to break it by accident. My understanding is that Firefox reset has no tests currently, so that's a big concern. We might be able to take care of it with an xpcshell test if we're really careful. So there are three classes of extensions we care about. Those that come with the application (system add-ons and the default theme), those that are sideloaded on the user's system and those in the profile. The first two are easy, when Firefox starts it will do the right thing with them (once bug 1249074 is fixed), that is install and enable those that come with the app and disable those that are sideloaded and mark them as such. The profile add-ons are harder. We need to make Firefox think they aren't sideloaded (when appropriate) and yet make Firefox call the bootstrap install hook for those add-ons that are restartless. So we basically have to trick Firefox into thinking they are staged installs by copying them to the staging directory in the profile and write out their extended metadata as a json blob that Firefox will read to import additional data like compatibility info and we'll have to add support to that for making them disabled and copying over some of the properties like the sideloading state. This is a method of sideloading that cheats the system and I'd really like to get rid of, so there's that!
Flags: needinfo?(dtownsend)
Depends on: 888624
Not currently working on this.
Assignee: gijskruitbosch+bugs → nobody
Status: ASSIGNED → NEW
Just like Comment 10, it works (I tried it). > Copy the extensions folder over but not the database and then they'll automatically be disabled on startup We could backup all xpi files in the extensions directory and put them back into the new profile's extensions directory during the Refresh Firefox process. The all add-on will be shown but disable on the about:addons page after reseting and restarting the Firefox. And it seems we need to update the `CreateResetProfile` or `ProfileResetCleanup` methods in the `ProfileReset.cpp` file to change the behavior of Refresh Firefox process and fix the issue. [1]: http://searchfox.org/mozilla-central/source/toolkit/xre/ProfileReset.cpp#37
(In reply to Evan Tseng [:evanxd] from comment #13) > Just like Comment 10, it works (I tried it). > > Copy the extensions folder over but not the database and then they'll automatically be disabled on startup > > We could backup all xpi files in the extensions directory and put them back > into the new profile's extensions directory during the Refresh Firefox > process. The all add-on will be shown but disable on the about:addons page > after reseting and restarting the Firefox. > > And it seems we need to update the `CreateResetProfile` or > `ProfileResetCleanup` methods in the `ProfileReset.cpp` file to change the > behavior of Refresh Firefox process and fix the issue. > > [1]: > http://searchfox.org/mozilla-central/source/toolkit/xre/ProfileReset.cpp#37 No, that's not the right place to fix it. You should update the FirefoxProfileMigrator.js file.
Blocks: 1351641
Thanks for the tips, Gijs. We will come back to work on this after we ensure we would like to deliver this at this stage (release 57) and this is a P1 bug.
Flags: firefox-backlog+
Whiteboard: [fxgrowth][Onboarding] → [photon] [fxgrowth] [Onboarding]
Whiteboard: [photon] [fxgrowth] [Onboarding] → [photon-onboarding] [fxgrowth]
Blocks: 1351616
No longer blocks: 1268708
Target Milestone: --- → Firefox 57
Based on the Photon Toronto Workweek meeting, we are not going to do auto-referesh (at least having an opt-out checkbox during installation) and after 57 there should only be webextension addons to consider. This bug doesn't affect Photon onboarding so de-scope it from Photon onboarding.
No longer blocks: 1351616
Whiteboard: [photon-onboarding] [fxgrowth] → [fxgrowth]
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.