Fix for bug 377285 - sync nsIAccessNode::scrollTo with IA2, r=aaronlev
authorsurkov.alexander@gmail.com
Thu, 12 Apr 2007 09:54:09 -0700
changeset 497 9b58f71e58c028369e445f59d0021e772cbdbd67
parent 496 5d2944ff59901a70e5eab9c2d3370817bef2208f
child 498 55a5ef5f4af94bdc7f5ebdfd402c60fcce405692
push id1
push userroot
push dateTue, 26 Apr 2011 22:38:44 +0000
treeherdermozilla-beta@bfdb6e623a36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersaaronlev
bugs377285
milestone1.9a4pre
Fix for bug 377285 - sync nsIAccessNode::scrollTo with IA2, r=aaronlev
accessible/public/Makefile.in
accessible/public/nsIAccessNode.idl
accessible/public/nsIAccessibleTypes.idl
accessible/src/base/nsAccessNode.cpp
accessible/src/base/nsAccessNode.h
accessible/src/msaa/nsAccessNodeWrap.cpp
accessible/src/msaa/nsAccessibleWrap.cpp
--- a/accessible/public/Makefile.in
+++ b/accessible/public/Makefile.in
@@ -46,16 +46,17 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
 DIRS = msaa ia2
 endif
 
 MODULE    = accessibility
 XPIDL_MODULE= accessibility
 GRE_MODULE	= 1
 
 XPIDLSRCS = \
+      nsIAccessibleTypes.idl \
       nsIAccessibilityService.idl \
       nsIAccessibleRetrieval.idl \
       nsIAccessible.idl \
       nsIAccessibleRole.idl \
       nsIAccessibleStates.idl \
       nsPIAccessible.idl \
       nsIAccessibleCaret.idl \
       nsIAccessibleDocument.idl \
--- a/accessible/public/nsIAccessNode.idl
+++ b/accessible/public/nsIAccessNode.idl
@@ -50,17 +50,17 @@ interface nsIAccessibleDocument;
  * The nsIAccessNode implementations are instantiated lazily.
  * The nsIAccessNode tree for a given dom window
  * has a one to one relationship to the DOM tree.
  * If the DOM node for this access node is "accessible",
  * then a QueryInterface to nsIAccessible will succeed.
  *
  * @status UNDER_REVIEW
  */
-[scriptable, uuid(0bd7ccde-486d-483c-a6df-79869cb6647d)]
+[scriptable, uuid(11c0007f-531c-43b7-be63-a3060a13d8d2)]
 interface nsIAccessNode : nsISupports
 {
   /**
    * The DOM node this nsIAccessNode is associated with.
    */
   readonly attribute nsIDOMNode DOMNode;
 
   /**
@@ -113,20 +113,32 @@ interface nsIAccessNode : nsISupports
    * This is a text string of all the markup inside the DOM
    * node, not including the start and end tag for the node.
    */
   readonly attribute DOMString innerHTML;
 
   /**
    * 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
    * is being displayed in.
    */
   [noscript] readonly attribute voidPtr ownerWindow;
   
   /**
new file mode 100755
--- /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 <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;
+};
--- a/accessible/src/base/nsAccessNode.cpp
+++ b/accessible/src/base/nsAccessNode.cpp
@@ -349,32 +349,65 @@ nsAccessNode::GetInnerHTML(nsAString& aI
 
   nsCOMPtr<nsIDOMNSHTMLElement> domNSElement(do_QueryInterface(mDOMNode));
   NS_ENSURE_TRUE(domNSElement, NS_ERROR_NULL_POINTER);
 
   return domNSElement->GetInnerHTML(aInnerHTML);
 }
 
 NS_IMETHODIMP
-nsAccessNode::ScrollTo(PRBool aTopLeft)
+nsAccessNode::ScrollTo(PRUint32 aScrollType)
 {
   NS_ENSURE_TRUE(mDOMNode, 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);
 
-  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
 nsAccessNode::MakeAccessNode(nsIDOMNode *aNode, nsIAccessNode **aAccessNode)
 {
   *aAccessNode = nsnull;
   
   nsIAccessibilityService *accService = GetAccService();
--- a/accessible/src/base/nsAccessNode.h
+++ b/accessible/src/base/nsAccessNode.h
@@ -40,16 +40,17 @@
  * see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
  */
 
 #ifndef _nsAccessNode_H_
 #define _nsAccessNode_H_
 
 #include "nsCOMPtr.h"
 #include "nsAccessibilityAtoms.h"
+#include "nsIAccessibleTypes.h"
 #include "nsIAccessNode.h"
 #include "nsIContent.h"
 #include "nsPIAccessNode.h"
 #include "nsIDocShellTreeItem.h"
 #include "nsIDOMNode.h"
 #include "nsINameSpaceManager.h"
 #include "nsIStringBundle.h"
 #include "nsWeakReference.h"
--- a/accessible/src/msaa/nsAccessNodeWrap.cpp
+++ b/accessible/src/msaa/nsAccessNodeWrap.cpp
@@ -309,24 +309,27 @@ STDMETHODIMP nsAccessNodeWrap::get_compu
     aStyleValues[index] = ::SysAllocString(value.get());
   }
 
   return S_OK;
 }
 
 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) 
     return NULL;
 
   nsAccessNodeWrap *newNode = NULL;
   
   nsCOMPtr<nsIContent> content(do_QueryInterface(node));
--- a/accessible/src/msaa/nsAccessibleWrap.cpp
+++ b/accessible/src/msaa/nsAccessibleWrap.cpp
@@ -1076,20 +1076,19 @@ nsAccessibleWrap::role(long *role)
                "MSAA role map skewed");
 
   *role = gWindowsRoleMap[xpRole].ia2Role;
 
   return S_OK;
 }
 
 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;
 }
 
 STDMETHODIMP
 nsAccessibleWrap::scrollToPoint(enum IA2CoordinateType coordinateType,
                                 long x, long y)
 {