Bug 369370 - pop-up window image zoom-out leads to wrong (broken) display. r=jst, a.19=damons

git-svn-id: svn://10.0.0.236/trunk@250595 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
dolske%mozilla.com 2008-04-22 04:41:38 +00:00
parent 25b2058d2b
commit a319041510
4 changed files with 119 additions and 2 deletions

View File

@ -126,6 +126,8 @@ protected:
void UpdateTitleAndCharset();
nsresult ScrollImageTo(PRInt32 aX, PRInt32 aY, PRBool restoreImage);
float GetRatio() {
return PR_MIN((float)mVisibleWidth / mImageWidth,
(float)mVisibleHeight / mImageHeight);
@ -425,6 +427,10 @@ nsImageDocument::ShrinkToFit()
image->SetWidth(PR_MAX(1, NSToCoordFloor(GetRatio() * mImageWidth)));
image->SetHeight(PR_MAX(1, NSToCoordFloor(GetRatio() * mImageHeight)));
// The view might have been scrolled when zooming in, scroll back to the
// origin now that we're showing a shrunk-to-window version.
(void) ScrollImageTo(0, 0, PR_FALSE);
imageContent->SetAttr(kNameSpaceID_None, nsGkAtoms::style,
NS_LITERAL_STRING("cursor: -moz-zoom-in"), PR_TRUE);
@ -437,11 +443,19 @@ nsImageDocument::ShrinkToFit()
NS_IMETHODIMP
nsImageDocument::RestoreImageTo(PRInt32 aX, PRInt32 aY)
{
return ScrollImageTo(aX, aY, PR_TRUE);
}
nsresult
nsImageDocument::ScrollImageTo(PRInt32 aX, PRInt32 aY, PRBool restoreImage)
{
float ratio = GetRatio();
RestoreImage();
FlushPendingNotifications(Flush_Layout);
if (restoreImage) {
RestoreImage();
FlushPendingNotifications(Flush_Layout);
}
nsIPresShell *shell = GetPrimaryShell();
if (!shell)

View File

@ -59,6 +59,8 @@ _TEST_FILES = test_bug1682.html \
test_bug324378.html \
test_bug332848.xhtml \
test_bug359657.html \
test_bug369370.html \
bug369370-popup.png \
test_bug380383.html \
test_bug386495.html \
test_bug391777.html \

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=369370
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test for Bug 369370</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<script type="text/javascript">
/*
* Test strategy:
*/
function makeClickFor(x, y) {
var event = kidDoc.createEvent("mouseevent");
event.initMouseEvent("click",
true, true, kidWin, 1, // bubbles, cancelable, view, single-click
x, y, x, y, // screen X/Y, client X/Y
false, false, false, false, // no key modifiers
0, null); // left click, not relatedTarget
return event;
}
function childLoaded() {
kidDoc = kidWin.document;
ok(true, "Child window loaded");
var elements = kidDoc.getElementsByTagName("img");
is(elements.length, 1, "looking for imagedoc img");
var img = elements[0];
is(kidDoc.documentElement.clientWidth, 400, "Checking doc width");
is(kidDoc.documentElement.clientHeight, 300, "Checking doc height");
// Image just loaded and is scaled to window size.
is(img.width, 378, "image width");
is(img.height, 284, "image height");
is(kidDoc.body.scrollLeft, 0, "Checking scrollLeft");
is(kidDoc.body.scrollTop, 0, "Checking scrollTop");
// ========== test 1 ==========
// Click in the upper left to zoom in
var event = makeClickFor(25,25);
img.dispatchEvent(event);
ok(true, "----- click 1 -----");
is(img.width, 800, "image width");
is(img.height, 600, "image height");
is(kidDoc.body.scrollLeft, 0, "Checking scrollLeft");
is(kidDoc.body.scrollTop, 0, "Checking scrollTop");
// ========== test 2 ==========
// Click there again to zoom out
event = makeClickFor(25,25);
img.dispatchEvent(event);
ok(true, "----- click 2 -----");
is(img.width, 378, "image width");
is(img.height, 284, "image height");
is(kidDoc.body.scrollLeft, 0, "Checking scrollLeft");
is(kidDoc.body.scrollTop, 0, "Checking scrollTop");
// ========== test 3 ==========
// Click in the lower right to zoom in
event = makeClickFor(350, 250);
img.dispatchEvent(event);
ok(true, "----- click 3 -----");
is(img.width, 800, "image width");
is(img.height, 600, "image height");
is(kidDoc.body.scrollLeft, 408, "Checking scrollLeft");
is(kidDoc.body.scrollTop, 316, "Checking scrollTop");
// ========== test 4 ==========
// Click there again to zoom out
event = makeClickFor(350, 250);
img.dispatchEvent(event);
ok(true, "----- click 4 -----");
is(img.width, 378, "image width");
is(img.height, 284, "image height");
is(kidDoc.body.scrollLeft, 0, "Checking scrollLeft");
is(kidDoc.body.scrollTop, 0, "Checking scrollTop");
kidWin.close();
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
var kidWin = window.open("bug369370-popup.png", "bug369370", "width=400,height=300");
var kidDoc; // will init onload
ok(kidWin, "opened child window");
kidWin.onload = childLoaded;
</script>
</body>
</html>