Closed Bug 300407 Opened 19 years ago Closed 19 years ago

Need to prevent default action when pressing F1 in an XForms control

Categories

(Core Graveyard :: XForms, defect)

x86
Windows XP
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: doronr, Assigned: doronr)

References

()

Details

Attachments

(1 file, 2 obsolete files)

On windows, we show the mozilla product help dialog and the xforms:hint url.
Attached patch le patch (obsolete) — Splinter Review
Problem is, this patch will always prevent default, even if there is no
xforms:hint
(In reply to comment #1)
> Created an attachment (id=188978) [edit]
> le patch
> 
> Problem is, this patch will always prevent default, even if there is no
> xforms:hint

I guess DispatchEvent could return defaultActionEnabled as an |out| parameter.
http://lxr.mozilla.org/seamonkey/source/extensions/xforms/nsXFormsUtils.cpp#855
and then the preventDefault could be called on help event in 
http://lxr.mozilla.org/seamonkey/source/extensions/xforms/nsXFormsMessageElement.cpp#428
This way the nsIDOMKeyEvent::DOM_VK_F1 keyevent should be prevented only
if the help-event is prevented.

Attached patch better patch (obsolete) — Splinter Review
Follow's smaug's idea, which works!
Attachment #188978 - Attachment is obsolete: true
Attachment #189077 - Flags: review?(smaug)
Attachment #189077 - Attachment is obsolete: true
Attachment #189077 - Flags: review?(smaug)
Attachment #189083 - Flags: review?(smaug)
Attachment #189083 - Flags: review?(aaronr)
Attachment #189083 - Flags: review?(smaug) → review+
Comment on attachment 189083 [details] [diff] [review]
with smaug's irc comment addressed

nits mostly.

>Index: extensions/xforms/nsXFormsControlStub.cpp
>===================================================================
>RCS file: /cvsroot/mozilla/extensions/xforms/nsXFormsControlStub.cpp,v
>retrieving revision 1.27
>diff -p -w -u -1 -0 -r1.27 nsXFormsControlStub.cpp
>--- extensions/xforms/nsXFormsControlStub.cpp	29 Jun 2005 18:14:43 -0000	1.27
>+++ extensions/xforms/nsXFormsControlStub.cpp	12 Jul 2005 19:50:14 -0000
>@@ -69,22 +69,31 @@ nsXFormsHintHelpListener::HandleEvent(ns
>     return NS_ERROR_UNEXPECTED;
> 
>   nsCOMPtr<nsIDOMEventTarget> target;
>   aEvent->GetCurrentTarget(getter_AddRefs(target));
>   nsCOMPtr<nsIDOMNode> targetNode(do_QueryInterface(target));
>   if (nsXFormsUtils::EventHandlingAllowed(aEvent, targetNode)) {
>     nsCOMPtr<nsIDOMKeyEvent> keyEvent(do_QueryInterface(aEvent));
>     if (keyEvent) {
>       PRUint32 code = 0;
>       keyEvent->GetKeyCode(&code);
>-      if (code == nsIDOMKeyEvent::DOM_VK_F1)
>-        nsXFormsUtils::DispatchEvent(targetNode, eEvent_Help);
>+      if (code == nsIDOMKeyEvent::DOM_VK_F1) {
>+        PRBool defaultEnabled = PR_TRUE;
>+        nsXFormsUtils::DispatchEvent(targetNode, eEvent_Help, &defaultEnabled);
>+
>+        // If the xforms event's default behavior was disabled, prevent the DOM
>+        // event's default action as well.  This means that the F1 key was
>+        // handled (a help dialog was shown) and we don't want the browser to
>+        // show it's help dialog.
>+        if (!defaultEnabled)
>+          aEvent->PreventDefault();
>+      }

You are changing the default behavior of this event without checking the return
code from DispatchEvent.  Probably should only do this is DispatchEvent was
successful, right?

> 
>Index: extensions/xforms/nsXFormsMessageElement.cpp
>===================================================================
>RCS file: /cvsroot/mozilla/extensions/xforms/nsXFormsMessageElement.cpp,v
>retrieving revision 1.8
>diff -p -w -u -1 -0 -r1.8 nsXFormsMessageElement.cpp
>--- extensions/xforms/nsXFormsMessageElement.cpp	26 Jun 2005 18:30:17 -0000	1.8
>+++ extensions/xforms/nsXFormsMessageElement.cpp	12 Jul 2005 19:50:20 -0000
>@@ -422,20 +422,21 @@ nsXFormsMessageElement::HandleAction(nsI
>     case eType_Hint:
>       level.AssignLiteral("ephemeral");
>       // Using the innermost <hint>.
>       aEvent->StopPropagation();
>       break;
>     case eType_Help:
>       level.AssignLiteral("modeless");
>       // <help> is equivalent to a
>       // <message level="modeless" ev:event="xforms-help" ev:propagate="stop>.
>       aEvent->StopPropagation();
>+      aEvent->PreventDefault();
>       break;
>     case eType_Alert:
>       if (HandleInlineAlert(aEvent))
>         return NS_OK;
> 
>       level.AssignLiteral("modal");
>       break;
>   }
> 
>   if (level.IsEmpty())
>Index: extensions/xforms/nsXFormsUtils.cpp
>===================================================================
>RCS file: /cvsroot/mozilla/extensions/xforms/nsXFormsUtils.cpp,v
>retrieving revision 1.45
>diff -p -w -u -1 -0 -r1.45 nsXFormsUtils.cpp
>--- extensions/xforms/nsXFormsUtils.cpp	4 Jul 2005 16:13:59 -0000	1.45
>+++ extensions/xforms/nsXFormsUtils.cpp	12 Jul 2005 19:50:25 -0000
>@@ -786,21 +786,22 @@ nsXFormsUtils::GetSingleNodeBindingValue
>   nsCOMPtr<nsIDOMNode> singleNode;
>   result->GetSingleNodeValue(getter_AddRefs(singleNode));
>   if (!singleNode)
>     return PR_FALSE;
> 
>   nsXFormsUtils::GetNodeValue(singleNode, aValue);
>   return PR_TRUE;
> }
> 
> /* static */ nsresult
>-nsXFormsUtils::DispatchEvent(nsIDOMNode* aTarget, nsXFormsEvent aEvent)
>+nsXFormsUtils::DispatchEvent(nsIDOMNode* aTarget, nsXFormsEvent aEvent,
>+                             PRBool *aDefaultActionEnabled)
> {
>   if (!aTarget)
>     return NS_ERROR_FAILURE;
> 
>   nsCOMPtr<nsIXFormsControl> control = do_QueryInterface(aTarget);
>   if (control) {
>     switch (aEvent) {
>       case eEvent_Previous:
>       case eEvent_Next:
>       case eEvent_Focus:
>@@ -845,22 +846,27 @@ nsXFormsUtils::DispatchEvent(nsIDOMNode*
> 
>   const EventData *data = &sXFormsEventsEntries[aEvent];
>   event->InitEvent(NS_ConvertUTF8toUTF16(data->name),
>                    data->canBubble, data->canCancel);
>   
>   nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(aTarget);
>   NS_ENSURE_STATE(target);
> 
>   SetEventTrusted(event, aTarget);
> 
>-  PRBool defaultActionEnabled;
>-  return target->DispatchEvent(event, &defaultActionEnabled);
>+  PRBool defaultActionEnabled = PR_TRUE;
>+  nsresult rv = target->DispatchEvent(event, &defaultActionEnabled);
>+
>+  if (aDefaultActionEnabled)
>+    *aDefaultActionEnabled = defaultActionEnabled;
>+
>+  return rv;
> }

You are changing the value in the return buffer even if you are returning an
error.	Ick!

> 
> /* static */ nsresult
> nsXFormsUtils::SetEventTrusted(nsIDOMEvent* aEvent, nsIDOMNode* aRelatedNode)
> {
>   nsCOMPtr<nsIDOMNSEvent> event(do_QueryInterface(aEvent));
>   if (event) {
>     PRBool isTrusted = PR_FALSE;
>     event->GetIsTrusted(&isTrusted);
>     if (!isTrusted && aRelatedNode) {
>Index: extensions/xforms/nsXFormsUtils.h
>===================================================================
>RCS file: /cvsroot/mozilla/extensions/xforms/nsXFormsUtils.h,v
>retrieving revision 1.28
>diff -p -w -u -1 -0 -r1.28 nsXFormsUtils.h
>--- extensions/xforms/nsXFormsUtils.h	26 Jun 2005 18:30:17 -0000	1.28
>+++ extensions/xforms/nsXFormsUtils.h	12 Jul 2005 19:50:30 -0000
>@@ -261,21 +261,22 @@ public:
>    * for an element.
>    * Returns PR_TRUE if the evaluation succeeds.
>    */
>   static NS_HIDDEN_(PRBool)
>     GetSingleNodeBindingValue(nsIDOMElement* aElement, nsString& aValue);
> 
>   /**
>    * Dispatch an XForms event. 
>    */
>   static NS_HIDDEN_(nsresult)
>-    DispatchEvent(nsIDOMNode* aTarget, nsXFormsEvent aEvent);
>+    DispatchEvent(nsIDOMNode* aTarget, nsXFormsEvent aEvent,
>+                  PRBool *aDefaultActionEnabled = nsnull);
> 

Should probably explain what the aDefaultActionEnabled means here.  Not quite
as apparent as the other two params.

with those, r=me
Attachment #189083 - Flags: review?(aaronr) → review+
checked in.
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → FIXED
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: