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

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

Issue 11189094: Implement sideload wipeout for Extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 2 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
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/ui/views/extensions/disabled_extensions_view.h"
6
7 #include "base/string_number_conversions.h"
8 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/extensions/extension_system.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/singleton_tabs.h"
13 #include "chrome/common/extensions/feature_switch.h"
14 #include "chrome/common/url_constants.h"
15 #include "content/public/browser/user_metrics.h"
16 #include "grit/generated_resources.h"
17 #include "grit/locale_settings.h"
18 #include "grit/theme_resources.h"
19 #include "ui/base/accessibility/accessible_view_state.h"
20 #include "ui/base/l10n/l10n_util.h"
21 #include "ui/base/resource/resource_bundle.h"
22 #include "ui/views/controls/button/text_button.h"
23 #include "ui/views/controls/label.h"
24 #include "ui/views/controls/image_view.h"
25 #include "ui/views/controls/link.h"
26 #include "ui/views/layout/grid_layout.h"
27 #include "ui/views/layout/layout_constants.h"
28 #include "ui/views/widget/widget.h"
29
30 using content::UserMetricsAction;
31
32 namespace {
33
34 // Layout constants.
35 const int kColumnPadding = 4;
36 const int kExtensionListPadding = 20;
37 const int kImagePadding = 7;
38 const int kInset = 2;
39 const int kHeadlineMessagePadding = 4;
40 const int kHeadlineRowPadding = 10;
41 const int kMessageBubblePadding = 11;
42
43 // How many extensions to show in the bubble (max).
44 const int kMaxExtensionsToShow = 7;
45
46 } // namespace
47
48 ////////////////////////////////////////////////////////////////////////////////
49 // DisabledExtensionsView
50
51 // static
52 bool DisabledExtensionsView::MaybeShow(Browser* browser,
53 views::View* anchor_view) {
54 #if defined(OS_WIN)
55 if (!extensions::FeatureSwitch::sideload_wipeout()->IsEnabled())
56 return false;
57
58 static bool done_showing_ui = false;
59 if (done_showing_ui)
60 return false; // Only show the bubble once per launch.
61
62 // Fetch all disabled extensions.
63 ExtensionService* extension_service =
64 extensions::ExtensionSystem::Get(
65 browser->profile())->extension_service();
66 scoped_ptr<const ExtensionSet> wiped_out(
67 extension_service->GenerateSideloadWipoutExtensionsSet());
68 if (wiped_out->size()) {
69 DisabledExtensionsView* bubble_delegate =
70 new DisabledExtensionsView(
71 anchor_view, browser, wiped_out.release());
72 views::BubbleDelegateView::CreateBubble(bubble_delegate);
73 bubble_delegate->StartFade(true);
74
75 done_showing_ui = true;
76 return true;
77 }
78 #endif // OS_WIN
79
80 return false;
81 }
82
83 DisabledExtensionsView::DisabledExtensionsView(
84 views::View* anchor_view,
85 Browser* browser,
86 const ExtensionSet* wiped_out)
87 : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
88 browser_(browser),
89 wiped_out_(wiped_out),
90 headline_(NULL),
91 learn_more_(NULL),
92 settings_button_(NULL),
93 dismiss_button_(NULL) {
94 set_close_on_deactivate(false);
95 set_move_with_anchor(true);
96 }
97
98 DisabledExtensionsView::~DisabledExtensionsView() {
99 }
100
101 void DisabledExtensionsView::ButtonPressed(
102 views::Button* sender, const ui::Event& event) {
sky 2012/10/19 21:41:36 nit each param on its own line.
103 if (sender == settings_button_) {
104 content::RecordAction(
105 UserMetricsAction("DisabledExtension_SettingsButton"));
106 browser_->OpenURL(
107 content::OpenURLParams(GURL(chrome::kChromeUIExtensionsURL),
108 content::Referrer(),
109 NEW_FOREGROUND_TAB,
110 content::PAGE_TRANSITION_LINK,
111 false));
112
113 } else if (sender == dismiss_button_) {
114 content::RecordAction(UserMetricsAction("DisabledExtension_Dismiss"));
115 // No action required. Close will happen below.
116 } else {
117 NOTREACHED();
118 }
119
120 GetWidget()->Close();
121 }
122
123 void DisabledExtensionsView::LinkClicked(
124 views::Link* source, int event_flags) {
125 content::RecordAction(UserMetricsAction("DisabledExtension_LearnMore"));
126 browser_->OpenURL(
127 content::OpenURLParams(GURL(chrome::kSideloadWipeoutHelpURL),
128 content::Referrer(),
129 NEW_FOREGROUND_TAB,
130 content::PAGE_TRANSITION_LINK,
131 false));
132
133 GetWidget()->Close();
134 }
135
136 void DisabledExtensionsView::GetAccessibleState(
137 ui::AccessibleViewState* state) {
138 state->role = ui::AccessibilityTypes::ROLE_ALERT;
139 }
140
141 void DisabledExtensionsView::ViewHierarchyChanged(
142 bool is_add, View* parent, View* child) {
143 if (is_add && child == this) {
144 GetWidget()->NotifyAccessibilityEvent(
145 this, ui::AccessibilityTypes::EVENT_ALERT, true);
146 }
147 }
148
149 void DisabledExtensionsView::Init() {
150 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
151
152 views::GridLayout* layout = views::GridLayout::CreatePanel(this);
153 layout->SetInsets(kInset, kInset, kInset, kInset);
154 SetLayoutManager(layout);
155
156 const int headline_column_set_id = 0;
157 views::ColumnSet* top_columns = layout->AddColumnSet(headline_column_set_id);
158 top_columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
159 0, views::GridLayout::USE_PREF, 0, 0);
160 top_columns->AddPaddingColumn(0, kImagePadding);
161 top_columns->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
162 0, views::GridLayout::USE_PREF, 0, 0);
163 top_columns->AddPaddingColumn(1, 0);
164 layout->StartRow(0, headline_column_set_id);
165
166 views::ImageView* image = new views::ImageView();
167 image->SetImage(rb.GetImageSkiaNamed(IDR_EXTENSIONS_PUZZLE_PIECE));
168 layout->AddView(image);
169
170 headline_ = new views::Label();
171 headline_->SetFont(rb.GetFont(ui::ResourceBundle::MediumFont));
172 headline_->SetText(l10n_util::GetStringUTF16(
173 IDS_OPTIONS_SIDELOAD_WIPEOUT_BUBBLE_HEADLINE));
174 layout->AddView(headline_);
175
176 layout->AddPaddingRow(0, kHeadlineRowPadding);
177
178 const int text_column_set_id = 1;
179 views::ColumnSet* upper_columns = layout->AddColumnSet(text_column_set_id);
180 upper_columns->AddPaddingColumn(0, kColumnPadding);
181 upper_columns->AddColumn(
182 views::GridLayout::LEADING, views::GridLayout::LEADING,
183 0, views::GridLayout::USE_PREF, 0, 0);
184 layout->StartRow(0, text_column_set_id);
185
186 views::Label* message = new views::Label();
187 message->SetMultiLine(true);
188 message->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
189 message->SetText(
190 l10n_util::GetStringUTF16(IDS_OPTIONS_SIDELOAD_WIPEOUT_WHAT_HAPPENED));
191 message->SizeToFit(views::Widget::GetLocalizedContentsWidth(
192 IDS_DISABLED_EXTENSIONS_BUBBLE_WIDTH_CHARS));
193 layout->AddView(message);
194
195 const int extension_list_column_set_id = 2;
196 views::ColumnSet* middle_columns =
197 layout->AddColumnSet(extension_list_column_set_id);
198 middle_columns->AddPaddingColumn(0, kExtensionListPadding);
199 middle_columns->AddColumn(
200 views::GridLayout::LEADING, views::GridLayout::CENTER,
201 0, views::GridLayout::USE_PREF, 0, 0);
202
203 layout->StartRowWithPadding(0, extension_list_column_set_id,
204 0, kHeadlineMessagePadding);
205 views::Label* extensions = new views::Label();
206 extensions->SetMultiLine(true);
207 extensions->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
208 extensions->SetFont(extensions->font().DeriveFont(0, gfx::Font::ITALIC));
209
210 std::vector<string16> extension_list;
211 int count = 0;
212 for (ExtensionSet::const_iterator iter = wiped_out_->begin();
213 iter != wiped_out_->end() && count < kMaxExtensionsToShow; ++iter) {
214 const extensions::Extension* extension = *iter;
215 extension_list.push_back(ASCIIToUTF16("- ") +
216 UTF8ToUTF16(extension->name()));
217 count++;
218 }
219
220 if (count == kMaxExtensionsToShow) {
221 string16 difference =
222 base::IntToString16(wiped_out_->size() - kMaxExtensionsToShow);
223 extension_list.push_back(ASCIIToUTF16("- ") +
224 l10n_util::GetStringFUTF16(IDS_OPTIONS_SIDELOAD_WIPEOUT_OVERFLOW,
225 difference));
226 }
227
228 extensions->SetText(JoinString(extension_list, ASCIIToUTF16("\n")));
229 extensions->SizeToFit(views::Widget::GetLocalizedContentsWidth(
230 IDS_DISABLED_EXTENSIONS_BUBBLE_WIDTH_CHARS));
231 layout->AddView(extensions);
232
233 layout->StartRowWithPadding(
234 0, text_column_set_id, 0, kHeadlineMessagePadding);
235 views::Label* recourse = new views::Label();
236 recourse->SetMultiLine(true);
237 recourse->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
238 recourse->SetText(
239 l10n_util::GetStringUTF16(IDS_OPTIONS_SIDELOAD_WIPEOUT_RECOURSE));
240 recourse->SizeToFit(views::Widget::GetLocalizedContentsWidth(
241 IDS_DISABLED_EXTENSIONS_BUBBLE_WIDTH_CHARS));
242 layout->AddView(recourse);
243
244 const int action_row_column_set_id = 3;
245 views::ColumnSet* bottom_columns =
246 layout->AddColumnSet(action_row_column_set_id);
247 bottom_columns->AddPaddingColumn(0, kColumnPadding);
248 bottom_columns->AddColumn(views::GridLayout::LEADING,
249 views::GridLayout::TRAILING, 0, views::GridLayout::USE_PREF, 0, 0);
250 bottom_columns->AddPaddingColumn(1, views::kRelatedButtonHSpacing);
251 bottom_columns->AddColumn(views::GridLayout::TRAILING,
252 views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0);
253 bottom_columns->AddPaddingColumn(0, views::kRelatedButtonHSpacing);
254 bottom_columns->AddColumn(views::GridLayout::TRAILING,
255 views::GridLayout::CENTER, 0, views::GridLayout::USE_PREF, 0, 0);
256 layout->StartRowWithPadding(0, action_row_column_set_id,
257 0, kMessageBubblePadding);
258
259 learn_more_ = new views::Link(l10n_util::GetStringUTF16(IDS_LEARN_MORE));
260 learn_more_->set_listener(this);
261 layout->AddView(learn_more_);
262
263 settings_button_ = new views::NativeTextButton(this,
264 l10n_util::GetStringUTF16(IDS_OPTIONS_SIDELOAD_WIPEOUT_SETTINGS));
265 settings_button_->SetIsDefault(true);
266 layout->AddView(settings_button_);
267 dismiss_button_ = new views::NativeTextButton(this,
268 l10n_util::GetStringUTF16(IDS_OPTIONS_SIDELOAD_WIPEOUT_DISMISS));
269 dismiss_button_->SetFont(
270 dismiss_button_->font().DeriveFont(0, gfx::Font::BOLD));
271 layout->AddView(dismiss_button_);
272
273 content::RecordAction(
274 UserMetricsAction("DisabledExtensionNotificationShown"));
275 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698