зеркало из https://github.com/mozilla/gecko-dev.git
Bug 564019 - Thick border on iframe can cause inputs to become unclickable [r=mfinkle]
This commit is contained in:
Родитель
7becfea648
Коммит
1095a0e49c
|
@ -1204,7 +1204,9 @@ var Browser = {
|
|||
for (let frame = contentElem.ownerDocument.defaultView; frame != cw; frame = frame.parent) {
|
||||
// adjust client coordinates' origin to be top left of iframe viewport
|
||||
rect = frame.frameElement.getBoundingClientRect();
|
||||
offset.add(rect.left, rect.top);
|
||||
let left = frame.getComputedStyle(frame.frameElement, "").borderLeftWidth;
|
||||
let top = frame.getComputedStyle(frame.frameElement, "").borderTopWidth;
|
||||
offset.add(rect.left + parseInt(left), rect.top + parseInt(top));
|
||||
}
|
||||
|
||||
let result = [];
|
||||
|
@ -1234,7 +1236,9 @@ var Browser = {
|
|||
for (let frame = contentElem.ownerDocument.defaultView; frame != browser.contentWindow; frame = frame.parent) {
|
||||
// adjust client coordinates' origin to be top left of iframe viewport
|
||||
let rect = frame.frameElement.getBoundingClientRect();
|
||||
offset.add(rect.left, rect.top);
|
||||
let left = frame.getComputedStyle(frame.frameElement, "").borderLeftWidth;
|
||||
let top = frame.getComputedStyle(frame.frameElement, "").borderTopWidth;
|
||||
offset.add(rect.left + parseInt(left), rect.top + parseInt(top));
|
||||
}
|
||||
|
||||
return new Rect(r.left + offset.x, r.top + offset.y, r.width, r.height);
|
||||
|
@ -1302,9 +1306,14 @@ var Browser = {
|
|||
// step through layers of IFRAMEs and FRAMES to find innermost element
|
||||
while (elem && (elem instanceof HTMLIFrameElement || elem instanceof HTMLFrameElement)) {
|
||||
// adjust client coordinates' origin to be top left of iframe viewport
|
||||
let win = elem.ownerDocument.defaultView;
|
||||
let left = win.getComputedStyle(elem, "").borderLeftWidth;
|
||||
let top = win.getComputedStyle(elem, "").borderTopWidth;
|
||||
|
||||
let rect = elem.getBoundingClientRect();
|
||||
x = x - rect.left;
|
||||
y = y - rect.top;
|
||||
x = Math.max(0, x - (rect.left + parseInt(left)));
|
||||
y = Math.max(0, y - (rect.top + parseInt(top)));
|
||||
|
||||
let windowUtils = elem.contentDocument.defaultView.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
|
||||
elem = ElementTouchHelper.getClosest(windowUtils, x, y);
|
||||
}
|
||||
|
@ -2006,7 +2015,7 @@ const ElementTouchHelper = {
|
|||
let isClickable = this._hasMouseListener(aElement);
|
||||
|
||||
// If possible looks in the parents node to find a target
|
||||
if (!isClickable && aElementsInRect) {
|
||||
if (aElement && !isClickable && aElementsInRect) {
|
||||
let parentNode = aElement.parentNode;
|
||||
let count = aElementsInRect.length;
|
||||
for (let i = 0; i < count && parentNode; i++) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<html style="border: 1px solid red">
|
||||
<title>Browser Click Page 01</title>
|
||||
<body>
|
||||
<iframe src="data:,test test" width="100" height="100"><iframe>
|
||||
<iframe id="iframe-1" src="data:,test test" width="100" height="100"></iframe>
|
||||
<iframe id="iframe-2" src="data:text/html;charset=utf-8,%3Cinput%3E" style="border: 50px solid black"></iframe>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -32,7 +32,7 @@ function testClickAndPosition() {
|
|||
is(uri, testURL_click, "URL Matches newly created Tab");
|
||||
|
||||
// Check click
|
||||
element = newTab.browser.contentDocument.querySelector("iframe");
|
||||
element = newTab.browser.contentDocument.getElementById("iframe-1");
|
||||
element.addEventListener("click", clickFired, true);
|
||||
|
||||
EventUtils.synthesizeMouseForContent(element, 1, 1, {}, window);
|
||||
|
@ -59,6 +59,21 @@ function checkPosition() {
|
|||
is(clickPosition.x, 1, "X position is correct");
|
||||
is(clickPosition.y, rect.height + 10, "Y position is correct");
|
||||
|
||||
checkThickBorder();
|
||||
}
|
||||
|
||||
function checkThickBorder() {
|
||||
let frame = newTab.browser.contentDocument.getElementById("iframe-2");
|
||||
let element = frame.contentDocument.getElementsByTagName("input")[0];
|
||||
|
||||
let frameRect = Browser.getBoundingContentRect(frame);
|
||||
let frameLeftBorder = window.getComputedStyle(frame, "").borderLeftWidth;
|
||||
let frameTopBorder = window.getComputedStyle(frame, "").borderTopWidth;
|
||||
|
||||
let elementRect = Browser.getBoundingContentRect(element);
|
||||
ok((frameRect.left + parseInt(frameLeftBorder)) < elementRect.left, "X position of nested element ok");
|
||||
ok((frameRect.top + parseInt(frameTopBorder)) < elementRect.top, "Y position of nested element ok");
|
||||
|
||||
close();
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче