Closed Bug 30375 Opened 25 years ago Closed 24 years ago

Use "busy" cursor while waiting for a link

Categories

(SeaMonkey :: UI Design, defect, P3)

Tracking

(Not tracked)

RESOLVED FIXED
mozilla0.8

People

(Reporter: keith, Assigned: adamlock)

References

Details

Attachments

(6 files)

From Bugzilla Helper:
User-Agent: Mozilla/5.0 (Windows; N; Win95; en-US) Mozilla/m13
BuildID:    2000022820

when I click a URL in Communicator, I get a nice "watch" cursor (the hourglass)
so I know that I clicked it. in IE and now Mozilla, nothing changes cursor-wise
when I click a link. it's confusing because it's hard to tell whether or not
it's actually doing anything.

Reproducible: Always
Steps to Reproduce:
1. click a link.


Actual Results:  no cursor change!	

Expected Results:  cursor change to 'watch' (the hourglass)
Severity: normal → enhancement
old build, but still an issue... more of an enhancement thought
Status: UNCONFIRMED → NEW
Ever confirmed: true
Summary: a "busy" (watch) cursor would be nice when I click a URL and the browser hasn't resolved/connected yet. → [RFE]a "busy" (watch) cursor would be nice when I click a URL and the browser hasn't resolved/connected yet.
adding 4xp keyword, updating component and owner.
Assignee: cbegle → bdonohoe
Component: Browser-General → User Interface: Design Feedback
Keywords: 4xp
QA Contact: asadotzler → elig
This is a pretty standard behavior and a very important feedback element for

users.  If the machine doesn't respond *immediately* there's no way to know

whether the action was recognized. Consequently, a lot of users will try again

or will try something else.  The throbber isn't good enough, either, because

more often than not, that's not where the user clicked, so that's not what

they're looking at.



It's not that hard to change a cursor...

Status: NEW → ASSIGNED
Since it sounds like an actual bug (per Brendan's comments), reassigning to Don, 
and upping severity to 'Normal'.
Assignee: bdonohoe → don
Severity: enhancement → normal
Status: ASSIGNED → NEW
QA Assigning non-confidential New/Assigned User Interface: Design Feedback bugs 
to Matthew Thomas (mpt@mailandnews.com).

Matthew Thomas is now the QA owner for the User Interface: Design Feedback 
component. (Bugs that involve UI issues in the Netscape-branded Mozilla browser 
should continue be QA assigned to elig@netscape.com.)
QA Contact: elig → mpt
This is crucial to users' impressions of how fast the browser is generally. I 
have seen many occasions where novice- to intermediate-level Internet Explorer 
users click a link and (due to an occasional IE bug) the cursor isn't changed to 
a busy one. They think nothing has happened, so they click the link again. And 
again, and again. Each time they click, of course, the browser restarts the 
connection process from scratch, resulting in a much longer time taken to 
actually open the page.

Mozilla's throbber and indeterminate progress indicators are more obvious than 
those in IE, but it's still better to get immediate feedback right where you 
clicked, i.e. in the cursor.

Nominating for nsbeta2, since it affects user perception of speed and since it 
should be fairly trivial to implement.

Note that you should use the half-busy cursor here (the combination pointer and 
watch/hourglass), to show that it is still possible to click on another link in 
the page while Mozilla is trying to connect to the first link.
URL: n/a
Keywords: nsbeta2
OS: Windows 95 → All
Hardware: PC → All
Summary: [RFE]a "busy" (watch) cursor would be nice when I click a URL and the browser hasn't resolved/connected yet. → Use "busy" cursor while waiting for a link
Putting on [nsbeta2-] radar. Not critical to beta2.
Keywords: nsbeta3
Whiteboard: [nsbeta2-]
Reassigning as per Don
Assignee: don → ben
Target Milestone: --- → M19
I don't know how to do this. I think there's already a style rule in global that 
may specify this, but if it's not applying, I would have no idea why. 

Back to don. 
Assignee: ben → don
Move to M20 target milestone.
Target Milestone: M19 → M20
This bug could also lead a user into submitting form data twice, which could be
*really* bad. Upping to major severity.
Severity: normal → major
Matt, can you figure out how to implement this?  If not, please find the
appropriate person to doom.  I agree with Matthew Thomas, there's a big danger
if we're not providing the right kind of feedback here.
Assignee: don → matt
Target Milestone: M20 → M19
Question: How long should the cursor stay busy?  Should it stay busy while the 
entire page is loading, or just until it gets it from the network and the page 
starts loading?  I'm attaching a patch for this that does the former.

I couldn't get CSS to work directly, instead I used the window.setCursor 
method, passing "spinning" as a parameter (spinning is a new cursor in CSS3 and 
represents the hourglass/arrow combination).  It's not perfect -- the browser 
window sometimes tries to set the cursor back to an arrow... but I think it's a 
lot better than nothing.
(CCing Tim because I don't see him here.)

When does this patch make the cursor kick in? It should be right after the 
browser has decided to load a page, and right before the DNS lookup starts. Is 
that correct?
Keywords: patch
Right now it basically turns the hourglass/arrow on and off at the same time 
the throbber is turned on and off.
Sorry, Tim, didn't answer your questions.
* IE uses the spinning cursor until the moment the new page starts rendering.
  However, my feeling is that you should continue it until the new page
  finishes loading. (That way it gives a subtle indication that incremental
  reflows might cause the layout of the page to change.)
* Using the mixed pointer-and-hourglass is correct (because you can do other
  things while the page is loading, e.g. click on another link).

W.r.t `the browser window sometimes tries to set the cursor back to an arrow': 
what should be happening is that the `spinning' cursor is used *whenever the 
ordinary arrow cursor would normally be used*, and only in those cases. In all 
places where other cursors are specified (sidebar grippy, page elements 
with :cursor style, etc), those specified cursors should still be applied.
Keywords: patch
Yep, tying it to the throbber makes sense. Duh, I didn't think of that. :-)
Could this be causing some of the double bugs? I'm talking about the cases where 
there are two identical bugs submitted at allmost the same time. Fixing this 
could cut down on the number of dupes. 
The patch turns the cursor to the arrow/hourglass combo over ALL elements in 
the page (and browser), which I think makes sense.  So if a new page is in the 
middle of loading and you mouse over a link, it won't change it to the hand 
pointer.  Once the page is loaded of course, it changes it back to "auto", so 
the cursors then work as expected.  

I saw the "patch" keyword on this briefly, but it disappeared for some reason.  
Matt, are you working on this?  Or perhaps Ben can check this in.
Hmmm, ok. This will mean you don't (for example) get the double-arrows cursor 
when mousing over the sidebar grippy while a page is loading ... but loading 
feedback is more important than that, I guess.

[Sorry, I think I removed the patch keyword by mistake in a mid-air collision. 
Reinstating.]
Component: User Interface: Design Feedback → XP Apps: GUI Features
Keywords: patch
Nav triage team: [nsbeta3+] please double plus this.
Whiteboard: [nsbeta2-] → [nsbeta2-][nsbeta3++]
Whiteboard: [nsbeta2-][nsbeta3++] → [nsbeta2-][nsbeta3+]
Whiteboard: [nsbeta2-][nsbeta3+] → [nsbeta2-][nsbeta3+] UE2
I have this in my tree and can check in the patch you submitted.
It has been working pretty well for the most part.  Waiting for the green to go 
normal.
Status: NEW → ASSIGNED
I've been running with it for a while too and I've noticed that some sites just 
want to reset the cursor all of the time.  For example, http://www.news.com .  
My patch tries to account for this somewhat, but it's not completely successful.
Also, I kind of miss the hand cursor feedback when moving over a hyperlink 
while a page is loading.  Ideally it would only show the hourglass when 
hovering over the background of the page.  Both of these probably require a 
more complicated solution than a few lines of Javascript code.  Some cursor 
feedback is better than nothing, I suppose, and IE and Nav4 aren't perfect 
either.  I haven't tested this on a Mac or Unix, by the way.
patch checked in.
Sorry that took so long.

I do see the problem of the hourglass getting reset all the time.
We should file another bug for that.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
I think it's pretty bad that the cursor never changes where it should now after 
you've clicked a link...Is there _any_ better solution to this?
Sorry, I'm reopening this.  We'll have to find a better way to do it; I think 
it's a major loss of feedback that the cursor doesn't change to a hand when 
over a link once you start navigating somewhere.  It seems as if you simply 
can't click the link at all, which isn't true (the same goes for many other 
parts of the UI).
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
I tend to agree that hyperlink cursor feedback is important.  In the long term, 
any time the cursor is set to an arrow, it should use the arrow/hourglass combo 
instead IF the page is currently loading.  This bug may need to be reassigned; 
I'm not sure who owns the various pieces of code that modify the cursor.  

In the short term I might be able to change this to match IE's behavior, which 
only uses the arrow/hourglass in the content area UNTIL the new page starts 
loading (also, it uses the arrow/hourglass in the chrome area the entire 
time).  I still think it's nice to have the arrow/hourglass feedback while the 
page is loading, but the current solution that hides the hyperlink feedback is 
less than ideal.  Also, having this in JavaScript means embedded Gecko 
applications don't get this basic behavior automatically.
See my comments on 2000-07-19: the partially-busy cursor should be `used 
*whenever the ordinary arrow cursor would normally be used*, and only in those 
cases'. Which means, not in the cases where the pointing hand cursor would be 
used.

Is it possible just to piggy-back the case where the ordinary arrow would be 
used, and replace it with the partially-busy cursor?
*** Bug 48804 has been marked as a duplicate of this bug. ***
Right now Linux is using XC_exchange instead of XC_watch, which I find to be
ugly (see bug 48804). This just changed a few days ago. Will a fix for this bug
do something about that? (my guess is yes, so I haven't filed a bug on it.)
In order to replace the arrow cursor with a hourglass/arrow efficiently and in 
all cases, the C++ code needs to be modified.  If Netscape has the resources to 
do this, that would be great.  I might buy a Visual C++ compiler soon to see if 
I could work on it myself, taking a deep breath and saying a few prayers 
beforehand :)

I'm presuming what needs to happen is to add some code around here...
http://lxr.mozilla.org/seamonkey/source/layout/events/src/nsEventStateManager.cp
p#1252
...which adds a special case for using the busy cursor in place of the standard 
arrow whenever the page is loading.  In order to do that, you need to somehow 
communicate with the document in order to retrieve the busy state (not sure 
quite how to do that yet).  Finally you need to make sure the cursor is 
appropriately updated at the beginning and end of the document load.  Sadly I 
can't mentally compile and execute so this is only a guess.
Regarding the Unix cursor.  I agree the cursor used for CSS3 "spinning" in Unix 
is a bit ugly.  The situation will be improved if the hyperlink cursor is used 
for mouseover hyperlinks, but it would still be shown on the page background.  
If you think CSS3 "spinning" should be a different cursor (such as the watch, 
the same as CSS3 "wait"), you should probably file a separate bug.
I've been trying to modify the fix for the problem that the cursor
does not change once a new page is loaded.  I don't have time
to change the c++ code the change the cursor in ever possible case
but it would be good at least cover the case you have been talking about.
Doing the other would be a toolkit bug.
Looks like Mac (bug 49173) and Unix people (bug 48839) really don't like the 
busy cursor appearance.  Even if we handle the case for hyperlinks, I'm 
guessing that the cursor may still be annoying for platforms with less pretty 
cursors than Windows.  I suggest we check the window.navigator.platform string 
at startup to either turn off, or special case this behavior for other 
platforms.  The values are "Windows", "OS/2", "Macintosh", and "X11" (Unix).  
I'm not sure what the current behavior is on the Mac and Unix for Navigator4, 
and IE5/Mac.  Perhaps we can use "wait" (the watch) instead of "spinning" for 
those platforms.  And/or consider just using the busy cursor until the new page 
begins loading.
IMO we shouldn't special-case it, we should leave it how it is and get bug 48839 
and bug 49173 fixed. Using the `wait' cursor would be misleading the user, 
because it would be implying that user input wasn't possible when it actually 
was.

I don't understand why this bug blocks bug 48839, by the way.
nav triage team:
we need to have a final word on what the "right" behavior is.  Matt, Gable and
German should talk about this - reassign to johng for decision.  We need to make
this decision for all related bugs dealing with curser wait indications.
Assignee: matt → johng
Status: REOPENED → NEW
Priority: P3 → P1
I'm currently testing some C++ code I wrote to support busy cursors in all 
DocShells.  It seems to work fairly well so far.  It basically covers the 
embedding case, chrome windows, browser windows -- anything that uses 
nsDocShell to load content.  For example, the busy cursor is displayed when 
switching between the very slow-loading Preferences panels.

The cursor behavior is as follows...
o Not Busy: 
- Appropriate cursor is used when hovering over elements.
o Busy...
- BEFORE a new page starts loading (i.e. connecting to the network):
"Spinning" cursor is used over ALL elements.  This is necessary so when you 
first click on a link, you know immediately that the new page is loading w/o 
having to move the mouse off the link.  Cursor feedback here isn't really too 
important since the existing page is going away.  Exact same behavior as IE 5.
- AFTER the page starts loading:
"Spinning" cursor only used where the arrow/default cursor would otherwise be 
used.  The hand cursor is shown over hyperlinks, for example.  (I'm wondering 
whether the "spinning" cursor should also take the place of the I-beam cursor 
that is used over selectable web page text?  Otherwise I'm not sure if having 
busy cursor feedback during page load is even that useful, since much of a page 
is often made up of text)
I agree with Matthew Thomas it should be the partial wait cursor substitutung 
where you would otherwise see the arrow pointer arrow, and only in those areas. 
Meaning that hor/vert grippies should still show the e-w and n-s resize cursors 
even while loading. That is the point of giving loading feedback while stating 
that some areas are still clickable.
Tim, your wondering is correct -- `spinning' should be used during the page load 
even where you are over selectable text. Incremental reflows mean that the text 
may move as the user tries to select it, and using `spinning' here helps warns 
her of this. (But if she starts dragging to make a selection while the page is 
still loading, the I-beam cursor should be used *during the drag*, as it would be 
in the normal case.)

Johng: German has commented here, which presumably means you have had your 
discussion -- so do you want to reassign this back to a programmer?
The patch seems fine to me, but please ensure that it works with situations such 
as the user stopping a load, a load timing out etc.

The cursor should also revert to the normal shape when the pointer is over the 
scrollbar.
I'm fairly certain that the busy cursor will work in those cases, because it 
responds to the same events as the throbber does.  The busy cursor should still 
be used for the scrollbar since it's normally an arrow...
I'm not sure how difficult it would be to use the I-beam while dragging but not 
otherwise.  I'll look into it.
Not critical to Netscape 6 ship. Moving to P3.  Adding [PDTP3]
Priority: P1 → P3
Whiteboard: [nsbeta2-][nsbeta3+] UE2 → [nsbeta2-][nsbeta3+][PDTP3] UE2
*** Bug 51171 has been marked as a duplicate of this bug. ***
Renominating for beta3.  Days before nsbeta3 and not even assigned to an 
engineer yet, this isn't a beta3 stop ship.

it would be appreciated if someone could review those patches, however...cc 
saari for hopeful patch evalation.
Keywords: review
Whiteboard: [nsbeta2-][nsbeta3+][PDTP3] UE2 → [nsbeta2-]UE2
JohnG, does Germans' 2000-08-24 comment represent the decision of Matt, Gable, 
and German Inc.? If so, please reassign to a programmer. If not, please tell us 
what the delay is. It would be nice if this could get in for M18. Thanks.
German's decision is the right one. Reassigning to Don Melton to get help with
triaging. Do we need to fix this for RTM? This does effect the user's perceived
performance of the product.
Assignee: johng → don
We're not gonna take this for beta 3.  Maybe RTM.

Ben, are these patches cool to take at this point?
Assignee: don → ben
Keywords: rtm
Whiteboard: [nsbeta2-]UE2 → [nsbeta2-]UE2[NEED INFO][beta3-]
Keywords: UE2
Whiteboard: [nsbeta2-]UE2[NEED INFO][beta3-] → [NEED INFO] [nsbeta2-][beta3-] UE2
Marking nsbeta3-.
Whiteboard: [NEED INFO] [nsbeta2-][beta3-] UE2 → [NEED INFO] [nsbeta2-][nsbeta3-] UE2
sending to jud. jud, does your group own this code? I tried this patch and it 
works fine for me. 
Assignee: ben → valeski
PDT marking [rtm-] for N6. Doesn't seem very serious.
Whiteboard: [NEED INFO] [nsbeta2-][nsbeta3-] UE2 → [rtm-] [nsbeta2-][nsbeta3-] UE2
Tim, a couple of comments on the patch.

1. Change the style from busyNotBusy to BUSY_FLAGS_NONE etc. and from signed to 
unsigned longs.
2. Consider using flag combinations to make up the various states. e.g. let 
people test for the BUSY_FLAGS_BUSY bit instead of having to compare against 
every busy state, busyPageLoad OR busyBeforePageLoad.

Otherwise it looks fine.
Target Milestone: M19 → mozilla0.8
Tim, mind producing an updated version of the patch that addresses Adam's 
comments so we can get it in?
Hmm....

So, I made a patch updated to the tip that addresses most of Adam's comments, 
but I'm not seeing the exact behavior Tim outlined in his 8/24 comment.  
Instead, although the cursor properly changes in the busyBeforePageLoad state, 
it quickly changes back to the standard cursor the second you move the mouse.  
Any ideas?  Some stuff changed in OnStateChange() since this patch was produced 
(STATE_IS_NETWORK -> STATE_IS_DOCUMENT, for example, although that had no 
effect).  I'll post the updated patch if you want, but it's kind of useless 
with the aforementioned problem.
Blocks: 64833
-> adam
really -> adam
Assignee: valeski → adamlock
Blake, can you provide me with your later patch?

Thanks
I've updated the patch slightly to work with the latest source code and to pick 
up some of the changes I suggested. I'll test it a little more tomorrow and if 
no one has any objections it will be submitted for review.
Status: NEW → ASSIGNED
sorry to be a grouch...
+   }
+   else if ((aStateFlags & STATE_STOP) && (aStateFlags & STATE_IS_NETWORK))
+   {
...
+     if(mainWidget)
+       {
+       mainWidget->SetCursor(eCursor_standard);
+       }

let's pick an indentation style and maintain it.
the one i prefer is:
if (cond) {
  statement;
} else {
  statement;
}
<!-- //the only case that does not follow this style is functions:
void functionName ( ... )
{
  body;
}
-->
i think that:
+   else if ((aStateFlags & STATE_STOP) && (aStateFlags & STATE_IS_NETWORK))
can be rewritten as
+   else if (aStateFlags & STATE_STOP && aStateFlags & STATE_IS_NETWORK)
however i'll leave that for brendan
Keywords: nsbeta2, nsbeta3, rtmapproval
Whiteboard: [rtm-] [nsbeta2-][nsbeta3-] UE2
timeless wrote:
>i think that:
>+   else if ((aStateFlags & STATE_STOP) && (aStateFlags & STATE_IS_NETWORK))
>can be rewritten as
>+   else if (aStateFlags & STATE_STOP && aStateFlags & STATE_IS_NETWORK)
>however i'll leave that for brendan

It's not a big deal, but I prefer unnecessary parenthesization of & against &&
for readability's sake (without the parens, the &&&s are hard to tell apart).

However, there's no need for a separate mask and test, and the branch implied by
&&, to test whether two bits are set:

+   else if ((aStateFlags & (STATE_STOP|STATE_IS_NETWORK)) ==
(STATE_STOP|STATE_IS_NETWORK))

Notice that parens are required now, due to C and C++'s notorious botched
precedence of equality operators as higher than the bitwise logicals.

Even shorter and faster:

+   else if ((~aStateFlags & (STATE_STOP|STATE_IS_NETWORK)) == 0)

/be
Attached patch Updated patchSplinter Review
I've updated the patch to include suggestions. I consider the original bitfield 
testing to be more readable but I've changed it since a more efficient way was 
suggested. Also note that docshell is a mess of coding conventions so no style 
would be correct for this file (many blocks are indented by 3 spaces!) but I've 
changed the brace style anyway.

This patch is now ready for review.
filed bug 66434 for cleanup of nsDocShell.cpp
Blocks: 66434
Adam: did you mean to leave this brace-style instance (and one like it soon
after) alone?

!     if(mainWidget)
! 	{
!       mainWidget->SetCursor(eCursor_spinning);
! 	}

Also, please use diff -u.  Sorry to nag, I don't have more to add right now.

As http://www.mozilla.org/hacking/reviewers.html, Rule 20, makes clear, bad or
no ownership made manifest by crappy/ugly/inconsistent style is a bug to be
fixed, incrementally or all at once, by new and better owners.  You should go
strong, get rid of Travis's evil Fibonacci-number indentation, and be a
righteous owner.

/be
Fix is checked in now. Coding style issues in docshell are covered by that other 
bug.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago24 years ago
Resolution: --- → FIXED
Who let this go by:

  if ((~aStateFlags & (STATE_START | STATE_IS_NETWORK)) == 0)

which is equivalent to the much more easily comprehended

  if (aStateFlags & (STATE_START | STATE_IS_NETWORK))
No it isn't, 

if ((~aStateFlags & (STATE_START | STATE_IS_NETWORK)) == 0)

Is equivalent to:

if ((aStateFlags & STATE_START) && (aStateFlags & STATE_IS_NETWORK))

I changed the expression from the latter to the former following comments from 
Brendan. See above.
Oops, you're right.

However, I find the
if ((aStateFlags & (STATE_STOP|STATE_IS_NETWORK)) == (STATE_STOP|
STATE_IS_NETWORK))
or 
if ((aStateFlags & STATE_START) && (aStateFlags & STATE_IS_NETWORK))
forms much easier to comprehend. Smaller brain-print.

(BTW, this error I made does not affect my patch in bug 67084, where I note that 
all this needs to be refactored anyway).
Keywords: UE2
No longer blocks: 64833
Product: Core → Mozilla Application Suite
Component: XP Apps: GUI Features → UI Design
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: