Bug 411212, cannot prevent file-picker from showing on <INPUT TYPE=FILE>, r+sr=roc+bzbarsky, a=mtschrep

This commit is contained in:
Olli.Pettay@helsinki.fi 2008-01-10 13:55:38 -08:00
parent c9fddb69ab
commit 065cc2d962
3 changed files with 149 additions and 19 deletions

View File

@ -70,6 +70,9 @@
#include "nsContentCreatorFunctions.h"
#include "nsContentUtils.h"
#include "nsDisplayList.h"
#include "nsIDOMNSUIEvent.h"
#include "nsIDOMEventGroup.h"
#include "nsIDOM3EventTarget.h"
#ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h"
#endif
@ -117,15 +120,25 @@ void
nsFileControlFrame::Destroy()
{
mTextFrame = nsnull;
ENSURE_TRUE(mContent);
// remove mMouseListener as a mouse event listener (bug 40533, bug 355931)
if (mBrowse) {
mBrowse->RemoveEventListenerByIID(mMouseListener,
NS_GET_IID(nsIDOMMouseListener));
NS_NAMED_LITERAL_STRING(click, "click");
nsCOMPtr<nsIDOMEventGroup> systemGroup;
mContent->GetSystemEventGroup(getter_AddRefs(systemGroup));
nsCOMPtr<nsIDOM3EventTarget> dom3Browse = do_QueryInterface(mBrowse);
if (dom3Browse) {
dom3Browse->RemoveGroupedEventListener(click, mMouseListener, PR_FALSE,
systemGroup);
nsContentUtils::DestroyAnonymousContent(&mBrowse);
}
if (mTextContent) {
mTextContent->RemoveEventListenerByIID(mMouseListener,
NS_GET_IID(nsIDOMMouseListener));
nsCOMPtr<nsIDOM3EventTarget> dom3TextContent =
do_QueryInterface(mTextContent);
if (dom3TextContent) {
dom3TextContent->RemoveGroupedEventListener(click, mMouseListener, PR_FALSE,
systemGroup);
nsContentUtils::DestroyAnonymousContent(&mTextContent);
}
@ -170,9 +183,16 @@ nsFileControlFrame::CreateAnonymousContent(nsTArray<nsIContent*>& aElements)
if (!aElements.AppendElement(mTextContent))
return NS_ERROR_OUT_OF_MEMORY;
// register as an event listener of the textbox to open file dialog on mouse click
mTextContent->AddEventListenerByIID(mMouseListener,
NS_GET_IID(nsIDOMMouseListener));
NS_NAMED_LITERAL_STRING(click, "click");
nsCOMPtr<nsIDOMEventGroup> systemGroup;
mContent->GetSystemEventGroup(getter_AddRefs(systemGroup));
nsCOMPtr<nsIDOM3EventTarget> dom3TextContent =
do_QueryInterface(mTextContent);
NS_ENSURE_STATE(dom3TextContent);
// Register as an event listener of the textbox
// to open file dialog on mouse click
dom3TextContent->AddGroupedEventListener(click, mMouseListener, PR_FALSE,
systemGroup);
// Create the browse button
NS_NewHTMLElement(getter_AddRefs(mBrowse), nodeInfo);
@ -196,9 +216,12 @@ nsFileControlFrame::CreateAnonymousContent(nsTArray<nsIContent*>& aElements)
if (!aElements.AppendElement(mBrowse))
return NS_ERROR_OUT_OF_MEMORY;
// register as an event listener of the button to open file dialog on mouse click
mBrowse->AddEventListenerByIID(mMouseListener,
NS_GET_IID(nsIDOMMouseListener));
nsCOMPtr<nsIDOM3EventTarget> dom3Browse = do_QueryInterface(mBrowse);
NS_ENSURE_STATE(dom3Browse);
// Register as an event listener of the button
// to open file dialog on mouse click
dom3Browse->AddGroupedEventListener(click, mMouseListener, PR_FALSE,
systemGroup);
SyncAttr(kNameSpaceID_None, nsGkAtoms::size, SYNC_TEXT);
SyncAttr(kNameSpaceID_None, nsGkAtoms::disabled, SYNC_BOTH);
@ -244,15 +267,23 @@ nsFileControlFrame::MouseClick(nsIDOMEvent* aMouseEvent)
{
// only allow the left button
nsCOMPtr<nsIDOMMouseEvent> mouseEvent = do_QueryInterface(aMouseEvent);
if (mouseEvent) {
PRUint16 whichButton;
if (NS_SUCCEEDED(mouseEvent->GetButton(&whichButton))) {
if (whichButton != 0) {
return NS_OK;
}
}
nsCOMPtr<nsIDOMNSUIEvent> uiEvent = do_QueryInterface(aMouseEvent);
NS_ENSURE_STATE(uiEvent);
PRBool defaultPrevented = PR_FALSE;
uiEvent->GetPreventDefault(&defaultPrevented);
if (defaultPrevented) {
return NS_OK;
}
PRUint16 whichButton;
if (NS_FAILED(mouseEvent->GetButton(&whichButton)) || whichButton != 0) {
return NS_OK;
}
PRInt32 clickCount;
if (NS_FAILED(mouseEvent->GetDetail(&clickCount)) || clickCount > 1) {
return NS_OK;
}
nsresult result;

View File

@ -46,6 +46,7 @@ include $(topsrcdir)/config/rules.mk
_TEST_FILES = test_bug345267.html \
test_bug402198.html \
test_bug411236.html \
$(NULL)
libs:: $(_TEST_FILES)

View File

@ -0,0 +1,98 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=411236
-->
<head>
<title>Test for Bug 411236</title>
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=411236">Mozilla Bug 411236</a>
<p id="display"></p>
<div id="content">
<input type="file" onfocus="window.oTarget = event.originalTarget;"
onclick="window.fileInputGotClick = true; return false;"
id="fileinput">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for Bug 411236 **/
window.oTarget = null;
window.fileInputGotClick = false;
// accessibility.tabfocus must be set to value 7 before running test also
// on a mac.
function setOrRestoreTabFocus(newValue) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
const prefSvcContractID = "@mozilla.org/preferences-service;1";
const prefSvcIID = Components.interfaces.nsIPrefService;
var prefs = Components.classes[prefSvcContractID].getService(prefSvcIID)
.getBranch("accessibility.");
if (!newValue) {
try {
prefs.clearUserPref("tabfocus");
} catch(ex) {}
} else {
prefs.setIntPref("tabfocus", newValue);
}
}
function tab() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var utils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
getInterface(Components.interfaces.nsIDOMWindowUtils);
// Send tab key events.
var key = Components.interfaces.nsIDOMKeyEvent.DOM_VK_TAB;
utils.sendKeyEvent("keydown", key, 0, 0);
utils.sendKeyEvent("keypress", key, 0, 0);
utils.sendKeyEvent("keyup", key, 0, 0);
}
function test() {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
// Try to find the 'Browse...' using tabbing.
var i = 0;
while (!window.oTarget && i < 100) {
++i;
tab();
}
if (i >= 100) {
ok(false, "Couldn't find an input element!");
setOrRestoreTabFocus(0);
SimpleTest.finish();
return;
}
ok(window.oTarget instanceof HTMLInputElement, "Should have focused an input element!")
ok(window.oTarget.type == "button", "Should have focused 'Browse...' button!");
var e = document.createEvent("mouseevents");
e.initMouseEvent("click", true, true, window, 0, 1, 1, 1, 1,
false, false, false, false, 0, null);
window.oTarget.dispatchEvent(e);
ok(window.fileInputGotClick,
"File input should have got a click event, but not open the file dialog.");
setOrRestoreTabFocus(0);
SimpleTest.finish();
}
function do_test() {
setOrRestoreTabFocus(7);
window.focus();
document.getElementById('fileinput').focus();
setTimeout(test, 100);
}
SimpleTest.waitForExplicitFinish();
addLoadEvent(test);
</script>
</pre>
</body>
</html>