From c3810f34078206571206b375171e95280f55e5fb Mon Sep 17 00:00:00 2001 From: Mirko Brodesser Date: Thu, 9 Sep 2021 07:47:33 +0000 Subject: [PATCH] Bug 1728955: part 6) Log result of Windows' `OleSetClipboardResult`. r=masayuki Helps to understand when something goes wrong. Differential Revision: https://phabricator.services.mozilla.com/D124899 --- widget/windows/nsClipboard.cpp | 44 +++++++++++++++++++++++++++++++++++++++--- widget/windows/nsClipboard.h | 8 ++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/widget/windows/nsClipboard.cpp b/widget/windows/nsClipboard.cpp index 3e5f6578794a..747be906ad9f 100644 --- a/widget/windows/nsClipboard.cpp +++ b/widget/windows/nsClipboard.cpp @@ -252,6 +252,44 @@ nsresult nsClipboard::SetupNativeDataObject(nsITransferable* aTransferable, return NS_OK; } +// static +void nsClipboard::OleSetClipboardResultToString(HRESULT aHres, + nsACString& aResult) { + switch (aHres) { + case S_OK: + aResult = "S_OK"; + break; + case CLIPBRD_E_CANT_OPEN: + aResult = "CLIPBRD_E_CANT_OPEN"; + break; + case CLIPBRD_E_CANT_EMPTY: + aResult = "CLIPBRD_E_CANT_EMPTY"; + break; + case CLIPBRD_E_CANT_CLOSE: + aResult = "CLIPBRD_E_CANT_CLOSE"; + break; + case CLIPBRD_E_CANT_SET: + aResult = "CLIPBRD_E_CANT_SET"; + break; + default: + // Explicit template instantiaton, because otherwise the call is + // ambiguous. + constexpr int kRadix = 16; + aResult = IntToCString(aHres, kRadix); + break; + } +} + +// static +void nsClipboard::LogOleSetClipboardResult(const HRESULT aHres) { + if (MOZ_LOG_TEST(gWin32ClipboardLog, LogLevel::Debug)) { + nsAutoCString hresString; + OleSetClipboardResultToString(aHres, hresString); + MOZ_LOG(gWin32ClipboardLog, LogLevel::Debug, + ("OleSetClipboard result: %s", hresString.get())); + } +} + //------------------------------------------------------------------------- NS_IMETHODIMP nsClipboard::SetNativeClipboardData(int32_t aWhichClipboard) { MOZ_LOG(gWin32ClipboardLog, LogLevel::Debug, ("%s", __FUNCTION__)); @@ -270,11 +308,11 @@ NS_IMETHODIMP nsClipboard::SetNativeClipboardData(int32_t aWhichClipboard) { IDataObject* dataObj; if (NS_SUCCEEDED(CreateNativeDataObject(mTransferable, &dataObj, nullptr))) { // this add refs dataObj - ::OleSetClipboard(dataObj); + LogOleSetClipboardResult(::OleSetClipboard(dataObj)); dataObj->Release(); } else { // Clear the native clipboard - ::OleSetClipboard(nullptr); + LogOleSetClipboardResult(::OleSetClipboard(nullptr)); } mIgnoreEmptyNotification = false; @@ -1056,7 +1094,7 @@ nsClipboard::EmptyClipboard(int32_t aWhichClipboard) { // has the clipboard open. So to avoid this race condition for OpenClipboard // we do not empty the clipboard when we're setting it. if (aWhichClipboard == kGlobalClipboard && !mEmptyingForSetData) { - OleSetClipboard(nullptr); + LogOleSetClipboardResult(::OleSetClipboard(nullptr)); } return nsBaseClipboard::EmptyClipboard(aWhichClipboard); } diff --git a/widget/windows/nsClipboard.h b/widget/windows/nsClipboard.h index 781e8474710a..2b8a8e334e9d 100644 --- a/widget/windows/nsClipboard.h +++ b/widget/windows/nsClipboard.h @@ -65,6 +65,14 @@ class nsClipboard : public nsBaseClipboard, public nsIObserver { static UINT GetCustomClipboardFormat(); protected: + // See + // . + static void LogOleSetClipboardResult(HRESULT aHres); + + // See + // . + static void OleSetClipboardResultToString(HRESULT aHres, nsACString& aResult); + NS_IMETHOD SetNativeClipboardData(int32_t aWhichClipboard) override; NS_IMETHOD GetNativeClipboardData(nsITransferable* aTransferable, int32_t aWhichClipboard) override; -- 2.11.4.GIT