Closed Bug 216399 Opened 21 years ago Closed 20 years ago

RFE: Allow custom button labels in xpinstall dialogs

Categories

(Core Graveyard :: Installer: XPInstall Engine, enhancement)

enhancement
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED
mozilla1.8beta1

People

(Reporter: Len, Assigned: jens.b)

Details

Attachments

(2 files, 7 obsolete files)

User-Agent:       Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.4b) Gecko/20030516 Mozilla Firebird/0.6
Build Identifier: 

This RFE is motivated by the choice being offered to the
user of where to install a Browser extension.  Currently
this dialog has only the JavaScript builtin function
confirm() for this, with its limitation of "OK" and "Cancel"
as the only button labels available.

Even the best of several versions of this dialog in use is quite 
awkward and confusing:
    "Press OK to install to the current profile directory.
     Press Cancel to install to the global Firebird directory"
       [OK]   [Cancel]

Besides requiring very careful reading, this dialog misleads
the user into worrying that the operation may be cancelled.

With the enhancement requested it could be something much
clearer, such as:

  "Do you want to install this extension
   to the current Profile directory, 
   or to the Global application directory?"
       [Profile]    [Global]

The confirmEx() function in the nsIPromptService component
provides exactly the functionality required.

So perhaps this RFE should be titled something like one of:
 - make the confirmEx() function available to the install object
 - make a Components object available to the install process

