Closed Bug 1448804 Opened 6 years ago Closed 6 years ago

Point users to a feedback form at the end of the uninstall process

Categories

(Firefox :: Installer, defect, P1)

defect

Tracking

()

RESOLVED FIXED
Firefox 63
Tracking Status
firefox63 + fixed

People

(Reporter: RT, Assigned: molly)

References

Details

User Story

As a product manager I want to understand how many people uninstall Firefox on Windows, where and why so I can understand the churn reasons better and act accordingly.

Acceptance criteria:
- Add a checkbox on the finish page of the uninstaller allowing users to enter a survey
- When the user hits "finish" at the end of the uninstall process on windows, close the uninstall wizard and open a link pointing to a survey (https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall) if the checkbox was checked.
- The link should include query parameters allowing to pass information about the OS version, the channel and the Firefox version uninstalled (We can pass in whatever we want using URL Variables, as long as they are known before).Survey language is based on geo so we don't need to worry about it (en-US, de, fr, ru, es-ES, pt-BR, pl, it, en-GB (top 9 locales) account for 85% of our DAU. We could localize only these and then fall-back to en-US)

- The form should gather analytics about the browser used to open the form (new default browser), count and geography
- All uninstalls would be exposed to the survey opt-in checkbox

TBD:
- Legal clearance of https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall

Attachments

(3 files)

Point users to an uninstall form at the end of the uninstallation process.
User Story: (updated)
User Story: (updated)
User Story: (updated)
User Story: (updated)
User Story: (updated)
Depends on: 1451279
User Story: (updated)
Rob, per discussion on bug 1451279, a URL from qsurvey.mozilla.org will be fine for our needs here, can you please help provide one for us to use in the client?
Flags: needinfo?(rrayborn)
Romain,
 We will want to work to design the survey soon (as this URL points to an empty survey), but here is a URL:

https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall

You can pass through whatever URL variables you want, we will be able to capture them on the survey side.
Flags: needinfo?(rrayborn)
User Story: (updated)
I'm updating the user story to set the share of uninstall users exposed to the survey to 10%. This would be using a mechanism where the uninstaller picks a random number based on a high-resolution timer or a similar approach, and picks the 10% sample from that. 
Doing this through Shield does not sound appropriate given this potentially would have to remain available for ever and Shield is designed to managed surveys for a definite duration.
We can still adjust the 10% value later based on what we learn when this ships, although understanding that only new installs would see the 10% value change.
User Story: (updated)
(In reply to Romain Testard [:RT] from comment #4)
> We can still adjust the 10% value later based on what we learn when this
> ships, although understanding that only new installs would see the 10% value
> change.

We would deploy the changed value through app updates as well, not only for new installs.
What number of users uninstall Firefox per-day? If we are only displaying to 10% of users, and then this requires opting-in AND the user to actually fill out the survey, I think the funnel will have such a massive drop-off that we will see few users actually take this survey. Compounding that, my theory is that few users who stop using Firefox actually uninstall it, but just install a new browser and switch over.

I'm beginning to wonder about the usefulness of this at this point.
(In reply to Tyler Downer [:Tyler] from comment #6)
> What number of users uninstall Firefox per-day?
We don't have that data currently

 If we are only displaying to
> 10% of users, and then this requires opting-in
This is opt-out, this is now clarified in the user story.

 AND the user to actually fill
> out the survey, I think the funnel will have such a massive drop-off that we
> will see few users actually take this survey. Compounding that, my theory is
> that few users who stop using Firefox actually uninstall it, but just
> install a new browser and switch over.
> 
> I'm beginning to wonder about the usefulness of this at this point.
It's hard to assess how many uninstalls we get. I agree that starting at 10% may require increasing that throttle if we realize volume is too low. We could start at 100% and then decrease if volume is too high obviously. As Matt mentioned the throttle value can be adjusted through app update. 
I'll reach out to discuss and get to an agreement on a good share of users to expose to the survey.
User Story: (updated)
> (In reply to Tyler Downer [:Tyler] from comment #6)
> > What number of users uninstall Firefox per-day?
> We don't have that data currently
> 
>  If we are only displaying to
> > 10% of users, and then this requires opting-in
> This is opt-out, this is now clarified in the user story.
> 
Correcting myself, this is opt-in per chat with legal - user story corrected
User Story: (updated)
User Story: (updated)
User Story: (updated)
Given that this survey has to be opt-in we won't be able to reliably quantify uninstalls. 
Bug 1461690 will help quantify uninstalls (telemetry uninstall ping) and we'll still ship this survey ahead of bug 1461690. Bug 1461690 will help understand statistical significance of the feedback gathered as well as other benefits outlined on the bug.
Michelle, can you please help validate the string we should be using for the opt-in checkbox in the uninstaller?
Proposal: I want to give details to Mozilla about why I just uninstalled Firefox.
Flags: needinfo?(mheubusch)
US updated with latest details.
The opt-in checkbox should be exposed to all users given this is only opt-in so it helps us get a reasonable number of answers.
Mika, could you please review that the survey is OK from a legal standpoint?
https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall
User Story: (updated)
Flags: needinfo?(udevi)
User Story: (updated)
(In reply to Romain Testard [:RT] from comment #10)
> Michelle, can you please help validate the string we should be using for the
> opt-in checkbox in the uninstaller?
> Proposal: I want to give details to Mozilla about why I just uninstalled
> Firefox.

Hi Michelle, we want to ship this with 63, can you please help confirm the string is correct?
This will appear on the Windows uninstaller on the Finish page along with an opt-in check-box to enter a survey (Web-based on https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall)
Clearing NI to Mika since this was discussed separately through e-mail.
Flags: needinfo?(udevi)
Assignee: nobody → mhowell
Status: NEW → ASSIGNED
Priority: -- → P1
Comment on attachment 8990774 [details]
Bug 1448804 Part 2 - Offer an opt-in survey at the end of the Windows uninstaller.

https://reviewboard.mozilla.org/r/255826/#review262608

::: browser/locales/en-US/installer/custom.properties:71
(Diff revision 1)
>  STATUS_INSTALL_APP=Installing $BrandShortName…
>  STATUS_INSTALL_LANG=Installing Language Files (${AB_CD})…
>  STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName…
>  STATUS_CLEANUP=A Little Housekeeping…
>  
> +UN_SURVEY_CHECKBOX_LABEL=I want to give details to Mozilla about why I just uninstalled Firefox.

This may or may not be the final string, I'll wait to land the patch until that's confirmed.
Comment on attachment 8990773 [details]
Bug 1448804 Part 1 - NSIS plugin for creating unelevated processes from an elevated [un]installer.

https://reviewboard.mozilla.org/r/255824/#review262654

I'd like to see one more iteration of this.

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:34
(Diff revision 1)
> +  IShellView* view = nullptr;
> +  IShellWindows* shell = nullptr;
> +  CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_LOCAL_SERVER,
> +                   IID_PPV_ARGS(&shell));
> +  if (shell) {
> +    VARIANT empty = {};

I'd prefer using VariantInit() here

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:37
(Diff revision 1)
> +                   IID_PPV_ARGS(&shell));
> +  if (shell) {
> +    VARIANT empty = {};
> +    HWND windowHandle = 0;
> +    IDispatch* dispatch = nullptr;
> +    shell->FindWindowSW(&empty, &empty, SWC_DESKTOP, (long*)&windowHandle,

The first parameter is supposed to be CSIDL_DESKTOP

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:41
(Diff revision 1)
> +    IDispatch* dispatch = nullptr;
> +    shell->FindWindowSW(&empty, &empty, SWC_DESKTOP, (long*)&windowHandle,
> +                        SWFO_NEEDDISPATCH, &dispatch);
> +    if (dispatch) {
> +      IServiceProvider* provider = nullptr;
> +      dispatch->QueryInterface(IID_IServiceProvider, (void**)&provider);

I guess you could use IID_PPV_ARGS here for consistency

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:63
(Diff revision 1)
> +
> +static IShellDispatch2*
> +GetApplicationFromShellView(IShellView* view)
> +{
> +  IShellDispatch2* shellDispatch = nullptr;
> +  HRESULT hr = view->GetItemObject(SVGIO_BACKGROUND, IID_IDispatch,

This looks like a leak. Please use a different pointer for the outparam.

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:83
(Diff revision 1)
> +  return shellDispatch;
> +}
> +
> +static bool
> +ShellExecInExplorerProcess(wchar_t* path)
> +{

As per our discussion on IRC, I'd suggest that you wrap this with CoInitialize/CoUninitialize to ensure that we have COM; it'll just bump a refcount if NSIS has already done so.

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:87
(Diff revision 1)
> +ShellExecInExplorerProcess(wchar_t* path)
> +{
> +  bool rv = false;
> +  IShellView *desktopView = GetDesktopWindowShellView();
> +  if (desktopView)
> +  {

Nit: indentation style

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:148
(Diff revision 1)
> +  stack_t *th;
> +  if (!stacktop) {
> +    return;
> +  }
> +
> +  th = (stack_t*)GlobalAlloc(GPTR, sizeof(stack_t) + len);

Casting directly from HGLOBAL to other types (without jumping through GlobalLock) makes me queasy. Is this a common NSIS-ism?
Attachment #8990773 - Flags: review?(aklotz) → review-
Depends on: 1474456
Comment on attachment 8990773 [details]
Bug 1448804 Part 1 - NSIS plugin for creating unelevated processes from an elevated [un]installer.

https://reviewboard.mozilla.org/r/255824/#review262654

> Casting directly from HGLOBAL to other types (without jumping through GlobalLock) makes me queasy. Is this a common NSIS-ism?

It is. It's probably not the only common NSIS-ism that would make you queasy, along with any other reasonable person. It's easy enough to just change this to HeapAlloc though.
Comment on attachment 8990774 [details]
Bug 1448804 Part 2 - Offer an opt-in survey at the end of the Windows uninstaller.

https://reviewboard.mozilla.org/r/255826/#review263130

Looks good once the string is finalized (and parameterized)!
Attachment #8990774 - Flags: review?(agashlin) → review+
Can you change the initial sentence to Firefox has been uninstalled. Can you tell us why you left?

Otherwise it's good to go.
Flags: needinfo?(mheubusch)
Attached image Finish Page w/ checkbox
Just to confirm, the screen does already say "Firefox has been uninstalled from your computer.", so does the checkbox label need to restate that? I'll attach a screenshot to illustrate what that screen looks like; for some reason I thought there already was one around somewhere, sorry. The checkbox (and label) near the center is the only thing we're adding here, the rest is what's there already.
Flags: needinfo?(mheubusch)
Comment on attachment 8990773 [details]
Bug 1448804 Part 1 - NSIS plugin for creating unelevated processes from an elevated [un]installer.

https://reviewboard.mozilla.org/r/255824/#review263176

r=me with the issue fixed.

::: other-licenses/nsis/Contrib/ExecInExplorer/ExecInExplorer.cpp:72
(Diff revisions 1 - 2)
>  
>  static IShellDispatch2*
>  GetApplicationFromShellView(IShellView* view)
>  {
>    IShellDispatch2* shellDispatch = nullptr;
> -  HRESULT hr = view->GetItemObject(SVGIO_BACKGROUND, IID_IDispatch,
> +  IDispatch* viewDisp = nullptr;

I think you still need to release viewDisp when you're done with it.
Attachment #8990773 - Flags: review?(aklotz) → review+
Comment on attachment 8991384 [details]
Finish Page w/ checkbox

Oh - I looked at the wrong attachment (the websurvey itself). Two suggestions:

1. Move the checkbox above the instruction to select Finish to close the wizard, so users at least see it before they select finish.  
2. Change the wording to "Tell Mozilla why you uninstalled Firefox" Note there is no period at the end of the checkbox label
I'm also wondering if you can make that a link instead of a check box - that will signal that they are going to a webpage. (Not sure if that's feasible).
Flags: needinfo?(mheubusch)
(In reply to mheubusch from comment #25)
> Comment on attachment 8991384 [details]
> Finish Page w/ checkbox
> 
> Oh - I looked at the wrong attachment (the websurvey itself). Two
> suggestions:
> 
> 1. Move the checkbox above the instruction to select Finish to close the
> wizard, so users at least see it before they select finish.  
> 2. Change the wording to "Tell Mozilla why you uninstalled Firefox" Note
> there is no period at the end of the checkbox label
> I'm also wondering if you can make that a link instead of a check box - that
> will signal that they are going to a webpage. (Not sure if that's feasible).

Okay, thanks. I can't easily move the checkbox, so I'll go with option 2. A link would be preferable, but unfortunately it doesn't work because of the hoops we have to jump through to start the user's browser in a secure way.
Pushed by mhowell@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/0987d300d69e
Part 1 - NSIS plugin for creating unelevated processes from an elevated [un]installer. r=aklotz
https://hg.mozilla.org/integration/autoland/rev/c2c011ae3954
Part 2 - Offer an opt-in survey at the end of the Windows uninstaller. r=agashlin
https://hg.mozilla.org/mozilla-central/rev/0987d300d69e
https://hg.mozilla.org/mozilla-central/rev/c2c011ae3954
Status: ASSIGNED → RESOLVED
Closed: 6 years ago
Resolution: --- → FIXED
Target Milestone: --- → Firefox 63
Depends on: 1491043
Depends on: 1497907
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: