From 3df7550e39e97094ca461a30061ca1204e299f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 16 Mar 2021 21:53:20 +0000 Subject: [PATCH] Bug 1698821 - Fix GetNumberControlFrameForSpinButton. r=dholbert It broke with bug 1698043 because we removed one wrapper. Differential Revision: https://phabricator.services.mozilla.com/D108654 --- layout/forms/nsNumberControlFrame.cpp | 28 ++++++++----------- .../number-spinbox-disabled-notref.html | 9 ++++++ .../input/number/number-spinbox-disabled.html | 9 ++++++ .../reftests/forms/input/number/reftest.list | 1 + 4 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 layout/reftests/forms/input/number/number-spinbox-disabled-notref.html create mode 100644 layout/reftests/forms/input/number/number-spinbox-disabled.html diff --git a/layout/forms/nsNumberControlFrame.cpp b/layout/forms/nsNumberControlFrame.cpp index ba17746ad0cf..ccc8e7019bd2 100644 --- a/layout/forms/nsNumberControlFrame.cpp +++ b/layout/forms/nsNumberControlFrame.cpp @@ -111,24 +111,20 @@ nsNumberControlFrame* nsNumberControlFrame::GetNumberControlFrameForTextField( nsNumberControlFrame* nsNumberControlFrame::GetNumberControlFrameForSpinButton( nsIFrame* aFrame) { // If aFrame is a spin button for an then we expect the - // frame of its mContent's great-grandparent to be that input's frame. We - // have to check for this via the content tree because we don't know whether - // extra frames will be wrapped around any of the elements between aFrame and - // the nsNumberControlFrame that we're looking for (e.g. flex wrappers). + // frame of the NAC root parent to be that input's frame. We have to check for + // this via the content tree because we don't know whether extra frames will + // be wrapped around any of the elements between aFrame and the + // nsNumberControlFrame that we're looking for (e.g. flex wrappers). nsIContent* content = aFrame->GetContent(); - if (content->IsInNativeAnonymousSubtree() && content->GetParent() && - content->GetParent()->GetParent() && - content->GetParent()->GetParent()->GetParent()) { - nsIContent* greatgrandparent = - content->GetParent()->GetParent()->GetParent(); - if (greatgrandparent->IsHTMLElement(nsGkAtoms::input) && - greatgrandparent->AsElement()->AttrValueIs( - kNameSpaceID_None, nsGkAtoms::type, nsGkAtoms::number, - eCaseMatters)) { - return do_QueryFrame(greatgrandparent->GetPrimaryFrame()); - } + auto* nacHost = content->GetClosestNativeAnonymousSubtreeRootParent(); + if (!nacHost) { + return nullptr; } - return nullptr; + auto* input = HTMLInputElement::FromNode(nacHost); + if (!input || input->ControlType() != NS_FORM_INPUT_NUMBER) { + return nullptr; + } + return do_QueryFrame(input->GetPrimaryFrame()); } int32_t nsNumberControlFrame::GetSpinButtonForPointerEvent( diff --git a/layout/reftests/forms/input/number/number-spinbox-disabled-notref.html b/layout/reftests/forms/input/number/number-spinbox-disabled-notref.html new file mode 100644 index 000000000000..216111431e97 --- /dev/null +++ b/layout/reftests/forms/input/number/number-spinbox-disabled-notref.html @@ -0,0 +1,9 @@ + + + diff --git a/layout/reftests/forms/input/number/number-spinbox-disabled.html b/layout/reftests/forms/input/number/number-spinbox-disabled.html new file mode 100644 index 000000000000..03124d4ab2d1 --- /dev/null +++ b/layout/reftests/forms/input/number/number-spinbox-disabled.html @@ -0,0 +1,9 @@ + + + diff --git a/layout/reftests/forms/input/number/reftest.list b/layout/reftests/forms/input/number/reftest.list index a9abb904baad..a0282ad07063 100644 --- a/layout/reftests/forms/input/number/reftest.list +++ b/layout/reftests/forms/input/number/reftest.list @@ -17,6 +17,7 @@ fuzzy-if(skiaContent,0-2,0-13) == show-value.html show-value-ref.html # disabled == number-disabled.html number-disabled-ref.html +!= number-spinbox-disabled.html number-spinbox-disabled-notref.html # auto width: == number-auto-width-1.html number-auto-width-1-ref.html