Commit 192c2c13 authored by Moe Ahmadi's avatar Moe Ahmadi Committed by Commit Bot

[IOS][Translate] Notify TranslateInfoBarDelegate observer when it's destroyed

In some scenarios TranslateInfoBarDelegate gets destructed before the
TranslateInfobarController and subsequently its
TranslateInfoBarDelegateObserverBridge instance. This results in the
delegate reference to be invalid in the observer bridge's destructor.

TranslateInfoBarDelegate now notifies its observer before being so that it
can stop observing the instance.

Bug: 945433
Change-Id: I8b8644c66c84c3a4378f281d2937b931e3bd6f98
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1536799
Commit-Queue: Moe Ahmadi <mahmadi@chromium.org>
Reviewed-by: default avatarSergio Collazos <sczs@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Reviewed-by: default avataranthonyvd <anthonyvd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#644813}
parent 5543aebc
......@@ -214,3 +214,9 @@ bool TranslateCompactInfoBar::IsDeclinedByUser() {
// Whether there is any affirmative action bit.
return action_flags_ == FLAG_NONE;
}
void TranslateCompactInfoBar::OnTranslateInfoBarDelegateDestroyed(
translate::TranslateInfoBarDelegate* delegate) {
DCHECK_EQ(GetDelegate(), delegate);
GetDelegate()->SetObserver(nullptr);
}
......@@ -55,6 +55,8 @@ class TranslateCompactInfoBar
// The function will be called when the translate infobar is dismissed.
// If it's true, we will record a declined event.
bool IsDeclinedByUser() override;
void OnTranslateInfoBarDelegateDestroyed(
translate::TranslateInfoBarDelegate* delegate) override;
private:
// InfoBarAndroid:
......
......@@ -43,6 +43,8 @@ const base::Feature kTranslateCompactUI{"TranslateCompactUI",
const size_t TranslateInfoBarDelegate::kNoIndex = TranslateUIDelegate::kNoIndex;
TranslateInfoBarDelegate::~TranslateInfoBarDelegate() {
if (observer_)
observer_->OnTranslateInfoBarDelegateDestroyed(this);
}
infobars::InfoBarDelegate::InfoBarIdentifier
......
......@@ -45,6 +45,9 @@ class TranslateInfoBarDelegate : public infobars::InfoBarDelegate {
TranslateErrors::Type error_type) = 0;
// Return whether user declined translate service.
virtual bool IsDeclinedByUser() = 0;
// Called when the TranslateInfoBarDelegate instance is destroyed.
virtual void OnTranslateInfoBarDelegateDestroyed(
TranslateInfoBarDelegate* delegate) = 0;
protected:
virtual ~Observer() {}
......
......@@ -35,6 +35,8 @@ class TranslateInfobarDelegateObserverBridge
translate::TranslateStep step,
translate::TranslateErrors::Type error_type) override;
bool IsDeclinedByUser() override;
void OnTranslateInfoBarDelegateDestroyed(
translate::TranslateInfoBarDelegate* delegate) override;
private:
translate::TranslateInfoBarDelegate* translate_infobar_delegate_ = nullptr;
......
......@@ -4,6 +4,8 @@
#import "ios/chrome/browser/translate/translate_infobar_delegate_observer_bridge.h"
#include "base/logging.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
......@@ -17,7 +19,9 @@ TranslateInfobarDelegateObserverBridge::TranslateInfobarDelegateObserverBridge(
TranslateInfobarDelegateObserverBridge::
~TranslateInfobarDelegateObserverBridge() {
translate_infobar_delegate_->SetObserver(nullptr);
if (translate_infobar_delegate_) {
translate_infobar_delegate_->SetObserver(nullptr);
}
}
void TranslateInfobarDelegateObserverBridge::OnTranslateStepChanged(
......@@ -28,7 +32,15 @@ void TranslateInfobarDelegateObserverBridge::OnTranslateStepChanged(
withErrorType:error_type];
}
BOOL TranslateInfobarDelegateObserverBridge::IsDeclinedByUser() {
bool TranslateInfobarDelegateObserverBridge::IsDeclinedByUser() {
return [owner_ translateInfoBarDelegateDidDismissWithoutInteraction:
translate_infobar_delegate_];
}
void TranslateInfobarDelegateObserverBridge::
OnTranslateInfoBarDelegateDestroyed(
translate::TranslateInfoBarDelegate* delegate) {
DCHECK_EQ(translate_infobar_delegate_, delegate);
translate_infobar_delegate_->SetObserver(nullptr);
translate_infobar_delegate_ = nullptr;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment