Bug 727942 - scrollSubstringToPoint is broken when page is zoomed, r=tbsaunde

This commit is contained in:
Alexander Surkov 2012-10-21 10:38:15 +09:00
parent 51dc398f98
commit 78aedb8c5e
4 changed files with 185 additions and 9 deletions

View File

@ -1898,7 +1898,9 @@ HyperTextAccessible::ScrollSubstringToPoint(int32_t aStartIndex,
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;
@ -1908,12 +1910,9 @@ HyperTextAccessible::ScrollSubstringToPoint(int32_t aStartIndex,
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());
@ -1921,8 +1920,8 @@ HyperTextAccessible::ScrollSubstringToPoint(int32_t aStartIndex,
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);

View File

@ -131,6 +131,24 @@ function testBounds(aID, aRect)
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.
*/

View File

@ -12,6 +12,7 @@ relativesrcdir = accessible/scroll
include $(DEPTH)/config/autoconf.mk
MOCHITEST_A11Y_FILES =\
test_zoom_text.html \
test_zoom.html \
$(NULL)

View File

@ -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>