Bug 326944, remove nsIComboboxControlFrame interface, r=mats
authorNeil Deakin <neil@mozilla.com>
Wed, 26 Sep 2018 10:41:12 -0400
changeset 438350 785a53ae44c0e8df1e8e900dc9be656319978359
parent 438349 d081601f722b18327d3504023b2e88e09921e632
child 438351 7df169d72b504e045b236ffb57d1fb61e518371e
push id34717
push usershindli@mozilla.com
push dateWed, 26 Sep 2018 21:52:33 +0000
treeherdermozilla-central@7ac88abc3c57 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmats
bugs326944
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 326944, remove nsIComboboxControlFrame interface, r=mats
accessible/html/HTMLSelectAccessible.cpp
dom/events/EventStateManager.cpp
dom/events/moz.build
dom/html/HTMLOptionsCollection.cpp
dom/html/HTMLSelectElement.cpp
layout/base/nsCSSFrameConstructor.cpp
layout/forms/moz.build
layout/forms/nsComboboxControlFrame.cpp
layout/forms/nsComboboxControlFrame.h
layout/forms/nsIComboboxControlFrame.h
layout/forms/nsListControlFrame.h
widget/windows/moz.build
widget/windows/nsNativeThemeWin.cpp
--- a/accessible/html/HTMLSelectAccessible.cpp
+++ b/accessible/html/HTMLSelectAccessible.cpp
@@ -12,17 +12,17 @@
 #include "nsEventShell.h"
 #include "nsTextEquivUtils.h"
 #include "Role.h"
 #include "States.h"
 
 #include "nsCOMPtr.h"
 #include "mozilla/dom/HTMLOptionElement.h"
 #include "mozilla/dom/HTMLSelectElement.h"
-#include "nsIComboboxControlFrame.h"
+#include "nsComboboxControlFrame.h"
 #include "nsContainerFrame.h"
 #include "nsListControlFrame.h"
 
 using namespace mozilla::a11y;
 using namespace mozilla::dom;
 
 ////////////////////////////////////////////////////////////////////////////////
 // HTMLSelectListAccessible
