Bug 1455514 - part 1: Add accessors and static helper methods to retrieve nsINode or its concrete classes from EventTarget r=smaug

Currently, checking whether an `EventTarget` is `nsINode` (or its concrete
classes) or not requires a QI, but it's expensive and used a lot while we
handle each event.  Therefore, it'd be nicer for creating a virtual method,
`EventTarget::IsNode()` and use it for the check.

If trying to convert `EventTarget` to a concrete class, it may require two
virtual method calls.  I'm not sure whether it's cheaper than a QI, but at
least, it won't depend on the UUID check order of `QueryInterface()` when
multiple interfaces are implemented.

Differential Revision: https://phabricator.services.mozilla.com/D129781
This commit is contained in:
Masayuki Nakano
2021-11-02 13:03:43 +00:00
parent 47116d6cfd
commit 628f3ba93c
36 changed files with 298 additions and 192 deletions

View File

@@ -3265,10 +3265,10 @@ void HTMLInputElement::GetEventTargetParent(EventChainPreVisitor& aVisitor) {
aVisitor.mEvent->mMessage == eFocusIn ||
aVisitor.mEvent->mMessage == eFocusOut ||
aVisitor.mEvent->mMessage == eBlur)) {
nsCOMPtr<nsIContent> originalTarget =
do_QueryInterface(aVisitor.mEvent->AsFocusEvent()->mOriginalTarget);
nsCOMPtr<nsIContent> relatedTarget =
do_QueryInterface(aVisitor.mEvent->AsFocusEvent()->mRelatedTarget);
nsIContent* originalTarget = nsIContent::FromEventTargetOrNull(
aVisitor.mEvent->AsFocusEvent()->mOriginalTarget);
nsIContent* relatedTarget = nsIContent::FromEventTargetOrNull(
aVisitor.mEvent->AsFocusEvent()->mRelatedTarget);
if (originalTarget && relatedTarget &&
originalTarget->FindFirstNonChromeOnlyAccessContent() ==
@@ -3485,7 +3485,7 @@ bool HTMLInputElement::ShouldPreventDOMActivateDispatch(
return false;
}
nsCOMPtr<Element> target = do_QueryInterface(aOriginalTarget);
Element* target = Element::FromEventTargetOrNull(aOriginalTarget);
if (!target) {
return false;
}
@@ -3514,8 +3514,8 @@ nsresult HTMLInputElement::MaybeInitPickers(EventChainPostVisitor& aVisitor) {
// If the user clicked on the "Choose folder..." button we open the
// directory picker, else we open the file picker.
FilePickerType type = FILE_PICKER_FILE;
nsCOMPtr<nsIContent> target =
do_QueryInterface(aVisitor.mEvent->mOriginalTarget);
nsIContent* target =
nsIContent::FromEventTargetOrNull(aVisitor.mEvent->mOriginalTarget);
if (target && target->FindFirstNonChromeOnlyAccessContent() == this &&
((StaticPrefs::dom_input_dirpicker() && Allowdirs()) ||
(StaticPrefs::dom_webkitBlink_dirPicker_enabled() &&