NS_IMETHODIMP nsAccessNode::ScrollTo(PRUint32 aScrollType) { if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIPresShell> shell(GetPresShell()); NS_ENSURE_TRUE(shell, NS_ERROR_FAILURE); nsIFrame *frame = GetFrame(); NS_ENSURE_TRUE(frame, NS_ERROR_FAILURE); nsCOMPtr<nsIContent> content = frame->GetContent(); NS_ENSURE_TRUE(content, NS_ERROR_FAILURE); PRInt16 vPercent, hPercent; nsCoreUtils::ConvertScrollTypeToPercents(aScrollType, &vPercent, &hPercent); return shell->ScrollContentIntoView(content, vPercent, hPercent, nsIPresShell::SCROLL_OVERFLOW_HIDDEN); }
NS_IMETHODIMP nsXULTreeGridAccessible::GetSelectedColumnIndices(PRUint32 *acolumnCount, PRInt32 **aColumns) { NS_ENSURE_ARG_POINTER(acolumnCount); *acolumnCount = 0; NS_ENSURE_ARG_POINTER(aColumns); *aColumns = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; // If all the row has been selected, then all the columns are selected. // Because we can't select a column alone. PRInt32 rowCount = 0; nsresult rv = GetRowCount(&rowCount); NS_ENSURE_SUCCESS(rv, rv); PRInt32 selectedrowCount = 0; rv = GetSelectionCount(&selectedrowCount); NS_ENSURE_SUCCESS(rv, rv); if (rowCount != selectedrowCount) return NS_OK; PRInt32 columnCount = 0; rv = GetColumnCount(&columnCount); NS_ENSURE_SUCCESS(rv, rv); PRInt32* outArray = static_cast<PRInt32*>( nsMemory::Alloc(columnCount * sizeof(PRInt32))); NS_ENSURE_TRUE(outArray, NS_ERROR_OUT_OF_MEMORY); for (PRInt32 colIdx = 0; colIdx < columnCount; colIdx++) outArray[colIdx] = colIdx; *acolumnCount = columnCount; *aColumns = outArray; return NS_OK; }
nsresult nsXULTreeGridCellAccessible::GetStateInternal(PRUint32 *aStates, PRUint32 *aExtraStates) { NS_ENSURE_ARG_POINTER(aStates); *aStates = 0; if (aExtraStates) *aExtraStates = 0; if (IsDefunct()) { if (aExtraStates) *aExtraStates = nsIAccessibleStates::EXT_STATE_DEFUNCT; return NS_OK_DEFUNCT_OBJECT; } // selectable/selected state *aStates |= nsIAccessibleStates::STATE_SELECTABLE; nsCOMPtr<nsITreeSelection> selection; mTreeView->GetSelection(getter_AddRefs(selection)); if (selection) { PRBool isSelected = PR_FALSE; selection->IsSelected(mRow, &isSelected); if (isSelected) *aStates |= nsIAccessibleStates::STATE_SELECTED; } // checked state PRInt16 type; mColumn->GetType(&type); if (type == nsITreeColumn::TYPE_CHECKBOX) { *aStates |= nsIAccessibleStates::STATE_CHECKABLE; nsAutoString checked; mTreeView->GetCellValue(mRow, mColumn, checked); if (checked.EqualsIgnoreCase("true")) *aStates |= nsIAccessibleStates::STATE_CHECKED; } return NS_OK; }
NS_IMETHODIMP nsXULTreeGridCellAccessible::GetBounds(PRInt32 *aX, PRInt32 *aY, PRInt32 *aWidth, PRInt32 *aHeight) { NS_ENSURE_ARG_POINTER(aX); *aX = 0; NS_ENSURE_ARG_POINTER(aY); *aY = 0; NS_ENSURE_ARG_POINTER(aWidth); *aWidth = 0; NS_ENSURE_ARG_POINTER(aHeight); *aHeight = 0; if (IsDefunct()) return NS_ERROR_FAILURE; // Get bounds for tree cell and add x and y of treechildren element to // x and y of the cell. nsCOMPtr<nsIBoxObject> boxObj = nsCoreUtils::GetTreeBodyBoxObject(mTree); NS_ENSURE_STATE(boxObj); PRInt32 x = 0, y = 0, width = 0, height = 0; nsresult rv = mTree->GetCoordsForCellItem(mRow, mColumn, NS_LITERAL_CSTRING("cell"), &x, &y, &width, &height); NS_ENSURE_SUCCESS(rv, rv); PRInt32 tcX = 0, tcY = 0; boxObj->GetScreenX(&tcX); boxObj->GetScreenY(&tcY); x += tcX; y += tcY; nsPresContext *presContext = GetPresContext(); *aX = presContext->CSSPixelsToDevPixels(x); *aY = presContext->CSSPixelsToDevPixels(y); *aWidth = presContext->CSSPixelsToDevPixels(width); *aHeight = presContext->CSSPixelsToDevPixels(height); return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::UnselectColumn(PRInt32 aColumn) { NS_ENSURE_ARG(IsValidColumn(aColumn)); if (IsDefunct()) return NS_ERROR_FAILURE; AccIterator rowIter(this, filters::GetRow); nsAccessible *row = nsnull; while ((row = rowIter.GetNext())) { nsAccessible *cell = GetCellInRowAt(row, aColumn); if (cell) { nsresult rv = SetARIASelected(cell, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); } } return NS_OK; }
NS_IMETHODIMP nsXULTreeGridAccessible::GetRowAndColumnIndicesAt(PRInt32 aCellIndex, PRInt32* aRowIndex, PRInt32* aColumnIndex) { NS_ENSURE_ARG_POINTER(aRowIndex); *aRowIndex = -1; NS_ENSURE_ARG_POINTER(aColumnIndex); *aColumnIndex = -1; if (IsDefunct()) return NS_ERROR_FAILURE; PRInt32 columnCount = 0; nsresult rv = GetColumnCount(&columnCount); NS_ENSURE_SUCCESS(rv, rv); *aColumnIndex = aCellIndex % columnCount; *aRowIndex = aCellIndex / columnCount; return NS_OK; }
NS_IMETHODIMP nsXULListboxAccessible::GetSelectedRowCount(PRUint32* aCount) { NS_ENSURE_ARG_POINTER(aCount); *aCount = 0; if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMXULMultiSelectControlElement> control = do_QueryInterface(mContent); NS_ASSERTION(control, "Doesn't implement nsIDOMXULMultiSelectControlElement."); PRInt32 selectedrowCount = 0; nsresult rv = control->GetSelectedCount(&selectedrowCount); NS_ENSURE_SUCCESS(rv, rv); *aCount = selectedrowCount; return NS_OK; }
nsresult nsXULColumnsAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { NS_ENSURE_ARG_POINTER(aState); *aState = 0; if (IsDefunct()) { if (aExtraState) *aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT; return NS_OK_DEFUNCT_OBJECT; } *aState = nsIAccessibleStates::STATE_READONLY; if (aExtraState) *aExtraState = 0; return NS_OK; }
NS_IMETHODIMP nsXULLinkAccessible::GetURI(PRInt32 aIndex, nsIURI **aURI) { NS_ENSURE_ARG_POINTER(aURI); *aURI = nsnull; if (aIndex != 0) return NS_ERROR_INVALID_ARG; if (IsDefunct()) return NS_ERROR_FAILURE; nsAutoString href; mContent->GetAttr(kNameSpaceID_None, nsAccessibilityAtoms::href, href); nsCOMPtr<nsIURI> baseURI = mContent->GetBaseURI(); nsIDocument* document = mContent->GetOwnerDoc(); return NS_NewURI(aURI, href, document ? document->GetDocumentCharacterSet().get() : nsnull, baseURI); }
NS_IMETHODIMP nsAccessNode::GetComputedStyleCSSValue(const nsAString& aPseudoElt, const nsAString& aPropertyName, nsIDOMCSSPrimitiveValue **aCSSValue) { NS_ENSURE_ARG_POINTER(aCSSValue); *aCSSValue = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIDOMCSSStyleDeclaration> styleDecl = nsCoreUtils::GetComputedStyleDeclaration(aPseudoElt, mContent); NS_ENSURE_STATE(styleDecl); nsCOMPtr<nsIDOMCSSValue> cssValue; styleDecl->GetPropertyCSSValue(aPropertyName, getter_AddRefs(cssValue)); NS_ENSURE_TRUE(cssValue, NS_ERROR_FAILURE); return CallQueryInterface(cssValue, aCSSValue); }
nsresult nsXULDropmarkerAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { *aState = 0; if (IsDefunct()) { if (aExtraState) *aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT; return NS_OK_DEFUNCT_OBJECT; } if (aExtraState) *aExtraState = 0; if (DropmarkerOpen(PR_FALSE)) *aState = nsIAccessibleStates::STATE_PRESSED; return NS_OK; }
NS_IMETHODIMP nsARIAGridCellAccessible::GetRowIndex(PRInt32 *aRowIndex) { NS_ENSURE_ARG_POINTER(aRowIndex); *aRowIndex = -1; if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIAccessible> row, prevRow; GetParent(getter_AddRefs(row)); while (row) { if (nsAccUtils::Role(row) == nsIAccessibleRole::ROLE_ROW) (*aRowIndex)++; row->GetPreviousSibling(getter_AddRefs(prevRow)); row.swap(prevRow); } return NS_OK; }
NS_IMETHODIMP nsXULTreeGridAccessible::GetSelectedRowIndices(PRUint32 *arowCount, PRInt32 **aRows) { NS_ENSURE_ARG_POINTER(arowCount); *arowCount = 0; NS_ENSURE_ARG_POINTER(aRows); *aRows = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; PRInt32 selectedrowCount = 0; nsresult rv = GetSelectionCount(&selectedrowCount); NS_ENSURE_SUCCESS(rv, rv); PRInt32* outArray = static_cast<PRInt32*>( nsMemory::Alloc(selectedrowCount * sizeof(PRInt32))); NS_ENSURE_TRUE(outArray, NS_ERROR_OUT_OF_MEMORY); nsCOMPtr<nsITreeSelection> selection; rv = mTreeView->GetSelection(getter_AddRefs(selection)); NS_ENSURE_SUCCESS(rv, rv); PRInt32 rowCount = 0; rv = GetRowCount(&rowCount); NS_ENSURE_SUCCESS(rv, rv); PRBool isSelected; for (PRInt32 rowIdx = 0, arrayIdx = 0; rowIdx < rowCount; rowIdx++) { selection->IsSelected(rowIdx, &isSelected); if (isSelected) outArray[arrayIdx++] = rowIdx; } *arowCount = selectedrowCount; *aRows = outArray; return NS_OK; }
NS_IMETHODIMP nsXULListCellAccessible::GetTable(nsIAccessibleTable **aTable) { NS_ENSURE_ARG_POINTER(aTable); *aTable = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIAccessible> thisRow; GetParent(getter_AddRefs(thisRow)); if (nsAccUtils::Role(thisRow) != nsIAccessibleRole::ROLE_ROW) return NS_OK; nsCOMPtr<nsIAccessible> table; thisRow->GetParent(getter_AddRefs(table)); if (nsAccUtils::Role(table) != nsIAccessibleRole::ROLE_TABLE) return NS_OK; CallQueryInterface(table, aTable); return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::GetRowIndexAt(PRInt32 aCellIndex, PRInt32 *aRowIndex) { NS_ENSURE_ARG_POINTER(aRowIndex); *aRowIndex = -1; if (IsDefunct()) return NS_ERROR_FAILURE; NS_ENSURE_ARG(aCellIndex >= 0); PRInt32 rowCount = 0; GetRowCount(&rowCount); PRInt32 colsCount = 0; GetColumnCount(&colsCount); NS_ENSURE_ARG(aCellIndex < rowCount * colsCount); *aRowIndex = aCellIndex / colsCount; return NS_OK; }
nsresult nsXULListitemAccessible::GetStateInternal(PRUint32 *aState, PRUint32 *aExtraState) { if (mIsCheckbox) { return nsXULMenuitemAccessible::GetStateInternal(aState, aExtraState); } *aState = 0; if (IsDefunct()) { if (aExtraState) *aExtraState = nsIAccessibleStates::EXT_STATE_DEFUNCT; return NS_OK_DEFUNCT_OBJECT; } if (aExtraState) *aExtraState = 0; *aState = nsIAccessibleStates::STATE_FOCUSABLE | nsIAccessibleStates::STATE_SELECTABLE; nsCOMPtr<nsIDOMXULSelectControlItemElement> listItem = do_QueryInterface(mContent); if (listItem) { PRBool isSelected; listItem->GetSelected(&isSelected); if (isSelected) *aState |= nsIAccessibleStates::STATE_SELECTED; if (gLastFocusedNode == mContent) *aState |= nsIAccessibleStates::STATE_FOCUSED; } return NS_OK; }
NS_IMETHODIMP nsXULTreeGridCellAccessible::GetNumActions(PRUint8 *aActionsCount) { NS_ENSURE_ARG_POINTER(aActionsCount); *aActionsCount = 0; if (IsDefunct()) return NS_ERROR_FAILURE; PRBool isCycler = PR_FALSE; mColumn->GetCycler(&isCycler); if (isCycler) { *aActionsCount = 1; return NS_OK; } PRInt16 type; mColumn->GetType(&type); if (type == nsITreeColumn::TYPE_CHECKBOX && IsEditable()) *aActionsCount = 1; return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::IsRowSelected(PRInt32 aRow, PRBool *aIsSelected) { NS_ENSURE_ARG_POINTER(aIsSelected); *aIsSelected = PR_FALSE; if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIAccessible> row = GetRowAt(aRow); NS_ENSURE_ARG(row); if (!nsAccUtils::IsARIASelected(row)) { nsCOMPtr<nsIAccessible> cell; while ((cell = GetNextCellInRow(row, cell))) { if (!nsAccUtils::IsARIASelected(cell)) return NS_OK; } } *aIsSelected = PR_TRUE; return NS_OK; }
NS_IMETHODIMP nsXULTreeAccessible::GetFocusedChild(nsIAccessible **aFocusedChild) { NS_ENSURE_ARG_POINTER(aFocusedChild); *aFocusedChild = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; if (gLastFocusedNode != mContent) return NS_OK; nsCOMPtr<nsIDOMXULMultiSelectControlElement> multiSelect = do_QueryInterface(mContent); if (multiSelect) { PRInt32 row = -1; multiSelect->GetCurrentIndex(&row); if (row >= 0) NS_IF_ADDREF(*aFocusedChild = GetTreeItemAccessible(row)); } return NS_OK; }
void nsAccessNode::ScrollTo(PRUint32 aScrollType) { if (IsDefunct()) return; nsIPresShell* shell = mDoc->PresShell(); if (!shell) return; nsIFrame *frame = GetFrame(); if (!frame) return; nsIContent* content = frame->GetContent(); if (!content) return; PRInt16 vPercent, hPercent; nsCoreUtils::ConvertScrollTypeToPercents(aScrollType, &vPercent, &hPercent); shell->ScrollContentIntoView(content, vPercent, hPercent, nsIPresShell::SCROLL_OVERFLOW_HIDDEN); }
NS_IMETHODIMP nsARIAGridAccessible::GetSelectedCells(nsIArray **aCells) { NS_ENSURE_ARG_POINTER(aCells); *aCells = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; nsresult rv = NS_OK; nsCOMPtr<nsIMutableArray> selCells = do_CreateInstance(NS_ARRAY_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); AccIterator rowIter(this, filters::GetRow); nsAccessible *row = nsnull; while ((row = rowIter.GetNext())) { AccIterator cellIter(row, filters::GetCell); nsAccessible *cell = nsnull; if (nsAccUtils::IsARIASelected(row)) { while ((cell = cellIter.GetNext())) selCells->AppendElement(static_cast<nsIAccessible *>(cell), PR_FALSE); continue; } while ((cell = cellIter.GetNext())) { if (nsAccUtils::IsARIASelected(cell)) selCells->AppendElement(static_cast<nsIAccessible *>(cell), PR_FALSE); } } NS_ADDREF(*aCells = selCells); return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::GetSelectedRowCount(PRUint32* aCount) { NS_ENSURE_ARG_POINTER(aCount); *aCount = 0; if (IsDefunct()) return NS_ERROR_FAILURE; AccIterator rowIter(this, filters::GetRow); nsAccessible *row = nsnull; while ((row = rowIter.GetNext())) { if (nsAccUtils::IsARIASelected(row)) { (*aCount)++; continue; } AccIterator cellIter(row, filters::GetCell); nsAccessible *cell = cellIter.GetNext(); if (!cell) continue; PRBool isRowSelected = PR_TRUE; do { if (!nsAccUtils::IsARIASelected(cell)) { isRowSelected = PR_FALSE; break; } } while ((cell = cellIter.GetNext())); if (isRowSelected) (*aCount)++; } return NS_OK; }
NS_IMETHODIMP nsXULListboxAccessible::GetColumnCount(PRInt32 *aColumnsCout) { NS_ENSURE_ARG_POINTER(aColumnsCout); *aColumnsCout = 0; if (IsDefunct()) return NS_ERROR_FAILURE; nsIContent* headContent = nsnull; PRUint32 count = mContent->GetChildCount(); for (PRUint32 index = 0; index < count; ++index) { nsIContent* childContent = mContent->GetChildAt(index); if (childContent->NodeInfo()->Equals(nsAccessibilityAtoms::listcols, kNameSpaceID_XUL)) { headContent = childContent; } } if (!headContent) return NS_OK; PRUint32 columnCount = 0; count = headContent->GetChildCount(); for (PRUint32 index = 0; index < count; ++index) { nsIContent* childContent = headContent->GetChildAt(index); if (childContent->NodeInfo()->Equals(nsAccessibilityAtoms::listcol, kNameSpaceID_XUL)) { columnCount++; } } *aColumnsCout = columnCount; return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::IsCellSelected(PRInt32 aRow, PRInt32 aColumn, PRBool *aIsSelected) { NS_ENSURE_ARG_POINTER(aIsSelected); *aIsSelected = PR_FALSE; if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIAccessible> row(GetRowAt(aRow)); NS_ENSURE_ARG(row); if (!nsAccUtils::IsARIASelected(row)) { nsCOMPtr<nsIAccessible> cell(GetCellInRowAt(row, aColumn)); NS_ENSURE_ARG(cell); if (!nsAccUtils::IsARIASelected(cell)) return NS_OK; } *aIsSelected = PR_TRUE; return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::IsRowSelected(PRInt32 aRow, PRBool *aIsSelected) { NS_ENSURE_ARG_POINTER(aIsSelected); *aIsSelected = PR_FALSE; if (IsDefunct()) return NS_ERROR_FAILURE; nsAccessible *row = GetRowAt(aRow); NS_ENSURE_ARG(row); if (!nsAccUtils::IsARIASelected(row)) { AccIterator cellIter(row, filters::GetCell); nsAccessible *cell = nsnull; while ((cell = cellIter.GetNext())) { if (!nsAccUtils::IsARIASelected(cell)) return NS_OK; } } *aIsSelected = PR_TRUE; return NS_OK; }
NS_IMETHODIMP nsXULTreeGridAccessible::IsColumnSelected(PRInt32 aColumnIndex, PRBool *aIsSelected) { NS_ENSURE_ARG_POINTER(aIsSelected); *aIsSelected = PR_FALSE; if (IsDefunct()) return NS_ERROR_FAILURE; // If all the row has been selected, then all the columns are selected. // Because we can't select a column alone. PRInt32 rowCount = 0; nsresult rv = GetRowCount(&rowCount); NS_ENSURE_SUCCESS(rv, rv); PRInt32 selectedrowCount = 0; rv = GetSelectionCount(&selectedrowCount); NS_ENSURE_SUCCESS(rv, rv); *aIsSelected = rowCount == selectedrowCount; return NS_OK; }
NS_IMETHODIMP nsXULTreeGridAccessible::GetCellAt(PRInt32 aRowIndex, PRInt32 aColumnIndex, nsIAccessible **aCell) { NS_ENSURE_ARG_POINTER(aCell); *aCell = nsnull; if (IsDefunct()) return NS_ERROR_FAILURE; nsAccessible *rowAccessible = GetTreeItemAccessible(aRowIndex); if (!rowAccessible) return NS_ERROR_INVALID_ARG; nsCOMPtr<nsITreeColumn> column = nsCoreUtils::GetSensibleColumnAt(mTree, aColumnIndex); if (!column) return NS_ERROR_INVALID_ARG; nsRefPtr<nsXULTreeItemAccessibleBase> rowAcc = do_QueryObject(rowAccessible); NS_IF_ADDREF(*aCell = rowAcc->GetCellAccessible(column)); return NS_OK; }
NS_IMETHODIMP nsARIAGridAccessible::SelectColumn(PRInt32 aColumn) { NS_ENSURE_ARG(IsValidColumn(aColumn)); if (IsDefunct()) return NS_ERROR_FAILURE; nsCOMPtr<nsIAccessible> row; while ((row = GetNextRow(row))) { // Unselect all cells in the row. nsresult rv = SetARIASelected(row, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); // Select cell at the column index. nsCOMPtr<nsIAccessible> cell = GetCellInRowAt(row, aColumn); if (cell) { rv = SetARIASelected(cell, PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); } } return NS_OK; }
nsresult nsXULTreeGridCellAccessible::GetAttributesInternal(nsIPersistentProperties *aAttributes) { NS_ENSURE_ARG_POINTER(aAttributes); if (IsDefunct()) return NS_ERROR_FAILURE; // "table-cell-index" attribute nsCOMPtr<nsIAccessible> accessible; mParent->GetParent(getter_AddRefs(accessible)); nsCOMPtr<nsIAccessibleTable> tableAccessible = do_QueryInterface(accessible); // XXX - temp fix for crash bug 516047 if (!tableAccessible) return NS_ERROR_FAILURE; PRInt32 colIdx = GetColumnIndex(); PRInt32 cellIdx = -1; tableAccessible->GetCellIndexAt(mRow, colIdx, &cellIdx); nsAutoString stringIdx; stringIdx.AppendInt(cellIdx); nsAccUtils::SetAccAttr(aAttributes, nsAccessibilityAtoms::tableCellIndex, stringIdx); // "cycles" attribute PRBool isCycler = PR_FALSE; nsresult rv = mColumn->GetCycler(&isCycler); if (NS_SUCCEEDED(rv) && isCycler) nsAccUtils::SetAccAttr(aAttributes, nsAccessibilityAtoms::cycles, NS_LITERAL_STRING("true")); return NS_OK; }
NS_IMETHODIMP nsXULTreeItemAccessibleBase::GetActionName(PRUint8 aIndex, nsAString& aName) { if (IsDefunct()) return NS_ERROR_FAILURE; if (aIndex == eAction_Click) { aName.AssignLiteral("activate"); return NS_OK; } if (aIndex == eAction_Expand && IsExpandable()) { PRBool isContainerOpen; mTreeView->IsContainerOpen(mRow, &isContainerOpen); if (isContainerOpen) aName.AssignLiteral("collapse"); else aName.AssignLiteral("expand"); return NS_OK; } return NS_ERROR_INVALID_ARG; }