зеркало из https://github.com/mozilla/gecko-dev.git
Bug 358714 ��� implement accessible object for xforms minimal select in xhtml context, r=aaronr,aaronl, sr=neil
This commit is contained in:
Родитель
9031002243
Коммит
b2cbc94366
|
@ -108,48 +108,55 @@ interface nsIAccessibleProvider : nsISupports
|
||||||
* Constants set is used by XForms elements.
|
* Constants set is used by XForms elements.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** Used for xforms elements that provide accessible object for itself as
|
/** Used for xforms elements that provide accessible object for itself as
|
||||||
* well for anonymous content. This property are used for upload,
|
* well for anonymous content. This property are used for upload,
|
||||||
* input[type="xsd:gDay"] and input[type="xsd:gMonth"] */
|
* input[type="xsd:gDay"] and input[type="xsd:gMonth"] */
|
||||||
const long XFormsContainer = 0x00002000;
|
const long XFormsContainer = 0x00002000;
|
||||||
|
|
||||||
/** Used for label element */
|
/** Used for label element */
|
||||||
const long XFormsLabel = 0x00002001;
|
const long XFormsLabel = 0x00002001;
|
||||||
/** Used for output element */
|
/** Used for output element */
|
||||||
const long XFormsOuput = 0x00002002;
|
const long XFormsOuput = 0x00002002;
|
||||||
/** Used for trigger and submit elements */
|
/** Used for trigger and submit elements */
|
||||||
const long XFormsTrigger = 0x00002003;
|
const long XFormsTrigger = 0x00002003;
|
||||||
/** Used for input and textarea elements */
|
/** Used for input and textarea elements */
|
||||||
const long XFormsInput = 0x00002004;
|
const long XFormsInput = 0x00002004;
|
||||||
/** Used for input[xsd:boolean] element */
|
/** Used for input[xsd:boolean] element */
|
||||||
const long XFormsInputBoolean = 0x00002005;
|
const long XFormsInputBoolean = 0x00002005;
|
||||||
/** Used for input[xsd:date] element */
|
/** Used for input[xsd:date] element */
|
||||||
const long XFormsInputDate = 0x00002006;
|
const long XFormsInputDate = 0x00002006;
|
||||||
/** Used for secret element */
|
/** Used for secret element */
|
||||||
const long XFormsSecret = 0x00002007;
|
const long XFormsSecret = 0x00002007;
|
||||||
/** Used for range element represented by slider */
|
/** Used for range element represented by slider */
|
||||||
const long XFormsSliderRange = 0x00002008;
|
const long XFormsSliderRange = 0x00002008;
|
||||||
|
|
||||||
/** Used for select and select1 that are implemented using host document's
|
/** Used for select and select1 that are implemented using host document's
|
||||||
* native widget. For example, a select1 in a xhtml document may be
|
* native widget. For example, a select1 in a xhtml document may be
|
||||||
* represented by the native html control html:select */
|
* represented by the native html control html:select */
|
||||||
const long XFormsSelect = 0x00002009;
|
const long XFormsSelect = 0x00002009;
|
||||||
/** Used for xforms choices element */
|
/** Used for xforms choices element */
|
||||||
const long XFormsChoices = 0x00002010;
|
const long XFormsChoices = 0x00002010;
|
||||||
/** Used for xforms full select/select1 elements that may be represented by
|
/** Used for xforms full select/select1 elements that may be represented by
|
||||||
* group of checkboxes and radiogroup */
|
* group of checkboxes and radiogroup */
|
||||||
const long XFormsSelectFull = 0x00002011;
|
const long XFormsSelectFull = 0x00002011;
|
||||||
/** Used for xforms item element that is used inside xforms select elements
|
/** Used for xforms item element that is used inside xforms select elements
|
||||||
* represented by group of checkboxes */
|
* represented by group of checkboxes */
|
||||||
const long XFormsItemCheckgroup = 0x00002012;
|
const long XFormsItemCheckgroup = 0x00002012;
|
||||||
/** Used for xforms item element that is used inside xforms select1 elements
|
/** Used for xforms item element that is used inside xforms select1 elements
|
||||||
* represented by radio group */
|
* represented by radio group */
|
||||||
const long XFormsItemRadiogroup = 0x00002013;
|
const long XFormsItemRadiogroup = 0x00002013;
|
||||||
|
/** Used for xforms select1 element that is represented by combobox */
|
||||||
|
const long XFormsSelectCombobox = 0x00002014;
|
||||||
|
/** Used for xforms item element that is used inside xforms select1
|
||||||
|
* elements represented by combobox */
|
||||||
|
const long XFormsItemCombobox = 0x00002015;
|
||||||
|
|
||||||
/** Used for dropmarker widget that is used by xforms elements */
|
/** Used for dropmarker widget that is used by xforms elements */
|
||||||
const long XFormsDropmarkerWidget = 0x00002101;
|
const long XFormsDropmarkerWidget = 0x00002101;
|
||||||
/** Used for calendar widget that is used by xforms elements */
|
/** Used for calendar widget that is used by xforms elements */
|
||||||
const long XFormsCalendarWidget = 0x00002102;
|
const long XFormsCalendarWidget = 0x00002102;
|
||||||
|
/** Used for popup widget that is used by xforms minimal select1 elements */
|
||||||
|
const long XFormsComboboxPopupWidget = 0x00002103;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return one of constants declared above.
|
* Return one of constants declared above.
|
||||||
|
|
|
@ -1587,6 +1587,12 @@ nsresult nsAccessibilityService::GetAccessibleByType(nsIDOMNode *aNode,
|
||||||
case nsIAccessibleProvider::XFormsItemRadiogroup:
|
case nsIAccessibleProvider::XFormsItemRadiogroup:
|
||||||
*aAccessible = new nsXFormsItemRadiogroupAccessible(aNode, weakShell);
|
*aAccessible = new nsXFormsItemRadiogroupAccessible(aNode, weakShell);
|
||||||
break;
|
break;
|
||||||
|
case nsIAccessibleProvider::XFormsSelectCombobox:
|
||||||
|
*aAccessible = new nsXFormsSelectComboboxAccessible(aNode, weakShell);
|
||||||
|
break;
|
||||||
|
case nsIAccessibleProvider::XFormsItemCombobox:
|
||||||
|
*aAccessible = new nsXFormsItemComboboxAccessible(aNode, weakShell);
|
||||||
|
break;
|
||||||
|
|
||||||
case nsIAccessibleProvider::XFormsDropmarkerWidget:
|
case nsIAccessibleProvider::XFormsDropmarkerWidget:
|
||||||
*aAccessible = new nsXFormsDropmarkerWidgetAccessible(aNode, weakShell);
|
*aAccessible = new nsXFormsDropmarkerWidgetAccessible(aNode, weakShell);
|
||||||
|
@ -1594,6 +1600,9 @@ nsresult nsAccessibilityService::GetAccessibleByType(nsIDOMNode *aNode,
|
||||||
case nsIAccessibleProvider::XFormsCalendarWidget:
|
case nsIAccessibleProvider::XFormsCalendarWidget:
|
||||||
*aAccessible = new nsXFormsCalendarWidgetAccessible(aNode, weakShell);
|
*aAccessible = new nsXFormsCalendarWidgetAccessible(aNode, weakShell);
|
||||||
break;
|
break;
|
||||||
|
case nsIAccessibleProvider::XFormsComboboxPopupWidget:
|
||||||
|
*aAccessible = new nsXFormsComboboxPopupWidgetAccessible(aNode, weakShell);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -102,7 +102,7 @@ nsXFormsAccessible::GetBoundChildElementValue(const nsAString& aTagName,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsXFormsAccessible::CacheSelectChildren()
|
nsXFormsAccessible::CacheSelectChildren(nsIDOMNode *aContainerNode)
|
||||||
{
|
{
|
||||||
if (!mWeakShell) {
|
if (!mWeakShell) {
|
||||||
// This node has been shut down
|
// This node has been shut down
|
||||||
|
@ -117,8 +117,13 @@ nsXFormsAccessible::CacheSelectChildren()
|
||||||
if (!accService)
|
if (!accService)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMNode> container(aContainerNode);
|
||||||
|
if (!container)
|
||||||
|
container = mDOMNode;
|
||||||
|
|
||||||
nsCOMPtr<nsIDOMNodeList> children;
|
nsCOMPtr<nsIDOMNodeList> children;
|
||||||
sXFormsService->GetSelectChildrenFor(mDOMNode, getter_AddRefs(children));
|
sXFormsService->GetSelectChildrenFor(container, getter_AddRefs(children));
|
||||||
|
|
||||||
if (!children)
|
if (!children)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,9 @@ protected:
|
||||||
// element. Note, those select/select1 elements that use native widget
|
// element. Note, those select/select1 elements that use native widget
|
||||||
// for representation don't use the method since their item/choices elements
|
// for representation don't use the method since their item/choices elements
|
||||||
// are hidden and therefore aren't accessible.
|
// are hidden and therefore aren't accessible.
|
||||||
void CacheSelectChildren();
|
//
|
||||||
|
// @param aContainerNode - node that contains item elements
|
||||||
|
void CacheSelectChildren(nsIDOMNode *aContainerNode = nsnull);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -562,3 +562,93 @@ nsXFormsItemRadiogroupAccessible::GetActionName(PRUint8 aIndex, nsAString& aName
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// nsXFormsSelectComboboxAccessible
|
||||||
|
|
||||||
|
nsXFormsSelectComboboxAccessible::
|
||||||
|
nsXFormsSelectComboboxAccessible(nsIDOMNode *aNode, nsIWeakReference *aShell):
|
||||||
|
nsXFormsSelectableAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsSelectComboboxAccessible::GetRole(PRUint32 *aRole)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aRole);
|
||||||
|
|
||||||
|
*aRole = ROLE_COMBOBOX;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsSelectComboboxAccessible::GetState(PRUint32 *aState)
|
||||||
|
{
|
||||||
|
nsresult rv = nsXFormsSelectableAccessible::GetState(aState);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
PRBool isOpen = PR_FALSE;
|
||||||
|
rv = sXFormsService->IsDropmarkerOpen(mDOMNode, &isOpen);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (isOpen)
|
||||||
|
*aState = STATE_EXPANDED;
|
||||||
|
else
|
||||||
|
*aState = STATE_COLLAPSED;
|
||||||
|
|
||||||
|
*aState |= STATE_HASPOPUP | STATE_FOCUSABLE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsSelectComboboxAccessible::GetAllowsAnonChildAccessibles(PRBool *aAllowsAnonChildren)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aAllowsAnonChildren);
|
||||||
|
|
||||||
|
*aAllowsAnonChildren = PR_TRUE;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// nsXFormsItemComboboxAccessible
|
||||||
|
|
||||||
|
nsXFormsItemComboboxAccessible::
|
||||||
|
nsXFormsItemComboboxAccessible(nsIDOMNode *aNode, nsIWeakReference *aShell):
|
||||||
|
nsXFormsSelectableItemAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsItemComboboxAccessible::GetRole(PRUint32 *aRole)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aRole);
|
||||||
|
|
||||||
|
*aRole = ROLE_LISTITEM;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsItemComboboxAccessible::GetState(PRUint32 *aState)
|
||||||
|
{
|
||||||
|
nsresult rv = nsXFormsSelectableItemAccessible::GetState(aState);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
if (*aState & STATE_UNAVAILABLE)
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
*aState |= STATE_SELECTABLE;
|
||||||
|
if (IsItemSelected())
|
||||||
|
*aState |= STATE_SELECTED;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsItemComboboxAccessible::GetActionName(PRUint8 aIndex, nsAString& aName)
|
||||||
|
{
|
||||||
|
if (aIndex != eAction_Click)
|
||||||
|
return NS_ERROR_INVALID_ARG;
|
||||||
|
|
||||||
|
nsAccessible::GetTranslatedString(NS_LITERAL_STRING("select"), aName);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -241,5 +241,41 @@ public:
|
||||||
NS_IMETHOD GetActionName(PRUint8 aIndex, nsAString& aName);
|
NS_IMETHOD GetActionName(PRUint8 aIndex, nsAString& aName);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessible object for xforms:select1 of minimal appearance that is
|
||||||
|
* represented by combobox.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class nsXFormsSelectComboboxAccessible : public nsXFormsSelectableAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXFormsSelectComboboxAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
|
||||||
|
|
||||||
|
NS_IMETHOD GetRole(PRUint32 *aRole);
|
||||||
|
NS_IMETHOD GetState(PRUint32 *aState);
|
||||||
|
|
||||||
|
// Allows accessible nodes in anonymous content of xforms element by
|
||||||
|
// always returning PR_TRUE value.
|
||||||
|
NS_IMETHOD GetAllowsAnonChildAccessibles(PRBool *aAllowsAnonChildren);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessible object for xforms:item element when it is represented by a
|
||||||
|
* listitem. This occurs when the item is contained in a xforms:select with
|
||||||
|
* minimal appearance. Such a xforms:select is represented by a combobox.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class nsXFormsItemComboboxAccessible : public nsXFormsSelectableItemAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXFormsItemComboboxAccessible(nsIDOMNode* aNode, nsIWeakReference* aShell);
|
||||||
|
|
||||||
|
NS_IMETHOD GetRole(PRUint32 *aRole);
|
||||||
|
NS_IMETHOD GetState(PRUint32 *aState);
|
||||||
|
NS_IMETHOD GetActionName(PRUint8 aIndex, nsAString& aName);
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -127,3 +127,73 @@ nsXFormsCalendarWidgetAccessible::GetRole(PRUint32 *aRole)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// nsXFormsComboboxPopupWidgetAccessible
|
||||||
|
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible(nsIDOMNode *aNode, nsIWeakReference *aShell):
|
||||||
|
nsXFormsAccessible(aNode, aShell)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::GetRole(PRUint32 *aRole)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aRole);
|
||||||
|
|
||||||
|
*aRole = ROLE_LIST;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::GetState(PRUint32 *aState)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aState);
|
||||||
|
|
||||||
|
nsXFormsAccessible::GetState(aState);
|
||||||
|
|
||||||
|
PRBool isOpen = PR_FALSE;
|
||||||
|
nsresult rv = sXFormsService->IsDropmarkerOpen(mDOMNode, &isOpen);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
*aState |= STATE_FOCUSABLE;
|
||||||
|
|
||||||
|
if (isOpen)
|
||||||
|
*aState = STATE_FLOATING;
|
||||||
|
else
|
||||||
|
*aState = STATE_INVISIBLE;
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::GetValue(nsAString& aValue)
|
||||||
|
{
|
||||||
|
aValue.Truncate();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::GetName(nsAString& aName)
|
||||||
|
{
|
||||||
|
aName.Truncate();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::GetDescription(nsAString& aDescription)
|
||||||
|
{
|
||||||
|
aDescription.Truncate();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible::CacheChildren()
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIDOMNode> parent;
|
||||||
|
mDOMNode->GetParentNode(getter_AddRefs(parent));
|
||||||
|
|
||||||
|
// Parent node must be an xforms:select1 element.
|
||||||
|
CacheSelectChildren(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,4 +74,24 @@ public:
|
||||||
NS_IMETHOD GetRole(PRUint32 *aRole);
|
NS_IMETHOD GetRole(PRUint32 *aRole);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessible object for popup menu of minimal xforms select1 element that is
|
||||||
|
* represented by combobox.
|
||||||
|
*/
|
||||||
|
class nsXFormsComboboxPopupWidgetAccessible : public nsXFormsAccessible
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nsXFormsComboboxPopupWidgetAccessible(nsIDOMNode *aNode,
|
||||||
|
nsIWeakReference *aShell);
|
||||||
|
|
||||||
|
NS_IMETHOD GetRole(PRUint32 *aRole);
|
||||||
|
NS_IMETHOD GetState(PRUint32 *aState);
|
||||||
|
NS_IMETHOD GetValue(nsAString& aValue);
|
||||||
|
NS_IMETHOD GetName(nsAString& aName);
|
||||||
|
NS_IMETHOD GetDescription(nsAString& aDescription);
|
||||||
|
|
||||||
|
void CacheChildren();
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -136,15 +136,16 @@ public:
|
||||||
NS_IMETHOD GetEditor(nsIDOMNode *aElement, nsIEditor **aEditor) = 0;
|
NS_IMETHOD GetEditor(nsIDOMNode *aElement, nsIEditor **aEditor) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if dropmarker is in open state, otherwise false. Failure if
|
* Return true if dropmarker is in open state (combobox popup is open),
|
||||||
* given element is not dropmarker or its parent element isn't supposed to
|
* otherwise false. Failure if given 'aElement' node is not direct child of
|
||||||
* have dropmarker.
|
* combobox element or is not combobox itself.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD IsDropmarkerOpen(nsIDOMNode *aElement, PRBool* aIsOpen) = 0;
|
NS_IMETHOD IsDropmarkerOpen(nsIDOMNode *aElement, PRBool* aIsOpen) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggles dropmarker state. Failure if given element is not dropmarker or
|
* Toggles dropmarker state (close/open combobox popup). Failure if given
|
||||||
* its parent element isn't supposed to have dropmarker.
|
* 'aElement' node is not direct child of combobox element or is not combobox
|
||||||
|
* itself.
|
||||||
*/
|
*/
|
||||||
NS_IMETHOD ToggleDropmarkerState(nsIDOMNode *aElement) = 0;
|
NS_IMETHOD ToggleDropmarkerState(nsIDOMNode *aElement) = 0;
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,9 @@
|
||||||
#include "nsXFormsAtoms.h"
|
#include "nsXFormsAtoms.h"
|
||||||
#include "nsIDOMNodeList.h"
|
#include "nsIDOMNodeList.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
|
#include "nsIDOMDocumentEvent.h"
|
||||||
|
#include "nsIDOMEvent.h"
|
||||||
|
#include "nsIPrivateDOMEvent.h"
|
||||||
#include "nsString.h"
|
#include "nsString.h"
|
||||||
#include "nsXFormsUtils.h"
|
#include "nsXFormsUtils.h"
|
||||||
#include "nsIXFormsValueElement.h"
|
#include "nsIXFormsValueElement.h"
|
||||||
|
@ -397,6 +400,33 @@ nsXFormsItemElement::SetActive(PRBool aActive)
|
||||||
{
|
{
|
||||||
/// @see comment in nsIXFormsItemElement.idl
|
/// @see comment in nsIXFormsItemElement.idl
|
||||||
|
|
||||||
|
if (aActive) {
|
||||||
|
// Fire 'DOMMenuItemActive' event. This event is used by accessible module.
|
||||||
|
nsCOMPtr<nsIDOMDocument> domDoc;
|
||||||
|
mElement->GetOwnerDocument(getter_AddRefs(domDoc));
|
||||||
|
nsCOMPtr<nsIDOMDocumentEvent> doc = do_QueryInterface(domDoc);
|
||||||
|
NS_ENSURE_STATE(doc);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMEvent> event;
|
||||||
|
doc->CreateEvent(NS_LITERAL_STRING("Events"), getter_AddRefs(event));
|
||||||
|
NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
|
||||||
|
|
||||||
|
event->InitEvent(NS_LITERAL_STRING("DOMMenuItemActive"),
|
||||||
|
PR_TRUE, PR_TRUE);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMNode> node(do_QueryInterface(mElement));
|
||||||
|
NS_ENSURE_STATE(node);
|
||||||
|
|
||||||
|
nsXFormsUtils::SetEventTrusted(event, node);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(mElement));
|
||||||
|
NS_ENSURE_STATE(target);
|
||||||
|
|
||||||
|
PRBool defaultActionEnabled = PR_TRUE;
|
||||||
|
nsresult rv = target->DispatchEvent(event, &defaultActionEnabled);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
}
|
||||||
|
|
||||||
NS_NAMED_LITERAL_STRING(active, "_moz_active");
|
NS_NAMED_LITERAL_STRING(active, "_moz_active");
|
||||||
|
|
||||||
return aActive ?
|
return aActive ?
|
||||||
|
|
|
@ -72,9 +72,11 @@ NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);\
|
||||||
|
|
||||||
#define GET_COMBOBOX_UIWIDGET \
|
#define GET_COMBOBOX_UIWIDGET \
|
||||||
NS_ENSURE_ARG(aElement);\
|
NS_ENSURE_ARG(aElement);\
|
||||||
nsCOMPtr<nsIContent> content(do_QueryInterface(aElement));\
|
nsCOMPtr<nsIXFormsComboboxUIWidget> widget(do_QueryInterface(aElement));\
|
||||||
nsCOMPtr<nsIContent> parent(content->GetBindingParent());\
|
if (!widget) {\
|
||||||
nsCOMPtr<nsIXFormsComboboxUIWidget> widget(do_QueryInterface(parent));\
|
nsCOMPtr<nsIContent> content(do_QueryInterface(aElement));\
|
||||||
|
widget = do_QueryInterface(content->GetBindingParent());\
|
||||||
|
}\
|
||||||
NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);\
|
NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);\
|
||||||
|
|
||||||
#define GET_XFORMS_SELECT1 \
|
#define GET_XFORMS_SELECT1 \
|
||||||
|
@ -367,6 +369,8 @@ nsresult
|
||||||
nsXFormsUtilityService::GetSelectChildrenForNodeInternal(nsIDOMNode *aElement,
|
nsXFormsUtilityService::GetSelectChildrenForNodeInternal(nsIDOMNode *aElement,
|
||||||
nsNodeList *aNodeList)
|
nsNodeList *aNodeList)
|
||||||
{
|
{
|
||||||
|
NS_ENSURE_ARG(aElement);
|
||||||
|
|
||||||
nsCOMPtr<nsIDOMNodeList> children;
|
nsCOMPtr<nsIDOMNodeList> children;
|
||||||
aElement->GetChildNodes(getter_AddRefs(children));
|
aElement->GetChildNodes(getter_AddRefs(children));
|
||||||
NS_ENSURE_TRUE(children, NS_ERROR_FAILURE);
|
NS_ENSURE_TRUE(children, NS_ERROR_FAILURE);
|
||||||
|
|
|
@ -52,13 +52,6 @@
|
||||||
<!-- The strange indentation is because of the whitespace nodes.-->
|
<!-- The strange indentation is because of the whitespace nodes.-->
|
||||||
<content>
|
<content>
|
||||||
<children includes="label|hint"/>
|
<children includes="label|hint"/>
|
||||||
<html:div class="-moz-xforms-select1-popup" anonid="popup"
|
|
||||||
onmouseover="this.parentNode.shouldHandleBlur = false;
|
|
||||||
this.parentNode.mouseOver(event);"
|
|
||||||
onmouseup="this.parentNode.mouseUp(event);"
|
|
||||||
onmouseout="this.parentNode.shouldHandleBlur = true;">
|
|
||||||
<children/>
|
|
||||||
</html:div>
|
|
||||||
<html:span class="-moz-select1-container"
|
<html:span class="-moz-select1-container"
|
||||||
anonid="container"><html:input
|
anonid="container"><html:input
|
||||||
class="-moz-xforms-select1-input xf-value"
|
class="-moz-xforms-select1-input xf-value"
|
||||||
|
@ -77,9 +70,17 @@
|
||||||
onmouseup="this.parentNode.parentNode.shouldHandleBlur = true;"
|
onmouseup="this.parentNode.parentNode.shouldHandleBlur = true;"
|
||||||
onclick="this.parentNode.parentNode.togglePopup();
|
onclick="this.parentNode.parentNode.togglePopup();
|
||||||
this.previousSibling.focus();"
|
this.previousSibling.focus();"
|
||||||
/></html:span></content>
|
/></html:span>
|
||||||
|
<html:div mozType:comboboxpopup="true" anonid="popup"
|
||||||
|
onmouseover="this.parentNode.shouldHandleBlur = false;
|
||||||
|
this.parentNode.mouseOver(event);"
|
||||||
|
onmouseup="this.parentNode.mouseUp(event);"
|
||||||
|
onmouseout="this.parentNode.shouldHandleBlur = true;">
|
||||||
|
<children/>
|
||||||
|
</html:div>
|
||||||
|
</content>
|
||||||
|
|
||||||
<implementation implements="nsIXFormsUIWidget, nsIXFormsNSSelect1Element, nsIXFormsNSEditableElement, nsIXFormsComboboxUIWidget">
|
<implementation implements="nsIXFormsNSSelect1Element, nsIXFormsNSEditableElement, nsIXFormsComboboxUIWidget, nsIAccessibleProvider">
|
||||||
|
|
||||||
<!-- nsIXFormsNSEditableElement -->
|
<!-- nsIXFormsNSEditableElement -->
|
||||||
<property name="editor" readonly="true"
|
<property name="editor" readonly="true"
|
||||||
|
@ -120,6 +121,13 @@
|
||||||
</setter>
|
</setter>
|
||||||
</property>
|
</property>
|
||||||
|
|
||||||
|
<!-- nsIAccessibleProvider -->
|
||||||
|
<property name="accessibleType" readonly="true">
|
||||||
|
<getter>
|
||||||
|
return Components.interfaces.nsIAccessibleProvider.XFormsSelectCombobox;
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
|
||||||
<field name="_inputField">null</field>
|
<field name="_inputField">null</field>
|
||||||
<field name="_dropMarker">null</field>
|
<field name="_dropMarker">null</field>
|
||||||
<field name="_popup">null</field>
|
<field name="_popup">null</field>
|
||||||
|
@ -201,6 +209,12 @@
|
||||||
if (this._selected) {
|
if (this._selected) {
|
||||||
// Remove extra white space characters from the beginning of the label.
|
// Remove extra white space characters from the beginning of the label.
|
||||||
this.inputField.value = this._selected.labelText.replace(/^[\s\n]+/, "");
|
this.inputField.value = this._selected.labelText.replace(/^[\s\n]+/, "");
|
||||||
|
|
||||||
|
// Fire 'ValueChange' event. This event is used by accessible
|
||||||
|
// module.
|
||||||
|
var event = this.ownerDocument.createEvent("Events");
|
||||||
|
event.initEvent("ValueChange", false, false);
|
||||||
|
this.dispatchEvent(event);
|
||||||
}
|
}
|
||||||
]]>
|
]]>
|
||||||
</body>
|
</body>
|
||||||
|
@ -1176,7 +1190,13 @@
|
||||||
</html:div>
|
</html:div>
|
||||||
</content>
|
</content>
|
||||||
|
|
||||||
<implementation>
|
<implementation implements="nsIAccessibleProvider">
|
||||||
|
<property name="accessibleType" readonly="true">
|
||||||
|
<getter>
|
||||||
|
return Components.interfaces.nsIAccessibleProvider.XFormsItemCombobox;
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
|
||||||
<field name="_content">null</field>
|
<field name="_content">null</field>
|
||||||
<property name="content" readonly="true">
|
<property name="content" readonly="true">
|
||||||
<getter>
|
<getter>
|
||||||
|
|
|
@ -755,5 +755,21 @@
|
||||||
</implementation>
|
</implementation>
|
||||||
</binding>
|
</binding>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- POPUP for MINIMAL SELECT1 -->
|
||||||
|
<binding id="comboboxpopup">
|
||||||
|
<resources>
|
||||||
|
<stylesheet src="chrome://xforms/skin/widgets-xhtml.css"/>
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<implementation implements="nsIAccessibleProvider">
|
||||||
|
<property name="accessibleType" readonly="true">
|
||||||
|
<getter>
|
||||||
|
return Components.interfaces.nsIAccessibleProvider.XFormsComboboxPopupWidget;
|
||||||
|
</getter>
|
||||||
|
</property>
|
||||||
|
</implementation>
|
||||||
|
</binding>
|
||||||
|
|
||||||
</bindings>
|
</bindings>
|
||||||
|
|
||||||
|
|
|
@ -498,6 +498,8 @@ select1 itemset, select itemset {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* choices widget */
|
/* choices widget */
|
||||||
|
html|*:root select1:not([appearance]) choices,
|
||||||
|
html|*:root select1[appearance="minimal] choices,
|
||||||
select[appearance='full'] choices,
|
select[appearance='full'] choices,
|
||||||
select1[appearance='full'] choices {
|
select1[appearance='full'] choices {
|
||||||
-moz-binding: url('chrome://xforms/content/selects.xml#choices');
|
-moz-binding: url('chrome://xforms/content/selects.xml#choices');
|
||||||
|
@ -759,3 +761,7 @@ xul|*:root xul|dropmarker[mozType|dropmarker] {
|
||||||
-moz-binding: url('chrome://xforms/content/widgets-xul.xml#dropmarker');
|
-moz-binding: url('chrome://xforms/content/widgets-xul.xml#dropmarker');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html|*:root html|div[mozType|comboboxpopup] {
|
||||||
|
-moz-binding: url('chrome://xforms/content/widgets-xhtml.xml#comboboxpopup');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -135,3 +135,22 @@ input[mozType|dropmarker]:active:hover {
|
||||||
border-style: outset;
|
border-style: outset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* combobox popup (used inside minimal select1) */
|
||||||
|
|
||||||
|
div[mozType|comboboxpopup="true"] {
|
||||||
|
border-width: 1px;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
border: 1px outset black !important;
|
||||||
|
background-color: -moz-Field;
|
||||||
|
font: -moz-list;
|
||||||
|
text-align: start;
|
||||||
|
visibility: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
position: absolute;
|
||||||
|
-moz-user-select: none;
|
||||||
|
z-index: 2147482647;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче