summaryrefslogtreecommitdiffstats
path: root/widget/windows/nsWindowDbg.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/windows/nsWindowDbg.h')
-rw-r--r--widget/windows/nsWindowDbg.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/widget/windows/nsWindowDbg.h b/widget/windows/nsWindowDbg.h
new file mode 100644
index 0000000000..c739966fd5
--- /dev/null
+++ b/widget/windows/nsWindowDbg.h
@@ -0,0 +1,153 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 WindowDbg_h__
+#define WindowDbg_h__
+
+/*
+ * nsWindowDbg - Debug related utilities for nsWindow.
+ */
+
+#include "nsWindowDefs.h"
+#include "mozilla/BaseProfilerMarkersPrerequisites.h"
+
+// Enables debug output for popup rollup hooks
+// #define POPUP_ROLLUP_DEBUG_OUTPUT
+
+// Enable window size and state debug output
+// #define WINSTATE_DEBUG_OUTPUT
+
+// nsIWidget defines a set of debug output statements
+// that are called in various places within the code.
+// #define WIDGET_DEBUG_OUTPUT
+
+// Enable IS_VK_DOWN debug output
+// #define DEBUG_VK
+
+namespace mozilla::widget {
+
+class MOZ_RAII AutoProfilerMessageMarker {
+ public:
+ explicit AutoProfilerMessageMarker(Span<const char> aMsgLoopName, HWND hWnd,
+ UINT msg, WPARAM wParam, LPARAM lParam);
+
+ ~AutoProfilerMessageMarker();
+
+ protected:
+ Maybe<MarkerOptions> mOptions;
+ Span<const char> mMsgLoopName;
+ UINT mMsg;
+ WPARAM mWParam;
+ LPARAM mLParam;
+};
+
+// Windows message debugging data
+struct EventMsgInfo {
+ const char* mStr;
+ UINT mId;
+ std::function<nsAutoCString(WPARAM, LPARAM, bool)> mParamInfoFn;
+ std::function<void(nsCString&, WPARAM, const char*, bool)> mWParamInfoFn;
+ const char* mWParamName;
+ std::function<void(nsCString&, LPARAM, const char*, bool)> mLParamInfoFn;
+ const char* mLParamName;
+ void LogParameters(nsCString& str, WPARAM wParam, LPARAM lParam,
+ bool isPreCall);
+};
+extern std::unordered_map<UINT, EventMsgInfo> gAllEvents;
+
+// RAII-style class to log before and after an event is handled.
+class NativeEventLogger final {
+ public:
+ template <size_t N>
+ NativeEventLogger(const char (&aMsgLoopName)[N], HWND hwnd, UINT msg,
+ WPARAM wParam, LPARAM lParam)
+ : NativeEventLogger(Span(aMsgLoopName), hwnd, msg, wParam, lParam) {}
+
+ void SetResult(LRESULT lresult, bool result) {
+ mRetValue = lresult;
+ mResult = mozilla::Some(result);
+ }
+ ~NativeEventLogger();
+
+ private:
+ NativeEventLogger(Span<const char> aMsgLoopName, HWND hwnd, UINT msg,
+ WPARAM wParam, LPARAM lParam);
+ bool NativeEventLoggerInternal();
+
+ AutoProfilerMessageMarker mProfilerMarker;
+ const char* mMsgLoopName;
+ const HWND mHwnd;
+ const UINT mMsg;
+ const WPARAM mWParam;
+ const LPARAM mLParam;
+ mozilla::Maybe<long> mEventCounter;
+ // not const because these will be set after the event is handled
+ mozilla::Maybe<bool> mResult;
+ LRESULT mRetValue = 0;
+
+ bool mShouldLogPostCall;
+};
+
+struct EnumValueAndName {
+ uint64_t mFlag;
+ const char* mName;
+};
+
+// Appends to str a description of the flags passed in.
+// flagsAndNames is a list of flag values with a string description
+// for each one. These are processed in order, so if there are
+// flag values that are combination of individual values (for example
+// something like WS_OVERLAPPEDWINDOW) they need to come first
+// in the flagsAndNames array.
+// A 0 flag value will only be written if the flags input is exactly
+// 0, and it must come last in the flagsAndNames array.
+// Returns whether any info was appended to str.
+bool AppendFlagsInfo(nsCString& str, uint64_t flags,
+ const nsTArray<EnumValueAndName>& flagsAndNames,
+ const char* name);
+
+nsAutoCString WmSizeParamInfo(uint64_t wParam, uint64_t lParam, bool isPreCall);
+void XLowWordYHighWordParamInfo(nsCString& str, uint64_t value,
+ const char* name, bool isPreCall);
+void WindowPosParamInfo(nsCString& str, uint64_t value, const char* name,
+ bool isPreCall);
+void WindowEdgeParamInfo(nsCString& str, uint64_t value, const char* name,
+ bool isPreCall);
+void RectParamInfo(nsCString& str, uint64_t value, const char* name,
+ bool isPreCall);
+void UiActionParamInfo(nsCString& str, uint64_t value, const char* name,
+ bool isPreCall);
+void WideStringParamInfo(nsCString& result, uint64_t value, const char* name,
+ bool isPreCall);
+void MinMaxInfoParamInfo(nsCString& result, uint64_t value, const char* name,
+ bool isPreCall);
+nsAutoCString WmNcCalcSizeParamInfo(uint64_t wParam, uint64_t lParam,
+ bool isPreCall);
+} // namespace mozilla::widget
+
+#if defined(POPUP_ROLLUP_DEBUG_OUTPUT)
+typedef struct {
+ char* mStr;
+ int mId;
+} MSGFEventMsgInfo;
+
+# define DISPLAY_NMM_PRT(_arg) \
+ MOZ_LOG(gWindowsLog, mozilla::LogLevel::Info, ((_arg)));
+#else
+# define DISPLAY_NMM_PRT(_arg)
+#endif // defined(POPUP_ROLLUP_DEBUG_OUTPUT)
+
+#if defined(DEBUG)
+void DDError(const char* msg, HRESULT hr);
+#endif // defined(DEBUG)
+
+#if defined(DEBUG_VK)
+bool is_vk_down(int vk);
+# define IS_VK_DOWN is_vk_down
+#else
+# define IS_VK_DOWN(a) (GetKeyState(a) < 0)
+#endif // defined(DEBUG_VK)
+
+#endif /* WindowDbg_h__ */