Fix for magnifying glass to magnify/shrink images when the zoom is not at 100%.

Allow zoom/restore in a zoomed image document. It is a regression from the earlier fix:
http://src.chromium.org/viewvc/blink?revision=156402&view=revision

BUG=324086
R=levi, tony

Review URL: https://codereview.chromium.org/262053005

git-svn-id: svn://svn.chromium.org/blink/trunk@176023 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent e424a134
This tests that on a zoomed page, click to scale up / down works fine. This test requires testRunner to run. To test manually, open this image in a browser window, resize the window to 100px tall and zoom out and click on the image to scale it up.
Size at zoomed in level : 77 x 100
Size at zoomed level after scale up click 1 : 500 x 644
Size at zoomed out level after click 2 (Image restored): 77 x 100
Size at zoomed level after scale up click 3 : 500 x 644
<!DOCTYPE html>
<script>
var clicked = false;
var count = 0;
var requestId = 0;
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.setCanOpenWindows();
testRunner.waitUntilDone();
}
function log(message)
{
var console = document.getElementById("console");
console.appendChild(document.createTextNode(message + "\n"));
}
function click(newwindow, image)
{
var e = newwindow.document.createEvent("MouseEvent");
e.initMouseEvent("click", true, true, newwindow, 1, 1, 1, 1, 1, false, false, false, false, 0, newwindow.document);
image.dispatchEvent(e);
}
window.onload = function()
{
var newwindow = window.open("resources/flowchart.jpg");
if (window.testRunner)
testRunner.useUnfortunateSynchronousResizeMode();
newwindow.onload = function() {
newwindow.onresize = function() {
var image = newwindow.document.querySelector("img");
if (image.clientWidth == 0) {
// On GTK+, sometimes the resize callback fires before the GTK
// window has finished resizing. If that happens, try to resize
// again.
requestId = newWindow.requestAnimationFrame(function() {
newwindow.resizeTo(100, 100);
if (requestId)
newwindow.cancelAnimationFrame(requestId);
requestId = 0;
});
return;
}
if (window.eventSender) {
if (!clicked) {
// Zoom in level 1
eventSender.zoomPageIn();
var w = Math.round(image.clientWidth);
var h = Math.round(image.clientHeight);
log("Size at zoomed in level : " + w + " x " + h);
clicked = true;
count++;
click(newwindow, image);
} else {
var w = Math.round(image.clientWidth);
var h = Math.round(image.clientHeight);
log("Size at zoomed level after scale up click " + count + " : " + w + " x " + h);
if (count == 3)
testRunner.notifyDone();
// Restore the image size
click(newwindow, image);
count++;
// Brings to normal zoom
eventSender.zoomPageOut();
// Zoom out level 1
eventSender.zoomPageOut();
// Restore the image size
var w = Math.round(image.clientWidth);
var h = Math.round(image.clientHeight);
log("Size at zoomed out level after click " + count + " (Image restored): " + w + " x " + h);
count++;
click(newwindow, image);
}
}
};
newwindow.resizeTo(100, 100);
};
}
</script>
<p>This tests that on a zoomed page, click to scale up / down works fine. This test requires testRunner to run. To test manually, open <a href="resources/dice.png">this image</a> in a browser window, resize the window to 100px tall and zoom out and click on the image to scale it up.</p>
<pre id="console"></pre>
......@@ -233,9 +233,9 @@ float ImageDocument::scale() const
return min(widthScale, heightScale);
}
void ImageDocument::resizeImageToFit()
void ImageDocument::resizeImageToFit(ScaleType type)
{
if (!m_imageElement || m_imageElement->document() != this || pageZoomFactor(this) > 1)
if (!m_imageElement || m_imageElement->document() != this || (pageZoomFactor(this) > 1 && type == ScaleOnlyUnzoomedDocument))
return;
LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m_imageElement->renderer(), pageZoomFactor(this));
......@@ -255,9 +255,9 @@ void ImageDocument::imageClicked(int x, int y)
m_shouldShrinkImage = !m_shouldShrinkImage;
if (m_shouldShrinkImage)
windowSizeChanged();
windowSizeChanged(ScaleZoomedDocument);
else {
restoreImageSize();
restoreImageSize(ScaleZoomedDocument);
updateLayout();
......@@ -284,13 +284,13 @@ void ImageDocument::imageUpdated()
if (shouldShrinkToFit()) {
// Force resizing of the image
windowSizeChanged();
windowSizeChanged(ScaleOnlyUnzoomedDocument);
}
}
void ImageDocument::restoreImageSize()
void ImageDocument::restoreImageSize(ScaleType type)
{
if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this || pageZoomFactor(this) < 1)
if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this || (pageZoomFactor(this) < 1 && type == ScaleOnlyUnzoomedDocument))
return;
LayoutSize imageSize = m_imageElement->cachedImage()->imageSizeForRenderer(m_imageElement->renderer(), 1.0f);
......@@ -320,7 +320,7 @@ bool ImageDocument::imageFitsInWindow() const
return imageSize.width() <= windowSize.width() && imageSize.height() <= windowSize.height();
}
void ImageDocument::windowSizeChanged()
void ImageDocument::windowSizeChanged(ScaleType type)
{
if (!m_imageElement || !m_imageSizeIsKnown || m_imageElement->document() != this)
return;
......@@ -341,13 +341,13 @@ void ImageDocument::windowSizeChanged()
// If the window has been resized so that the image fits, restore the image size
// otherwise update the restored image size.
if (fitsInWindow)
restoreImageSize();
restoreImageSize(type);
else
resizeImageToFit();
resizeImageToFit(type);
} else {
// If the image isn't resized but needs to be, then resize it.
if (!fitsInWindow) {
resizeImageToFit();
resizeImageToFit(type);
m_didShrinkImage = true;
}
}
......@@ -385,7 +385,7 @@ void ImageDocument::trace(Visitor* visitor)
void ImageEventListener::handleEvent(ExecutionContext*, Event* event)
{
if (event->type() == EventTypeNames::resize)
m_doc->windowSizeChanged();
m_doc->windowSizeChanged(ImageDocument::ScaleOnlyUnzoomedDocument);
else if (event->type() == EventTypeNames::click && event->isMouseEvent()) {
MouseEvent* mouseEvent = toMouseEvent(event);
m_doc->imageClicked(mouseEvent->x(), mouseEvent->y());
......
......@@ -40,10 +40,15 @@ public:
return adoptRefWillBeNoop(new ImageDocument(initializer));
}
enum ScaleType {
ScaleZoomedDocument,
ScaleOnlyUnzoomedDocument
};
ImageResource* cachedImage();
HTMLImageElement* imageElement() const { return m_imageElement.get(); }
void windowSizeChanged();
void windowSizeChanged(ScaleType);
void imageUpdated();
void imageClicked(int x, int y);
......@@ -58,8 +63,8 @@ private:
#endif
void createDocumentStructure();
void resizeImageToFit();
void restoreImageSize();
void resizeImageToFit(ScaleType);
void restoreImageSize(ScaleType);
bool imageFitsInWindow() const;
bool shouldShrinkToFit() const;
float scale() const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment