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

Side by Side Diff: chrome/browser/plugin_exceptions_table_model.cc

Issue 7977042: Get rid of synchronous calls to getting plugins to help with http://codereview.chromium.org/79800... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/plugin_exceptions_table_model.h"
6
7 #include "base/auto_reset.h"
8 #include "base/sys_string_conversions.h"
9 #include "base/utf_string_conversions.h"
10 #include "chrome/common/chrome_notification_types.h"
11 #include "content/common/notification_service.h"
12 #include "grit/generated_resources.h"
13 #include "ui/base/l10n/l10n_util.h"
14 #include "ui/base/models/table_model_observer.h"
15
16 PluginExceptionsTableModel::PluginExceptionsTableModel(
17 HostContentSettingsMap* content_settings_map,
18 HostContentSettingsMap* otr_content_settings_map)
19 : map_(content_settings_map),
20 otr_map_(otr_content_settings_map),
21 updates_disabled_(false),
22 observer_(NULL) {
23 registrar_.Add(this, chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED,
24 Source<HostContentSettingsMap>(map_));
25 if (otr_map_) {
26 registrar_.Add(this, chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED,
27 Source<HostContentSettingsMap>(otr_map_));
28 }
29 }
30
31 PluginExceptionsTableModel::~PluginExceptionsTableModel() {
32 }
33
34 bool PluginExceptionsTableModel::CanRemoveRows(const Rows& rows) const {
35 return !rows.empty();
36 }
37
38 void PluginExceptionsTableModel::RemoveRows(const Rows& rows) {
39 AutoReset<bool> tmp(&updates_disabled_, true);
40 bool reload_all = false;
41 // Iterate over the rows starting with the highest ones so we can delete
42 // entries from |settings_| without the other indices shifting.
43 for (Rows::const_reverse_iterator it = rows.rbegin();
44 it != rows.rend(); ++it) {
45 DCHECK_LT(*it, settings_.size());
46 SettingsEntry entry = settings_[*it];
47 HostContentSettingsMap* map = entry.is_otr ? otr_map_ : map_;
48 map->SetContentSetting(entry.pattern,
49 ContentSettingsPattern::Wildcard(),
50 CONTENT_SETTINGS_TYPE_PLUGINS,
51 resources_[entry.plugin_id],
52 CONTENT_SETTING_DEFAULT);
53 settings_.erase(settings_.begin() + *it);
54 row_counts_[entry.plugin_id]--;
55 if (!reload_all) {
56 // If we remove the last exception for a plugin, recreate all groups
57 // to get correct IDs.
58 if (row_counts_[entry.plugin_id] == 0) {
59 reload_all = true;
60 } else {
61 if (observer_)
62 observer_->OnItemsRemoved(*it, 1);
63 }
64 }
65 }
66 if (reload_all) {
67 // This also notifies the observer.
68 ReloadSettings();
69 }
70 }
71
72 void PluginExceptionsTableModel::RemoveAll() {
73 AutoReset<bool> tmp(&updates_disabled_, true);
74 map_->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_PLUGINS);
75 if (otr_map_)
76 otr_map_->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_PLUGINS);
77
78 ClearSettings();
79 if (observer_)
80 observer_->OnModelChanged();
81 }
82
83 int PluginExceptionsTableModel::RowCount() {
84 return settings_.size();
85 }
86
87 string16 PluginExceptionsTableModel::GetText(int row, int column_id) {
88 DCHECK_GE(row, 0);
89 DCHECK_LT(row, static_cast<int>(settings_.size()));
90 SettingsEntry& entry = settings_[row];
91 if (column_id == IDS_EXCEPTIONS_PATTERN_HEADER ||
92 column_id == IDS_EXCEPTIONS_HOSTNAME_HEADER) {
93 return UTF8ToUTF16(entry.pattern.ToString());
94 } else if (column_id == IDS_EXCEPTIONS_ACTION_HEADER) {
95 switch (entry.setting) {
96 case CONTENT_SETTING_ALLOW:
97 return l10n_util::GetStringUTF16(IDS_EXCEPTIONS_ALLOW_BUTTON);
98 case CONTENT_SETTING_BLOCK:
99 return l10n_util::GetStringUTF16(IDS_EXCEPTIONS_BLOCK_BUTTON);
100 default:
101 NOTREACHED();
102 }
103 } else {
104 NOTREACHED();
105 }
106 return string16();
107 }
108
109 bool PluginExceptionsTableModel::HasGroups() {
110 return true;
111 }
112
113 void PluginExceptionsTableModel::SetObserver(ui::TableModelObserver* observer) {
114 observer_ = observer;
115 }
116
117 ui::TableModel::Groups PluginExceptionsTableModel::GetGroups() {
118 return groups_;
119 }
120
121 int PluginExceptionsTableModel::GetGroupID(int row) {
122 DCHECK_LT(row, static_cast<int>(settings_.size()));
123 return settings_[row].plugin_id;
124 }
125
126 void PluginExceptionsTableModel::Observe(int type,
127 const NotificationSource& source,
128 const NotificationDetails& details) {
129 if (!updates_disabled_)
130 ReloadSettings();
131 }
132
133 void PluginExceptionsTableModel::ClearSettings() {
134 settings_.clear();
135 groups_.clear();
136 row_counts_.clear();
137 resources_.clear();
138 }
139
140 void PluginExceptionsTableModel::GetPlugins(
141 std::vector<webkit::npapi::PluginGroup>* plugin_groups) {
142 webkit::npapi::PluginList::Singleton()->GetPluginGroups(false, plugin_groups);
143 }
144
145 void PluginExceptionsTableModel::LoadSettings() {
146 int group_id = 0;
147 std::vector<webkit::npapi::PluginGroup> plugins;
148 GetPlugins(&plugins);
149 for (size_t i = 0; i < plugins.size(); ++i) {
150 std::string plugin = plugins[i].identifier();
151 HostContentSettingsMap::SettingsForOneType settings;
152 map_->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PLUGINS,
153 plugin,
154 &settings);
155 HostContentSettingsMap::SettingsForOneType otr_settings;
156 if (otr_map_) {
157 otr_map_->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PLUGINS,
158 plugin,
159 &otr_settings);
160 }
161 string16 title = plugins[i].GetGroupName();
162 for (HostContentSettingsMap::SettingsForOneType::iterator setting_it =
163 settings.begin();
164 setting_it != settings.end(); ++setting_it) {
165 SettingsEntry entry = {
166 setting_it->a,
167 group_id,
168 setting_it->c,
169 false
170 };
171 settings_.push_back(entry);
172 }
173 for (HostContentSettingsMap::SettingsForOneType::iterator setting_it =
174 otr_settings.begin();
175 setting_it != otr_settings.end(); ++setting_it) {
176 SettingsEntry entry = {
177 setting_it->a,
178 group_id,
179 setting_it->c,
180 true
181 };
182 settings_.push_back(entry);
183 }
184 int num_plugins = settings.size() + otr_settings.size();
185 if (num_plugins > 0) {
186 Group group = { title, group_id++ };
187 groups_.push_back(group);
188 resources_.push_back(plugin);
189 row_counts_.push_back(num_plugins);
190 }
191 }
192 }
193
194 void PluginExceptionsTableModel::ReloadSettings() {
195 ClearSettings();
196 LoadSettings();
197
198 if (observer_)
199 observer_->OnModelChanged();
200 }
OLDNEW
« no previous file with comments | « chrome/browser/plugin_exceptions_table_model.h ('k') | chrome/browser/plugin_exceptions_table_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698