From c42b24bed58dfd7b1ac824a7a99428e0e7d02b7f Mon Sep 17 00:00:00 2001 From: "surkov.alexander@gmail.com" Date: Thu, 12 Apr 2007 09:54:09 -0700 Subject: [PATCH] Fix for bug 377285 - sync nsIAccessNode::scrollTo with IA2, r=aaronlev --- accessible/public/Makefile.in | 1 + accessible/public/nsIAccessNode.idl | 20 ++++- accessible/public/nsIAccessibleTypes.idl | 103 +++++++++++++++++++++++ accessible/src/base/nsAccessNode.cpp | 41 ++++++++- accessible/src/base/nsAccessNode.h | 1 + accessible/src/msaa/nsAccessNodeWrap.cpp | 7 +- accessible/src/msaa/nsAccessibleWrap.cpp | 5 +- 7 files changed, 165 insertions(+), 13 deletions(-) create mode 100755 accessible/public/nsIAccessibleTypes.idl diff --git a/accessible/public/Makefile.in b/accessible/public/Makefile.in index 5b0f434976d..4d328d4e2a4 100644 --- a/accessible/public/Makefile.in +++ b/accessible/public/Makefile.in @@ -51,6 +51,7 @@ XPIDL_MODULE= accessibility GRE_MODULE = 1 XPIDLSRCS = \ + nsIAccessibleTypes.idl \ nsIAccessibilityService.idl \ nsIAccessibleRetrieval.idl \ nsIAccessible.idl \ diff --git a/accessible/public/nsIAccessNode.idl b/accessible/public/nsIAccessNode.idl index 92093e6e805..2e0d9be620a 100644 --- a/accessible/public/nsIAccessNode.idl +++ b/accessible/public/nsIAccessNode.idl @@ -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 diff --git a/accessible/public/nsIAccessibleTypes.idl b/accessible/public/nsIAccessibleTypes.idl new file mode 100755 index 00000000000..0a1d3149436 --- /dev/null +++ b/accessible/public/nsIAccessibleTypes.idl @@ -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 (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; +}; diff --git a/accessible/src/base/nsAccessNode.cpp b/accessible/src/base/nsAccessNode.cpp index ea3065cbd29..a34a6023081 100755 --- a/accessible/src/base/nsAccessNode.cpp +++ b/accessible/src/base/nsAccessNode.cpp @@ -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 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 diff --git a/accessible/src/base/nsAccessNode.h b/accessible/src/base/nsAccessNode.h index fb7bf285b2f..cebf08c900d 100755 --- a/accessible/src/base/nsAccessNode.h +++ b/accessible/src/base/nsAccessNode.h @@ -45,6 +45,7 @@ #include "nsCOMPtr.h" #include "nsAccessibilityAtoms.h" +#include "nsIAccessibleTypes.h" #include "nsIAccessNode.h" #include "nsIContent.h" #include "nsPIAccessNode.h" diff --git a/accessible/src/msaa/nsAccessNodeWrap.cpp b/accessible/src/msaa/nsAccessNodeWrap.cpp index 3dde4318fa4..3d95cd24d0b 100644 --- a/accessible/src/msaa/nsAccessNodeWrap.cpp +++ b/accessible/src/msaa/nsAccessNodeWrap.cpp @@ -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) diff --git a/accessible/src/msaa/nsAccessibleWrap.cpp b/accessible/src/msaa/nsAccessibleWrap.cpp index cd564fd12de..de61e702075 100644 --- a/accessible/src/msaa/nsAccessibleWrap.cpp +++ b/accessible/src/msaa/nsAccessibleWrap.cpp @@ -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; }