blob: a88e22a0acace3c65753593438c6494fef7bde6e [file] [log] [blame]
/*
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
// pixelzoomer is shared with LayoutTests/fast/harness/results.html
// Unfortuantely, there's no good way to share code between these two uses.
var pixelzoomer = pixelzoomer || {};
(function() {
var kZoomFactor = 6;
var kDelayTimeoutMS = 400;
var kResultWidth = 800;
var kResultHeight = 600;
var kZoomedResultWidth = kResultWidth * kZoomFactor;
var kZoomedResultHeight = kResultHeight * kZoomFactor;
function matchesSelector(node, selector)
{
if (node.webkitMatchesSelector)
return node.webkitMatchesSelector(selector);
if (node.mozMatchesSelector)
return node.mozMatchesSelector(selector);
}
function parentOfType(node, selector)
{
while (node = node.parentNode) {
if (matchesSelector(node, selector))
return node;
}
return null;
}
function zoomImageContainer(url)
{
var container = document.createElement('div');
container.className = 'zoom-image-container';
var title = url.match(/\-([^\-]*)\.png/)[1];
var label = document.createElement('div');
label.className = 'label';
label.appendChild(document.createTextNode(title));
container.appendChild(label);
var imageContainer = document.createElement('div');
imageContainer.className = 'scaled-image-container';
var image = new Image();
image.src = url;
image.style.width = kZoomedResultWidth + 'px';
image.style.height = kZoomedResultHeight + 'px';
image.style.border = '1px solid black';
imageContainer.appendChild(image);
container.appendChild(imageContainer);
return container;
}
function createContainer(e)
{
var tbody = parentOfType(e.target, 'tbody');
var row = tbody.querySelector('tr');
var images = row.querySelectorAll('img[src$=".png"]');
var container = document.createElement('div');
container.className = 'pixel-zoom-container';
for (var i = 0; i < images.length; i++)
container.appendChild(zoomImageContainer(images[i].src));
document.body.appendChild(container);
drawAll();
}
function draw(imageContainer)
{
var image = imageContainer.querySelector('img');
var containerBounds = imageContainer.getBoundingClientRect();
image.style.left = (containerBounds.width / 2 - pixelzoomer._percentX * kZoomedResultWidth) + 'px';
image.style.top = (containerBounds.height / 2 - pixelzoomer._percentY * kZoomedResultHeight) + 'px';
}
function drawAll()
{
Array.prototype.forEach.call(document.querySelectorAll('.pixel-zoom-container .scaled-image-container'), draw);
}
function handleMouseOut(e)
{
if (e.relatedTarget && e.relatedTarget.tagName != 'IFRAME')
return;
// If e.relatedTarget is null, we've moused out of the document.
$('pixel-zoom-container').detach();
}
function handleMouseMove(e)
{
if (pixelzoomer._mouseMoveTimeout)
clearTimeout(pixelzoomer._mouseMoveTimeout);
if (parentOfType(e.target, '.pixel-zoom-container'))
return;
var container = document.querySelector('.pixel-zoom-container');
var resultContainer = (e.target.className == 'result-container') ?
e.target : parentOfType(e.target, '.result-container');
if (!resultContainer || !resultContainer.querySelector('img')) {
$(container).detach();
return;
}
var targetLocation = e.target.getBoundingClientRect();
pixelzoomer._percentX = (e.clientX - targetLocation.left) / targetLocation.width;
pixelzoomer._percentY = (e.clientY - targetLocation.top) / targetLocation.height;
if (!container) {
if (pixelzoomer.showOnDelay) {
pixelzoomer._mouseMoveTimeout = setTimeout(function() {
createContainer(e);
}, kDelayTimeoutMS);
return;
}
createContainer(e);
return;
}
drawAll();
}
pixelzoomer.showOnDelay = true;
pixelzoomer.installEventListeners = function()
{
document.addEventListener('mousemove', handleMouseMove, false);
document.addEventListener('mouseout', handleMouseOut, false);
};
})();