@@ -348,17 +348,17 @@ HTMLSelectOptGroupAccessible::DoAction(u
 HTMLComboboxAccessible::
   HTMLComboboxAccessible(nsIContent* aContent, DocAccessible* aDoc) :
   AccessibleWrap(aContent, aDoc)
 {
   mType = eHTMLComboboxType;
   mGenericTypes |= eCombobox;
   mStateFlags |= eNoKidsFromDOM;
 
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(GetFrame());
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(GetFrame());
   if (comboFrame) {
     nsIFrame* listFrame = comboFrame->GetDropDown();
     if (listFrame) {
       mListAccessible = new HTMLComboboxListAccessible(mParent, mContent, mDoc);
       Document()->BindToDocument(mListAccessible, nullptr);
       AppendChild(mListAccessible);
     }
   }
@@ -399,17 +399,17 @@ HTMLComboboxAccessible::Shutdown()
 uint64_t
 HTMLComboboxAccessible::NativeState() const
 {
   // As a HTMLComboboxAccessible we can have the following states:
   // FOCUSED, FOCUSABLE, HASPOPUP, EXPANDED, COLLAPSED
   // Get focus status from base class
   uint64_t state = Accessible::NativeState();
 
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(GetFrame());
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(GetFrame());
   if (comboFrame && comboFrame->IsDroppedDown())
     state |= states::EXPANDED;
   else
     state |= states::COLLAPSED;
 
   state |= states::HASPOPUP;
   return state;
 }
@@ -456,17 +456,17 @@ HTMLComboboxAccessible::DoAction(uint8_t
 }
 
 void
 HTMLComboboxAccessible::ActionNameAt(uint8_t aIndex, nsAString& aName)
 {
   if (aIndex != HTMLComboboxAccessible::eAction_Click)
     return;
 
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(GetFrame());
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(GetFrame());
   if (!comboFrame)
     return;
 
   if (comboFrame->IsDroppedDown())
     aName.AssignLiteral("close");
   else
     aName.AssignLiteral("open");
 }
@@ -490,17 +490,17 @@ bool
 HTMLComboboxAccessible::IsActiveWidget() const
 {
   return FocusMgr()->HasDOMFocus(mContent);
 }
 
 bool
 HTMLComboboxAccessible::AreItemsOperable() const
 {
-  nsIComboboxControlFrame* comboboxFrame = do_QueryFrame(GetFrame());
+  nsComboboxControlFrame* comboboxFrame = do_QueryFrame(GetFrame());
   return comboboxFrame && comboboxFrame->IsDroppedDown();
 }
 
 Accessible*
 HTMLComboboxAccessible::CurrentItem() const
 {
   return AreItemsOperable() ? mListAccessible->CurrentItem() : nullptr;
 }
@@ -548,17 +548,17 @@ HTMLComboboxListAccessible::
 
 ////////////////////////////////////////////////////////////////////////////////
 // HTMLComboboxAccessible: Accessible
 
 nsIFrame*
 HTMLComboboxListAccessible::GetFrame() const
 {
   nsIFrame* frame = HTMLSelectListAccessible::GetFrame();
-  nsIComboboxControlFrame* comboBox = do_QueryFrame(frame);
+  nsComboboxControlFrame* comboBox = do_QueryFrame(frame);
   if (comboBox) {
     return comboBox->GetDropDown();
   }
 
   return nullptr;
 }
 
 role
@@ -570,17 +570,17 @@ HTMLComboboxListAccessible::NativeRole()
 uint64_t
 HTMLComboboxListAccessible::NativeState() const
 {
   // As a HTMLComboboxListAccessible we can have the following states:
   // FOCUSED, FOCUSABLE, FLOATING, INVISIBLE
   // Get focus status from base class
   uint64_t state = Accessible::NativeState();
 
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(mParent->GetFrame());
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(mParent->GetFrame());
   if (comboFrame && comboFrame->IsDroppedDown())
     state |= states::FLOATING;
   else
     state |= states::INVISIBLE;
 
   return state;
 }
 
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -39,17 +39,17 @@
 #include "nsIContentInlines.h"
 #include "nsIDocument.h"
 #include "nsIFrame.h"
 #include "nsIWidget.h"
 #include "nsPresContext.h"
 #include "nsIPresShell.h"
 #include "nsGkAtoms.h"
 #include "nsIFormControl.h"
-#include "nsIComboboxControlFrame.h"
+#include "nsComboboxControlFrame.h"
 #include "nsIScrollableFrame.h"
 #include "nsIDOMXULControlElement.h"
 #include "nsNameSpaceManager.h"
 #include "nsIBaseWindow.h"
 #include "nsFrameSelection.h"
 #include "nsPIDOMWindow.h"
 #include "nsPIWindowRoot.h"
 #include "nsIWebNavigation.h"
@@ -2679,17 +2679,17 @@ EventStateManager::ComputeScrollTargetAn
         canScroll = true;
       }
     } else if (WheelHandlingUtils::CanScrollOn(scrollableFrame,
                                                aDirectionX, aDirectionY)) {
       canScroll = true;
     }
 
     // Comboboxes need special care.
-    nsIComboboxControlFrame* comboBox = do_QueryFrame(scrollFrame);
+    nsComboboxControlFrame* comboBox = do_QueryFrame(scrollFrame);
     if (comboBox) {
       if (comboBox->IsDroppedDown()) {
         // Don't propagate to parent when drop down menu is active.
         return canScroll ? frameToScroll : nullptr;
       }
       // Always propagate when not dropped down (even if focused).
       continue;
     }
