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

Side by Side Diff: chrome/browser/ui/views/translate/translate_bubble_view.cc

Issue 330443004: Bug fix: Translate: leak of a ComboboxModel (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix the order of the member variables Created 6 years, 6 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/ui/views/translate/translate_bubble_view.h" 5 #include "chrome/browser/ui/views/translate/translate_bubble_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector>
10 9
11 #include "base/i18n/string_compare.h" 10 #include "base/i18n/string_compare.h"
12 #include "base/memory/singleton.h" 11 #include "base/memory/singleton.h"
13 #include "base/metrics/histogram.h" 12 #include "base/metrics/histogram.h"
14 #include "base/prefs/pref_service.h" 13 #include "base/prefs/pref_service.h"
15 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
16 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
17 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/translate/chrome_translate_client.h" 17 #include "chrome/browser/translate/chrome_translate_client.h"
19 #include "chrome/browser/translate/translate_service.h" 18 #include "chrome/browser/translate/translate_service.h"
20 #include "chrome/browser/ui/chrome_pages.h" 19 #include "chrome/browser/ui/chrome_pages.h"
21 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h" 20 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
21 #include "chrome/browser/ui/translate/translate_denial_combobox_model.h"
22 #include "chrome/common/url_constants.h" 22 #include "chrome/common/url_constants.h"
23 #include "components/translate/core/browser/translate_download_manager.h" 23 #include "components/translate/core/browser/translate_download_manager.h"
24 #include "components/translate/core/browser/translate_manager.h" 24 #include "components/translate/core/browser/translate_manager.h"
25 #include "components/translate/core/browser/translate_ui_delegate.h" 25 #include "components/translate/core/browser/translate_ui_delegate.h"
26 #include "content/public/browser/web_contents.h" 26 #include "content/public/browser/web_contents.h"
27 #include "grit/generated_resources.h" 27 #include "grit/generated_resources.h"
28 #include "ui/base/l10n/l10n_util.h" 28 #include "ui/base/l10n/l10n_util.h"
29 #include "ui/base/models/combobox_model.h" 29 #include "ui/base/models/combobox_model.h"
30 #include "ui/base/resource/resource_bundle.h" 30 #include "ui/base/resource/resource_bundle.h"
31 #include "ui/views/controls/button/checkbox.h" 31 #include "ui/views/controls/button/checkbox.h"
(...skipping 20 matching lines...) Expand all
52 views::Link* CreateLink(views::LinkListener* listener, 52 views::Link* CreateLink(views::LinkListener* listener,
53 int resource_id, 53 int resource_id,
54 int id) { 54 int id) {
55 views::Link* link = new views::Link( 55 views::Link* link = new views::Link(
56 l10n_util::GetStringUTF16(resource_id)); 56 l10n_util::GetStringUTF16(resource_id));
57 link->set_listener(listener); 57 link->set_listener(listener);
58 link->set_id(id); 58 link->set_id(id);
59 return link; 59 return link;
60 } 60 }
61 61
62 class TranslateDenialComboboxModel : public ui::ComboboxModel {
63 public:
64 enum {
65 INDEX_NOPE = 0,
66 INDEX_NEVER_TRANSLATE_LANGUAGE = 2,
67 INDEX_NEVER_TRANSLATE_SITE = 4,
68 };
69
70 explicit TranslateDenialComboboxModel(
71 const base::string16& original_language_name) {
72 items_.push_back(l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_DENY));
73 items_.push_back(base::string16());
74 items_.push_back(l10n_util::GetStringFUTF16(
75 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_LANG,
76 original_language_name));
77 items_.push_back(base::string16());
78 items_.push_back(l10n_util::GetStringUTF16(
79 IDS_TRANSLATE_BUBBLE_NEVER_TRANSLATE_SITE));
80 }
81 virtual ~TranslateDenialComboboxModel() {}
82
83 private:
84 // Overridden from ui::ComboboxModel:
85 virtual int GetItemCount() const OVERRIDE {
86 return items_.size();
87 }
88 virtual base::string16 GetItemAt(int index) OVERRIDE {
89 return items_[index];
90 }
91 virtual bool IsItemSeparatorAt(int index) OVERRIDE {
92 return items_[index].empty();
93 }
94 virtual int GetDefaultIndex() const OVERRIDE {
95 return 0;
96 }
97
98 std::vector<base::string16> items_;
99
100 DISALLOW_COPY_AND_ASSIGN(TranslateDenialComboboxModel);
101 };
102
103 } // namespace 62 } // namespace
104 63
105 // static 64 // static
106 TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = NULL; 65 TranslateBubbleView* TranslateBubbleView::translate_bubble_view_ = NULL;
107 66
108 TranslateBubbleView::~TranslateBubbleView() { 67 TranslateBubbleView::~TranslateBubbleView() {
109 // A child view could refer to a model which is owned by this class when 68 // A child view could refer to a model which is owned by this class when
110 // the child view is destructed. For example, |source_language_combobx_model_| 69 // the child view is destructed. For example, |source_language_combobx_model_|
111 // is referred by Combobox's destructor. Before destroying the models, 70 // is referred by Combobox's destructor. Before destroying the models,
112 // removing the child views is needed. 71 // removing the child views is needed.
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 view->SetVisible(view == GetCurrentView()); 398 view->SetVisible(view == GetCurrentView());
440 } 399 }
441 } 400 }
442 401
443 views::View* TranslateBubbleView::CreateViewBeforeTranslate() { 402 views::View* TranslateBubbleView::CreateViewBeforeTranslate() {
444 views::Label* message_label = new views::Label( 403 views::Label* message_label = new views::Label(
445 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE)); 404 l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_BEFORE_TRANSLATE));
446 405
447 base::string16 original_language_name = 406 base::string16 original_language_name =
448 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex()); 407 model_->GetLanguageNameAt(model_->GetOriginalLanguageIndex());
449 denial_combobox_ = new views::Combobox( 408 denial_combobox_model_.reset(
450 new TranslateDenialComboboxModel(original_language_name)); 409 new TranslateDenialComboboxModel(original_language_name));
410 denial_combobox_ = new views::Combobox(denial_combobox_model_.get());
sky 2014/06/17 16:30:38 I believe you need to explicitly destroy the combo
hajimehoshi 2014/06/18 08:33:37 |denial_combobox_model_| is initialized only once
sky 2014/06/18 16:57:19 I missed the explicit RemoveAlloChildViews(true).
451 denial_combobox_->set_id(COMBOBOX_ID_DENIAL); 411 denial_combobox_->set_id(COMBOBOX_ID_DENIAL);
452 denial_combobox_->set_listener(this); 412 denial_combobox_->set_listener(this);
453 denial_combobox_->SetStyle(views::Combobox::STYLE_ACTION); 413 denial_combobox_->SetStyle(views::Combobox::STYLE_ACTION);
454 414
455 views::View* view = new views::View(); 415 views::View* view = new views::View();
456 views::GridLayout* layout = new views::GridLayout(view); 416 views::GridLayout* layout = new views::GridLayout(view);
457 view->SetLayoutManager(layout); 417 view->SetLayoutManager(layout);
458 418
459 using views::GridLayout; 419 using views::GridLayout;
460 420
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 model_->ShouldAlwaysTranslate()); 725 model_->ShouldAlwaysTranslate());
766 } 726 }
767 727
768 base::string16 label; 728 base::string16 label;
769 if (model_->IsPageTranslatedInCurrentLanguages()) 729 if (model_->IsPageTranslatedInCurrentLanguages())
770 label = l10n_util::GetStringUTF16(IDS_DONE); 730 label = l10n_util::GetStringUTF16(IDS_DONE);
771 else 731 else
772 label = l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT); 732 label = l10n_util::GetStringUTF16(IDS_TRANSLATE_BUBBLE_ACCEPT);
773 advanced_done_button_->SetText(label); 733 advanced_done_button_->SetText(label);
774 } 734 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698