Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5053)

Unified Diff: chrome/browser/ui/views/speech_recognition_bubble_views.cc

Issue 213153002: Fixing a lifetime issue for Speech Recognition Bubble (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ixed comments Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/speech_recognition_bubble_views.cc
diff --git a/chrome/browser/ui/views/speech_recognition_bubble_views.cc b/chrome/browser/ui/views/speech_recognition_bubble_views.cc
index d22da84f82a2928294e5428cfcf33a346bd665bf..512e859165b023057a172e9e8a1fd8462d5ed6ca 100644
--- a/chrome/browser/ui/views/speech_recognition_bubble_views.cc
+++ b/chrome/browser/ui/views/speech_recognition_bubble_views.cc
@@ -31,6 +31,11 @@ using content::WebContents;
namespace {
+class SpeechRecognitionBubbleViewLifeTimeObserver {
+ public:
+ virtual void BubbleViewGoingAway() = 0;
+};
+
const int kBubbleHorizMargin = 6;
const int kBubbleVertMargin = 4;
const int kBubbleHeadingVertMargin = 6;
@@ -45,6 +50,9 @@ class SpeechRecognitionBubbleView : public views::BubbleDelegateView,
const gfx::Rect& element_rect,
WebContents* web_contents);
+ void SetLifeTimeObserver(
+ SpeechRecognitionBubbleViewLifeTimeObserver* life_time_observer);
+
void UpdateLayout(SpeechRecognitionBubbleBase::DisplayMode mode,
const base::string16& message_text,
const gfx::ImageSkia& image);
@@ -53,6 +61,7 @@ class SpeechRecognitionBubbleView : public views::BubbleDelegateView,
// views::BubbleDelegateView methods.
virtual void OnWidgetActivationChanged(views::Widget* widget,
bool active) OVERRIDE;
+ virtual void OnWidgetDestroyed(views::Widget* widget) OVERRIDE;
virtual gfx::Rect GetAnchorRect() OVERRIDE;
virtual void Init() OVERRIDE;
@@ -85,6 +94,7 @@ class SpeechRecognitionBubbleView : public views::BubbleDelegateView,
views::Link* mic_settings_;
SpeechRecognitionBubbleBase::DisplayMode display_mode_;
const int kIconLayoutMinWidth;
+ SpeechRecognitionBubbleViewLifeTimeObserver* life_time_observer_;
DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionBubbleView);
};
@@ -119,6 +129,18 @@ SpeechRecognitionBubbleView::SpeechRecognitionBubbleView(
set_move_with_anchor(true);
}
+void SpeechRecognitionBubbleView::SetLifeTimeObserver(
+ SpeechRecognitionBubbleViewLifeTimeObserver* life_time_observer) {
+ life_time_observer_ = life_time_observer;
tommi (sloooow) - chröme 2014/03/27 14:44:03 nit: First DCHECK(!life_time_observer_)? or if lif
Tommy Widenflycht 2014/03/31 10:45:54 Done.
+}
+
+void SpeechRecognitionBubbleView::OnWidgetDestroyed(views::Widget* widget) {
+ BubbleDelegateView::OnWidgetDestroyed(widget);
+ if (life_time_observer_) {
tommi (sloooow) - chröme 2014/03/27 14:44:03 nit: no {}
Tommy Widenflycht 2014/03/31 10:45:54 Done.
+ life_time_observer_->BubbleViewGoingAway();
+ }
+}
+
void SpeechRecognitionBubbleView::OnWidgetActivationChanged(
views::Widget* widget, bool active) {
if (widget == GetWidget() && !active && notify_delegate_on_activation_change_)
@@ -327,7 +349,9 @@ void SpeechRecognitionBubbleView::Layout() {
}
// Implementation of SpeechRecognitionBubble.
-class SpeechRecognitionBubbleImpl : public SpeechRecognitionBubbleBase {
+class SpeechRecognitionBubbleImpl
+ : public SpeechRecognitionBubbleBase,
+ public SpeechRecognitionBubbleViewLifeTimeObserver {
public:
SpeechRecognitionBubbleImpl(int render_process_id, int render_view_id,
Delegate* delegate,
@@ -342,6 +366,9 @@ class SpeechRecognitionBubbleImpl : public SpeechRecognitionBubbleBase {
virtual void UpdateLayout() OVERRIDE;
virtual void UpdateImage() OVERRIDE;
+ // SpeechRecognitionBubbleViewLifeTimeObserver methods.
+ virtual void BubbleViewGoingAway() OVERRIDE;
+
private:
Delegate* delegate_;
SpeechRecognitionBubbleView* bubble_;
@@ -361,11 +388,16 @@ SpeechRecognitionBubbleImpl::SpeechRecognitionBubbleImpl(
SpeechRecognitionBubbleImpl::~SpeechRecognitionBubbleImpl() {
if (bubble_) {
+ bubble_->SetLifeTimeObserver(NULL);
bubble_->set_notify_delegate_on_activation_change(false);
bubble_->GetWidget()->Close();
}
}
+void SpeechRecognitionBubbleImpl::BubbleViewGoingAway() {
+ bubble_ = NULL;
+}
+
void SpeechRecognitionBubbleImpl::Show() {
WebContents* web_contents = GetWebContents();
if (!web_contents)
@@ -385,6 +417,7 @@ void SpeechRecognitionBubbleImpl::Show() {
bubble_ = new SpeechRecognitionBubbleView(delegate_, icon, element_rect_,
web_contents);
+ bubble_->SetLifeTimeObserver(this);
if (!icon) {
// We dont't have an icon to attach to. Manually specify the web contents
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698