tor-browser

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

commit 5d95a0922d711aabc29e3b3e5ab9dd2d16d1f084
parent 0be364d59d63980db44f09c4ef33e8497bade8da
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Fri, 17 Oct 2025 07:52:19 +0000

Bug 1994893 - Avoid null InitData in widget init. r=mac-reviewers,geckoview-reviewers,bradwerth,m_kato

widget/cocoa was already dereferencing without checking. There were two
callers with null init data which were for headless / puppet widgets,
but this is clearer.

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

Diffstat:
Mdom/ipc/BrowserChild.cpp | 5++---
Mgfx/tests/gtest/MockWidget.h | 50+++++++++++++++++++++++++-------------------------
Mwidget/PuppetWidget.cpp | 16+++++++---------
Mwidget/PuppetWidget.h | 8++++----
Mwidget/android/nsWindow.cpp | 5++---
Mwidget/android/nsWindow.h | 5++---
Mwidget/cocoa/nsCocoaWindow.h | 4++--
Mwidget/cocoa/nsCocoaWindow.mm | 12++++++------
Mwidget/gtk/nsWindow.cpp | 18+++++++-----------
Mwidget/gtk/nsWindow.h | 2+-
Mwidget/headless/HeadlessWidget.cpp | 7++-----
Mwidget/headless/HeadlessWidget.h | 2+-
Mwidget/nsIWidget.cpp | 25++++++++++++-------------
Mwidget/nsIWidget.h | 8++++----
Mwidget/tests/gtest/MockWinWidget.h | 44++++++++++++++++++++++----------------------
Mwidget/uikit/nsWindow.h | 5++---
Mwidget/uikit/nsWindow.mm | 2+-
Mwidget/windows/nsWindow.cpp | 27++++++++++++---------------
Mwidget/windows/nsWindow.h | 5++---
Mxpfe/appshell/AppWindow.cpp | 2+-
Mxpfe/appshell/nsAppShellService.cpp | 4+---
21 files changed, 118 insertions(+), 138 deletions(-)

