Files
Nicholas Rishel 5fc0707f84 Bug 2034609 - Remove remaining unnecessary STA initialization from nsWindowsShellService. r=win-reviewers,handyman
STA initialization was initially introduced to nsWindowsShellService when pin checks were moved to a background thread in D106346, and only for `IsCurrentAppPinnedToTaskbarAsync`.  Notably neither `PinCurrentAppToTaskbar` nor `CheckPinCurrentAppToTaskbar` enforce either main thread or STA, though the Taskband Pin COM API can only be created on an STA thread.

No Windows API called by `IsCurrentAppPinnedToTaskbarAsync` are documented or observed to rely on STA, notably `ShellLink` has `ThreadingModel=Both` in `HKCR\CLSID\{00021401-0000-0000-C000-000000000046}\InProcServer32`. `00021401-0000-0000-C000-000000000046` is UUID associated to `CLSID_ShellLink`.

Neither `ShellExecute` nor shell dialog opening functions are used herein. These are the two common sources of shell functions erring from `E_NOINTERFACE` on MTA threads as documented in "Calling shell functions and interfaces from a multithreaded apartment" at https://learn.microsoft.com/en-us/previous-versions/troubleshoot/windows/win32/shell-functions-multithreaded-apartment.

This initial use of STA predates implicit MTA on background threads introduced in Bug 1707954 by a few months.

Given the above context it is likely that the original intent was only to ensure COM was initialized for the background thread. It is unlikely STA was an intentional choice, and instead the result of choosing the smaller API between `CoInitialize` and `CoInitializeEx`.

Remaining STA initialization seems to have copy/pasted this original example without further consideration.

Differential Revision: https://phabricator.services.mozilla.com/D296211
2026-07-01 16:25:35 +00:00

69 lines
2.6 KiB
YAML

# 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/.
---
forbid-mscom-init:
description: >-
New calls to CoInitialize, CoInitializeEx, OleInitialize, RoInitialize,
CoUninitialize, OleUninitialize, or RoUninitialize are forbidden. If you
have questions, please consult a peer of the IPC: MSCOM module.
level: error
include: ['.']
type: regex
payload: ([CR]o|Ole)(Uni|I)nitialize(Ex)?
ignore-case: false
extensions:
- h
- c
- cc
- cpp
- rs
exclude:
# These files contain utilities for using COM more safely.
- ipc/mscom/ApartmentRegion.h
- ipc/mscom/COMWrappers.cpp
- ipc/mscom/COMWrappers.h
- ipc/mscom/EnsureMTA.cpp
# These files have been reviewed by MSCOM peers, and the use of
# CoInitialize within them has been confirmed to be necessary and
# proper.
- ipc/mscom/ProcessRuntime.cpp
# These files are existing legacy uses of CoInitialize (and so forth)
# that must eventually be fixed -- probably by converting them to use
# ApartmentRegion and moving them to _that_ lint's exception-list.
- image/DecodePool.cpp
- ipc/glue/IOThread.cpp
- netwerk/system/win32/nsNotifyAddrListener.cpp
- toolkit/components/bitsdownload/bits_client/bits/src/lib.rs
- toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.cc
- toolkit/mozapps/defaultagent/proxy/main.cpp
- uriloader/exthandler/win/nsOSHelperAppService.cpp
- widget/windows/TaskbarPreview.cpp
- widget/windows/WinTaskbar.cpp
- widget/windows/nsWindow.cpp
- widget/windows/nsWindow.h
- widget/windows/tests/TestUriValidation.cpp
- xpcom/io/nsLocalFileWin.cpp
forbid-apartment-region:
description: >-
New uses of ApartmentRegion, ApartmentRegionT, MTARegion, or STARegion
require approval by a peer of the IPC: MSCOM module.
level: error
include: ['.']
type: regex
payload: ApartmentRegion(T)?|[MS]TARegion
ignore-case: false
extensions:
- h
- c
- cc
- cpp
exclude:
# ApartmentRegion's definition.
- ipc/mscom/ApartmentRegion.h
# These files have been reviewed and approved by MSCOM peers.
- ipc/mscom/ProcessRuntime.cpp
- ipc/mscom/ProcessRuntime.h
- widget/windows/filedialog/WinFileDialogCommands.cpp