Bug 599053 text typed in awesome bare shows up on previously focused form field [r=mfinkle]

This commit is contained in:
Benjamin Stover 2010-09-24 17:39:41 -07:00
Родитель 5d94adb8d8
Коммит 9c4241d21d
5 изменённых файлов: 124 добавлений и 96 удалений

Просмотреть файл

@ -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();