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

Side by Side Diff: chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc

Issue 412483006: Fixed bug where Uninstall dialog forces its own widget to close twice (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Made ExtensionUninstallDialogViews notify ExtensionUninstallDialogDelegateView when it closes, so t… Created 6 years, 4 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/extensions/extension_uninstall_dialog.h" 5 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 21 matching lines...) Expand all
32 // Views implementation of the uninstall dialog. 32 // Views implementation of the uninstall dialog.
33 class ExtensionUninstallDialogViews 33 class ExtensionUninstallDialogViews
34 : public extensions::ExtensionUninstallDialog { 34 : public extensions::ExtensionUninstallDialog {
35 public: 35 public:
36 ExtensionUninstallDialogViews( 36 ExtensionUninstallDialogViews(
37 Profile* profile, 37 Profile* profile,
38 gfx::NativeWindow parent, 38 gfx::NativeWindow parent,
39 extensions::ExtensionUninstallDialog::Delegate* delegate); 39 extensions::ExtensionUninstallDialog::Delegate* delegate);
40 virtual ~ExtensionUninstallDialogViews(); 40 virtual ~ExtensionUninstallDialogViews();
41 41
42 // Called when the ExtensionUninstallDialogDelegate has been destroyed to make
43 // sure we invalidate pointers.
44 void DialogDelegateDestroyed() { view_ = NULL; }
45
42 // Forwards the accept and cancels to the delegate. 46 // Forwards the accept and cancels to the delegate.
43 void ExtensionUninstallAccepted(); 47 void ExtensionUninstallAccepted();
44 void ExtensionUninstallCanceled(); 48 void ExtensionUninstallCanceled();
45 49
46 private: 50 private:
47 virtual void Show() OVERRIDE; 51 virtual void Show() OVERRIDE;
48 52
49 ExtensionUninstallDialogDelegateView* view_; 53 ExtensionUninstallDialogDelegateView* view_;
50 54
51 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogViews); 55 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogViews);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 } 118 }
115 119
116 void ExtensionUninstallDialogViews::Show() { 120 void ExtensionUninstallDialogViews::Show() {
117 view_ = new ExtensionUninstallDialogDelegateView( 121 view_ = new ExtensionUninstallDialogDelegateView(
118 this, extension_, triggering_extension_, &icon_); 122 this, extension_, triggering_extension_, &icon_);
119 CreateBrowserModalDialogViews(view_, parent_)->Show(); 123 CreateBrowserModalDialogViews(view_, parent_)->Show();
120 } 124 }
121 125
122 void ExtensionUninstallDialogViews::ExtensionUninstallAccepted() { 126 void ExtensionUninstallDialogViews::ExtensionUninstallAccepted() {
123 // The widget gets destroyed when the dialog is accepted. 127 // The widget gets destroyed when the dialog is accepted.
128 view_->DialogDestroyed();
124 view_ = NULL; 129 view_ = NULL;
125 delegate_->ExtensionUninstallAccepted(); 130 delegate_->ExtensionUninstallAccepted();
126 } 131 }
127 132
128 void ExtensionUninstallDialogViews::ExtensionUninstallCanceled() { 133 void ExtensionUninstallDialogViews::ExtensionUninstallCanceled() {
129 // The widget gets destroyed when the dialog is canceled. 134 // The widget gets destroyed when the dialog is canceled.
135 view_->DialogDestroyed();
130 view_ = NULL; 136 view_ = NULL;
131 delegate_->ExtensionUninstallCanceled(); 137 delegate_->ExtensionUninstallCanceled();
132 } 138 }
133 139
134 ExtensionUninstallDialogDelegateView::ExtensionUninstallDialogDelegateView( 140 ExtensionUninstallDialogDelegateView::ExtensionUninstallDialogDelegateView(
135 ExtensionUninstallDialogViews* dialog_view, 141 ExtensionUninstallDialogViews* dialog_view,
136 const extensions::Extension* extension, 142 const extensions::Extension* extension,
137 const extensions::Extension* triggering_extension, 143 const extensions::Extension* triggering_extension,
138 gfx::ImageSkia* image) 144 gfx::ImageSkia* image)
139 : dialog_(dialog_view), 145 : dialog_(dialog_view),
140 triggered_by_extension_(triggering_extension != NULL) { 146 triggered_by_extension_(triggering_extension != NULL) {
141 // Scale down to icon size, but allow smaller icons (don't scale up). 147 // Scale down to icon size, but allow smaller icons (don't scale up).
142 gfx::Size size(image->width(), image->height()); 148 gfx::Size size(image->width(), image->height());
143 if (size.width() > kIconSize || size.height() > kIconSize) 149 if (size.width() > kIconSize || size.height() > kIconSize)
144 size = gfx::Size(kIconSize, kIconSize); 150 size = gfx::Size(kIconSize, kIconSize);
145 icon_ = new views::ImageView(); 151 icon_ = new views::ImageView();
146 icon_->SetImageSize(size); 152 icon_->SetImageSize(size);
147 icon_->SetImage(*image); 153 icon_->SetImage(*image);
148 AddChildView(icon_); 154 AddChildView(icon_);
149 155
150 heading_ = new views::Label(base::UTF8ToUTF16(dialog_->GetHeadingText())); 156 heading_ = new views::Label(base::UTF8ToUTF16(dialog_->GetHeadingText()));
151 heading_->SetMultiLine(true); 157 heading_->SetMultiLine(true);
152 heading_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 158 heading_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
153 AddChildView(heading_); 159 AddChildView(heading_);
154 } 160 }
155 161
156 ExtensionUninstallDialogDelegateView::~ExtensionUninstallDialogDelegateView() { 162 ExtensionUninstallDialogDelegateView::~ExtensionUninstallDialogDelegateView() {
163 // If we're here, 2 things could have happened. Either the user closed the
164 // dialog nicely and one of ExtensionUninstallAccepted or
165 // ExtensionUninstallCanceled has been called (in which case dialog_ will be
166 // NULL), *or* neither of them have been called and we are being forced closed
167 // by our parent widget. In this case, we need to make sure to notify dialog_
168 // not to call us again, since we're about to be freed by the Widget
169 // framework.
170 if (dialog_)
171 dialog_->DialogDelegateDestroyed();
157 } 172 }
158 173
159 base::string16 ExtensionUninstallDialogDelegateView::GetDialogButtonLabel( 174 base::string16 ExtensionUninstallDialogDelegateView::GetDialogButtonLabel(
160 ui::DialogButton button) const { 175 ui::DialogButton button) const {
161 return l10n_util::GetStringUTF16((button == ui::DIALOG_BUTTON_OK) ? 176 return l10n_util::GetStringUTF16((button == ui::DIALOG_BUTTON_OK) ?
162 IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON : IDS_CANCEL); 177 IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON : IDS_CANCEL);
163 } 178 }
164 179
165 bool ExtensionUninstallDialogDelegateView::Accept() { 180 bool ExtensionUninstallDialogDelegateView::Accept() {
166 if (dialog_) 181 if (dialog_)
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 234
220 } // namespace 235 } // namespace
221 236
222 // static 237 // static
223 extensions::ExtensionUninstallDialog* 238 extensions::ExtensionUninstallDialog*
224 extensions::ExtensionUninstallDialog::Create(Profile* profile, 239 extensions::ExtensionUninstallDialog::Create(Profile* profile,
225 gfx::NativeWindow parent, 240 gfx::NativeWindow parent,
226 Delegate* delegate) { 241 Delegate* delegate) {
227 return new ExtensionUninstallDialogViews(profile, parent, delegate); 242 return new ExtensionUninstallDialogViews(profile, parent, delegate);
228 } 243 }
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