Feel free to rename this bug to whatever is most
appropriate.  (Also feel free to change the component of
this bug, as I couldn't see anything for XPCOM nor XPInstall)

(There is more discussion of this topic in
http://forums.mozillazine.org/viewtopic.php?t=20148&start=15 )


Reproducible: Always

Steps to Reproduce:
1.
2.
3.
Over to right component
Component: Downloading → Installer: XPInstall Engine
Product: Firebird → Browser
Version: unspecified → Trunk
Reassigning bug to owner and QA contact of that component.
Assignee: blake → ssu
QA Contact: asa → gbush
This was filed as a firefox bug, but Firefox no longer requires install scripts
and automatically manages install location. Does someone want this for the suite?
> Does someone want this for the suite?

Yes. It's still a valid RFE there.
Taking. I'll try to come up with a patch within the next week(s).
Assignee: ssu0262 → jens.b
Okay, I only recently started working. I'm confident to have a patch within the
next two weeks (yes, holidays are great)...
Status: NEW → ASSIGNED
Status update: the custom button labels part works, but the optional checkbox
provided by confirmEx does not yet. Although the latter is not really needed
according to the original bug description, I'd like to have the full confirmEx
functionality in XPInstall.
Attachment #170175 - Flags: review?(dveditz)
Attaching an example for install.js that demonstrates how to use custom buttons
with or without a checkbox.
Attached patch patch v2 (obsolete) — Splinter Review
Updated patch to adress dveditz's remarks:
- overloading confirm() instead of introducing confirmEx
- improving alert() and confirm() to show the installation's display name (set
in initInstall call), if available, as the dialog title
Attachment #170183 - Flags: review?(dveditz)
Attachment #170175 - Attachment is obsolete: true
Attachment #170175 - Flags: review?(dveditz)
Attaching an updated example. Note how the BUTTON_POS_0 constant is used to
detect the extended confirm support. Also demonstrates the new title logic for
alert/confirm.
Attachment #170177 - Attachment is obsolete: true
Flags: blocking1.8a6?
not a blocker but we'd consider taking a reviewed patch.
Flags: blocking1.8a6? → blocking1.8a6-
Comment on attachment 170183 [details] [diff] [review]
patch v2

Thanks for using more than the default 3 lines of context. In the future please
also use the "-p" cvs diff option.

> nsInstall::Alert(nsString& string)
>-    return ui->Alert( GetTranslatedString(NS_LITERAL_STRING("Alert").get()),
>-                      string.get());
>+    const PRUnichar *title;
>+    if (!mUIName.IsEmpty())
>+    {
>+      title = mUIName.get();
>+    }
>+    else
>+    {
>+      title = GetTranslatedString(NS_LITERAL_STRING("Alert").get());
>+    }
>+    return ui->Alert( title, string.get());

Now I'm a little worried install spoofers will use a blank pretty name, or try
to spoof some other dialog with a creative name. On the other hand, if an
installer is already running to be able to call these functions you're already
toast if it's a malicious installer. Ok, it's good as is, and I filed bug
277041 to think about ways to improve the text.

> PR_STATIC_CALLBACK(JSBool)
> InstallConfirm(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
> {
>   nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
>   nsAutoString b0;
>+  PRUint32 flags = 0;
>+  nsAutoString b1;
>+  nsAutoString b3;
>+  nsAutoString b4;
>+  nsAutoString b5;
>+  nsAutoString b6;
>+  JSObject* b7;

These need better names. As we've mucked in these files over time we've changed
the original auto-generated b0 etc here and there. Definitely don't want to
perpetuate this if you're adding so many variables.

>+  else if(argc == 8)
>+  {
>+    //  public int InstallConfirm (String aDialogTitle,
>+    //                             String aText,
>+    //                             Number aButtonFlags,
>+    //                             String aButton0Title,
>+    //                             String aButton1Title,
>+    //                             String aButton2Title,
>+    //                             String aCheckMsg,
>+    //                             Object aCheckState);

I'm OK with this for the freeze, but if all those extra parameters are
unnecessary (at times) why require placeholders? That is, the flags might say
what button text to use, and there may not be a check message or a check state
return, and if the script author doesn't need those things why not make it easy
on them and supply defaults?

Then you don't need to call both confirm() and confirmEx() on the backend, you
just call confirmEx() with the default arguments if they aren't specified.

waffling on this one...
Comment on attachment 170183 [details] [diff] [review]
patch v2

r-, I want a new patch with descriptive variable names at least.
Attachment #170183 - Flags: review?(dveditz) → review-
(In reply to comment #13)
> >+  else if(argc == 8)
> >+  {
> >+    //  public int InstallConfirm (String aDialogTitle,
> >+    //                             String aText,
> >+    //                             Number aButtonFlags,
> >+    //                             String aButton0Title,
> >+    //                             String aButton1Title,
> >+    //                             String aButton2Title,
> >+    //                             String aCheckMsg,
> >+    //                             Object aCheckState);
> 
> I'm OK with this for the freeze, but if all those extra parameters are
> unnecessary (at times) why require placeholders? That is, the flags might say
> what button text to use, and there may not be a check message or a check state
> return, and if the script author doesn't need those things why not make it easy
> on them and supply defaults?

What do you mean with "supply defaults" - do you suggest having new variants
with e.g. only 6 parameters (without checkbox), and/or having one without button
flags (auto-detect how many buttons are needed)?

> Then you don't need to call both confirm() and confirmEx() on the backend, you
> just call confirmEx() with the default arguments if they aren't specified.

But that wouldn't change anything for the author, right? I mean with the one-arg
call, he'd get the defaults, and with the 8-arg-call, he couldn't help but
overwrite the defaults...
Attached patch patch v3 (obsolete) — Splinter Review
Descriptive variable names
Attachment #170183 - Attachment is obsolete: true
Attachment #170281 - Flags: review?(dveditz)
Comment on attachment 170281 [details] [diff] [review]
patch v3

>   nsInstall *nativeThis = (nsInstall*)JS_GetPrivate(cx, obj);
>-  nsAutoString b0;
>+  nsAutoString aDialogTitle;
>+  nsAutoString aText;
>+  PRUint32 aButtonFlags = 0;
>+  nsAutoString aButton0Title;
>+  nsAutoString aButton1Title;
>+  nsAutoString aButton2Title;
>+  nsAutoString aCheckMsg;
>+  JSObject* aCheckState;

Thanks. However, we use the 'a' prefix to indicate arguments passed in and
these are locals. "dialogTitle" (or just "title") is better than
"aDialogTitle", etc.

This also raised my awareness that now we have confirm(text) and confirm(title,
text, ...). It works, but it's going to confuse people. Better to treat it as
if it were a single confirm(text, [title, flags, etc]) function with optional
args rather than two separate functions with completely different args.

I don't care about the order of the C++ version, you can leave that one
matching nsIPrompt if you like.

> What do you mean with "supply defaults" - do you suggest having new variants
> with e.g. only 6 parameters (without checkbox), and/or having one without button
> flags (auto-detect how many buttons are needed)?

Yes, pretty much. Everything after the flags could default to blank in a lot of
useful cases.

...
+  PRUint32 aButtonFlags = nsIPromptService::STD_OK_CANCEL_BUTTONS;
...
   if (argc >= 3)  // instead of 8, and we won't object to 9 or more
		   // in case someone adds more in the future
   {
... go ahead and check flags for numeric, bail if required
      JSObject* checkObj = 0;  // initialize this! (was aCheckState)
      ConvertJSValToStr(text, cx argv[0]);
      ConvertJSValToStr(title, cx, argv[1]);
      buttonFlags = JSVAL_TO_INT(argv[2]);

      if (argc > 3)
	 ConvertJSValToStr(button0, cx, argv[3]);
      if (argc > 4)
	 ConvertJSValToStr(button1, cx, argv[4]);
     ... etc...
     if (argc > 7 && JSVAL_IS_OBJECT(argv[7])) // why care about null, just
ignore others
	checkObj = JSVAL_TO_OBJECT(argv[7]);
	...

>+    // Only save back checkState when an object was passed as last parameter
>+    if (jsCheckState)

This would be better as "if (checkObj)", which is now initialized to null.
Checking the jsval works (if you initialize it), but it's not appropriate to
use a jsval as a boolean.

still r-, but almost there. btw if it's getting too late I can check in for you
if the next patch is OK.
Attachment #170281 - Flags: review?(dveditz) → review-
Attached patch patch v4 (obsolete) — Splinter Review
- Makes all parameters beside the confirm-text optional, allows a two-arg
confirm(text, title).
- Stays backward-compatible with the old confirm() call: returns 0=OK/first
button, 1=Cancel/second button/window closed, 2=Third button. Note that this is
different behaviour than nsPromptService's confirmEx.
- Polish: removes internal confirm() calls that are no longer used.

Re-applying this on the current, unmodified xpinstall/ files builds and works
correctly; the previous patches did not include neccessary xpinstall/public/
changes.
Attachment #170281 - Attachment is obsolete: true
Attachment #170337 - Flags: review?(dveditz)
(In reply to comment #18)
> - Stays backward-compatible with the old confirm() call: returns 0=OK/first
> button, 1=Cancel/second button/window closed, 2=Third button.

I mixed it up in this comment, actually it's:
 0 (false)     = Cancel/second button/window closed
 1 (true)      = OK/first button
 2 (also true) = Third button

So we really only add a third possible return value here.
Comment on attachment 170337 [details] [diff] [review]
patch v4

r/sr=dveditz
Attachment #170337 - Flags: superreview+
Attachment #170337 - Flags: review?(dveditz)
Attachment #170337 - Flags: review+
Comment on attachment 170337 [details] [diff] [review]
patch v4

+      title = GetTranslatedString(NS_LITERAL_STRING("Alert").get());
+    }
+    return ui->Alert( title, string.get());

this is a memory leak...

public/nsPIXPIProxy.idl

this needs a new IID
I'll address biesi's comments in a new patch.
Target Milestone: --- → mozilla1.8beta
Attached patch patch v5 (obsolete) — Splinter Review
Fixed the memory leaks (they were in the old code, too). However, I left the
old IID as bumping it resulted in my build not showing any alerts/confirms at
all.

Requesting r from biesi as he spotted the leaks. Is the sr carried over from
the last patch, or should I request it again?
Attachment #170337 - Attachment is obsolete: true
Attachment #171198 - Flags: review?(cbiesinger)
Comment on attachment 171198 [details] [diff] [review]
patch v5

+ title = aDialogTitle.get();

I'd rather you didn't do that... this forces a string copy. instead, do:
  title = aDialogTitle;
which can often share the buffer.
Attachment #171198 - Flags: review?(cbiesinger) → review-
Fixed that.

Oh, and I forgot to mention: patches v5/6 add another thing (sponsored by
timeless): A hard-coded fallback for the "Confirm" or "Alert" titles in case
they're not translated . Although that's unlikely, the fallback doesn't hurt
either (and is always better than an empty title).
Attachment #171198 - Attachment is obsolete: true
Attachment #171199 - Flags: review?(cbiesinger)
Attachment #171199 - Flags: superreview?(dveditz)
Attachment #171199 - Flags: review?(cbiesinger) → review+
Attachment #171199 - Attachment description: patch v6 → v6: fixes memory leaks, adds fallback in case GetTranslatedString() fails
Comment on attachment 171199 [details] [diff] [review]
v6: fixes memory leaks, adds fallback in case GetTranslatedString() fails

sr=dveditz
I'm OK not revving the IID for nsPIXPIProxy, it's private.
Attachment #171199 - Flags: superreview?(dveditz) → superreview+
Attached patch v7: minor tweaksSplinter Review
Sorry to obsolete a reviewed patch once again, but timeless convinced me to
make some minor changes. This one includes a real change, though - a clearer IF
block for the 'checkState' parameter check (search for 'JS_GetProperty' to find
it) - so I need new reviews. The rest fixes incorrect indentation, improves
comments and fixes javadoc. I recommend diffing it to the previous one to see
the changes.
Attachment #171199 - Attachment is obsolete: true
Attachment #172287 - Flags: superreview?(dveditz)
Attachment #172287 - Flags: review?(dveditz)
Comment on attachment 172287 [details] [diff] [review]
v7: minor tweaks

r/sr=dveditz on the differences between this and the previously reviewed patch.
Attachment #172287 - Flags: superreview?(dveditz)
Attachment #172287 - Flags: superreview+
Attachment #172287 - Flags: review?(dveditz)
Attachment #172287 - Flags: review+
Patch checked in.
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Are you planning on documenting this anywhere?
(In reply to comment #30)
> Are you planning on documenting this anywhere?

Sure, I want to get this up on developer.mozilla.org soon - in a way that will
fit into the XPInstall API once the Netscape DevEdge content is transferred.
(In reply to comment #30)
> Are you planning on documenting this anywhere?

Draft documentation is up at DevMo, right inside the XPInstall API Reference.

Current location (during DevMo alpha phase):
http://developer-test.mozilla.org/docs/XPInstall_API_Reference:Install_Object:Methods:confirm
Feel free to suggest (or just make) changes over there.
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: