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:
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(