Bug 1532140 - Cleanup nsDataObj. r=jmathies
authorMasatoshi Kimura <VYV03354@nifty.ne.jp>
Wed, 13 Mar 2019 19:00:59 +0000
changeset 524861 19d90e94a7ece27154c6ed35466d86072910041d
parent 524860 416032a984592cd291a7fc4a18253f929ef861ed
child 524862 4905cca9fa818ebcab585fb7c988e685e0b7c551
push id2032
push userffxbld-merge
push dateMon, 13 May 2019 09:36:57 +0000
treeherdermozilla-release@455c1065dcbe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjmathies
bugs1532140
milestone67.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 1532140 - Cleanup nsDataObj. r=jmathies * Removed dead code. * Removed a duplicated field (`m_cRef`) from the derived class. * Removed #ifdefs for older SDKs that we no longer support. * Made access specifiers more restrictive. * Added `override` and `final`. * De-virtualized member functions unless it is neccessary. Differential Revision: https://phabricator.services.mozilla.com/D21864
widget/windows/nsClipboard.cpp
widget/windows/nsDataObj.cpp
widget/windows/nsDataObj.h
widget/windows/nsDataObjCollection.cpp
widget/windows/nsDataObjCollection.h
widget/windows/nsDragService.cpp
--- a/widget/windows/nsClipboard.cpp
+++ b/widget/windows/nsClipboard.cpp
@@ -129,17 +129,17 @@ nsresult nsClipboard::CreateNativeDataOb
 
   dataObj->AddRef();
 
   // Now set it up with all the right data flavors & enums
   nsresult res = SetupNativeDataObject(aTransferable, dataObj);
   if (NS_OK == res) {
     *aDataObj = dataObj;
   } else {
-    delete dataObj;
+    dataObj->Release();
   }
   return res;
 }
 
 //-------------------------------------------------------------------------
 nsresult nsClipboard::SetupNativeDataObject(nsITransferable* aTransferable,
                                             IDataObject* aDataObj) {
   if (nullptr == aTransferable || nullptr == aDataObj) {
--- a/widget/windows/nsDataObj.cpp
+++ b/widget/windows/nsDataObj.cpp
@@ -308,19 +308,16 @@ HRESULT nsDataObj::CreateStream(IStream*
     pStream->Release();
     return E_FAIL;
   }
   *outStream = pStream;
 
   return S_OK;
 }
 
-static GUID CLSID_nsDataObj = {
-    0x1bba7640, 0xdf52, 0x11cf, {0x82, 0x7b, 0, 0xa0, 0x24, 0x3a, 0xe5, 0x05}};
-
 /*
  * deliberately not using MAX_PATH. This is because on platforms < XP
  * a file created with a long filename may be mishandled by the shell
  * resulting in it not being able to be deleted or moved.
  * See bug 250392 for more details.
  */
 #define NS_MAX_FILEDESCRIPTOR 128 + 1
 
@@ -371,18 +368,18 @@ nsDataObj::~nsDataObj() {
 //-----------------------------------------------------
 STDMETHODIMP nsDataObj::QueryInterface(REFIID riid, void** ppv) {
   *ppv = nullptr;
 
   if ((IID_IUnknown == riid) || (IID_IDataObject == riid)) {
     *ppv = this;
     AddRef();
     return S_OK;
-  } else if (IID_IAsyncOperation == riid) {
-    *ppv = static_cast<IAsyncOperation*>(this);
+  } else if (IID_IDataObjectAsyncCapability == riid) {
+    *ppv = static_cast<IDataObjectAsyncCapability*>(this);
     AddRef();
     return S_OK;
   }
 
   return E_NOINTERFACE;
 }
 
 //-----------------------------------------------------
@@ -759,17 +756,17 @@ STDMETHODIMP nsDataObj::DUnadvise(DWORD 
   return OLE_E_ADVISENOTSUPPORTED;
 }
 
 //-----------------------------------------------------
 STDMETHODIMP nsDataObj::EnumDAdvise(LPENUMSTATDATA* ppEnum) {
   return OLE_E_ADVISENOTSUPPORTED;
 }
 
-// IAsyncOperation methods
+// IDataObjectAsyncCapability methods
 STDMETHODIMP nsDataObj::EndOperation(HRESULT hResult, IBindCtx* pbcReserved,
                                      DWORD dwEffects) {
   mIsInOperation = FALSE;
   return S_OK;
 }
 
 STDMETHODIMP nsDataObj::GetAsyncMode(BOOL* pfIsOpAsync) {
   *pfIsOpAsync = mIsAsyncMode;
@@ -788,24 +785,16 @@ STDMETHODIMP nsDataObj::SetAsyncMode(BOO
   return S_OK;
 }
 
 STDMETHODIMP nsDataObj::StartOperation(IBindCtx* pbcReserved) {
   mIsInOperation = TRUE;
   return S_OK;
 }
 
-//-----------------------------------------------------
-// GetData and SetData helper functions
-//-----------------------------------------------------
-HRESULT nsDataObj::AddSetFormat(FORMATETC& aFE) { return S_OK; }
-
-//-----------------------------------------------------
-HRESULT nsDataObj::AddGetFormat(FORMATETC& aFE) { return S_OK; }
-
 //
 // GetDIB
 //
 // Someone is asking for a bitmap. The data in the transferable will be a
 // straight imgIContainer, so just QI it.
 //
 HRESULT
 nsDataObj::GetDib(const nsACString& inFlavor, FORMATETC& aFormat,
@@ -1644,35 +1633,16 @@ HRESULT nsDataObj::DropTempFile(FORMATET
   GlobalUnlock(hGlobalMemory);
 
   aSTG.hGlobal = hGlobalMemory;
 
   return S_OK;
 }
 
 //-----------------------------------------------------
-HRESULT nsDataObj::GetMetafilePict(FORMATETC&, STGMEDIUM&) { return E_NOTIMPL; }
-
-//-----------------------------------------------------
-HRESULT nsDataObj::SetBitmap(FORMATETC&, STGMEDIUM&) { return E_NOTIMPL; }
-
-//-----------------------------------------------------
-HRESULT nsDataObj::SetDib(FORMATETC&, STGMEDIUM&) { return E_FAIL; }
-
-//-----------------------------------------------------
-HRESULT nsDataObj::SetText(FORMATETC& aFE, STGMEDIUM& aSTG) { return E_FAIL; }
-
-//-----------------------------------------------------
-HRESULT nsDataObj::SetMetafilePict(FORMATETC&, STGMEDIUM&) { return E_FAIL; }
-
-//-----------------------------------------------------
-//-----------------------------------------------------
-CLSID nsDataObj::GetClassID() const { return CLSID_nsDataObj; }
-
-//-----------------------------------------------------
 // Registers the DataFlavor/FE pair.
 //-----------------------------------------------------
 void nsDataObj::AddDataFlavor(const char* aDataFlavor, LPFORMATETC aFE) {
   // These two lists are the mapping to and from data flavors and FEs.
   // Later, OLE will tell us it needs a certain type of FORMATETC (text,
   // unicode, etc) unicode, etc), so we will look up the data flavor that
   // corresponds to the FE and then ask the transferable for that type of data.
   mDataFlavors.AppendElement(aDataFlavor);
--- a/widget/windows/nsDataObj.h
+++ b/widget/windows/nsDataObj.h
@@ -16,276 +16,213 @@
 #include "nsIInputStream.h"
 #include "nsIStreamListener.h"
 #include "nsIChannel.h"
 #include "nsCOMArray.h"
 #include "nsITimer.h"
 
 class nsIThread;
 class nsIPrincipal;
-
-// The SDK shipping with VC11 has renamed IAsyncOperation to
-// IDataObjectAsyncCapability.  We try to detect this, and rename this in our
-// code too to make sure that we pick the correct name when building.
-#ifdef __IDataObjectAsyncCapability_INTERFACE_DEFINED__
-#  define IAsyncOperation IDataObjectAsyncCapability
-#  define IID_IAsyncOperation IID_IDataObjectAsyncCapability
-#else
-// XXX for older version of PSDK where IAsyncOperation and related stuff is not
-// available but thisdefine  should be removed when parocles config is updated
-#  ifndef __IAsyncOperation_INTERFACE_DEFINED__
-// IAsyncOperation interface definition
-EXTERN_C const IID IID_IAsyncOperation;
-
-MIDL_INTERFACE("3D8B0590-F691-11d2-8EA9-006097DF5BD4")
-IAsyncOperation : public IUnknown {
-  virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(BOOL fDoOpAsync) = 0;
-  virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(BOOL * pfIsOpAsync) = 0;
-  virtual HRESULT STDMETHODCALLTYPE StartOperation(IBindCtx * pbcReserved) = 0;
-  virtual HRESULT STDMETHODCALLTYPE InOperation(BOOL * pfInAsyncOp) = 0;
-  virtual HRESULT STDMETHODCALLTYPE EndOperation(
-      HRESULT hResult, IBindCtx * pbcReserved, DWORD dwEffects) = 0;
-};
-// this is not defined in the old headers for some reason
-#    ifndef FD_PROGRESSUI
-#      define FD_PROGRESSUI 0x4000
-#    endif
-
-#  endif  // __IAsyncOperation_INTERFACE_DEFINED__
-#endif    // __IDataObjectAsyncCapability_INTERFACE_DEFINED__
-
-/*
- * CFSTR_SHELLURL is deprecated and doesn't have a Unicode version.
- * Therefore we are using CFSTR_INETURL instead of CFSTR_SHELLURL.
- * See
- * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_programming/transferring/clipboard.asp
- */
-#ifndef CFSTR_INETURLA
-#  define CFSTR_INETURLA L"UniformResourceLocator"
-#endif
-#ifndef CFSTR_INETURLW
-#  define CFSTR_INETURLW L"UniformResourceLocatorW"
-#endif
-
-// For support of MinGW w32api v2.4.
-// When the next version of w32api is released with shlobj.h rev 1.35
-// http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/winsup/w32api/include/shlobj.h?cvsroot=src
-// then that can be made the base required version and this code should be
-// removed.
-#ifndef CFSTR_FILEDESCRIPTORA
-#  define CFSTR_FILEDESCRIPTORA L"FileGroupDescriptor"
-#endif
-#ifndef CFSTR_FILEDESCRIPTORW
-#  define CFSTR_FILEDESCRIPTORW L"FileGroupDescriptorW"
-#endif
-
 class CEnumFormatEtc;
 class nsITransferable;
 
 /*
  * This ole registered class is used to facilitate drag-drop of objects which
  * can be adapted by an object derived from CfDragDrop. The CfDragDrop is
  * associated with instances via SetDragDrop().
  */
-class nsDataObj : public IDataObject, public IAsyncOperation {
- protected:
+class nsDataObj : public IDataObject, public IDataObjectAsyncCapability {
   nsCOMPtr<nsIThread> mIOThread;
 
  public:  // construction, destruction
   explicit nsDataObj(nsIURI* uri = nullptr);
+
+ protected:
   virtual ~nsDataObj();
 
  public:  // IUnknown methods - see iunknown.h for documentation
-  STDMETHODIMP_(ULONG) AddRef();
-  STDMETHODIMP QueryInterface(REFIID, void**);
-  STDMETHODIMP_(ULONG) Release();
+  STDMETHODIMP_(ULONG) AddRef() override;
+  STDMETHODIMP QueryInterface(REFIID, void**) override;
+  STDMETHODIMP_(ULONG) Release() override;
 
   // support for clipboard
   virtual void AddDataFlavor(const char* aDataFlavor, LPFORMATETC aFE);
   void SetTransferable(nsITransferable* aTransferable);
 
-  // Return the registered OLE class ID of this object's CfDataObj.
-  CLSID GetClassID() const;
-
  public:  // IDataObject methods - these are general comments. see CfDragDrop
           // for overriding behavior
   // Store data in pSTM according to the format specified by pFE, if the
   // format is supported (supported formats are specified in CfDragDrop::
   // GetFormats) and return NOERROR; otherwise return DATA_E_FORMATETC. It
   // is the callers responsibility to free pSTM if NOERROR is returned.
-  STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM) override;
 
   // Similar to GetData except that the caller allocates the structure
   // referenced by pSTM.
-  STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM) override;
 
   // Returns S_TRUE if this object supports the format specified by pSTM,
   // S_FALSE otherwise.
-  STDMETHODIMP QueryGetData(LPFORMATETC pFE);
+  STDMETHODIMP QueryGetData(LPFORMATETC pFE) override;
 
   // Set pCanonFE to the canonical format of pFE if one exists and return
   // NOERROR, otherwise return DATA_S_SAMEFORMATETC. A canonical format
   // implies an identical rendering.
-  STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFE, LPFORMATETC pCanonFE);
+  STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFE,
+                                     LPFORMATETC pCanonFE) final;
 
   // Set this objects data according to the format specified by pFE and
   // the storage medium specified by pSTM and return NOERROR, if the format
   // is supported. If release is TRUE this object must release the storage
   // associated with pSTM.
-  STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL release);
+  STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM,
+                       BOOL release) override;
 
   // Set ppEnum to an IEnumFORMATETC object which will iterate all of the
   // data formats that this object supports. direction is either DATADIR_GET
   // or DATADIR_SET.
-  STDMETHODIMP EnumFormatEtc(DWORD direction, LPENUMFORMATETC* ppEnum);
+  STDMETHODIMP EnumFormatEtc(DWORD direction, LPENUMFORMATETC* ppEnum) final;
 
   // Set up an advisory connection to this object based on the format specified
   // by pFE, flags, and the pAdvise. Set pConn to the established advise
   // connection.
   STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD flags, LPADVISESINK pAdvise,
-                       DWORD* pConn);
+                       DWORD* pConn) final;
 
   // Turn off advising of a previous call to DAdvise which set pConn.
-  STDMETHODIMP DUnadvise(DWORD pConn);
+  STDMETHODIMP DUnadvise(DWORD pConn) final;
 
   // Set ppEnum to an IEnumSTATDATA object which will iterate over the
   // existing objects which have established advisory connections to this
   // object.
-  STDMETHODIMP EnumDAdvise(LPENUMSTATDATA* ppEnum);
+  STDMETHODIMP EnumDAdvise(LPENUMSTATDATA* ppEnum) final;
 
-  // IAsyncOperation methods
-  STDMETHOD(EndOperation)
-  (HRESULT hResult, IBindCtx* pbcReserved, DWORD dwEffects);
-  STDMETHOD(GetAsyncMode)(BOOL* pfIsOpAsync);
-  STDMETHOD(InOperation)(BOOL* pfInAsyncOp);
-  STDMETHOD(SetAsyncMode)(BOOL fDoOpAsync);
-  STDMETHOD(StartOperation)(IBindCtx* pbcReserved);
+  // IDataObjectAsyncCapability methods
+  STDMETHODIMP EndOperation(HRESULT hResult, IBindCtx* pbcReserved,
+                            DWORD dwEffects) final;
+  STDMETHODIMP GetAsyncMode(BOOL* pfIsOpAsync) final;
+  STDMETHODIMP InOperation(BOOL* pfInAsyncOp) final;
+  STDMETHODIMP SetAsyncMode(BOOL fDoOpAsync) final;
+  STDMETHODIMP StartOperation(IBindCtx* pbcReserved) final;
 
- public:  // other methods
+ private:  // other methods
   // Gets the filename from the kFilePromiseURLMime flavour
   HRESULT GetDownloadDetails(nsIURI** aSourceURI, nsAString& aFilename);
 
- protected:
   // help determine the kind of drag
   bool IsFlavourPresent(const char* inFlavour);
 
-  virtual HRESULT AddSetFormat(FORMATETC& FE);
-  virtual HRESULT AddGetFormat(FORMATETC& FE);
+ protected:
+  HRESULT GetFile(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetText(const nsACString& aDF, FORMATETC& aFE, STGMEDIUM& aSTG);
 
-  virtual HRESULT GetFile(FORMATETC& aFE, STGMEDIUM& aSTG);
-  virtual HRESULT GetText(const nsACString& aDF, FORMATETC& aFE,
-                          STGMEDIUM& aSTG);
-  virtual HRESULT GetDib(const nsACString& inFlavor, FORMATETC&,
-                         STGMEDIUM& aSTG);
-  virtual HRESULT GetMetafilePict(FORMATETC& FE, STGMEDIUM& STM);
+ private:
+  HRESULT GetDib(const nsACString& inFlavor, FORMATETC&, STGMEDIUM& aSTG);
 
-  virtual HRESULT DropImage(FORMATETC& aFE, STGMEDIUM& aSTG);
-  virtual HRESULT DropFile(FORMATETC& aFE, STGMEDIUM& aSTG);
-  virtual HRESULT DropTempFile(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT DropImage(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT DropFile(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT DropTempFile(FORMATETC& aFE, STGMEDIUM& aSTG);
 
-  virtual HRESULT GetUniformResourceLocator(FORMATETC& aFE, STGMEDIUM& aSTG,
-                                            bool aIsUnicode);
-  virtual HRESULT ExtractUniformResourceLocatorA(FORMATETC& aFE,
-                                                 STGMEDIUM& aSTG);
-  virtual HRESULT ExtractUniformResourceLocatorW(FORMATETC& aFE,
-                                                 STGMEDIUM& aSTG);
-  virtual HRESULT GetFileDescriptor(FORMATETC& aFE, STGMEDIUM& aSTG,
+  HRESULT GetUniformResourceLocator(FORMATETC& aFE, STGMEDIUM& aSTG,
                                     bool aIsUnicode);
-  virtual HRESULT GetFileContents(FORMATETC& aFE, STGMEDIUM& aSTG);
-  virtual HRESULT GetPreferredDropEffect(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT ExtractUniformResourceLocatorA(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT ExtractUniformResourceLocatorW(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetFileDescriptor(FORMATETC& aFE, STGMEDIUM& aSTG, bool aIsUnicode);
 
-  virtual HRESULT SetBitmap(FORMATETC& FE, STGMEDIUM& STM);
-  virtual HRESULT SetDib(FORMATETC& FE, STGMEDIUM& STM);
-  virtual HRESULT SetText(FORMATETC& FE, STGMEDIUM& STM);
-  virtual HRESULT SetMetafilePict(FORMATETC& FE, STGMEDIUM& STM);
+ protected:
+  HRESULT GetFileContents(FORMATETC& aFE, STGMEDIUM& aSTG);
+
+ private:
+  HRESULT GetPreferredDropEffect(FORMATETC& aFE, STGMEDIUM& aSTG);
 
   // Provide the structures needed for an internet shortcut by the shell
-  virtual HRESULT GetFileDescriptorInternetShortcutA(FORMATETC& aFE,
-                                                     STGMEDIUM& aSTG);
-  virtual HRESULT GetFileDescriptorInternetShortcutW(FORMATETC& aFE,
-                                                     STGMEDIUM& aSTG);
-  virtual HRESULT GetFileContentsInternetShortcut(FORMATETC& aFE,
-                                                  STGMEDIUM& aSTG);
+  HRESULT GetFileDescriptorInternetShortcutA(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetFileDescriptorInternetShortcutW(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetFileContentsInternetShortcut(FORMATETC& aFE, STGMEDIUM& aSTG);
 
   // IStream implementation
-  virtual HRESULT GetFileDescriptor_IStreamA(FORMATETC& aFE, STGMEDIUM& aSTG);
-  virtual HRESULT GetFileDescriptor_IStreamW(FORMATETC& aFE, STGMEDIUM& aSTG);
-  virtual HRESULT GetFileContents_IStream(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetFileDescriptor_IStreamA(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetFileDescriptor_IStreamW(FORMATETC& aFE, STGMEDIUM& aSTG);
+  HRESULT GetFileContents_IStream(FORMATETC& aFE, STGMEDIUM& aSTG);
 
   nsresult ExtractShortcutURL(nsString& outURL);
   nsresult ExtractShortcutTitle(nsString& outTitle);
 
   // munge our HTML data to win32's CF_HTML spec. Will null terminate
   nsresult BuildPlatformHTML(const char* inOurHTML, char** outPlatformHTML);
 
   // Used for the SourceURL part of CF_HTML
   nsCString mSourceURL;
 
+ protected:
   BOOL FormatsMatch(const FORMATETC& source, const FORMATETC& target) const;
 
   ULONG m_cRef;  // the reference count
 
+ private:
   nsTArray<nsCString> mDataFlavors;
 
   nsITransferable* mTransferable;  // nsDataObj owns and ref counts
                                    // nsITransferable, the nsITransferable does
                                    // know anything about the nsDataObj
 
+ protected:
   CEnumFormatEtc* m_enumFE;  // Ownership Rules:
                              // nsDataObj owns and ref counts CEnumFormatEtc,
 
+ private:
   nsCOMPtr<nsIFile> mCachedTempFile;
 
   BOOL mIsAsyncMode;
   BOOL mIsInOperation;
   ///////////////////////////////////////////////////////////////////////////////
   // CStream class implementation
   // this class is used in Drag and drop with download sample
   // called from IDataObject::GetData
-  class CStream : public IStream, public nsIStreamListener {
+  class CStream final : public IStream, public nsIStreamListener {
     nsCOMPtr<nsIChannel> mChannel;
     FallibleTArray<uint8_t> mChannelData;
     bool mChannelRead;
     nsresult mChannelResult;
     uint32_t mStreamRead;
 
-   protected:
     virtual ~CStream();
     nsresult WaitForCompletion();
 
    public:
     CStream();
     nsresult Init(nsIURI* pSourceURI, uint32_t aContentPolicyType,
                   nsIPrincipal* aRequestingPrincipal);
 
     NS_DECL_ISUPPORTS
     NS_DECL_NSIREQUESTOBSERVER
     NS_DECL_NSISTREAMLISTENER
 
     // IUnknown
-    STDMETHOD(QueryInterface)(REFIID refiid, void** ppvResult);
+    STDMETHOD(QueryInterface)(REFIID refiid, void** ppvResult) override;
 
     // IStream
-    STDMETHOD(Clone)(IStream** ppStream);
-    STDMETHOD(Commit)(DWORD dwFrags);
-    STDMETHOD(CopyTo)
-    (IStream* pDestStream, ULARGE_INTEGER nBytesToCopy,
-     ULARGE_INTEGER* nBytesRead, ULARGE_INTEGER* nBytesWritten);
-    STDMETHOD(LockRegion)
-    (ULARGE_INTEGER nStart, ULARGE_INTEGER nBytes, DWORD dwFlags);
-    STDMETHOD(Read)(void* pvBuffer, ULONG nBytesToRead, ULONG* nBytesRead);
-    STDMETHOD(Revert)(void);
-    STDMETHOD(Seek)
-    (LARGE_INTEGER nMove, DWORD dwOrigin, ULARGE_INTEGER* nNewPos);
-    STDMETHOD(SetSize)(ULARGE_INTEGER nNewSize);
-    STDMETHOD(Stat)(STATSTG* statstg, DWORD dwFlags);
-    STDMETHOD(UnlockRegion)
-    (ULARGE_INTEGER nStart, ULARGE_INTEGER nBytes, DWORD dwFlags);
-    STDMETHOD(Write)
-    (const void* pvBuffer, ULONG nBytesToRead, ULONG* nBytesRead);
+    STDMETHODIMP Clone(IStream** ppStream) final;
+    STDMETHODIMP Commit(DWORD dwFrags) final;
+    STDMETHODIMP CopyTo(IStream* pDestStream, ULARGE_INTEGER nBytesToCopy,
+                        ULARGE_INTEGER* nBytesRead,
+                        ULARGE_INTEGER* nBytesWritten) final;
+    STDMETHODIMP LockRegion(ULARGE_INTEGER nStart, ULARGE_INTEGER nBytes,
+                            DWORD dwFlags) final;
+    STDMETHODIMP Read(void* pvBuffer, ULONG nBytesToRead,
+                      ULONG* nBytesRead) final;
+    STDMETHODIMP Revert(void) final;
+    STDMETHODIMP Seek(LARGE_INTEGER nMove, DWORD dwOrigin,
+                      ULARGE_INTEGER* nNewPos) final;
+    STDMETHODIMP SetSize(ULARGE_INTEGER nNewSize) final;
+    STDMETHODIMP Stat(STATSTG* statstg, DWORD dwFlags) final;
+    STDMETHODIMP UnlockRegion(ULARGE_INTEGER nStart, ULARGE_INTEGER nBytes,
+                              DWORD dwFlags) final;
+    STDMETHODIMP Write(const void* pvBuffer, ULONG nBytesToRead,
+                       ULONG* nBytesRead) final;
   };
 
   HRESULT CreateStream(IStream** outStream);
 
  private:
   // Drag and drop helper data for implementing drag and drop image support
   typedef struct {
     FORMATETC fe;
--- a/widget/windows/nsDataObjCollection.cpp
+++ b/widget/windows/nsDataObjCollection.cpp
@@ -17,17 +17,17 @@ const IID IID_IDataObjCollection = {
     0x1fac,
     0x47b9,
     {0xbf, 0x43, 0xca, 0xea, 0x89, 0xb7, 0x95, 0x33}};
 
 /*
  * Class nsDataObjCollection
  */
 
-nsDataObjCollection::nsDataObjCollection() : m_cRef(0) {}
+nsDataObjCollection::nsDataObjCollection() {}
 
 nsDataObjCollection::~nsDataObjCollection() { mDataObjects.Clear(); }
 
 // IUnknown interface methods - see iunknown.h for documentation
 STDMETHODIMP nsDataObjCollection::QueryInterface(REFIID riid, void** ppv) {
   *ppv = nullptr;
 
   if ((IID_IUnknown == riid) || (IID_IDataObject == riid)) {
@@ -37,18 +37,18 @@ STDMETHODIMP nsDataObjCollection::QueryI
   }
 
   if (IID_IDataObjCollection == riid) {
     *ppv = static_cast<nsIDataObjCollection*>(this);
     AddRef();
     return NOERROR;
   }
   // offer to operate asynchronously (required by nsDragService)
-  if (IID_IAsyncOperation == riid) {
-    *ppv = static_cast<IAsyncOperation*>(this);
+  if (IID_IDataObjectAsyncCapability == riid) {
+    *ppv = static_cast<IDataObjectAsyncCapability*>(this);
     AddRef();
     return NOERROR;
   }
 
   return E_NOINTERFACE;
 }
 
 STDMETHODIMP_(ULONG) nsDataObjCollection::AddRef() { return ++m_cRef; }
--- a/widget/windows/nsDataObjCollection.h
+++ b/widget/windows/nsDataObjCollection.h
@@ -29,67 +29,64 @@ class nsIDataObjCollection : public IUnk
  * can be adapted by an object derived from CfDragDrop. The CfDragDrop is
  * associated with instances via SetDragDrop().
  */
 
 class nsDataObjCollection final : public nsIDataObjCollection,
                                   public nsDataObj {
  public:
   nsDataObjCollection();
-  ~nsDataObjCollection();
+
+ private:
+  ~nsDataObjCollection() final;
 
  public:  // IUnknown methods - see iunknown.h for documentation
-  STDMETHODIMP_(ULONG) AddRef();
-  STDMETHODIMP QueryInterface(REFIID, void**);
-  STDMETHODIMP_(ULONG) Release();
+  STDMETHODIMP_(ULONG) AddRef() final;
+  STDMETHODIMP QueryInterface(REFIID, void**) final;
+  STDMETHODIMP_(ULONG) Release() final;
 
- public:  // DataGet and DataSet helper methods
-  virtual HRESULT GetFile(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
-  virtual HRESULT GetText(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
-  virtual HRESULT GetFileDescriptors(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
-  virtual HRESULT GetFileContents(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
-  virtual HRESULT GetFirstSupporting(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+ private:  // DataGet and DataSet helper methods
+  HRESULT GetFile(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  HRESULT GetText(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  HRESULT GetFileDescriptors(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  HRESULT GetFileContents(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  HRESULT GetFirstSupporting(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
 
   using nsDataObj::GetFile;
   using nsDataObj::GetFileContents;
   using nsDataObj::GetText;
 
   // support for clipboard
-  void AddDataFlavor(const char* aDataFlavor, LPFORMATETC aFE);
+  void AddDataFlavor(const char* aDataFlavor, LPFORMATETC aFE) final;
 
-  // from nsPIDataObjCollection
+ public:  // from nsPIDataObjCollection
   void AddDataObject(IDataObject* aDataObj);
   int32_t GetNumDataObjects() { return mDataObjects.Length(); }
   nsDataObj* GetDataObjectAt(uint32_t aItem) {
     return mDataObjects.SafeElementAt(aItem, RefPtr<nsDataObj>());
   }
 
-  // Return the registered OLE class ID of this object's CfDataObj.
-  CLSID GetClassID() const;
-
  public:
   // Store data in pSTM according to the format specified by pFE, if the
   // format is supported (supported formats are specified in CfDragDrop::
   // GetFormats) and return NOERROR; otherwise return DATA_E_FORMATETC. It
   // is the callers responsibility to free pSTM if NOERROR is returned.
-  STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  STDMETHODIMP GetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM) final;
 
   // Similar to GetData except that the caller allocates the structure
   // referenced by pSTM.
-  STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
+  STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM) final;
 
   // Returns S_TRUE if this object supports the format specified by pSTM,
   // S_FALSE otherwise.
-  STDMETHODIMP QueryGetData(LPFORMATETC pFE);
+  STDMETHODIMP QueryGetData(LPFORMATETC pFE) final;
 
   // Set this objects data according to the format specified by pFE and
   // the storage medium specified by pSTM and return NOERROR, if the format
   // is supported. If release is TRUE this object must release the storage
   // associated with pSTM.
-  STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL release);
+  STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL release) final;
 
- protected:
-  ULONG m_cRef;  // the reference count
-
+ private:
   nsTArray<RefPtr<nsDataObj> > mDataObjects;
 };
 
 #endif  //
--- a/widget/windows/nsDragService.cpp
+++ b/widget/windows/nsDragService.cpp
@@ -276,19 +276,19 @@ nsDragService::StartInvokingDragSession(
   // the drag
   mDragAction = aActionType;
   mSentLocalDropEvent = false;
 
   // Start dragging
   StartDragSession();
   OpenDragPopup();
 
-  RefPtr<IAsyncOperation> pAsyncOp;
+  RefPtr<IDataObjectAsyncCapability> pAsyncOp;
   // Offer to do an async drag
-  if (SUCCEEDED(aDataObj->QueryInterface(IID_IAsyncOperation,
+  if (SUCCEEDED(aDataObj->QueryInterface(IID_IDataObjectAsyncCapability,
                                          getter_AddRefs(pAsyncOp)))) {
     pAsyncOp->SetAsyncMode(VARIANT_TRUE);
   } else {
     MOZ_ASSERT_UNREACHABLE("When did our data object stop being async");
   }
 
   // Call the native D&D method
   HRESULT res = ::DoDragDrop(aDataObj, nativeDragSrc, effects, &winDropRes);