diff --git a/dom/ipc/BrowserChild.cpp b/dom/ipc/BrowserChild.cpp @@ -463,9 +463,8 @@ nsresult BrowserChild::Init(mozIDOMWindowProxy* aParent, NS_ERROR("couldn't create fake widget"); return NS_ERROR_FAILURE; } - mPuppetWidget->InfallibleCreate(nullptr, // No parent - LayoutDeviceIntRect(0, 0, 0, 0), - nullptr); // HandleWidgetEvent + mPuppetWidget->InfallibleCreate(nullptr, LayoutDeviceIntRect(), + widget::InitData()); mWebBrowser = nsWebBrowser::Create(this, mPuppetWidget, mBrowsingContext, aInitialWindowChild); diff --git a/gfx/tests/gtest/MockWidget.h b/gfx/tests/gtest/MockWidget.h @@ -26,10 +26,10 @@ class MockWidget : public nsIWidget { : mCompWidth(aWidth), mCompHeight(aHeight) {} NS_DECL_ISUPPORTS_INHERITED - virtual LayoutDeviceIntRect GetClientBounds() override { + LayoutDeviceIntRect GetClientBounds() override { return LayoutDeviceIntRect(0, 0, mCompWidth, mCompHeight); } - virtual LayoutDeviceIntRect GetBounds() override { return GetClientBounds(); } + LayoutDeviceIntRect GetBounds() override { return GetClientBounds(); } void* GetNativeData(uint32_t aDataType) override { if (aDataType == NS_NATIVE_OPENGL_CONTEXT) { @@ -47,40 +47,40 @@ class MockWidget : public nsIWidget { return nullptr; } - virtual nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - InitData* aInitData = nullptr) override { + nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect&, + const InitData&) override { return NS_OK; } - virtual nsresult Create(nsIWidget* aParent, const DesktopIntRect& aRect, - InitData* aInitData = nullptr) override { + nsresult Create(nsIWidget* aParent, const DesktopIntRect&, + const InitData&) override { return NS_OK; } - virtual void Show(bool aState) override {} - virtual bool IsVisible() const override { return true; } - virtual void Move(double aX, double aY) override {} - virtual void Resize(double aWidth, double aHeight, bool aRepaint) override {} - virtual void Resize(double aX, double aY, double aWidth, double aHeight, - bool aRepaint) override {} + void Show(bool aState) override {} + bool IsVisible() const override { return true; } + void Move(double aX, double aY) override {} + void Resize(double aWidth, double aHeight, bool aRepaint) override {} + void Resize(double aX, double aY, double aWidth, double aHeight, + bool aRepaint) override {} - virtual void Enable(bool aState) override {} - virtual bool IsEnabled() const override { return true; } + void Enable(bool aState) override {} + bool IsEnabled() const override { return true; } - virtual nsSizeMode SizeMode() override { return mSizeMode; } - virtual void SetSizeMode(nsSizeMode aMode) override { mSizeMode = aMode; } + nsSizeMode SizeMode() override { return mSizeMode; } + void SetSizeMode(nsSizeMode aMode) override { mSizeMode = aMode; } - virtual void SetFocus(Raise, mozilla::dom::CallerType aCallerType) override {} - virtual void Invalidate(const LayoutDeviceIntRect& aRect) override {} - virtual nsresult SetTitle(const nsAString& title) override { return NS_OK; } - virtual LayoutDeviceIntPoint WidgetToScreenOffset() override { + void SetFocus(Raise, mozilla::dom::CallerType aCallerType) override {} + void Invalidate(const LayoutDeviceIntRect& aRect) override {} + nsresult SetTitle(const nsAString& title) override { return NS_OK; } + LayoutDeviceIntPoint WidgetToScreenOffset() override { return LayoutDeviceIntPoint(0, 0); } - virtual nsresult DispatchEvent(mozilla::WidgetGUIEvent* aEvent, - nsEventStatus& aStatus) override { + nsresult DispatchEvent(mozilla::WidgetGUIEvent* aEvent, + nsEventStatus& aStatus) override { return NS_OK; } - virtual void SetInputContext(const InputContext& aContext, - const InputContextAction& aAction) override {} - virtual InputContext GetInputContext() override { abort(); } + void SetInputContext(const InputContext& aContext, + const InputContextAction& aAction) override {} + InputContext GetInputContext() override { abort(); } private: ~MockWidget() = default; diff --git a/widget/PuppetWidget.cpp b/widget/PuppetWidget.cpp @@ -56,14 +56,13 @@ already_AddRefed<nsIWidget> nsIWidget::CreatePuppetWidget( return widget.forget(); } -namespace mozilla { -namespace widget { +namespace mozilla::widget { -static bool IsPopup(const widget::InitData* aInitData) { - return aInitData && aInitData->mWindowType == WindowType::Popup; +static bool IsPopup(const widget::InitData& aInitData) { + return aInitData.mWindowType == WindowType::Popup; } -static bool MightNeedIMEFocus(const widget::InitData* aInitData) { +static bool MightNeedIMEFocus(const widget::InitData& aInitData) { // In the puppet-widget world, popup widgets are just dummies and // shouldn't try to mess with IME state. // @@ -95,7 +94,7 @@ PuppetWidget::~PuppetWidget() { Destroy(); } void PuppetWidget::InfallibleCreate(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { BaseCreate(aParent, aInitData); mBounds = aRect; @@ -109,7 +108,7 @@ void PuppetWidget::InfallibleCreate(nsIWidget* aParent, nsresult PuppetWidget::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { InfallibleCreate(aParent, aRect, aInitData); return NS_OK; } @@ -1121,5 +1120,4 @@ LayersId PuppetWidget::GetLayersId() const { return mBrowserChild ? mBrowserChild->GetLayersId() : LayersId{0}; } -} // namespace widget -} // namespace mozilla +} // namespace mozilla::widget diff --git a/widget/PuppetWidget.h b/widget/PuppetWidget.h @@ -71,10 +71,10 @@ class PuppetWidget final : public nsIWidget, // PuppetWidget creation is infallible, hence InfallibleCreate(), which // Create() calls. using nsIWidget::Create; // for Create signature not overridden here - nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData = nullptr) override; - void InfallibleCreate(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData = nullptr); + nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect&, + const widget::InitData&) override; + void InfallibleCreate(nsIWidget* aParent, const LayoutDeviceIntRect&, + const widget::InitData&); void InitIMEState(); diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp @@ -2253,7 +2253,7 @@ bool nsWindow::IsTopLevel() { } nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - InitData* aInitData) { + const InitData& aInitData) { ALOG("nsWindow[%p]::Create %p [%d %d %d %d]", (void*)this, (void*)aParent, aRect.x, aRect.y, aRect.width, aRect.height); @@ -2270,8 +2270,7 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, mBounds = rect; SetSizeConstraints(SizeConstraints()); - MOZ_DIAGNOSTIC_ASSERT(!aInitData || - aInitData->mWindowType != WindowType::Invisible); + MOZ_DIAGNOSTIC_ASSERT(aInitData.mWindowType != WindowType::Invisible); BaseCreate(aParent, aInitData); MOZ_ASSERT_IF(!IsTopLevel(), aParent); diff --git a/widget/android/nsWindow.h b/widget/android/nsWindow.h @@ -156,9 +156,8 @@ class nsWindow final : public nsIWidget { // using nsIWidget::Create; // for Create signature not overridden here - [[nodiscard]] nsresult Create(nsIWidget* aParent, - const LayoutDeviceIntRect& aRect, - InitData* aInitData) override; + [[nodiscard]] nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect&, + const InitData&) override; void Destroy() override; void DidClearParent(nsIWidget*) override; float GetDPI() override; diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h @@ -204,11 +204,11 @@ class nsCocoaWindow final : public nsIWidget { nsCocoaWindow(); [[nodiscard]] nsresult Create(nsIWidget* aParent, const DesktopIntRect& aRect, - InitData* = nullptr) override; + const InitData&) override; [[nodiscard]] nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - InitData* = nullptr) override; + const InitData&) override; void Destroy() override; diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm @@ -4757,7 +4757,7 @@ DesktopToLayoutDeviceScale ParentBackingScaleFactor(nsIWidget* aParent) { // For child windows aRect.{x,y} are offsets from the origin of the parent // window and not an absolute position. nsresult nsCocoaWindow::Create(nsIWidget* aParent, const DesktopIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { NS_OBJC_BEGIN_TRY_BLOCK_RETURN; // Because the hidden window is created outside of an event loop, @@ -4773,14 +4773,14 @@ nsresult nsCocoaWindow::Create(nsIWidget* aParent, const DesktopIntRect& aRect, Inherited::BaseCreate(aParent, aInitData); - mAlwaysOnTop = aInitData->mAlwaysOnTop; - mIsAlert = aInitData->mIsAlert; + mAlwaysOnTop = aInitData.mAlwaysOnTop; + mIsAlert = aInitData.mIsAlert; nsresult rv = CreateNativeWindow(nsCocoaUtils::GeckoRectToCocoaRect(aRect), - mBorderStyle, false, aInitData->mIsPrivate); + mBorderStyle, false, aInitData.mIsPrivate); NS_ENSURE_SUCCESS(rv, rv); - mIsAnimationSuppressed = aInitData->mIsAnimationSuppressed; + mIsAnimationSuppressed = aInitData.mIsAnimationSuppressed; // create our content NSView and hook it up to our parent. Recall that // NS_NATIVE_WIDGET is the NSView. @@ -4812,7 +4812,7 @@ nsresult nsCocoaWindow::Create(nsIWidget* aParent, const DesktopIntRect& aRect, nsresult nsCocoaWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { DesktopIntRect desktopRect = RoundedToInt(aRect / ParentBackingScaleFactor(aParent)); return Create(aParent, desktopRect, aInitData); diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp @@ -6072,9 +6072,8 @@ void nsWindow::ConfigureCompositor() { } nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { - MOZ_DIAGNOSTIC_ASSERT(!aInitData || - aInitData->mWindowType != WindowType::Invisible); + const widget::InitData& aInitData) { + MOZ_DIAGNOSTIC_ASSERT(aInitData.mWindowType != WindowType::Invisible); #ifdef ACCESSIBILITY // Send a DBus message to check whether a11y is enabled @@ -6107,8 +6106,8 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, mLastMoveRequest = mBounds.TopLeft(); const bool popupNeedsAlphaVisual = - mWindowType == WindowType::Popup && aInitData && - aInitData->mTransparencyMode == TransparencyMode::Transparent; + mWindowType == WindowType::Popup && + aInitData.mTransparencyMode == TransparencyMode::Transparent; // Figure out our parent window. auto* parentnsWindow = static_cast<nsWindow*>(aParent); @@ -6122,9 +6121,9 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, return NS_ERROR_FAILURE; } - mAlwaysOnTop = aInitData && aInitData->mAlwaysOnTop; - mIsAlert = aInitData && aInitData->mIsAlert; - mIsDragPopup = aInitData && aInitData->mIsDragPopup; + mAlwaysOnTop = aInitData.mAlwaysOnTop; + mIsAlert = aInitData.mIsAlert; + mIsDragPopup = aInitData.mIsDragPopup; // For popups, use the standard GtkWindowType GTK_WINDOW_POPUP, // which will use a Window with the override-redirect attribute @@ -6133,7 +6132,6 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, // popup window position. GtkWindowType type = GTK_WINDOW_TOPLEVEL; if (mWindowType == WindowType::Popup) { - MOZ_ASSERT(aInitData); type = GTK_WINDOW_POPUP; } mShell = gtk_window_new(type); @@ -6221,7 +6219,6 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, LOG(" set parent window [%p]\n", parentnsWindow); } } else if (mWindowType == WindowType::Popup) { - MOZ_ASSERT(aInitData); mGtkWindowRoleName = "Popup"; LOG(" nsWindow::Create() Popup"); @@ -6348,7 +6345,6 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, } if (mWindowType == WindowType::Popup) { - MOZ_ASSERT(aInitData); // gdk does not automatically set the cursor for "temporary" // windows, which are what gtk uses for popups. diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h @@ -180,7 +180,7 @@ class nsWindow final : public nsIWidget { using nsIWidget::Create; // for Create signature not overridden here [[nodiscard]] nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - InitData* aInitData) override; + const InitData&) override; void Destroy() override; float GetDPI() override; double GetDefaultScaleInternal() override; diff --git a/widget/headless/HeadlessWidget.cpp b/widget/headless/HeadlessWidget.cpp @@ -120,14 +120,11 @@ void HeadlessWidget::Destroy() { nsresult HeadlessWidget::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { BaseCreate(aParent, aInitData); - mBounds = aRect; mRestoreBounds = aRect; - - mAlwaysOnTop = aInitData && aInitData->mAlwaysOnTop; - + mAlwaysOnTop = aInitData.mAlwaysOnTop; return NS_OK; } diff --git a/widget/headless/HeadlessWidget.h b/widget/headless/HeadlessWidget.h @@ -51,7 +51,7 @@ class HeadlessWidget final : public nsIWidget { } nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData = nullptr) override; + const widget::InitData&) override; using nsIWidget::Create; // for Create signature not overridden here void GetCompositorWidgetInitData( diff --git a/widget/nsIWidget.cpp b/widget/nsIWidget.cpp @@ -457,15 +457,14 @@ nsIWidget::~nsIWidget() { // Basic create. // //------------------------------------------------------------------------- -void nsIWidget::BaseCreate(nsIWidget* aParent, widget::InitData* aInitData) { - if (aInitData) { - mWindowType = aInitData->mWindowType; - mBorderStyle = aInitData->mBorderStyle; - mPopupLevel = aInitData->mPopupLevel; - mPopupType = aInitData->mPopupHint; - mHasRemoteContent = aInitData->mHasRemoteContent; - mIsPIPWindow = aInitData->mPIPWindow; - } +void nsIWidget::BaseCreate(nsIWidget* aParent, + const widget::InitData& aInitData) { + mWindowType = aInitData.mWindowType; + mBorderStyle = aInitData.mBorderStyle; + mPopupLevel = aInitData.mPopupLevel; + mPopupType = aInitData.mPopupHint; + mHasRemoteContent = aInitData.mHasRemoteContent; + mIsPIPWindow = aInitData.mPIPWindow; mParent = aParent; if (mParent) { @@ -548,7 +547,9 @@ void nsIWidget::SetWidgetListener(nsIWidgetListener* aWidgetListener) { } already_AddRefed<nsIWidget> nsIWidget::CreateChild( - const LayoutDeviceIntRect& aRect, widget::InitData& aInitData) { + const LayoutDeviceIntRect& aRect, const widget::InitData& aInitData) { + MOZ_ASSERT(aInitData.mWindowType == WindowType::Popup, + "Creating non-popup puppet widget?"); nsCOMPtr<nsIWidget> widget; switch (mWidgetType) { case WidgetType::Native: { @@ -560,8 +561,6 @@ already_AddRefed<nsIWidget> nsIWidget::CreateChild( break; case WidgetType::Puppet: { // This really only should happen in crashtests that have menupopups. - MOZ_ASSERT(aInitData.mWindowType == WindowType::Popup, - "Creating non-popup puppet widget?"); widget = nsIWidget::CreatePuppetWidget(nullptr); break; } @@ -575,7 +574,7 @@ already_AddRefed<nsIWidget> nsIWidget::CreateChild( widget->SetNeedFastSnaphot(); } - if (NS_FAILED(widget->Create(this, aRect, &aInitData))) { + if (NS_FAILED(widget->Create(this, aRect, aInitData))) { return nullptr; } diff --git a/widget/nsIWidget.h b/widget/nsIWidget.h @@ -508,7 +508,7 @@ class nsIWidget : public nsSupportsWeakReference { */ [[nodiscard]] virtual nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - InitData* = nullptr) = 0; + const InitData&) = 0; /* * As above, but with aRect specified in DesktopPixel units (for top-level @@ -520,7 +520,7 @@ class nsIWidget : public nsSupportsWeakReference { */ [[nodiscard]] virtual nsresult Create(nsIWidget* aParent, const DesktopIntRect& aRect, - InitData* aInitData = nullptr) { + const InitData& aInitData) { LayoutDeviceIntRect devPixRect = RoundedToInt(aRect * GetDesktopToDeviceScale()); return Create(aParent, devPixRect, aInitData); @@ -538,7 +538,7 @@ class nsIWidget : public nsSupportsWeakReference { * for |Create()|. */ already_AddRefed<nsIWidget> CreateChild(const LayoutDeviceIntRect& aRect, - InitData&); + const InitData&); /** * Attach to a top level widget. @@ -1383,7 +1383,7 @@ class nsIWidget : public nsSupportsWeakReference { void ResolveIconName(const nsAString& aIconName, const nsAString& aIconSuffix, nsIFile** aResult); virtual void OnDestroy(); - void BaseCreate(nsIWidget* aParent, InitData* aInitData); + void BaseCreate(nsIWidget* aParent, const InitData& aInitData); virtual void ConfigureAPZCTreeManager(); virtual void ConfigureAPZControllerThread(); diff --git a/widget/tests/gtest/MockWinWidget.h b/widget/tests/gtest/MockWinWidget.h @@ -35,36 +35,36 @@ class MockWinWidget : public nsIWidget { void* GetNativeData(uint32_t aDataType) override { return nullptr; } - virtual nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - InitData* aInitData = nullptr) override { + nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, + const InitData&) override { return NS_OK; } - virtual nsresult Create(nsIWidget* aParent, const DesktopIntRect& aRect, - InitData* aInitData = nullptr) override { + nsresult Create(nsIWidget* aParent, const DesktopIntRect& aRect, + const InitData&) override { return NS_OK; } - virtual void Show(bool aState) override {} - virtual bool IsVisible() const override { return true; } - virtual void Move(double aX, double aY) override {} - virtual void Resize(double aWidth, double aHeight, bool aRepaint) override {} - virtual void Resize(double aX, double aY, double aWidth, double aHeight, - bool aRepaint) override {} - - virtual void Enable(bool aState) override {} - virtual bool IsEnabled() const override { return true; } - virtual void SetFocus(Raise, mozilla::dom::CallerType aCallerType) override {} - virtual void Invalidate(const LayoutDeviceIntRect& aRect) override {} - virtual nsresult SetTitle(const nsAString& title) override { return NS_OK; } - virtual LayoutDeviceIntPoint WidgetToScreenOffset() override { + void Show(bool aState) override {} + bool IsVisible() const override { return true; } + void Move(double aX, double aY) override {} + void Resize(double aWidth, double aHeight, bool aRepaint) override {} + void Resize(double aX, double aY, double aWidth, double aHeight, + bool aRepaint) override {} + + void Enable(bool aState) override {} + bool IsEnabled() const override { return true; } + void SetFocus(Raise, mozilla::dom::CallerType aCallerType) override {} + void Invalidate(const LayoutDeviceIntRect& aRect) override {} + nsresult SetTitle(const nsAString& title) override { return NS_OK; } + LayoutDeviceIntPoint WidgetToScreenOffset() override { return LayoutDeviceIntPoint(0, 0); } - virtual nsresult DispatchEvent(mozilla::WidgetGUIEvent* aEvent, - nsEventStatus& aStatus) override { + nsresult DispatchEvent(mozilla::WidgetGUIEvent* aEvent, + nsEventStatus& aStatus) override { return NS_OK; } - virtual void SetInputContext(const InputContext& aContext, - const InputContextAction& aAction) override {} - virtual InputContext GetInputContext() override { abort(); } + void SetInputContext(const InputContext& aContext, + const InputContextAction& aAction) override {} + InputContext GetInputContext() override { abort(); } private: MockWinWidget(); diff --git a/widget/uikit/nsWindow.h b/widget/uikit/nsWindow.h @@ -45,9 +45,8 @@ class nsWindow final : public nsIWidget { // nsIWidget // - [[nodiscard]] nsresult Create( - nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - mozilla::widget::InitData* aInitData = nullptr) override; + [[nodiscard]] nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect&, + const mozilla::widget::InitData&) override; void Destroy() override; void Show(bool aState) override; void Enable(bool aState) override {} diff --git a/widget/uikit/nsWindow.mm b/widget/uikit/nsWindow.mm @@ -778,7 +778,7 @@ bool nsWindow::IsTopLevel() { // nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { ALOG("nsWindow[%p]::Create %p [%d %d %d %d]", (void*)this, (void*)aParent, aRect.x, aRect.y, aRect.width, aRect.height); nsWindow* parent = (nsWindow*)aParent; diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp @@ -1010,7 +1010,7 @@ void SetWindowStyles(HWND aWnd, const WindowStyles& aStyles) { // Create the proper widget nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, - widget::InitData* aInitData) { + const widget::InitData& aInitData) { // Historical note: there was once some belief and/or intent that nsWindows // could be created on arbitrary threads, and this may still be reflected in // some comments. @@ -1020,10 +1020,7 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, // (WM_FONTCHANGE et al.) are received and processed. WinEventWindow::Ensure(); - widget::InitData defaultInitData; - if (!aInitData) aInitData = &defaultInitData; - - MOZ_DIAGNOSTIC_ASSERT(aInitData->mWindowType != WindowType::Invisible); + MOZ_DIAGNOSTIC_ASSERT(aInitData.mWindowType != WindowType::Invisible); mBounds = aRect; @@ -1035,12 +1032,12 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, HWND parent = aParent ? (HWND)aParent->GetNativeData(NS_NATIVE_WINDOW) : nullptr; - mIsRTL = aInitData->mRTL; - mPIPWindow = aInitData->mPIPWindow; - mOpeningAnimationSuppressed = aInitData->mIsAnimationSuppressed; - mAlwaysOnTop = aInitData->mAlwaysOnTop; - mIsAlert = aInitData->mIsAlert; - mResizable = aInitData->mResizable; + mIsRTL = aInitData.mRTL; + mPIPWindow = aInitData.mPIPWindow; + mOpeningAnimationSuppressed = aInitData.mIsAnimationSuppressed; + mAlwaysOnTop = aInitData.mAlwaysOnTop; + mIsAlert = aInitData.mIsAlert; + mResizable = aInitData.mResizable; Styles desiredStyles{ .style = static_cast<LONG_PTR>(WindowStyle()), @@ -1049,12 +1046,12 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, if (mWindowType != WindowType::Popup) { // See if the caller wants to explicitly set clip children and clip siblings - if (aInitData->mClipChildren) { + if (aInitData.mClipChildren) { desiredStyles.style |= WS_CLIPCHILDREN; } else { desiredStyles.style &= ~WS_CLIPCHILDREN; } - if (aInitData->mClipSiblings) { + if (aInitData.mClipSiblings) { desiredStyles.style |= WS_CLIPSIBLINGS; } } @@ -1063,7 +1060,7 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, // Take specific actions when creating the first top-level window static bool sFirstTopLevelWindowCreated = false; - if (aInitData->mWindowType == WindowType::TopLevel && !aParent && + if (aInitData.mWindowType == WindowType::TopLevel && !aParent && !sFirstTopLevelWindowCreated) { sFirstTopLevelWindowCreated = true; mWnd = ConsumePreXULSkeletonUIHandle(); @@ -1164,7 +1161,7 @@ nsresult nsWindow::Create(nsIWidget* aParent, const LayoutDeviceIntRect& aRect, // AUMID). bool usePrivateAumid = Preferences::GetBool("browser.privateWindowSeparation.enabled", true) && - (aInitData->mIsPrivate) && + aInitData.mIsPrivate && !StaticPrefs::browser_privatebrowsing_autostart(); RefPtr<IPropertyStore> pPropStore; if (!FAILED(SHGetPropertyStoreForWindow(mWnd, IID_IPropertyStore, diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h @@ -189,9 +189,8 @@ class nsWindow final : public nsIWidget { // nsIWidget interface using nsIWidget::Create; // for Create signature not overridden here - [[nodiscard]] nsresult Create(nsIWidget* aParent, - const LayoutDeviceIntRect& aRect, - InitData* aInitData = nullptr) override; + [[nodiscard]] nsresult Create(nsIWidget* aParent, const LayoutDeviceIntRect&, + const InitData&) override; void Destroy() override; float GetDPI() override; double GetDefaultScaleInternal() override; diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp @@ -213,7 +213,7 @@ nsresult AppWindow::Initialize(nsIAppWindow* aParent, nsIAppWindow* aOpener, mWindow->SetWidgetListener(&mWidgetListenerDelegate); rv = mWindow->Create(parentWidget.get(), // Parent nsIWidget deskRect, // Widget dimensions - &widgetInitData); // Widget initialization data + widgetInitData); // Widget initialization data NS_ENSURE_SUCCESS(rv, rv); LayoutDeviceIntRect r = mWindow->GetClientBounds(); diff --git a/xpfe/appshell/nsAppShellService.cpp b/xpfe/appshell/nsAppShellService.cpp @@ -407,9 +407,7 @@ nsAppShellService::CreateWindowlessBrowser(bool aIsChrome, uint32_t aChromeMask, return NS_ERROR_FAILURE; } - nsresult rv = - widget->Create(nullptr, LayoutDeviceIntRect(0, 0, 0, 0), nullptr); - NS_ENSURE_SUCCESS(rv, rv); + MOZ_TRY(widget->Create(nullptr, LayoutDeviceIntRect(), widget::InitData())); // Create a BrowsingContext for our windowless browser. RefPtr<BrowsingContext> browsingContext = BrowsingContext::CreateIndependent(