Merge m-c to m-i.
authorMs2ger <ms2ger@gmail.com>
Sun, 21 Oct 2012 10:36:35 +0200
changeset 111126 0ee1233feb66a90875a8075a6b28cfad031c7a1b
parent 111029 abe709bfc49a4d5027bd15331b0cad36e753082b (current diff)
parent 111125 c127ae4496a3acb6a95dce93d782cb884859d1e9 (diff)
child 111127 7af92c476876e6d6b96390edff011cee3d949494
push id93
push usernmatsakis@mozilla.com
push dateWed, 31 Oct 2012 21:26:57 +0000
milestone19.0a1
Merge m-c to m-i.
--- a/accessible/src/generic/Accessible.cpp
+++ b/accessible/src/generic/Accessible.cpp
@@ -186,22 +186,16 @@ Accessible::Accessible(nsIContent* aCont
 //-----------------------------------------------------
 // destruction
 //-----------------------------------------------------
 Accessible::~Accessible()
 {
 }
 
 void
-Accessible::SetRoleMapEntry(nsRoleMapEntry* aRoleMapEntry)
-{
-  mRoleMapEntry = aRoleMapEntry;
-}
-
-void
 Accessible::Init()
 {
 }
 
 NS_IMETHODIMP
 Accessible::GetDocument(nsIAccessibleDocument** aDocument)
 {
   NS_ENSURE_ARG_POINTER(aDocument);
--- a/accessible/src/generic/Accessible.h
+++ b/accessible/src/generic/Accessible.h
@@ -306,17 +306,18 @@ public:
 
   /**
    * Set the ARIA role map entry for a new accessible.
    * For a newly created accessible, specify which role map entry should be used.
    *
    * @param aRoleMapEntry The ARIA nsRoleMapEntry* for the accessible, or
    *                      nullptr if none.
    */
-  virtual void SetRoleMapEntry(nsRoleMapEntry* aRoleMapEntry);
+  void SetRoleMapEntry(nsRoleMapEntry* aRoleMapEntry)
+    { mRoleMapEntry = aRoleMapEntry; }
 
   /**
    * Update the children cache.
    */
   inline bool UpdateChildren()
   {
     InvalidateChildren();
     return EnsureChildren();
--- a/accessible/src/generic/DocAccessible.cpp
+++ b/accessible/src/generic/DocAccessible.cpp
@@ -238,39 +238,16 @@ DocAccessible::NativeRole()
     else if (itemType == nsIDocShellTreeItem::typeContent) {
       return roles::DOCUMENT;
     }
   }
 
   return roles::PANE; // Fall back;
 }
 
-// Accessible public method
-void
-DocAccessible::SetRoleMapEntry(nsRoleMapEntry* aRoleMapEntry)
-{
-  NS_ASSERTION(mDocument, "No document during initialization!");
-  if (!mDocument)
-    return;
-
-  mRoleMapEntry = aRoleMapEntry;
-
-  nsIDocument *parentDoc = mDocument->GetParentDocument();
-  if (!parentDoc)
-    return; // No parent document for the root document
-
-  // Allow use of ARIA role from outer to override
-  nsIContent *ownerContent = parentDoc->FindContentForSubDocument(mDocument);
-  if (ownerContent) {
-    nsRoleMapEntry* roleMapEntry = aria::GetRoleMap(ownerContent);
-    if (roleMapEntry)
-      mRoleMapEntry = roleMapEntry; // Override
-  }
-}
-
 void
 DocAccessible::Description(nsString& aDescription)
 {
   if (mParent)
     mParent->Description(aDescription);
 
   if (HasOwnContent() && aDescription.IsEmpty()) {
     nsTextEquivUtils::
--- a/accessible/src/generic/DocAccessible.h
+++ b/accessible/src/generic/DocAccessible.h
@@ -90,18 +90,16 @@ public:
   virtual Accessible* FocusedChild();
   virtual mozilla::a11y::role NativeRole();
   virtual uint64_t NativeState();
   virtual uint64_t NativeInteractiveState() const;
   virtual bool NativelyUnavailable() const;
   virtual void ApplyARIAState(uint64_t* aState) const;
   virtual already_AddRefed<nsIPersistentProperties> Attributes();
 
-  virtual void SetRoleMapEntry(nsRoleMapEntry* aRoleMapEntry);
-
 #ifdef A11Y_LOG
   virtual nsresult HandleAccEvent(AccEvent* aEvent);
 #endif
 
   virtual void GetBoundsRect(nsRect& aRect, nsIFrame** aRelativeFrame);
 
   // HyperTextAccessible
   virtual already_AddRefed<nsIEditor> GetEditor() const;
--- a/accessible/src/generic/HyperTextAccessible.cpp
+++ b/accessible/src/generic/HyperTextAccessible.cpp
@@ -1893,41 +1893,40 @@ HyperTextAccessible::ScrollSubstringToPo
   nsresult rv = nsAccUtils::ConvertToScreenCoords(aX, aY, aCoordinateType,
                                                   this, &coords);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsRefPtr<nsRange> range = new nsRange();
   rv = HypertextOffsetsToDOMRange(aStartIndex, aEndIndex, range);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  nsPresContext *presContext = frame->PresContext();
+  nsPresContext* presContext = frame->PresContext();
+  nsPoint coordsInAppUnits =
+    coords.ToAppUnits(presContext->AppUnitsPerDevPixel());
 
   bool initialScrolled = false;
   nsIFrame *parentFrame = frame;
   while ((parentFrame = parentFrame->GetParent())) {
     nsIScrollableFrame *scrollableFrame = do_QueryFrame(parentFrame);
     if (scrollableFrame) {
       if (!initialScrolled) {
         // Scroll substring to the given point. Turn the point into percents
         // relative scrollable area to use nsCoreUtils::ScrollSubstringTo.
-        nsIntRect frameRect = parentFrame->GetScreenRectExternal();
-        int32_t devOffsetX = coords.x - frameRect.x;
-        int32_t devOffsetY = coords.y - frameRect.y;
-
-        nsPoint offsetPoint(presContext->DevPixelsToAppUnits(devOffsetX),
-                            presContext->DevPixelsToAppUnits(devOffsetY));
+        nsRect frameRect = parentFrame->GetScreenRectInAppUnits();
+        nscoord offsetPointX = coordsInAppUnits.x - frameRect.x;
+        nscoord offsetPointY = coordsInAppUnits.y - frameRect.y;
 
         nsSize size(parentFrame->GetSize());
 
         // avoid divide by zero
         size.width = size.width ? size.width : 1;
         size.height = size.height ? size.height : 1;
 
-        int16_t hPercent = offsetPoint.x * 100 / size.width;
-        int16_t vPercent = offsetPoint.y * 100 / size.height;
+        int16_t hPercent = offsetPointX * 100 / size.width;
+        int16_t vPercent = offsetPointY * 100 / size.height;
 
         rv = nsCoreUtils::ScrollSubstringTo(frame, range, vPercent, hPercent);
         NS_ENSURE_SUCCESS(rv, rv);
 
         initialScrolled = true;
       } else {
         // Substring was scrolled to the given point already inside its closest
         // scrollable area. If there are nested scrollable areas then make
--- a/accessible/tests/mochitest/layout.js
+++ b/accessible/tests/mochitest/layout.js
@@ -127,16 +127,34 @@ function testBounds(aID, aRect)
   var [x, y, width, height] = getBounds(aID);
   is(x, expectedX, "Wrong x coordinate of " + prettyName(aID));
   is(y, expectedY, "Wrong y coordinate of " + prettyName(aID));
   is(width, expectedWidth, "Wrong width of " + prettyName(aID));
   is(height, expectedHeight, "Wrong height of " + prettyName(aID));
 }
 
 /**
+ * Test text position at the given offset.
+ */
+function testTextPos(aID, aOffset, aPoint, aCoordOrigin)
+{
+  var [expectedX, expectedY] = aPoint;
+
+  var xObj = {}, yObj = {};
+  var hyperText = getAccessible(aID, [nsIAccessibleText]);
+  hyperText.getCharacterExtents(aOffset, xObj, yObj, {}, {}, aCoordOrigin);
+  is(xObj.value, expectedX,
+     "Wrong x coordinate at offset " + aOffset + " for " + prettyName(aID));
+  ok(yObj.value - expectedY < 2 && expectedY - yObj.value < 2,
+     "Wrong y coordinate at offset " + aOffset + " for " + prettyName(aID) +
+     " - got " + yObj.value + ", expected " + expectedY +
+     "The difference doesn't exceed 1.");
+}
+
+/**
  * Test text bounds that is enclosed betwene the given offsets.
  */
 function testTextBounds(aID, aStartOffset, aEndOffset, aRect, aCoordOrigin)
 {
   var [expectedX, expectedY, expectedWidth, expectedHeight] = aRect;
 
   var xObj = {}, yObj = {}, widthObj = {}, heightObj = {};
   var hyperText = getAccessible(aID, [nsIAccessibleText]);
--- a/accessible/tests/mochitest/scroll/Makefile.in
+++ b/accessible/tests/mochitest/scroll/Makefile.in
@@ -7,12 +7,13 @@ DEPTH		= @DEPTH@
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 relativesrcdir  = accessible/scroll
 
 include $(DEPTH)/config/autoconf.mk
 
 MOCHITEST_A11Y_FILES =\
+		test_zoom_text.html \
 		test_zoom.html \
 		$(NULL)
 
 include $(topsrcdir)/config/rules.mk
new file mode 100644
--- /dev/null
+++ b/accessible/tests/mochitest/scroll/test_zoom_text.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Test scrollSubstringToPoint when page is zoomed</title>
+  <link rel="stylesheet" type="text/css"
+        href="chrome://mochikit/content/tests/SimpleTest/test.css" />
+
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
+
+  <script type="application/javascript"
+          src="../common.js"></script>
+  <script type="application/javascript"
+          src="../role.js"></script>
+  <script type="application/javascript"
+          src="../layout.js"></script>
+  <script type="application/javascript"
+          src="../browser.js"></script>
+
+  <script type="application/javascript">
+    function doTest()
+    {
+      var tabDocument = currentTabDocument();
+      var paragraphNode = tabDocument.getElementById("paragraph");
+      var paragraph = getAccessible(paragraphNode, [nsIAccessibleText]);
+      var offset = 64; // beginning of 4th stanza
+
+      var [x, y] = getPos(paragraph);
+      var [docX, docY] = getPos(tabDocument);
+
+      paragraph.scrollSubstringToPoint(offset, offset,
+                                       COORDTYPE_SCREEN_RELATIVE, docX, docY);
+      testTextPos(paragraph, offset, [x, docY], COORDTYPE_SCREEN_RELATIVE);
+
+      zoomDocument(tabDocument, 2.0);
+
+      paragraphNode = tabDocument.getElementById("paragraph2");
+      paragraph = getAccessible(paragraphNode, [nsIAccessibleText]);
+      offset = 52; // // beginning of 4th stanza
+      var [x, y] = getPos(paragraph);
+      paragraph.scrollSubstringToPoint(offset, offset,
+                                       COORDTYPE_SCREEN_RELATIVE, docX, docY);
+      testTextPos(paragraph, offset, [x, docY], COORDTYPE_SCREEN_RELATIVE);
+
+      closeBrowserWindow();
+      SimpleTest.finish();
+    }
+
+    var url = "data:text/html,<html>" +
+      "<meta http-equiv='Content-Type' content='text/html;charset=utf-8' />" +
+      "<body>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br><hr>" +
+      "<p id='paragraph'>" +
+      "  Пошел котик на торжок<br>" +
+      "  Купил котик пирожок<br>" +
+      "  Пошел котик на улочку<br>" +
+      "  Купил котик булочку<br>" +
+      "</p>" +
+      "<hr><br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br><hr>" +
+      "<p id='paragraph2'>" +
+      "  Самому ли съесть<br>" +
+      "  Либо Сашеньке снесть<br>" +
+      "  Я и сам укушу<br>" +
+      "  Я и Сашеньке снесу<br>" +
+      "</p>" +
+      "<hr><br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "<br><br><br><br><br><br><br><br><br><br>" +
+      "</body></html>";
+
+    SimpleTest.waitForExplicitFinish();
+    openBrowserWindow(doTest,
+                      url,
+                      { left: 0, top: 0, width: 600, height: 600 });
+  </script>
+
+</head>
+<body>
+
+  <a target="_blank"
+     href="https://bugzilla.mozilla.org/show_bug.cgi?id=727942"
+     title="scrollSubstringToPoint is broken when page is zoomed">
+    Mozilla Bug 727942
+  </a>
+  <p id="display"></p>
+  <div id="content" style="display: none"></div>
+  <pre id="test">
+  </pre>
+</body>
+</html>
--- a/build/unix/build-clang/build-clang.py
+++ b/build/unix/build-clang/build-clang.py
@@ -1,14 +1,14 @@
 #!/usr/bin/python
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-llvm_revision = "164411"
+llvm_revision = "166095"
 moz_version = "moz0"
 
 ##############################################
 
 import os
 import os.path
 import shutil
 import tarfile
--- a/dom/base/nsWindowMemoryReporter.cpp
+++ b/dom/base/nsWindowMemoryReporter.cpp
@@ -23,34 +23,34 @@ nsWindowMemoryReporter::nsWindowMemoryRe
 NS_IMPL_ISUPPORTS3(nsWindowMemoryReporter, nsIMemoryMultiReporter, nsIObserver,
                    nsSupportsWeakReference)
 
 /* static */
 void
 nsWindowMemoryReporter::Init()
 {
   // The memory reporter manager will own this object.
-  nsWindowMemoryReporter *windowReporter = new nsWindowMemoryReporter();
+  nsRefPtr<nsWindowMemoryReporter> windowReporter = new nsWindowMemoryReporter();
   NS_RegisterMemoryMultiReporter(windowReporter);
 
   nsCOMPtr<nsIObserverService> os = services::GetObserverService();
   if (os) {
     // DOM_WINDOW_DESTROYED_TOPIC announces what we call window "detachment",
     // when a window's docshell is set to NULL.
     os->AddObserver(windowReporter, DOM_WINDOW_DESTROYED_TOPIC,
                     /* weakRef = */ true);
     os->AddObserver(windowReporter, "after-minimize-memory-usage",
                     /* weakRef = */ true);
   }
 
-  GhostURLsReporter *ghostMultiReporter =
+  nsRefPtr<GhostURLsReporter> ghostMultiReporter =
     new GhostURLsReporter(windowReporter);
   NS_RegisterMemoryMultiReporter(ghostMultiReporter);
 
-  NumGhostsReporter *ghostReporter =
+  nsRefPtr<NumGhostsReporter> ghostReporter =
     new NumGhostsReporter(windowReporter);
   NS_RegisterMemoryReporter(ghostReporter);
 }
 
 static already_AddRefed<nsIURI>
 GetWindowURI(nsIDOMWindow *aWindow)
 {
   nsCOMPtr<nsPIDOMWindow> pWindow = do_QueryInterface(aWindow);
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -118,16 +118,17 @@ SessionDescription.prototype = {
   }
 };
 
 function PeerConnection() {
   this._queue = [];
 
   this._pc = null;
   this._observer = null;
+  this._closed = false;
 
   this._onCreateOfferSuccess = null;
   this._onCreateOfferFailure = null;
   this._onCreateAnswerSuccess = null;
   this._onCreateAnswerFailure = null;
 
   /**
    * Everytime we get a request from content, we put it in the queue. If
@@ -198,16 +199,19 @@ PeerConnection.prototype = {
 
   /**
    * Add a function to the queue or run it immediately if the queue is empty.
    * Argument is an object with the func, args and wait properties; wait should
    * be set to true if the function has a success/error callback that will
    * call _executeNext, false if it doesn't have a callback.
    */
   _queueOrRun: function(obj) {
+    if (this._closed) {
+	return;
+    }
     if (!this._pending) {
       obj.func.apply(this, obj.args);
       if (obj.wait) {
         this._pending = true;
       }
     } else {
       this._queue.push(obj);
     }
@@ -415,16 +419,17 @@ PeerConnection.prototype = {
   },
 
   close: function() {
     this._queueOrRun({
       func: this._pc.close,
       args: [],
       wait: false
     });
+    this._closed = true;
   },
 
   get localStreams() {
     return this._pc.localStreams;
   },
   get remoteStreams() {
     return this._pc.remoteStreams;
   },