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.bottom - aJsonBounds.top);
|
||||
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();
|
||||
}
|
||||
};
|
||||
|
@ -138,7 +138,7 @@ this.EventManager.prototype = {
|
||||
case Ci.nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED:
|
||||
{
|
||||
let pivot = aEvent.accessible.
|
||||
QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor;
|
||||
QueryInterface(Ci.nsIAccessibleDocument).virtualCursor;
|
||||
let position = pivot.position;
|
||||
if (position.role == Ci.nsIAccessibleRole.ROLE_INTERNAL_FRAME)
|
||||
break;
|
||||
|
@ -31,9 +31,9 @@ BaseTraversalRule.prototype = {
|
||||
match: function BaseTraversalRule_match(aAccessible)
|
||||
{
|
||||
if (aAccessible.role == Ci.nsIAccessibleRole.ROLE_INTERNAL_FRAME) {
|
||||
return (aAccessible.childCount) ?
|
||||
Ci.nsIAccessibleTraversalRule.FILTER_IGNORE :
|
||||
Ci.nsIAccessibleTraversalRule.FILTER_MATCH;
|
||||
return (Utils.getMessageManager(aAccessible.DOMNode)) ?
|
||||
Ci.nsIAccessibleTraversalRule.FILTER_MATCH :
|
||||
Ci.nsIAccessibleTraversalRule.FILTER_IGNORE;
|
||||
}
|
||||
|
||||
if (this._matchFunc)
|
||||
|
@ -131,15 +131,27 @@ this.Utils = {
|
||||
let document = this.CurrentContentDoc;
|
||||
|
||||
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;
|
||||
},
|
||||
|
||||
get isContentProcess() {
|
||||
delete this.isContentProcess;
|
||||
this.isContentProcess =
|
||||
Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT;
|
||||
return this.isContentProcess;
|
||||
},
|
||||
|
||||
getMessageManager: function getMessageManager(aBrowser) {
|
||||
try {
|
||||
return aBrowser.QueryInterface(Ci.nsIFrameLoaderOwner).
|
||||
@ -173,15 +185,12 @@ this.Utils = {
|
||||
let doc = (aDocument instanceof Ci.nsIAccessible) ? aDocument :
|
||||
this.AccRetrieval.getAccessibleFor(aDocument);
|
||||
|
||||
while (doc) {
|
||||
try {
|
||||
return doc.QueryInterface(Ci.nsIAccessibleCursorable).virtualCursor;
|
||||
} catch (x) {
|
||||
doc = doc.parentDocument;
|
||||
}
|
||||
}
|
||||
return doc.QueryInterface(Ci.nsIAccessibleDocument).virtualCursor;
|
||||
},
|
||||
|
||||
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);
|
||||
|
||||
// XXX: OOP content provides a screen offset of 0, while in-process provides a real
|
||||
// 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);
|
||||
this._bounds = new Rect(objX.value, objY.value, objW.value, objH.value);
|
||||
}
|
||||
|
||||
return this._bounds.clone();
|
||||
|
@ -59,7 +59,12 @@ function virtualCursorControl(aMessage) {
|
||||
}
|
||||
break;
|
||||
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;
|
||||
case 'whereIsIt':
|
||||
if (!forwardMessage(vc, aMessage)) {
|
||||
@ -97,10 +102,12 @@ function forwardMessage(aVirtualCursor, aMessage) {
|
||||
let mm = Utils.getMessageManager(acc.DOMNode);
|
||||
mm.addMessageListener(aMessage.name, virtualCursorControl);
|
||||
aMessage.json.origin = 'parent';
|
||||
// XXX: OOP content's screen offset is 0,
|
||||
// so we remove the real screen offset here.
|
||||
aMessage.json.x -= content.mozInnerScreenX;
|
||||
aMessage.json.y -= content.mozInnerScreenY;
|
||||
if (Utils.isContentProcess) {
|
||||
// XXX: OOP content's screen offset is 0,
|
||||
// so we remove the real screen offset here.
|
||||
aMessage.json.x -= content.mozInnerScreenX;
|
||||
aMessage.json.y -= content.mozInnerScreenY;
|
||||
}
|
||||
mm.sendAsyncMessage(aMessage.name, aMessage.json);
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user