From fc52829da855da4d3b717bf4c9cd855302210712 Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Tue, 12 Jan 2016 09:13:55 +0100 Subject: [PATCH] Fix misplaced hint markers when zoomed Hint markers are supposed to be centered vertically on the non-covered point. This didn't work properly when zoomed, but now does. For simplicity, that fix removed the "make sure the marker stays within its element" constraint, which turned out to be nice and more consistent. The hint markers are now _always_ centered vertically on the non-covered point, even for very small links. This commit also fixes hint marker placement in the devtools when the devtools have been independently zoomed. The above issue needed to be fixed before this could be fixed. Fixes #667. --- extension/lib/hints.coffee | 24 +++++++++++++++++------- extension/lib/marker.coffee | 9 ++++----- extension/lib/modes.coffee | 4 ++-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/extension/lib/hints.coffee b/extension/lib/hints.coffee index 4561ee2..7b6566b 100644 --- a/extension/lib/hints.coffee +++ b/extension/lib/hints.coffee @@ -25,6 +25,8 @@ huffman = require('n-ary-huffman') {Marker} = require('./marker') utils = require('./utils') +{devtools} = Cu.import('resource://devtools/shared/Loader.jsm', {}) + CONTAINER_ID = 'VimFxMarkersContainer' Element = Ci.nsIDOMElement @@ -130,7 +132,6 @@ injectHints = (window, wrappers, viewport, options) -> return markers - getMarkableElementsAndViewport = (window, filter) -> { clientWidth, clientHeight # Viewport size excluding scrollbars, usually. @@ -276,9 +277,7 @@ getElementShape = (window, viewport, parents, element, rects = null) -> for visibleRect in visibleRects nonCoveredPoint = getFirstNonCoveredPoint(window, viewport, element, visibleRect, parents) - if nonCoveredPoint - nonCoveredPoint.rect = visibleRect - break + break if nonCoveredPoint return null unless nonCoveredPoint @@ -286,7 +285,6 @@ getElementShape = (window, viewport, parents, element, rects = null) -> nonCoveredPoint, area: totalArea } - MINIMUM_EDGE_DISTANCE = 4 isInsideViewport = (rect, viewport) -> return \ @@ -295,7 +293,6 @@ isInsideViewport = (rect, viewport) -> rect.right >= viewport.left + MINIMUM_EDGE_DISTANCE and rect.bottom >= viewport.top - MINIMUM_EDGE_DISTANCE - adjustRectToViewport = (rect, viewport) -> # The right and bottom values are subtracted by 1 because # `document.elementFromPoint(right, bottom)` does not return the element @@ -319,7 +316,6 @@ adjustRectToViewport = (rect, viewport) -> height, width, area } - getFirstNonCoveredPoint = (window, viewport, element, elementRect, parents) -> # Tries a point `(x + dx, y + dy)`. Returns `(x, y)` (and the frame offset) # if it passes the tests. Otherwise it tries to the right of whatever is at @@ -344,6 +340,20 @@ getFirstNonCoveredPoint = (window, viewport, element, elementRect, parents) -> # is present at the point for each parent in `parents`. currentWindow = window for parent in parents by -1 + # If leaving the devtools container take the devtools zoom into account. + if currentWindow.DevTools and not parent.window.DevTools + toolbox = window.gDevTools.getToolbox( + devtools.TargetFactory.forTab(window.top.gBrowser.selectedTab) + ) + if toolbox + devtoolsZoom = toolbox.zoomValue + offset.left *= devtoolsZoom + offset.top *= devtoolsZoom + x *= devtoolsZoom + y *= devtoolsZoom + dx *= devtoolsZoom + dy *= devtoolsZoom + offset.left += parent.offset.left offset.top += parent.offset.top elementAtPoint = parent.window.document.elementFromPoint( diff --git a/extension/lib/marker.coffee b/extension/lib/marker.coffee index d5a5df5..350f40a 100644 --- a/extension/lib/marker.coffee +++ b/extension/lib/marker.coffee @@ -46,16 +46,15 @@ class Marker setPosition: (viewport, zoom) -> { markerElement: {clientHeight: height, clientWidth: width} - elementShape: {nonCoveredPoint: {x: left, y: top, offset, rect}} + elementShape: {nonCoveredPoint: {x: left, y: top, offset}} } = this + height /= zoom + width /= zoom + # Center the marker vertically on the non-covered point. top -= Math.ceil(height / 2) - # Make sure that the marker stays within its element (vertically). - top = Math.min(top, rect.bottom - height) - top = Math.max(top, rect.top) - # Make the position relative to the top frame. left += offset.left top += offset.top diff --git a/extension/lib/modes.coffee b/extension/lib/modes.coffee index e62c3b7..6f7701e 100644 --- a/extension/lib/modes.coffee +++ b/extension/lib/modes.coffee @@ -93,8 +93,8 @@ mode('normal', { if uiEvent # In browser UI the biggest reasons are allowing to reset the location bar # when blurring it, and closing dialogs such as the “bookmark this page” - # dialog (). However, an exception is made for the dev tools (). - # There, trying to unfocus the dev tools using Escape would annoyingly + # dialog (). However, an exception is made for the devtools (). + # There, trying to unfocus the devtools using Escape would annoyingly # open the split console. return uiEvent.originalTarget.ownerGlobal.DevTools? else -- 2.39.3