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

Side by Side Diff: chrome/browser/ui/views/speech_recognition_bubble_views.cc

Issue 240223010: Merge 261737 "Fixing a lifetime issue for Speech Recognition Bubble" (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1847/src/
Patch Set: Created 6 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/speech/speech_recognition_bubble.h" 5 #include "chrome/browser/speech/speech_recognition_bubble.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/ui/browser.h" 10 #include "chrome/browser/ui/browser.h"
11 #include "chrome/browser/ui/browser_finder.h" 11 #include "chrome/browser/ui/browser_finder.h"
12 #include "chrome/browser/ui/views/frame/browser_view.h" 12 #include "chrome/browser/ui/views/frame/browser_view.h"
13 #include "chrome/browser/ui/views/toolbar/toolbar_view.h" 13 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
14 #include "content/public/browser/resource_context.h" 14 #include "content/public/browser/resource_context.h"
15 #include "content/public/browser/speech_recognition_manager.h" 15 #include "content/public/browser/speech_recognition_manager.h"
16 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
17 #include "content/public/browser/web_contents_view.h" 17 #include "content/public/browser/web_contents_view.h"
18 #include "grit/generated_resources.h" 18 #include "grit/generated_resources.h"
19 #include "grit/theme_resources.h" 19 #include "grit/theme_resources.h"
20 #include "ui/base/l10n/l10n_util.h" 20 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/base/resource/resource_bundle.h" 21 #include "ui/base/resource/resource_bundle.h"
22 #include "ui/views/bubble/bubble_delegate.h" 22 #include "ui/views/bubble/bubble_delegate.h"
23 #include "ui/views/controls/button/label_button.h" 23 #include "ui/views/controls/button/label_button.h"
24 #include "ui/views/controls/image_view.h" 24 #include "ui/views/controls/image_view.h"
25 #include "ui/views/controls/label.h" 25 #include "ui/views/controls/label.h"
26 #include "ui/views/controls/link.h" 26 #include "ui/views/controls/link.h"
27 #include "ui/views/controls/link_listener.h" 27 #include "ui/views/controls/link_listener.h"
28 #include "ui/views/layout/layout_constants.h" 28 #include "ui/views/layout/layout_constants.h"
29 #include "ui/views/widget/widget_observer.h"
29 30
30 using content::WebContents; 31 using content::WebContents;
31 32
32 namespace { 33 namespace {
33 34
34 const int kBubbleHorizMargin = 6; 35 const int kBubbleHorizMargin = 6;
35 const int kBubbleVertMargin = 4; 36 const int kBubbleVertMargin = 4;
36 const int kBubbleHeadingVertMargin = 6; 37 const int kBubbleHeadingVertMargin = 6;
37 38
38 // This is the SpeechRecognitionBubble content and views bubble delegate. 39 // This is the SpeechRecognitionBubble content and views bubble delegate.
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 if (cancel_->visible()) { 304 if (cancel_->visible()) {
304 control_height = cancel_->GetPreferredSize().height(); 305 control_height = cancel_->GetPreferredSize().height();
305 int width = cancel_->GetPreferredSize().width(); 306 int width = cancel_->GetPreferredSize().width();
306 cancel_->SetBounds(x + (available_width - width) / 2, y, width, 307 cancel_->SetBounds(x + (available_width - width) / 2, y, width,
307 control_height); 308 control_height);
308 } 309 }
309 } 310 }
310 } 311 }
311 312
312 // Implementation of SpeechRecognitionBubble. 313 // Implementation of SpeechRecognitionBubble.
313 class SpeechRecognitionBubbleImpl : public SpeechRecognitionBubbleBase { 314 class SpeechRecognitionBubbleImpl
315 : public SpeechRecognitionBubbleBase,
316 public views::WidgetObserver {
314 public: 317 public:
315 SpeechRecognitionBubbleImpl(int render_process_id, int render_view_id, 318 SpeechRecognitionBubbleImpl(int render_process_id, int render_view_id,
316 Delegate* delegate, 319 Delegate* delegate,
317 const gfx::Rect& element_rect); 320 const gfx::Rect& element_rect);
318 virtual ~SpeechRecognitionBubbleImpl(); 321 virtual ~SpeechRecognitionBubbleImpl();
319 322
320 // SpeechRecognitionBubble methods. 323 // SpeechRecognitionBubble methods.
321 virtual void Show() OVERRIDE; 324 virtual void Show() OVERRIDE;
322 virtual void Hide() OVERRIDE; 325 virtual void Hide() OVERRIDE;
323 326
324 // SpeechRecognitionBubbleBase methods. 327 // SpeechRecognitionBubbleBase methods.
325 virtual void UpdateLayout() OVERRIDE; 328 virtual void UpdateLayout() OVERRIDE;
326 virtual void UpdateImage() OVERRIDE; 329 virtual void UpdateImage() OVERRIDE;
327 330
331 // views::WidgetObserver methods.
332 virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
333
328 private: 334 private:
329 Delegate* delegate_; 335 Delegate* delegate_;
330 SpeechRecognitionBubbleView* bubble_; 336 SpeechRecognitionBubbleView* bubble_;
331 gfx::Rect element_rect_; 337 gfx::Rect element_rect_;
332 338
333 DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionBubbleImpl); 339 DISALLOW_COPY_AND_ASSIGN(SpeechRecognitionBubbleImpl);
334 }; 340 };
335 341
336 SpeechRecognitionBubbleImpl::SpeechRecognitionBubbleImpl( 342 SpeechRecognitionBubbleImpl::SpeechRecognitionBubbleImpl(
337 int render_process_id, int render_view_id, Delegate* delegate, 343 int render_process_id, int render_view_id, Delegate* delegate,
338 const gfx::Rect& element_rect) 344 const gfx::Rect& element_rect)
339 : SpeechRecognitionBubbleBase(render_process_id, render_view_id), 345 : SpeechRecognitionBubbleBase(render_process_id, render_view_id),
340 delegate_(delegate), 346 delegate_(delegate),
341 bubble_(NULL), 347 bubble_(NULL),
342 element_rect_(element_rect) { 348 element_rect_(element_rect) {
343 } 349 }
344 350
345 SpeechRecognitionBubbleImpl::~SpeechRecognitionBubbleImpl() { 351 SpeechRecognitionBubbleImpl::~SpeechRecognitionBubbleImpl() {
346 if (bubble_) { 352 if (bubble_) {
353 bubble_->GetWidget()->RemoveObserver(this);
347 bubble_->set_notify_delegate_on_activation_change(false); 354 bubble_->set_notify_delegate_on_activation_change(false);
348 bubble_->GetWidget()->Close(); 355 bubble_->GetWidget()->Close();
349 } 356 }
350 } 357 }
351 358
359 void SpeechRecognitionBubbleImpl::OnWidgetDestroying(views::Widget* widget) {
360 bubble_ = NULL;
361 }
362
352 void SpeechRecognitionBubbleImpl::Show() { 363 void SpeechRecognitionBubbleImpl::Show() {
353 WebContents* web_contents = GetWebContents(); 364 WebContents* web_contents = GetWebContents();
354 if (!web_contents) 365 if (!web_contents)
355 return; 366 return;
356 367
357 if (!bubble_) { 368 if (!bubble_) {
358 views::View* icon = NULL; 369 views::View* icon = NULL;
359 370
360 // Anchor to the location bar, in case |element_rect| is offscreen. 371 // Anchor to the location bar, in case |element_rect| is offscreen.
361 Browser* browser = chrome::FindBrowserWithWebContents(web_contents); 372 Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
362 if (browser) { 373 if (browser) {
363 BrowserView* browser_view = 374 BrowserView* browser_view =
364 BrowserView::GetBrowserViewForBrowser(browser); 375 BrowserView::GetBrowserViewForBrowser(browser);
365 icon = browser_view->GetLocationBarView() ? 376 icon = browser_view->GetLocationBarView() ?
366 browser_view->GetLocationBarView()->GetLocationBarAnchor() : NULL; 377 browser_view->GetLocationBarView()->GetLocationBarAnchor() : NULL;
367 } 378 }
368 379
369 bubble_ = new SpeechRecognitionBubbleView(delegate_, icon, element_rect_, 380 bubble_ = new SpeechRecognitionBubbleView(delegate_, icon, element_rect_,
370 web_contents); 381 web_contents);
371 382
372 if (!icon) { 383 if (!icon) {
373 // We dont't have an icon to attach to. Manually specify the web contents 384 // We dont't have an icon to attach to. Manually specify the web contents
374 // window as the parent. 385 // window as the parent.
375 bubble_->set_parent_window( 386 bubble_->set_parent_window(
376 web_contents->GetView()->GetTopLevelNativeWindow()); 387 web_contents->GetView()->GetTopLevelNativeWindow());
377 } 388 }
378 389
379 views::BubbleDelegateView::CreateBubble(bubble_); 390 views::BubbleDelegateView::CreateBubble(bubble_);
380 UpdateLayout(); 391 UpdateLayout();
381 } 392 bubble_->GetWidget()->AddObserver(this);
393 }
382 bubble_->GetWidget()->Show(); 394 bubble_->GetWidget()->Show();
383 } 395 }
384 396
385 void SpeechRecognitionBubbleImpl::Hide() { 397 void SpeechRecognitionBubbleImpl::Hide() {
386 if (bubble_) 398 if (bubble_)
387 bubble_->GetWidget()->Hide(); 399 bubble_->GetWidget()->Hide();
388 } 400 }
389 401
390 void SpeechRecognitionBubbleImpl::UpdateLayout() { 402 void SpeechRecognitionBubbleImpl::UpdateLayout() {
391 if (bubble_ && GetWebContents()) 403 if (bubble_ && GetWebContents())
392 bubble_->UpdateLayout(display_mode(), message_text(), icon_image()); 404 bubble_->UpdateLayout(display_mode(), message_text(), icon_image());
393 } 405 }
394 406
395 void SpeechRecognitionBubbleImpl::UpdateImage() { 407 void SpeechRecognitionBubbleImpl::UpdateImage() {
396 if (bubble_ && GetWebContents()) 408 if (bubble_ && GetWebContents())
397 bubble_->SetImage(icon_image()); 409 bubble_->SetImage(icon_image());
398 } 410 }
399 411
400 } // namespace 412 } // namespace
401 413
402 SpeechRecognitionBubble* SpeechRecognitionBubble::CreateNativeBubble( 414 SpeechRecognitionBubble* SpeechRecognitionBubble::CreateNativeBubble(
403 int render_process_id, 415 int render_process_id,
404 int render_view_id, 416 int render_view_id,
405 SpeechRecognitionBubble::Delegate* delegate, 417 SpeechRecognitionBubble::Delegate* delegate,
406 const gfx::Rect& element_rect) { 418 const gfx::Rect& element_rect) {
407 return new SpeechRecognitionBubbleImpl(render_process_id, render_view_id, 419 return new SpeechRecognitionBubbleImpl(render_process_id, render_view_id,
408 delegate, element_rect); 420 delegate, element_rect);
409 } 421 }
OLDNEW
« 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