--- a/dom/events/moz.build
+++ b/dom/events/moz.build
@@ -154,15 +154,16 @@ LOCAL_INCLUDES += [
     '/docshell/base',
     '/dom/base',
     '/dom/html',
     '/dom/storage',
     '/dom/svg',
     '/dom/xml',
     '/dom/xul',
     '/js/xpconnect/wrappers',
+    '/layout/forms',
     '/layout/generic',
     '/layout/xul',
     '/layout/xul/tree/',
 ]
 
 if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
     CXXFLAGS += ['-Wno-error=shadow']
--- a/dom/html/HTMLOptionsCollection.cpp
+++ b/dom/html/HTMLOptionsCollection.cpp
@@ -13,17 +13,16 @@
 #include "mozilla/MappedDeclarations.h"
 #include "mozilla/dom/HTMLFormSubmission.h"
 #include "mozilla/dom/HTMLOptionElement.h"
 #include "mozilla/dom/HTMLOptionsCollectionBinding.h"
 #include "mozilla/dom/HTMLSelectElement.h"
 #include "nsContentCreatorFunctions.h"
 #include "nsError.h"
 #include "nsGkAtoms.h"
-#include "nsIComboboxControlFrame.h"
 #include "nsIDocument.h"
 #include "nsIFormControlFrame.h"
 #include "nsIForm.h"
 #include "nsIFormProcessor.h"
 #include "nsLayoutUtils.h"
 #include "nsMappedAttributes.h"
 #include "nsServiceManagerUtils.h"
 #include "nsStyleConsts.h"
--- a/dom/html/HTMLSelectElement.cpp
+++ b/dom/html/HTMLSelectElement.cpp
@@ -17,17 +17,17 @@
 #include "mozilla/dom/HTMLOptionElement.h"
 #include "mozilla/dom/HTMLSelectElementBinding.h"
 #include "mozilla/dom/UnionTypes.h"
 #include "mozilla/MappedDeclarations.h"
 #include "nsContentCreatorFunctions.h"
 #include "nsContentList.h"
 #include "nsError.h"
 #include "nsGkAtoms.h"
-#include "nsIComboboxControlFrame.h"
+#include "nsComboboxControlFrame.h"
 #include "nsIDocument.h"
 #include "nsIFormControlFrame.h"
 #include "nsIForm.h"
 #include "nsIFormProcessor.h"
 #include "nsIFrame.h"
 #include "nsListControlFrame.h"
 #include "nsISelectControlFrame.h"
 #include "nsLayoutUtils.h"
