mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 872355 - Always use nested virtual cursors, when available. r=yzen
This commit is contained in:
parent
14261d72c9
commit
fc8d1c535c
@ -479,9 +479,20 @@ var Output = {
|
|||||||
aJsonBounds.right - aJsonBounds.left,
|
aJsonBounds.right - aJsonBounds.left,
|
||||||
aJsonBounds.bottom - aJsonBounds.top);
|
aJsonBounds.bottom - aJsonBounds.top);
|
||||||
let vp = Utils.getViewport(Utils.win) || { zoom: 1.0, offsetY: 0 };
|
let vp = Utils.getViewport(Utils.win) || { zoom: 1.0, offsetY: 0 };
|
||||||
let browserOffset = aBrowser.getBoundingClientRect();
|
let root = Utils.win;
|
||||||
|
let offset = { left: -root.mozInnerScreenX, top: -root.mozInnerScreenY };
|
||||||
|
let scale = 1 / Utils.getPixelsPerCSSPixel(Utils.win);
|
||||||
|
|
||||||
return bounds.translate(browserOffset.left, browserOffset.top).
|
if (!aBrowser.contentWindow) {
|
||||||
|
// OOP browser, add offset of browser.
|
||||||
|
// The offset of the browser element in relation to its parent window.
|
||||||
|
let clientRect = aBrowser.getBoundingClientRect();
|
||||||
|
let win = aBrowser.ownerDocument.defaultView;
|
||||||
|
offset.left += clientRect.left + win.mozInnerScreenX;
|
||||||
|
offset.top += clientRect.top + win.mozInnerScreenY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bounds.scale(scale, scale).translate(offset.left, offset.top).
|
||||||
scale(vp.zoom, vp.zoom).expandToIntegers();
|
scale(vp.zoom, vp.zoom).expandToIntegers();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -138,7 +138,7 @@ this.EventManager.prototype = {
|
|||||||
case Ci.nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED:
|
case Ci.nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED:
|
||||||
{
|
{
|
||||||
let pivot = aEvent.accessible.
|
let pivot = aEvent.accessible.
|
||||||
QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor;
|
QueryInterface(Ci.nsIAccessibleDocument).virtualCursor;
|
||||||
let position = pivot.position;
|
let position = pivot.position;
|
||||||
if (position.role == Ci.nsIAccessibleRole.ROLE_INTERNAL_FRAME)
|
if (position.role == Ci.nsIAccessibleRole.ROLE_INTERNAL_FRAME)
|
||||||
break;
|
break;
|
||||||
|
@ -31,9 +31,9 @@ BaseTraversalRule.prototype = {
|
|||||||
match: function BaseTraversalRule_match(aAccessible)
|
match: function BaseTraversalRule_match(aAccessible)
|
||||||
{
|
{
|
||||||
if (aAccessible.role == Ci.nsIAccessibleRole.ROLE_INTERNAL_FRAME) {
|
if (aAccessible.role == Ci.nsIAccessibleRole.ROLE_INTERNAL_FRAME) {
|
||||||
return (aAccessible.childCount) ?
|
return (Utils.getMessageManager(aAccessible.DOMNode)) ?
|
||||||
Ci.nsIAccessibleTraversalRule.FILTER_IGNORE :
|
Ci.nsIAccessibleTraversalRule.FILTER_MATCH :
|
||||||
Ci.nsIAccessibleTraversalRule.FILTER_MATCH;
|
Ci.nsIAccessibleTraversalRule.FILTER_IGNORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._matchFunc)
|
if (this._matchFunc)
|
||||||
|
@ -131,15 +131,27 @@ this.Utils = {
|
|||||||
let document = this.CurrentContentDoc;
|
let document = this.CurrentContentDoc;
|
||||||
|
|
||||||
if (document) {
|
if (document) {
|
||||||
let remoteframes = document.querySelectorAll('iframe[remote=true]');
|
let remoteframes = document.querySelectorAll('iframe');
|
||||||
|
|
||||||
|
for (let i = 0; i < remoteframes.length; ++i) {
|
||||||
|
let mm = this.getMessageManager(remoteframes[i]);
|
||||||
|
if (mm) {
|
||||||
|
messageManagers.push(mm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < remoteframes.length; ++i)
|
|
||||||
messageManagers.push(this.getMessageManager(remoteframes[i]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return messageManagers;
|
return messageManagers;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get isContentProcess() {
|
||||||
|
delete this.isContentProcess;
|
||||||
|
this.isContentProcess =
|
||||||
|
Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT;
|
||||||
|
return this.isContentProcess;
|
||||||
|
},
|
||||||
|
|
||||||
getMessageManager: function getMessageManager(aBrowser) {
|
getMessageManager: function getMessageManager(aBrowser) {
|
||||||
try {
|
try {
|
||||||
return aBrowser.QueryInterface(Ci.nsIFrameLoaderOwner).
|
return aBrowser.QueryInterface(Ci.nsIFrameLoaderOwner).
|
||||||
@ -173,15 +185,12 @@ this.Utils = {
|
|||||||
let doc = (aDocument instanceof Ci.nsIAccessible) ? aDocument :
|
let doc = (aDocument instanceof Ci.nsIAccessible) ? aDocument :
|
||||||
this.AccRetrieval.getAccessibleFor(aDocument);
|
this.AccRetrieval.getAccessibleFor(aDocument);
|
||||||
|
|
||||||
while (doc) {
|
return doc.QueryInterface(Ci.nsIAccessibleDocument).virtualCursor;
|
||||||
try {
|
},
|
||||||
return doc.QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor;
|
|
||||||
} catch (x) {
|
|
||||||
doc = doc.parentDocument;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
getPixelsPerCSSPixel: function getPixelsPerCSSPixel(aWindow) {
|
||||||
|
return aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||||
|
.getInterface(Ci.nsIDOMWindowUtils).screenPixelsPerCSSPixel;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -402,15 +411,7 @@ PivotContext.prototype = {
|
|||||||
|
|
||||||
this._accessible.getBounds(objX, objY, objW, objH);
|
this._accessible.getBounds(objX, objY, objW, objH);
|
||||||
|
|
||||||
// XXX: OOP content provides a screen offset of 0, while in-process provides a real
|
this._bounds = new Rect(objX.value, objY.value, objW.value, objH.value);
|
||||||
// offset. Removing the offset and using content-relative coords normalizes this.
|
|
||||||
let docX = {}, docY = {};
|
|
||||||
let docRoot = this._accessible.rootDocument.
|
|
||||||
QueryInterface(Ci.nsIAccessible);
|
|
||||||
docRoot.getBounds(docX, docY, {}, {});
|
|
||||||
|
|
||||||
this._bounds = new Rect(objX.value, objY.value, objW.value, objH.value).
|
|
||||||
translate(-docX.value, -docY.value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._bounds.clone();
|
return this._bounds.clone();
|
||||||
|
@ -59,7 +59,12 @@ function virtualCursorControl(aMessage) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'moveToPoint':
|
case 'moveToPoint':
|
||||||
moved = vc.moveToPoint(rule, details.x, details.y, true);
|
if (!this._ppcp) {
|
||||||
|
this._ppcp = Utils.getPixelsPerCSSPixel(content);
|
||||||
|
}
|
||||||
|
moved = vc.moveToPoint(rule,
|
||||||
|
details.x * this._ppcp, details.y * this._ppcp,
|
||||||
|
true);
|
||||||
break;
|
break;
|
||||||
case 'whereIsIt':
|
case 'whereIsIt':
|
||||||
if (!forwardMessage(vc, aMessage)) {
|
if (!forwardMessage(vc, aMessage)) {
|
||||||
@ -97,10 +102,12 @@ function forwardMessage(aVirtualCursor, aMessage) {
|
|||||||
let mm = Utils.getMessageManager(acc.DOMNode);
|
let mm = Utils.getMessageManager(acc.DOMNode);
|
||||||
mm.addMessageListener(aMessage.name, virtualCursorControl);
|
mm.addMessageListener(aMessage.name, virtualCursorControl);
|
||||||
aMessage.json.origin = 'parent';
|
aMessage.json.origin = 'parent';
|
||||||
// XXX: OOP content's screen offset is 0,
|
if (Utils.isContentProcess) {
|
||||||
// so we remove the real screen offset here.
|
// XXX: OOP content's screen offset is 0,
|
||||||
aMessage.json.x -= content.mozInnerScreenX;
|
// so we remove the real screen offset here.
|
||||||
aMessage.json.y -= content.mozInnerScreenY;
|
aMessage.json.x -= content.mozInnerScreenX;
|
||||||
|
aMessage.json.y -= content.mozInnerScreenY;
|
||||||
|
}
|
||||||
mm.sendAsyncMessage(aMessage.name, aMessage.json);
|
mm.sendAsyncMessage(aMessage.name, aMessage.json);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user