Fix for bug 377285 - sync nsIAccessNode::scrollTo with IA2, r=aaronlev

This commit is contained in:
surkov.alexander@gmail.com 2007-04-12 09:54:09 -07:00
parent 0e344e40d3
commit c42b24bed5
7 changed files with 165 additions and 13 deletions

View File

@ -51,6 +51,7 @@ XPIDL_MODULE= accessibility
GRE_MODULE = 1
XPIDLSRCS = \
nsIAccessibleTypes.idl \
nsIAccessibilityService.idl \
nsIAccessibleRetrieval.idl \
nsIAccessible.idl \

View File

@ -55,7 +55,7 @@ interface nsIAccessibleDocument;
*
* @status UNDER_REVIEW
*/
[scriptable, uuid(0bd7ccde-486d-483c-a6df-79869cb6647d)]
[scriptable, uuid(11c0007f-531c-43b7-be63-a3060a13d8d2)]
interface nsIAccessNode : nsISupports
{
/**
@ -118,10 +118,22 @@ interface nsIAccessNode : nsISupports
/**
* Makes an object visible on screen.
*
* @param topLeft - if false then it will scroll the shortest distance it
* needs to put the element on-screen.
* @param scrollType - defines where the object should be placed on
* the screen (see nsIAccessibleScrollType for
* available constants).
*/
void scrollTo(in boolean aTopLeft);
void scrollTo(in unsigned long aScrollType);
/**
* Moves the top left of an object to a specified location.
*
* @param coordinateType - specifies whether the coordinates are relative to
* the screen or the parent object (for available
* constants refer to nsIAccessibleCoordinateType)
* @param aX - defines the x coordinate
* @param aY - defines the y coordinate
*/
void scrollToPoint(in unsigned long aCoordinateType, in long aX, in long aY);
/**
* The OS window handle for the window this node

View File

@ -0,0 +1,103 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Alexander Surkov <surkov.alexander@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsISupports.idl"
/**
* These constants control the scrolling of an object or substring into a
* window. Note, keep them synchronized with IA2ScrollType.
*/
[scriptable, uuid(05cd38b1-94b3-4cdf-8371-3935a9611405)]
interface nsIAccessibleScrollType : nsISupports
{
/**
* Scroll the top left of the object or substring to the top left of the
* window (or as close as possible).
*/
const unsigned long SCROLL_TYPE_TOP_LEFT =0x00;
/**
* Scroll the bottom right of the object or substring to the bottom right of
* the window (or as close as possible).
*/
const unsigned long SCROLL_TYPE_BOTTOM_RIGHT = 0x01;
/**
* Scroll the top edge of the object or substring to the top edge of the
* window (or as close as possible).
*/
const unsigned long SCROLL_TYPE_TOP_EDGE = 0x02;
/**
* Scroll the bottom edge of the object or substring to the bottom edge of
* the window (or as close as possible).
*/
const unsigned long SCROLL_TYPE_BOTTOM_EDGE = 0x03;
/**
* Scroll the left edge of the object or substring to the left edge of the
* window (or as close as possible).
*/
const unsigned long SCROLL_TYPE_LEFT_EDGE =0x04;
/**
* Scroll the right edge of the object or substring to the right edge of the
* window (or as close as possible).
*/
const unsigned long SCROLL_TYPE_RIGHT_EDGE = 0x05;
};
/**
* These constants define which coordinate system a point is located in. Note,
* keep them synchronized with IA2CoordinateType.
*/
[scriptable, uuid(15a523bb-fb3b-4cb2-af87-ad26ea792c4c)]
interface nsIAccessibleCoordinateType : nsISupports
{
/**
* The coordinates are relative to the screen.
*/
const unsigned long COORDTYPE_SCREEN_RELATIVE = 0x00;
/**
* The coordinates are relative to the upper left corner of the bounding box
* of the immediate parent.
*/
const unsigned long COORDTYPE_PARENT_RELATIVE = 0x01;
};

View File

@ -354,7 +354,7 @@ nsAccessNode::GetInnerHTML(nsAString& aInnerHTML)
}
NS_IMETHODIMP
nsAccessNode::ScrollTo(PRBool aTopLeft)
nsAccessNode::ScrollTo(PRUint32 aScrollType)
{
NS_ENSURE_TRUE(mDOMNode, NS_ERROR_FAILURE);
@ -367,9 +367,42 @@ nsAccessNode::ScrollTo(PRBool aTopLeft)
nsCOMPtr<nsIContent> content = frame->GetContent();
NS_ENSURE_TRUE(content, NS_ERROR_FAILURE);
PRInt32 percent = aTopLeft ? NS_PRESSHELL_SCROLL_TOP :
NS_PRESSHELL_SCROLL_ANYWHERE;
return shell->ScrollContentIntoView(content, percent, percent);
PRInt32 vPercent, hPercent;
switch (aScrollType)
{
case nsIAccessibleScrollType::SCROLL_TYPE_TOP_LEFT:
vPercent = NS_PRESSHELL_SCROLL_TOP;
hPercent = NS_PRESSHELL_SCROLL_LEFT;
break;
case nsIAccessibleScrollType::SCROLL_TYPE_BOTTOM_RIGHT:
vPercent = NS_PRESSHELL_SCROLL_BOTTOM;
hPercent = NS_PRESSHELL_SCROLL_RIGHT;
break;
case nsIAccessibleScrollType::SCROLL_TYPE_TOP_EDGE:
vPercent = NS_PRESSHELL_SCROLL_TOP;
hPercent = NS_PRESSHELL_SCROLL_ANYWHERE;
break;
case nsIAccessibleScrollType::SCROLL_TYPE_BOTTOM_EDGE:
vPercent = NS_PRESSHELL_SCROLL_BOTTOM;
hPercent = NS_PRESSHELL_SCROLL_ANYWHERE;
break;
case nsIAccessibleScrollType::SCROLL_TYPE_LEFT_EDGE:
vPercent = NS_PRESSHELL_SCROLL_ANYWHERE;
hPercent = NS_PRESSHELL_SCROLL_LEFT;
break;
case nsIAccessibleScrollType::SCROLL_TYPE_RIGHT_EDGE:
vPercent = NS_PRESSHELL_SCROLL_ANYWHERE;
hPercent = NS_PRESSHELL_SCROLL_RIGHT;
break;
}
return shell->ScrollContentIntoView(content, vPercent, hPercent);
}
NS_IMETHODIMP
nsAccessNode::ScrollToPoint(PRUint32 aCoordinateType, PRInt32 aX, PRInt32 aY)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
nsresult

