tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 433cc8224790300fdabe76bd225b644c1812da34
parent 72c331806e9eb09df4f757bd32410681306a75ea
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Thu, 27 Nov 2025 15:28:12 +0000

Bug 1993474 - Ensure our WNDPROC has precedence over WinAppSDK's. r=gstoll,win-reviewers

See the comment for reasoning. WM_NCCALCSIZE wasn't getting called, and
we rely on that to get the right client area on things like maximized
windows.

Differential Revision: https://phabricator.services.mozilla.com/D274281

Diffstat:
Mwidget/windows/nsWindow.cpp | 32++++++++++++++++++++++----------
Mwidget/windows/nsWindow.h | 2++
2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp @@ -1081,7 +1081,7 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, mBounds = mLastPaintBounds = GetBounds(); // Reset the WNDPROC for this window and its whole class, as we had - // to use our own WNDPROC when creating the the skeleton UI window. + // to use our own WNDPROC when creating the skeleton UI window. ::SetWindowLongPtrW(mWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>( WinUtils::NonClientDpiScalingDefWindowProcW)); @@ -1520,12 +1520,31 @@ DWORD nsWindow::WindowExStyle() { * **************************************************************/ +bool nsWindow::ShouldAssociateWithWinAppSDK() const { + // We currently don't need any SDK functionality for for PiP windows, + // and using the SDK on these windows causes them to go under the + // taskbar (bug 1995838). + // + // TODO(emilio): That might not be true anymore after bug 1993474, + // consider re-testing and removing that special-case. + return IsTopLevelWidget() && !mIsPIPWindow; +} + bool nsWindow::AssociateWithNativeWindow() { if (!mWnd || !IsWindow(mWnd)) { NS_ERROR("Invalid window handle"); return false; } + if (ShouldAssociateWithWinAppSDK()) { + // Make sure to call this here to associate our window with the + // Windows App SDK _before_ setting our WNDPROC, if needed. + // This is important because the SDKs WNDPROC might handle messages like + // WM_NCCALCSIZE without calling into us, and that can cause sizing issues, + // see bug 1993474. + WindowsUIUtils::SetIsTitlebarCollapsed(mWnd, mCustomNonClient); + } + // Connect the this pointer to the native window handle. // This should be done before SetWindowLongPtrW, because nsWindow::WindowProc // uses WinUtils::GetNSWindowPtr internally. @@ -1552,12 +1571,7 @@ void nsWindow::DissociateFromNativeWindow() { DebugOnly<WNDPROC> wndProcBeforeDissociate = reinterpret_cast<WNDPROC>(::SetWindowLongPtrW( mWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(*mPrevWndProc))); - // If we've used the Windows App SDK to remove the minimize/maximize/close - // entries from the titlebar, then the Windows App SDK sets its own WNDPROC - // own the window, so this assertion would fail. But we only do this if - // Mica is available. - NS_ASSERTION(WinUtils::MicaAvailable() || - wndProcBeforeDissociate == nsWindow::WindowProc, + NS_ASSERTION(wndProcBeforeDissociate == nsWindow::WindowProc, "Unstacked an unexpected native window procedure"); WinUtils::SetNSWindowPtr(mWnd, nullptr); @@ -2835,9 +2849,7 @@ void nsWindow::SetCustomTitlebar(bool aCustomTitlebar) { mCustomNonClientMetrics = {}; ResetLayout(); } - // Not needed for PiP windows, and using the Windows App SDK on - // these windows causes them to go under the taskbar (bug 1995838) - if (!mPIPWindow) { + if (ShouldAssociateWithWinAppSDK()) { WindowsUIUtils::SetIsTitlebarCollapsed(mWnd, mCustomNonClient); } } diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h @@ -335,6 +335,8 @@ class nsWindow final : public nsIWidget { bool IsRTL() const { return mIsRTL; } + bool ShouldAssociateWithWinAppSDK() const; + /** * AssociateDefaultIMC() associates or disassociates the default IMC for * the window.