@@ -1595,17 +1595,17 @@ HTMLSelectElement::SubmitNamesValues(HTM
 void
 HTMLSelectElement::DispatchContentReset()
 {
   nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
   if (formControlFrame) {
     // Only dispatch content reset notification if this is a list control
     // frame or combo box control frame.
     if (IsCombobox()) {
-      nsIComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
+      nsComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
       if (comboFrame) {
         comboFrame->OnContentReset();
       }
     } else {
       nsListControlFrame* listFrame = do_QueryFrame(formControlFrame);
       if (listFrame) {
         listFrame->OnContentReset();
       }
@@ -1774,41 +1774,41 @@ HTMLSelectElement::UpdateSelectedOptions
     mSelectedOptions->SetDirty();
   }
 }
 
 bool
 HTMLSelectElement::OpenInParentProcess()
 {
   nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
   if (comboFrame) {
     return comboFrame->IsOpenInParentProcess();
   }
 
   return false;
 }
 
 void
 HTMLSelectElement::SetOpenInParentProcess(bool aVal)
 {
   nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
   if (comboFrame) {
     comboFrame->SetOpenInParentProcess(aVal);
   }
 }
 
 void
 HTMLSelectElement::SetPreviewValue(const nsAString& aValue)
 {
   mPreviewValue = aValue;
   nsContentUtils::RemoveNewlines(mPreviewValue);
   nsIFormControlFrame* formControlFrame = GetFormControlFrame(false);
-  nsIComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
+  nsComboboxControlFrame* comboFrame = do_QueryFrame(formControlFrame);
   if (comboFrame) {
     comboFrame->RedisplaySelectedText();
   }
 }
 
 JSObject*
 HTMLSelectElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -45,17 +45,16 @@
 #include "nsViewManager.h"
 #include "nsStyleConsts.h"
 #ifdef MOZ_XUL
 #include "nsXULElement.h"
 #include "mozilla/dom/BoxObject.h"
 #endif // MOZ_XUL
 #include "nsContainerFrame.h"
 #include "nsNameSpaceManager.h"
-#include "nsIComboboxControlFrame.h"
 #include "nsComboboxControlFrame.h"
 #include "nsListControlFrame.h"
 #include "nsPlaceholderFrame.h"
 #include "nsTableRowGroupFrame.h"
 #include "nsIFormControl.h"
 #include "nsCSSAnonBoxes.h"
 #include "nsTextFragment.h"
 #include "nsIAnonymousContentCreator.h"
--- a/layout/forms/moz.build
+++ b/layout/forms/moz.build
@@ -6,17 +6,16 @@
 
 with Files('**'):
     BUG_COMPONENT = ('Core', 'Layout: Form Controls')
 
 MOCHITEST_MANIFESTS += ['test/mochitest.ini']
 MOCHITEST_CHROME_MANIFESTS += ['test/chrome.ini']
 
 EXPORTS += [
-    'nsIComboboxControlFrame.h',
     'nsIFormControlFrame.h',
     'nsISelectControlFrame.h',
     'nsITextControlFrame.h',
 ]
 
 UNIFIED_SOURCES += [
     'nsButtonFrameRenderer.cpp',
     'nsCheckboxRadioFrame.cpp',
--- a/layout/forms/nsComboboxControlFrame.cpp
+++ b/layout/forms/nsComboboxControlFrame.cpp
@@ -246,17 +246,16 @@ nsComboboxControlFrame::~nsComboboxContr
 {
   REFLOW_COUNTER_DUMP("nsCCF");
 }
 
 //--------------------------------------------------------------
 
 NS_QUERYFRAME_HEAD(nsComboboxControlFrame)
   NS_QUERYFRAME_ENTRY(nsComboboxControlFrame)
-  NS_QUERYFRAME_ENTRY(nsIComboboxControlFrame)
   NS_QUERYFRAME_ENTRY(nsIFormControlFrame)
   NS_QUERYFRAME_ENTRY(nsIAnonymousContentCreator)
   NS_QUERYFRAME_ENTRY(nsISelectControlFrame)
   NS_QUERYFRAME_ENTRY(nsIStatefulFrame)
 NS_QUERYFRAME_TAIL_INHERITING(nsBlockFrame)
 
 #ifdef ACCESSIBILITY
 a11y::AccType
@@ -930,19 +929,16 @@ nsComboboxControlFrame::Reflow(nsPresCon
 nsresult
 nsComboboxControlFrame::GetFrameName(nsAString& aResult) const
 {
   return MakeFrameName(NS_LITERAL_STRING("ComboboxControl"), aResult);
 }
 #endif
 
 
-//----------------------------------------------------------------------
-// nsIComboboxControlFrame
-//----------------------------------------------------------------------
 void
 nsComboboxControlFrame::ShowDropDown(bool aDoDropDown)
 {
   if (!nsLayoutUtils::IsContentSelectEnabled()) {
     // TODO(kuoe0) remove this assertion after content-select is enabled
     MOZ_ASSERT(!XRE_IsContentProcess());
   }
   mDelayedShowDropDown = false;
@@ -985,17 +981,17 @@ nsIFrame*
 nsComboboxControlFrame::GetDropDown()
 {
   return mDropdownFrame;
 }
 
 ///////////////////////////////////////////////////////////////
 
 
-NS_IMETHODIMP
+nsresult
 nsComboboxControlFrame::RedisplaySelectedText()
 {
   nsAutoScriptBlocker scriptBlocker;
   mDisplayedIndex = mListControlFrame->GetSelectedIndex();
   return RedisplayText();
 }
 
 
--- a/layout/forms/nsComboboxControlFrame.h
+++ b/layout/forms/nsComboboxControlFrame.h
@@ -20,17 +20,16 @@
 #endif
 
 //Mark used to indicate when onchange has been fired for current combobox item
 #define NS_SKIP_NOTIFY_INDEX -2
 
 #include "mozilla/Attributes.h"
 #include "nsBlockFrame.h"
 #include "nsIFormControlFrame.h"
-#include "nsIComboboxControlFrame.h"
 #include "nsIAnonymousContentCreator.h"
 #include "nsISelectControlFrame.h"
 #include "nsIRollupListener.h"
 #include "nsIStatefulFrame.h"
 #include "nsThreadUtils.h"
 
 class nsListControlFrame;
 class nsComboboxDisplayFrame;
@@ -41,17 +40,16 @@ class nsTextNode;
 namespace mozilla {
 namespace gfx {
 class DrawTarget;
 } // namespace gfx
 } // namespace mozilla
 
 class nsComboboxControlFrame final : public nsBlockFrame,
                                      public nsIFormControlFrame,
-                                     public nsIComboboxControlFrame,
                                      public nsIAnonymousContentCreator,
                                      public nsISelectControlFrame,
                                      public nsIRollupListener,
                                      public nsIStatefulFrame
 {
   typedef mozilla::gfx::DrawTarget DrawTarget;
 
 public:
@@ -127,58 +125,59 @@ public:
    * If it lost focus, the dropdown menu will be rolled up if needed,
    * and FireOnChange() will be called.
    * @param aOn true if got focus, false if lost focus.
    * @param aRepaint if true then force repaint (NOTE: we always force repaint currently)
    * @note This method might destroy |this|.
    */
   virtual void SetFocus(bool aOn, bool aRepaint) override;
 
-  //nsIComboboxControlFrame
-  virtual bool IsDroppedDown() override { return mDroppedDown; }
+  bool IsDroppedDown() { return mDroppedDown; }
   /**
    * @note This method might destroy |this|.
    */
-  virtual void ShowDropDown(bool aDoDropDown) override;
-  virtual nsIFrame* GetDropDown() override;
-  virtual void SetDropDown(nsIFrame* aDropDownFrame) override;
+  void ShowDropDown(bool aDoDropDown);
+  nsIFrame* GetDropDown();
+  void SetDropDown(nsIFrame* aDropDownFrame);
   /**
    * @note This method might destroy |this|.
    */
-  virtual void RollupFromList() override;
+  void RollupFromList();
 
   /**
    * Return the available space before and after this frame for
    * placing the drop-down list, and the current 2D translation.
    * Note that either or both can be less than or equal to zero,
    * if both are then the drop-down should be closed.
    */
   void GetAvailableDropdownSpace(mozilla::WritingMode aWM,
                                  nscoord* aBefore,
                                  nscoord* aAfter,
                                  mozilla::LogicalPoint* aTranslation);
-  virtual int32_t GetIndexOfDisplayArea() override;
+  int32_t GetIndexOfDisplayArea();
   /**
    * @note This method might destroy |this|.
    */
-  NS_IMETHOD RedisplaySelectedText() override;
-  virtual int32_t UpdateRecentIndex(int32_t aIndex) override;
-  virtual void OnContentReset() override;
+  nsresult RedisplaySelectedText();
+  int32_t UpdateRecentIndex(int32_t aIndex);
+  void OnContentReset();
 
 
-  bool IsOpenInParentProcess() override
+  bool IsOpenInParentProcess()
   {
     return mIsOpenInParentProcess;
   }
 
-  void SetOpenInParentProcess(bool aVal) override
+  void SetOpenInParentProcess(bool aVal)
   {
     mIsOpenInParentProcess = aVal;
   }
 
+  bool IsDroppedDownOrHasParentPopup() { return IsDroppedDown() || IsOpenInParentProcess(); }
+
   // nsISelectControlFrame
   NS_IMETHOD AddOption(int32_t index) override;
   NS_IMETHOD RemoveOption(int32_t index) override;
   NS_IMETHOD DoneAddingChildren(bool aIsDone) override;
   NS_IMETHOD OnOptionSelected(int32_t aIndex, bool aSelected) override;
   NS_IMETHOD OnSetSelectedIndex(int32_t aOldIndex, int32_t aNewIndex) override;
 
   //nsIRollupListener
deleted file mode 100644
--- a/layout/forms/nsIComboboxControlFrame.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#ifndef nsIComboboxControlFrame_h___
-#define nsIComboboxControlFrame_h___
-
-#include "nsQueryFrame.h"
-
-/**
-  * nsIComboboxControlFrame is the interface for comboboxes.
-  */
-class nsIComboboxControlFrame : public nsQueryFrame
-{
-public:
-  NS_DECL_QUERYFRAME_TARGET(nsIComboboxControlFrame)
-
-  /**
-   * Indicates whether the list is dropped down
-   */
-  virtual bool IsDroppedDown() = 0;
-
-  virtual bool IsOpenInParentProcess() = 0;
-  virtual void SetOpenInParentProcess(bool aVal) = 0;
-
-  bool IsDroppedDownOrHasParentPopup() { return IsDroppedDown() || IsOpenInParentProcess(); }
-
-  /**
-   * Shows or hides the drop down
-   */
-  virtual void ShowDropDown(bool aDoDropDown) = 0;
-
-  /**
-   * Gets the Drop Down List
-   */
-  virtual nsIFrame* GetDropDown() = 0;
-
-  /**
-   * Sets the Drop Down List
-   */
-  virtual void SetDropDown(nsIFrame* aDropDownFrame) = 0;
-
-  /**
-   * Tells the combobox to roll up
-   */
-  virtual void RollupFromList() = 0;
-
-  /**
-   * Redisplay the selected text (will do nothing if text has not changed).
-   * This method might destroy this frame or any others that happen to be
-   * around.  It might even run script.
-   */
-  NS_IMETHOD RedisplaySelectedText() = 0;
-
-  /**
-   * Method for the listbox to set and get the recent index
-   */
-  virtual int32_t UpdateRecentIndex(int32_t aIndex) = 0;
-
-  /**
-   * Notification that the content has been reset
-   */
-  virtual void OnContentReset() = 0;
-
-  /**
-   * This returns the index of the item that is currently being displayed
-   * in the display area. It may differ from what the currently Selected index
-   * is in in the dropdown.
-   *
-   * Detailed explanation:
-   * When the dropdown is dropped down via a mouse click and the user moves the mouse
-   * up and down without clicking, the currently selected item is being tracking inside
-   * the dropdown, but the combobox is not being updated. When the user selects items
-   * with the arrow keys, the combobox is being updated. So when the user clicks outside
-   * the dropdown and it needs to roll up it has to decide whether to keep the current
-   * selection or not. This method is used to get the current index in the combobox to
-   * compare it to the current index in the dropdown to see if the combox has been updated
-   * and that way it knows whether to "cancel" the current selection residing in the
-   * dropdown. Or whether to leave the selection alone.
-   */
-  virtual int32_t GetIndexOfDisplayArea() = 0;
-};
-
-#endif
-
--- a/layout/forms/nsListControlFrame.h
+++ b/layout/forms/nsListControlFrame.h
@@ -23,17 +23,17 @@
 #include "nsISelectControlFrame.h"
 #include "nsSelectsAreaFrame.h"
 
 // X.h defines KeyPress
 #ifdef KeyPress
 #undef KeyPress
 #endif
 
-class nsIComboboxControlFrame;
+class nsComboboxControlFrame;
 class nsPresContext;
 class nsListEventListener;
 
 namespace mozilla {
 namespace dom {
 class Event;
 class HTMLOptionElement;
 class HTMLOptionsCollection;
@@ -387,17 +387,17 @@ protected:
 
   nsView* GetViewInternal() const override { return mView; }
   void SetViewInternal(nsView* aView) override { mView = aView; }
 
   // Data Members
   int32_t      mStartSelectionIndex;
   int32_t      mEndSelectionIndex;
 
-  nsIComboboxControlFrame* mComboboxFrame;
+  nsComboboxControlFrame* mComboboxFrame;
 
   // The view is only created (& non-null) if IsInDropDownMode() is true.
   nsView* mView;
 
   uint32_t mNumDisplayRows;
   bool mChangesSinceDragStart:1;
   bool mButtonDown:1;
 
--- a/widget/windows/moz.build
+++ b/widget/windows/moz.build
@@ -141,16 +141,17 @@ if CONFIG['MOZ_ENABLE_SKIA_PDF']:
   LOCAL_INCLUDES += [
     '/gfx/skia/skia/include/config',
     '/gfx/skia/skia/include/core',
     '/modules/pdfium/pdfium/public',
   ]
   TEST_DIRS += ['gtest']
 
 LOCAL_INCLUDES += [
+    '/layout/forms',
     '/layout/generic',
     '/layout/xul',
     '/toolkit/xre',
     '/widget',
     '/widget/headless',
     '/xpcom/base',
 ]
 
--- a/widget/windows/nsNativeThemeWin.cpp
+++ b/widget/windows/nsNativeThemeWin.cpp
@@ -24,17 +24,17 @@
 #include "nsIFrame.h"
 #include "nsLayoutUtils.h"
 #include "nsNameSpaceManager.h"
 #include "nsLookAndFeel.h"
 #include "nsMenuFrame.h"
 #include "nsGkAtoms.h"
 #include <malloc.h>
 #include "nsWindow.h"
-#include "nsIComboboxControlFrame.h"
+#include "nsComboboxControlFrame.h"
 #include "prinrval.h"
 #include "WinUtils.h"
 
 #include "gfxPlatform.h"
 #include "gfxContext.h"
 #include "gfxWindowsPlatform.h"
 #include "gfxWindowsSurface.h"
 #include "gfxWindowsNativeDrawing.h"
@@ -1326,17 +1326,17 @@ nsNativeThemeWin::GetThemePartAndState(n
         aPart = CBP_DROPMARKER;
 
       if (IsDisabled(aFrame, eventState)) {
         aState = TS_DISABLED;
         return NS_OK;
       }
 
       if (isHTML) {
-        nsIComboboxControlFrame* ccf = do_QueryFrame(aFrame);
+        nsComboboxControlFrame* ccf = do_QueryFrame(aFrame);
         isOpen = (ccf && ccf->IsDroppedDownOrHasParentPopup());
       }
       else
         isOpen = IsOpenButton(aFrame);
 
       if (isHTML) {
         if (isOpen) {
           /* Hover is propagated, but we need to know whether we're hovering
@@ -3384,17 +3384,17 @@ nsresult nsNativeThemeWin::ClassicGetThe
       EventStates eventState = GetContentState(aFrame, aWidgetType);
 
       if (IsDisabled(aFrame, eventState)) {
         aState |= DFCS_INACTIVE;
         return NS_OK;
       }
 
       if (isHTML) {
-        nsIComboboxControlFrame* ccf = do_QueryFrame(aFrame);
+        nsComboboxControlFrame* ccf = do_QueryFrame(aFrame);
         isOpen = (ccf && ccf->IsDroppedDownOrHasParentPopup());
       }
       else
         isOpen = IsOpenButton(aFrame);
 
       // XXX Button should look active until the mouse is released, but
       //     without making it look active when the popup is clicked.
       if (isOpen && (isHTML || isMenulist))