зеркало из https://github.com/mozilla/gecko-dev.git
Bug 599053 text typed in awesome bare shows up on previously focused form field [r=mfinkle]
This commit is contained in:
Родитель
5d94adb8d8
Коммит
9c4241d21d
|
@ -246,6 +246,52 @@ let WebNavigation = {
|
|||
WebNavigation.init();
|
||||
|
||||
|
||||
let FocusEvents = {
|
||||
init: function() {
|
||||
addMessageListener("Content:Focus", this);
|
||||
addMessageListener("Content:Blur", this);
|
||||
addMessageListener("Content:KeyEvent", this);
|
||||
},
|
||||
|
||||
receiveMessage: function(aMessage) {
|
||||
let json = aMessage.json;
|
||||
|
||||
switch (aMessage.name) {
|
||||
case "Content:Blur": {
|
||||
let activeElement = content.document.activeElement;
|
||||
if (activeElement)
|
||||
activeElement.blur();
|
||||
|
||||
docShell.isActive = false;
|
||||
break;
|
||||
}
|
||||
|
||||
case "Content:Focus":
|
||||
docShell.isActive = true;
|
||||
break;
|
||||
|
||||
case "Content:KeyEvent": {
|
||||
let utils = Util.getWindowUtils(content);
|
||||
let defaultAction = utils.sendKeyEvent(json.type, json.keyCode, json.charCode, json.modifiers);
|
||||
if (defaultAction && json.type == "keypress") {
|
||||
const masks = Ci.nsIDOMNSEvent;
|
||||
sendAsyncMessage("Content:KeyPress", {
|
||||
ctrlKey: json.modifiers & masks.CONTROL_MASK,
|
||||
shiftKey: json.modifiers & masks.SHIFT_MASK,
|
||||
metaKey: json.modifiers & masks.META_MASK,
|
||||
keyCode: json.keyCode,
|
||||
charCode: json.charCode
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
FocusEvents.init();
|
||||
|
||||
|
||||
let DOMEvents = {
|
||||
init: function() {
|
||||
addEventListener("DOMContentLoaded", this, false);
|
||||
|
|
|
@ -808,6 +808,14 @@
|
|||
<constructor>
|
||||
<![CDATA[
|
||||
this.messageManager.addMessageListener("scroll", this._messageListenerRemote);
|
||||
this.messageManager.addMessageListener("Content:KeyPress", this._messageListenerRemote);
|
||||
|
||||
this.addEventListener("keypress", this, false);
|
||||
this.addEventListener("keyup", this, false);
|
||||
this.addEventListener("keydown", this, false);
|
||||
|
||||
this.addEventListener("focus", this, false);
|
||||
this.addEventListener("blur", this, false);
|
||||
]]>
|
||||
</constructor>
|
||||
|
||||
|
@ -829,6 +837,18 @@
|
|||
// Use floor so that we always guarantee top-left corner of content is visible.
|
||||
self.scrollTo(Math.floor(json.x * self.scale), Math.floor(json.y * self.scale));
|
||||
break;
|
||||
|
||||
case "Content:KeyPress":
|
||||
// Content did not want this keypress event, so resend event up the tree.
|
||||
let node = this.self.parentNode;
|
||||
if (!node)
|
||||
break;
|
||||
|
||||
let event = document.createEvent("KeyEvents");
|
||||
event.initKeyEvent("keypress", true, true, null,
|
||||
json.ctrlKey, json.altKey, json.shiftKey, json.metaKey,
|
||||
json.keyCode, json.charCode)
|
||||
node.dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
})
|
||||
|
@ -909,6 +929,58 @@
|
|||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="_parseModifiers">
|
||||
<parameter name="aEvent"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
const masks = Components.interfaces.nsIDOMNSEvent;
|
||||
var mval = 0;
|
||||
if (aEvent.shiftKey)
|
||||
mval |= masks.SHIFT_MASK;
|
||||
if (aEvent.ctrlKey)
|
||||
mval |= masks.CONTROL_MASK;
|
||||
if (aEvent.altKey)
|
||||
mval |= masks.ALT_MASK;
|
||||
if (aEvent.metaKey)
|
||||
mval |= masks.META_MASK;
|
||||
return mval;
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="handleEvent">
|
||||
<parameter name="aEvent"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
switch (aEvent.type) {
|
||||
case "keypress":
|
||||
case "keyup":
|
||||
case "keydown":
|
||||
aEvent.stopPropagation();
|
||||
aEvent.preventDefault();
|
||||
|
||||
this.messageManager.sendAsyncMessage("Content:KeyEvent", {
|
||||
type: aEvent.type,
|
||||
keyCode: aEvent.keyCode,
|
||||
charCode: aEvent.charCode,
|
||||
modifiers: this._parseModifiers(aEvent)
|
||||
});
|
||||
break;
|
||||
|
||||
case "focus":
|
||||
let fl = this.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
|
||||
fl.activateRemoteFrame();
|
||||
this.messageManager.sendAsyncMessage("Content:Focus");
|
||||
break;
|
||||
|
||||
case "blur":
|
||||
this.messageManager.sendAsyncMessage("Content:Blur");
|
||||
break;
|
||||
}
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
</implementation>
|
||||
|
||||
</binding>
|
||||
|
|
|
@ -175,7 +175,6 @@ var Browser = {
|
|||
let inputHandlerOverlay = document.getElementById("inputhandler-overlay");
|
||||
inputHandlerOverlay.customDragger = new Browser.MainDragger();
|
||||
|
||||
let keySender = new ContentCustomKeySender(inputHandlerOverlay);
|
||||
let mouseModule = new MouseModule();
|
||||
let gestureModule = new GestureModule();
|
||||
let scrollWheelModule = new ScrollwheelModule(inputHandlerOverlay);
|
||||
|
@ -341,7 +340,6 @@ var Browser = {
|
|||
|
||||
messageManager.addMessageListener("Browser:ViewportMetadata", this);
|
||||
messageManager.addMessageListener("Browser:FormSubmit", this);
|
||||
messageManager.addMessageListener("Browser:KeyPress", this);
|
||||
messageManager.addMessageListener("Browser:ZoomToPoint:Return", this);
|
||||
messageManager.addMessageListener("scroll", this);
|
||||
messageManager.addMessageListener("Browser:MozApplicationManifest", OfflineApps);
|
||||
|
@ -613,13 +611,12 @@ var Browser = {
|
|||
if (oldBrowser) {
|
||||
oldBrowser.setAttribute("type", "content");
|
||||
oldBrowser.style.display = "none";
|
||||
oldBrowser.messageManager.sendAsyncMessage("Browser:Blur", {});
|
||||
}
|
||||
|
||||
if (browser) {
|
||||
browser.setAttribute("type", "content-primary");
|
||||
browser.style.display = "";
|
||||
browser.messageManager.sendAsyncMessage("Browser:Focus", {});
|
||||
browser.focus();
|
||||
}
|
||||
|
||||
document.getElementById("tabs").selectedTab = tab.chromeTab;
|
||||
|
@ -1031,14 +1028,6 @@ var Browser = {
|
|||
browser.lastLocation = null;
|
||||
break;
|
||||
|
||||
case "Browser:KeyPress":
|
||||
let event = document.createEvent("KeyEvents");
|
||||
event.initKeyEvent("keypress", true, true, null,
|
||||
json.ctrlKey, json.altKey, json.shiftKey, json.metaKey,
|
||||
json.keyCode, json.charCode)
|
||||
document.getElementById("mainKeyset").dispatchEvent(event);
|
||||
break;
|
||||
|
||||
case "Browser:ZoomToPoint:Return":
|
||||
// JSON-ified rect needs to be recreated so the methods exist
|
||||
let rect = Rect.fromRect(json.rect);
|
||||
|
@ -1399,14 +1388,11 @@ const ContentTouchHandler = {
|
|||
|
||||
tapDown: function tapDown(aX, aY) {
|
||||
// Ensure that the content process has gets an activate event
|
||||
let browser = getBrowser();
|
||||
let fl = browser.QueryInterface(Ci.nsIFrameLoaderOwner).frameLoader;
|
||||
browser.focus();
|
||||
try {
|
||||
fl.activateRemoteFrame();
|
||||
} catch (e) {
|
||||
}
|
||||
this._dispatchMouseEvent("Browser:MouseDown", aX, aY);
|
||||
|
||||
// Since overlay lays on top of browser element, we must focus the browser
|
||||
// when user taps on overlay.
|
||||
getBrowser().focus();
|
||||
},
|
||||
|
||||
tapUp: function tapUp(aX, aY) {
|
||||
|
@ -1446,49 +1432,6 @@ const ContentTouchHandler = {
|
|||
};
|
||||
|
||||
|
||||
/** Watches for mouse events in chrome and sends them to content. */
|
||||
function ContentCustomKeySender(container) {
|
||||
container.addEventListener("keypress", this, false);
|
||||
container.addEventListener("keyup", this, false);
|
||||
container.addEventListener("keydown", this, false);
|
||||
}
|
||||
|
||||
ContentCustomKeySender.prototype = {
|
||||
handleEvent: function handleEvent(aEvent) {
|
||||
aEvent.stopPropagation();
|
||||
aEvent.preventDefault();
|
||||
|
||||
let browser = getBrowser();
|
||||
if (browser) {
|
||||
browser.messageManager.sendAsyncMessage("Browser:KeyEvent", {
|
||||
type: aEvent.type,
|
||||
keyCode: aEvent.keyCode,
|
||||
charCode: aEvent.charCode,
|
||||
modifiers: this._parseModifiers(aEvent)
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_parseModifiers: function _parseModifiers(aEvent) {
|
||||
const masks = Components.interfaces.nsIDOMNSEvent;
|
||||
var mval = 0;
|
||||
if (aEvent.shiftKey)
|
||||
mval |= masks.SHIFT_MASK;
|
||||
if (aEvent.ctrlKey)
|
||||
mval |= masks.CONTROL_MASK;
|
||||
if (aEvent.altKey)
|
||||
mval |= masks.ALT_MASK;
|
||||
if (aEvent.metaKey)
|
||||
mval |= masks.META_MASK;
|
||||
return mval;
|
||||
},
|
||||
|
||||
toString: function toString() {
|
||||
return "[ContentCustomKeySender] { }";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Utility class to handle manipulations of the identity indicators in the UI
|
||||
*/
|
||||
|
@ -2473,7 +2416,6 @@ Tab.prototype = {
|
|||
// stop about:blank from loading
|
||||
browser.stop();
|
||||
|
||||
|
||||
let self = this;
|
||||
browser.messageManager.addMessageListener("MozScrolledAreaChanged", function() {
|
||||
self.updateDefaultZoomLevel();
|
||||
|
|
|
@ -277,7 +277,7 @@
|
|||
<html:div id="browsers"/>
|
||||
<html:canvas id="content-overlay" style="display: none; position: absolute; z-index: 1000; left: 0; top: 0;"/>
|
||||
</html:div>
|
||||
<html:div id="inputhandler-overlay" style="z-index: 1001" tabindex="-1"/>
|
||||
<html:div id="inputhandler-overlay" style="z-index: 1001"/>
|
||||
</stack>
|
||||
<box id="content-navigator-spacer" hidden="true"/>
|
||||
</vbox>
|
||||
|
|
|
@ -297,9 +297,6 @@ ProgressController.prototype = {
|
|||
|
||||
/** Can't think of a good description of this class. It probably does too much? */
|
||||
function Content() {
|
||||
addMessageListener("Browser:Blur", this);
|
||||
addMessageListener("Browser:Focus", this);
|
||||
addMessageListener("Browser:KeyEvent", this);
|
||||
addMessageListener("Browser:MouseDown", this);
|
||||
addMessageListener("Browser:MouseUp", this);
|
||||
addMessageListener("Browser:MouseCancel", this);
|
||||
|
@ -349,31 +346,6 @@ Content.prototype = {
|
|||
let modifiers = json.modifiers;
|
||||
|
||||
switch (aMessage.name) {
|
||||
case "Browser:Blur":
|
||||
docShell.isActive = false;
|
||||
this._selected = false;
|
||||
break;
|
||||
|
||||
case "Browser:Focus":
|
||||
docShell.isActive = true;
|
||||
this._selected = true;
|
||||
break;
|
||||
|
||||
case "Browser:KeyEvent":
|
||||
let utils = Util.getWindowUtils(content);
|
||||
let defaultAction = utils.sendKeyEvent(json.type, json.keyCode, json.charCode, modifiers);
|
||||
if (defaultAction && json.type == "keypress") {
|
||||
const masks = Ci.nsIDOMNSEvent;
|
||||
sendAsyncMessage("Browser:KeyPress", {
|
||||
ctrlKey: json.modifiers & masks.CONTROL_MASK,
|
||||
shiftKey: json.modifiers & masks.SHIFT_MASK,
|
||||
metaKey: json.modifiers & masks.META_MASK,
|
||||
keyCode: json.keyCode,
|
||||
charCode: json.charCode
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case "Browser:MouseDown": {
|
||||
let element = elementFromPoint(x, y);
|
||||
if (!element)
|
||||
|
@ -500,10 +472,6 @@ Content.prototype = {
|
|||
stopLoading: function stopLoading() {
|
||||
this._loading = false;
|
||||
},
|
||||
|
||||
isSelected: function isSelected() {
|
||||
return this._selected;
|
||||
}
|
||||
};
|
||||
|
||||
let contentObject = new Content();
|
||||
|
|
Загрузка…
Ссылка в новой задаче