View File

@ -45,6 +45,7 @@
#include "nsCOMPtr.h"
#include "nsAccessibilityAtoms.h"
#include "nsIAccessibleTypes.h"
#include "nsIAccessNode.h"
#include "nsIContent.h"
#include "nsPIAccessNode.h"

View File

@ -314,14 +314,17 @@ STDMETHODIMP nsAccessNodeWrap::get_computedStyleForProperties(
STDMETHODIMP nsAccessNodeWrap::scrollTo(/* [in] */ boolean aScrollTopLeft)
{
nsresult rv = ScrollTo(aScrollTopLeft);
PRUint32 scrollType =
aScrollTopLeft ? nsIAccessibleScrollType::SCROLL_TYPE_TOP_LEFT :
nsIAccessibleScrollType::SCROLL_TYPE_BOTTOM_RIGHT;
nsresult rv = ScrollTo(scrollType);
if (NS_SUCCEEDED(rv))
return S_OK;
return E_FAIL;
}
ISimpleDOMNode* nsAccessNodeWrap::MakeAccessNode(nsIDOMNode *node)
{
if (!node)

View File

@ -1081,10 +1081,9 @@ nsAccessibleWrap::role(long *role)
}
STDMETHODIMP
nsAccessibleWrap::scrollTo(enum IA2ScrollType scrollType)
nsAccessibleWrap::scrollTo(enum IA2ScrollType aScrollType)
{
// XXX Handle scrollType
if (NS_SUCCEEDED(ScrollTo(PR_TRUE)))
if (NS_SUCCEEDED(ScrollTo(aScrollType)))
return S_OK;
return E_FAIL;
}