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

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

Issue 7920023: Fix crashes related to the extension uninstall dialog. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make Show() pure virtual Created 9 years, 3 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/compiler_specific.h" 6 #include "base/compiler_specific.h"
7 #include "base/string_util.h" 7 #include "base/string_util.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/extensions/extension_uninstall_dialog.h" 9 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
10 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/browser_list.h" 11 #include "chrome/browser/ui/browser_list.h"
12 #include "chrome/browser/ui/browser_window.h" 12 #include "chrome/browser/ui/browser_window.h"
13 #include "chrome/browser/ui/views/window.h" 13 #include "chrome/browser/ui/views/window.h"
14 #include "chrome/common/extensions/extension.h" 14 #include "chrome/common/extensions/extension.h"
15 #include "grit/generated_resources.h" 15 #include "grit/generated_resources.h"
16 #include "ui/base/l10n/l10n_util.h" 16 #include "ui/base/l10n/l10n_util.h"
17 #include "ui/gfx/compositor/compositor.h"
18 #include "ui/gfx/compositor/layer.h"
17 #include "views/controls/image_view.h" 19 #include "views/controls/image_view.h"
18 #include "views/controls/label.h" 20 #include "views/controls/label.h"
19 #include "views/layout/layout_constants.h" 21 #include "views/layout/layout_constants.h"
20 #include "views/view.h" 22 #include "views/view.h"
21 #include "views/widget/widget.h" 23 #include "views/widget/widget.h"
22 #include "views/window/dialog_delegate.h" 24 #include "views/window/dialog_delegate.h"
23 25
24 namespace { 26 namespace {
25 27
26 const int kRightColumnWidth = 210; 28 const int kRightColumnWidth = 210;
27 const int kIconSize = 69; 29 const int kIconSize = 69;
28 30
29 class ExtensionUninstallDialogView : public views::DialogDelegateView { 31 class ExtensionUninstallDialogDelegateView;
32
33 // Views implementation of the uninstall dialog.
34 class ExtensionUninstallDialogViews : public ExtensionUninstallDialog {
30 public: 35 public:
31 ExtensionUninstallDialogView(ExtensionUninstallDialog::Delegate* delegate, 36 ExtensionUninstallDialogViews(Profile* profile,
32 const Extension* extension, 37 ExtensionUninstallDialog::Delegate* delegate);
33 SkBitmap* icon) 38 virtual ~ExtensionUninstallDialogViews();
34 : delegate_(delegate), 39
35 icon_(NULL) { 40 // Forwards the accept and cancels to the delegate.
36 // Scale down to icon size, but allow smaller icons (don't scale up). 41 void ExtensionUninstallAccepted();
37 gfx::Size size(icon->width(), icon->height()); 42 void ExtensionUninstallCanceled();
38 if (size.width() > kIconSize || size.height() > kIconSize) 43
39 size = gfx::Size(kIconSize, kIconSize); 44 ExtensionUninstallDialogDelegateView* view() { return view_; }
40 icon_ = new views::ImageView();
41 icon_->SetImageSize(size);
42 icon_->SetImage(*icon);
43 AddChildView(icon_);
44
45 heading_ = new views::Label(UTF16ToWide(
46 l10n_util::GetStringFUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_HEADING,
47 UTF8ToUTF16(extension->name()))));
48 heading_->SetMultiLine(true);
49 heading_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
50 AddChildView(heading_);
51 }
52 45
53 private: 46 private:
54 // views::DialogDelegateView: 47 void Show() OVERRIDE;
48
49 ExtensionUninstallDialogDelegateView* view_;
50
51 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogViews);
52 };
53
54 // The dialog's view, owned by the views framework.
55 class ExtensionUninstallDialogDelegateView : public views::DialogDelegateView {
56 public:
57 ExtensionUninstallDialogDelegateView(
58 ExtensionUninstallDialogViews* dialog_view,
59 const Extension* extension,
60 SkBitmap* icon);
61 virtual ~ExtensionUninstallDialogDelegateView();
62
63 // Called when the ExtensionUninstallDialog has been destroyed to make sure
64 // we invalidate pointers.
65 void DialogDestroyed() { dialog_ = NULL; }
66
67 private:
68 // views::DialogDelegate:
55 virtual std::wstring GetDialogButtonLabel( 69 virtual std::wstring GetDialogButtonLabel(
56 MessageBoxFlags::DialogButton button) const OVERRIDE { 70 MessageBoxFlags::DialogButton button) const OVERRIDE;
57 switch (button) {
58 case MessageBoxFlags::DIALOGBUTTON_OK:
59 return UTF16ToWide(
60 l10n_util::GetStringUTF16(
61 IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
62 case MessageBoxFlags::DIALOGBUTTON_CANCEL:
63 return UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANCEL));
64 default:
65 NOTREACHED();
66 return L"";
67 }
68 }
69 71
70 virtual int GetDefaultDialogButton() const OVERRIDE { 72 virtual int GetDefaultDialogButton() const OVERRIDE {
71 return MessageBoxFlags::DIALOGBUTTON_CANCEL; 73 return MessageBoxFlags::DIALOGBUTTON_CANCEL;
72 } 74 }
73 75
74 virtual bool Accept() OVERRIDE { 76 virtual bool Accept() OVERRIDE;
75 delegate_->ExtensionDialogAccepted(); 77 virtual bool Cancel() OVERRIDE;
76 return true;
77 }
78
79 virtual bool Cancel() OVERRIDE {
80 delegate_->ExtensionDialogCanceled();
81 return true;
82 }
83 78
84 // views::WidgetDelegate: 79 // views::WidgetDelegate:
85 virtual bool IsModal() const OVERRIDE { return true; } 80 virtual bool IsModal() const OVERRIDE { return true; }
86 virtual std::wstring GetWindowTitle() const OVERRIDE { 81 virtual views::View* GetContentsView() OVERRIDE { return this; }
87 return UTF16ToWide( 82 virtual std::wstring GetWindowTitle() const OVERRIDE;
88 l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE));
89 }
90 virtual views::View* GetContentsView() { return this; }
91 83
92 // views::View: 84 // views::View:
93 virtual gfx::Size GetPreferredSize() OVERRIDE { 85 virtual gfx::Size GetPreferredSize() OVERRIDE;
94 int width = kRightColumnWidth; 86
95 width += kIconSize; 87 virtual void Layout() OVERRIDE;
96 width += views::kPanelHorizMargin * 3; 88
97 89 ExtensionUninstallDialogViews* dialog_;
98 int height = views::kPanelVertMargin * 2; 90
99 height += heading_->GetHeightForWidth(kRightColumnWidth);
100
101 return gfx::Size(width,
102 std::max(height, kIconSize + views::kPanelVertMargin * 2));
103 }
104
105 virtual void Layout() OVERRIDE {
106 int x = views::kPanelHorizMargin;
107 int y = views::kPanelVertMargin;
108
109 heading_->SizeToFit(kRightColumnWidth);
110
111 if (heading_->height() <= kIconSize) {
112 icon_->SetBounds(x, y, kIconSize, kIconSize);
113 x += kIconSize;
114 x += views::kPanelHorizMargin;
115
116 heading_->SetX(x);
117 heading_->SetY(y + (kIconSize - heading_->height()) / 2);
118 } else {
119 icon_->SetBounds(x,
120 y + (heading_->height() - kIconSize) / 2,
121 kIconSize,
122 kIconSize);
123 x += kIconSize;
124 x += views::kPanelHorizMargin;
125
126 heading_->SetX(x);
127 heading_->SetY(y);
128 }
129 }
130
131 ExtensionUninstallDialog::Delegate* delegate_;
132 views::ImageView* icon_; 91 views::ImageView* icon_;
133 views::Label* heading_; 92 views::Label* heading_;
134 93
135 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogView); 94 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallDialogDelegateView);
136 }; 95 };
137 96
138 } // namespace 97 ExtensionUninstallDialogViews::ExtensionUninstallDialogViews(
139 98 Profile* profile, ExtensionUninstallDialog::Delegate* delegate)
140 // static 99 : ExtensionUninstallDialog(profile, delegate) {}
141 void ExtensionUninstallDialog::Show( 100
142 Profile* profile, 101 ExtensionUninstallDialogViews::~ExtensionUninstallDialogViews() {
143 ExtensionUninstallDialog::Delegate* delegate, 102 // Close the widget (the views framework will delete view_).
144 const Extension* extension, 103 if (view_) {
145 SkBitmap* icon) { 104 view_->DialogDestroyed();
146 Browser* browser = BrowserList::GetLastActiveWithProfile(profile); 105 view_->GetWidget()->CloseNow();
106 }
107 }
108
109 void ExtensionUninstallDialogViews::Show() {
110 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
147 if (!browser) { 111 if (!browser) {
148 delegate->ExtensionDialogCanceled(); 112 delegate_->ExtensionUninstallCanceled();
149 return; 113 return;
150 } 114 }
151 115
152 BrowserWindow* window = browser->window(); 116 BrowserWindow* window = browser->window();
153 if (!window) { 117 if (!window) {
154 delegate->ExtensionDialogCanceled(); 118 delegate_->ExtensionUninstallCanceled();
155 return; 119 return;
156 } 120 }
157 121
158 browser::CreateViewsWindow(window->GetNativeHandle(), 122 view_ = new ExtensionUninstallDialogDelegateView(this, extension_, &icon_);
159 new ExtensionUninstallDialogView(delegate, extension, icon))->Show(); 123 browser::CreateViewsWindow(window->GetNativeHandle(), view_)->Show();
160 } 124 }
125
126 void ExtensionUninstallDialogViews::ExtensionUninstallAccepted() {
127 // The widget gets destroyed when the dialog is accepted.
128 view_ = NULL;
129 delegate_->ExtensionUninstallAccepted();
130 }
131
132 void ExtensionUninstallDialogViews::ExtensionUninstallCanceled() {
133 // The widget gets destroyed when the dialog is canceled.
134 view_ = NULL;
135 delegate_->ExtensionUninstallCanceled();
136 }
137
138 ExtensionUninstallDialogDelegateView::ExtensionUninstallDialogDelegateView(
139 ExtensionUninstallDialogViews* dialog_view,
140 const Extension* extension,
141 SkBitmap* icon)
142 : dialog_(dialog_view) {
143 // Scale down to icon size, but allow smaller icons (don't scale up).
144 gfx::Size size(icon->width(), icon->height());
145 if (size.width() > kIconSize || size.height() > kIconSize)
146 size = gfx::Size(kIconSize, kIconSize);
147 icon_ = new views::ImageView();
148 icon_->SetImageSize(size);
149 icon_->SetImage(*icon);
150 AddChildView(icon_);
151
152 heading_ = new views::Label(UTF16ToWide(
153 l10n_util::GetStringFUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_HEADING,
154 UTF8ToUTF16(extension->name()))));
155 heading_->SetMultiLine(true);
156 AddChildView(heading_);
157 }
158
159 ExtensionUninstallDialogDelegateView::~ExtensionUninstallDialogDelegateView() {
160 }
161
162 std::wstring ExtensionUninstallDialogDelegateView::GetDialogButtonLabel(
163 MessageBoxFlags::DialogButton button) const {
164 switch (button) {
165 case MessageBoxFlags::DIALOGBUTTON_OK:
166 return UTF16ToWide(
167 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_UNINSTALL_BUTTON));
168 case MessageBoxFlags::DIALOGBUTTON_CANCEL:
169 return UTF16ToWide(l10n_util::GetStringUTF16(IDS_CANCEL));
170 default:
171 NOTREACHED();
172 return L"";
173 }
174 }
175
176 bool ExtensionUninstallDialogDelegateView::Accept() {
177 if (dialog_)
178 dialog_->ExtensionUninstallAccepted();
179 return true;
180 }
181
182 bool ExtensionUninstallDialogDelegateView::Cancel() {
183 if (dialog_)
184 dialog_->ExtensionUninstallCanceled();
185 return true;
186 }
187
188 std::wstring ExtensionUninstallDialogDelegateView::GetWindowTitle() const {
189 return UTF16ToWide(
190 l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_PROMPT_TITLE));
191 }
192
193
194 gfx::Size ExtensionUninstallDialogDelegateView::GetPreferredSize() {
195 int width = kRightColumnWidth;
196 width += kIconSize;
197 width += views::kPanelHorizMargin * 3;
198
199 int height = views::kPanelVertMargin * 2;
200 height += heading_->GetHeightForWidth(kRightColumnWidth);
201
202 return gfx::Size(width,
203 std::max(height, kIconSize + views::kPanelVertMargin * 2));
204 }
205
206 void ExtensionUninstallDialogDelegateView::Layout() {
207 int x = views::kPanelHorizMargin;
208 int y = views::kPanelVertMargin;
209
210 heading_->SizeToFit(kRightColumnWidth);
211
212 if (heading_->height() <= kIconSize) {
213 icon_->SetBounds(x, y, kIconSize, kIconSize);
214 x += kIconSize;
215 x += views::kPanelHorizMargin;
216
217 heading_->SetX(x);
218 heading_->SetY(y + (kIconSize - heading_->height()) / 2);
219 } else {
220 icon_->SetBounds(x,
221 y + (heading_->height() - kIconSize) / 2,
222 kIconSize,
223 kIconSize);
224 x += kIconSize;
225 x += views::kPanelHorizMargin;
226
227 heading_->SetX(x);
228 heading_->SetY(y);
229 }
230 }
231
232 } // namespace
233
234 // static
235 ExtensionUninstallDialog* ExtensionUninstallDialog::Create(
236 Profile* profile, Delegate* delegate) {
237 return new ExtensionUninstallDialogViews(profile, delegate);
238 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/panels/panel_settings_menu_model.cc ('k') | chrome/browser/ui/webui/ntp/app_launcher_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698