Fix crash that could occur when closing a split before its display name was updated (#4731)

This fixes a crash that could occur when closing a split before the
display name had a chance to update

The reason I found this was because the LiveController change I made
updated display names more regularly

Additionally, we now make sure to not send duplicate `displayNameUpdated` signals
upon each request for channels with CJK characters in their display name

* Default-initialize the `actualDisplayName` with the user's login name to not send an initial display name update if the display name is the same casing as the login name
This commit is contained in:
pajlada 2023-07-23 12:11:57 +02:00 committed by GitHub
parent 5c8c05b1af
commit a440f0261a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 5 deletions

View file

@ -16,6 +16,7 @@
- Bugfix: Fixed generation of crashdumps by the browser-extension process when the browser was closed. (#4667)
- Bugfix: Fix spacing issue with mentions inside RTL text. (#4677)
- Bugfix: Fixed a crash when opening and closing a reply thread and switching the user. (#4675)
- Bugfix: Fixed a crash that could happen when closing splits before their display name was updated. This was especially noticeable after the live controller changes. (#4731)
- Bugfix: Fix visual glitches with smooth scrolling. (#4501)
- Bugfix: Fixed pings firing for the "Your username" highlight when not signed in. (#4698)
- Bugfix: Fixed partially broken filters on Qt 6 builds. (#4702)

View file

@ -73,7 +73,7 @@ namespace {
TwitchChannel::TwitchChannel(const QString &name)
: Channel(name, Channel::Type::Twitch)
, ChannelChatters(*static_cast<Channel *>(this))
, nameOptions{name, name}
, nameOptions{name, name, name}
, subscriptionUrl_("https://www.twitch.tv/subs/" + name)
, channelUrl_("https://twitch.tv/" + name)
, popoutPlayerUrl_("https://player.twitch.tv/?parent=twitch.tv&channel=" +
@ -472,7 +472,7 @@ void TwitchChannel::updateStreamTitle(const QString &title)
void TwitchChannel::updateDisplayName(const QString &displayName)
{
if (displayName == this->getDisplayName())
if (displayName == this->nameOptions.actualDisplayName)
{
// Display name has not changed
return;
@ -480,6 +480,8 @@ void TwitchChannel::updateDisplayName(const QString &displayName)
// Display name has changed
this->nameOptions.actualDisplayName = displayName;
if (QString::compare(displayName, this->getName(), Qt::CaseInsensitive) ==
0)
{

View file

@ -229,8 +229,17 @@ public:
private:
struct NameOptions {
// displayName is the non-CJK-display name for this user
// This will always be the same as their `name_`, but potentially with different casing
QString displayName;
// localizedName is their display name that *may* contain CJK characters
// If the display name does not contain any CJK characters, this will be
// the same as `displayName`
QString localizedName;
// actualDisplayName is the raw display name string received from Twitch
QString actualDisplayName;
} nameOptions;
private:

View file

@ -850,7 +850,8 @@ void Split::setChannel(IndirectChannel newChannel)
this->header_->setViewersButtonVisible(false);
}
this->channel_.get()->displayNameChanged.connect([this] {
this->channelSignalHolder_.managedConnect(
this->channel_.get()->displayNameChanged, [this] {
this->actionRequested.invoke(Action::RefreshTab);
});

View file

@ -163,6 +163,10 @@ private:
pajlada::Signals::Connection roomModeChangedConnection_;
pajlada::Signals::Connection indirectChannelChangedConnection_;
// This signal-holder is cleared whenever this split changes the underlying channel
pajlada::Signals::SignalHolder channelSignalHolder_;
pajlada::Signals::SignalHolder signalHolder_;
std::vector<boost::signals2::scoped_connection> bSignals_;