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

Side by Side Diff: chrome/browser/ui/webui/policy_ui.cc

Issue 12084065: Convert chrome://policy to new WebUI style (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed tag names from CSS selectors that unambiguously match on id anyway. Created 7 years, 10 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) 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/ui/webui/policy_ui.h" 5 #include "chrome/browser/ui/webui/policy_ui.h"
6 6
7 #include <vector>
8
9 #include "base/bind.h" 7 #include "base/bind.h"
10 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
11 #include "base/callback.h" 9 #include "base/callback.h"
12 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
13 #include "base/hash_tables.h" 11 #include "base/logging.h"
14 #include "base/stl_util.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/string16.h"
15 #include "base/time.h" 15 #include "base/time.h"
16 #include "base/utf_string_conversions.h" 16 #include "base/values.h"
17 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/policy/browser_policy_connector.h" 18 #include "chrome/browser/policy/browser_policy_connector.h"
19 #include "chrome/browser/policy/cloud_policy_client.h" 19 #include "chrome/browser/policy/cloud_policy_client.h"
20 #include "chrome/browser/policy/cloud_policy_constants.h"
20 #include "chrome/browser/policy/cloud_policy_core.h" 21 #include "chrome/browser/policy/cloud_policy_core.h"
21 #include "chrome/browser/policy/cloud_policy_refresh_scheduler.h" 22 #include "chrome/browser/policy/cloud_policy_refresh_scheduler.h"
22 #include "chrome/browser/policy/cloud_policy_store.h" 23 #include "chrome/browser/policy/cloud_policy_store.h"
23 #include "chrome/browser/policy/cloud_policy_validator.h" 24 #include "chrome/browser/policy/cloud_policy_validator.h"
25 #include "chrome/browser/policy/configuration_policy_handler_list.h"
26 #include "chrome/browser/policy/device_local_account_policy_service.h"
24 #include "chrome/browser/policy/message_util.h" 27 #include "chrome/browser/policy/message_util.h"
25 #include "chrome/browser/policy/policy_error_map.h" 28 #include "chrome/browser/policy/policy_error_map.h"
29 #include "chrome/browser/policy/policy_map.h"
26 #include "chrome/browser/policy/policy_service.h" 30 #include "chrome/browser/policy/policy_service.h"
31 #include "chrome/browser/policy/policy_types.h"
27 #include "chrome/browser/policy/proto/device_management_backend.pb.h" 32 #include "chrome/browser/policy/proto/device_management_backend.pb.h"
28 #include "chrome/browser/prefs/pref_service.h"
29 #include "chrome/browser/profiles/profile.h" 33 #include "chrome/browser/profiles/profile.h"
30 #include "chrome/common/pref_names.h"
31 #include "chrome/common/time_format.h" 34 #include "chrome/common/time_format.h"
32 #include "chrome/common/url_constants.h" 35 #include "chrome/common/url_constants.h"
33 #include "content/public/browser/web_contents.h"
34 #include "content/public/browser/web_ui.h" 36 #include "content/public/browser/web_ui.h"
35 #include "content/public/browser/web_ui_data_source.h" 37 #include "content/public/browser/web_ui_data_source.h"
38 #include "content/public/browser/web_ui_message_handler.h"
39 #include "google_apis/gaia/gaia_auth_util.h"
36 #include "grit/browser_resources.h" 40 #include "grit/browser_resources.h"
37 #include "grit/generated_resources.h" 41 #include "grit/generated_resources.h"
42 #include "policy/policy_constants.h"
38 #include "ui/base/l10n/l10n_util.h" 43 #include "ui/base/l10n/l10n_util.h"
39 44
40 #if defined(OS_CHROMEOS) 45 #if defined(OS_CHROMEOS)
41 #include "chrome/browser/chromeos/login/user_manager.h" 46 #include "chrome/browser/chromeos/login/user_manager.h"
42 #include "chrome/browser/policy/device_cloud_policy_manager_chromeos.h" 47 #include "chrome/browser/policy/device_cloud_policy_manager_chromeos.h"
43 #include "chrome/browser/policy/device_local_account_policy_service.h" 48 #include "chrome/browser/policy/device_local_account_policy_service.h"
44 #include "chrome/browser/policy/user_cloud_policy_manager_chromeos.h" 49 #include "chrome/browser/policy/user_cloud_policy_manager_chromeos.h"
45 #else 50 #else
46 #include "chrome/browser/policy/user_cloud_policy_manager.h" 51 #include "chrome/browser/policy/user_cloud_policy_manager.h"
47 #include "chrome/browser/policy/user_cloud_policy_manager_factory.h" 52 #include "chrome/browser/policy/user_cloud_policy_manager_factory.h"
48 #endif 53 #endif
49 54
50 namespace em = enterprise_management; 55 namespace em = enterprise_management;
51 56
52 const char PolicyUIHandler::kLevel[] = "level";
53 const char PolicyUIHandler::kName[] = "name";
54 const char PolicyUIHandler::kScope[] = "scope";
55 const char PolicyUIHandler::kSet[] = "set";
56 const char PolicyUIHandler::kStatus[] = "status";
57 const char PolicyUIHandler::kValue[] = "value";
58
59 namespace { 57 namespace {
60 58
61 content::WebUIDataSource* CreatePolicyUIHTMLSource() { 59 content::WebUIDataSource* CreatePolicyUIHTMLSource() {
62 content::WebUIDataSource* source = 60 content::WebUIDataSource* source =
63 content::WebUIDataSource::Create(chrome::kChromeUIPolicyHost); 61 content::WebUIDataSource::Create(chrome::kChromeUIPolicyHost);
64 62
65 // Localized strings. 63 // Localized strings.
64 source->AddLocalizedString("title", IDS_POLICY_TITLE);
65 source->AddLocalizedString("filterPlaceholder",
66 IDS_POLICY_FILTER_PLACEHOLDER);
67 source->AddLocalizedString("reloadPolicies", IDS_POLICY_RELOAD_POLICIES);
68 source->AddLocalizedString("status", IDS_POLICY_STATUS);
69 source->AddLocalizedString("statusDevice", IDS_POLICY_STATUS_DEVICE);
70 source->AddLocalizedString("statusUser", IDS_POLICY_STATUS_USER);
71 source->AddLocalizedString("labelDomain", IDS_POLICY_LABEL_DOMAIN);
72 source->AddLocalizedString("labelUsername", IDS_POLICY_LABEL_USERNAME);
73 source->AddLocalizedString("labelClientId", IDS_POLICY_LABEL_CLIENT_ID);
74 source->AddLocalizedString("labelTimeSinceLastRefresh",
75 IDS_POLICY_LABEL_TIME_SINCE_LAST_REFRESH);
76 source->AddLocalizedString("labelRefreshInterval",
77 IDS_POLICY_LABEL_REFRESH_INTERVAL);
78 source->AddLocalizedString("labelStatus", IDS_POLICY_LABEL_STATUS);
79 source->AddLocalizedString("showUnset", IDS_POLICY_SHOW_UNSET);
80 source->AddLocalizedString("noPoliciesSet", IDS_POLICY_NO_POLICIES_SET);
81 source->AddLocalizedString("headerScope", IDS_POLICY_HEADER_SCOPE);
82 source->AddLocalizedString("headerLevel", IDS_POLICY_HEADER_LEVEL);
83 source->AddLocalizedString("headerName", IDS_POLICY_HEADER_NAME);
84 source->AddLocalizedString("headerValue", IDS_POLICY_HEADER_VALUE);
85 source->AddLocalizedString("headerStatus", IDS_POLICY_HEADER_STATUS);
86 source->AddLocalizedString("showExpandedValue",
87 IDS_POLICY_SHOW_EXPANDED_VALUE);
88 source->AddLocalizedString("hideExpandedValue",
89 IDS_POLICY_HIDE_EXPANDED_VALUE);
90 source->AddLocalizedString("scopeUser", IDS_POLICY_SCOPE_USER);
91 source->AddLocalizedString("scopeDevice", IDS_POLICY_SCOPE_DEVICE);
92 source->AddLocalizedString("levelRecommended", IDS_POLICY_LEVEL_RECOMMENDED);
93 source->AddLocalizedString("levelMandatory", IDS_POLICY_LEVEL_MANDATORY);
94 source->AddLocalizedString("ok", IDS_POLICY_OK);
95 source->AddLocalizedString("unset", IDS_POLICY_UNSET);
96 source->AddLocalizedString("unknown", IDS_POLICY_UNKNOWN);
97
66 source->SetUseJsonJSFormatV2(); 98 source->SetUseJsonJSFormatV2();
67 source->AddLocalizedString("policyTitle", IDS_POLICY_TITLE);
68 source->AddLocalizedString("statusPaneTitle", IDS_POLICY_STATUS_TITLE);
69 source->AddLocalizedString("fetchPoliciesText", IDS_POLICY_FETCH);
70 source->AddLocalizedString("devicePoliciesBoxTitle",
71 IDS_POLICY_DEVICE_POLICIES);
72 source->AddLocalizedString("userPoliciesBoxTitle", IDS_POLICY_USER_POLICIES);
73 source->AddLocalizedString("enrollmentDomainText",
74 IDS_POLICY_ENROLLMENT_DOMAIN);
75 source->AddLocalizedString("clientIdText", IDS_POLICY_CLIENT_ID);
76 source->AddLocalizedString("usernameText", IDS_POLICY_USERNAME);
77 source->AddLocalizedString("timeSinceLastFetchText", IDS_POLICY_LAST_FETCHED);
78 source->AddLocalizedString("fetchIntervalText", IDS_POLICY_FETCH_INTERVAL);
79 source->AddLocalizedString("serverStatusText", IDS_POLICY_SERVER_STATUS);
80 source->AddLocalizedString("showUnsentPoliciesText", IDS_POLICY_SHOW_UNSENT);
81 source->AddLocalizedString("filterPoliciesText", IDS_POLICY_FILTER);
82 source->AddLocalizedString("noPoliciesSet",IDS_POLICY_NO_POLICIES_SET);
83 source->AddLocalizedString("appliesToTableHeader", IDS_POLICY_APPLIES_TO);
84 source->AddLocalizedString("policyLevelTableHeader", IDS_POLICY_LEVEL);
85 source->AddLocalizedString("policyNameTableHeader", IDS_POLICY_ENTRY_NAME);
86 source->AddLocalizedString("policyValueTableHeader", IDS_POLICY_ENTRY_VALUE);
87 source->AddLocalizedString("policyStatusTableHeader",
88 IDS_POLICY_ENTRY_STATUS);
89 source->AddLocalizedString("showMoreText", IDS_POLICY_SHOW_MORE);
90 source->AddLocalizedString("hideText", IDS_POLICY_HIDE);
91 source->SetJsonPath("strings.js"); 99 source->SetJsonPath("strings.js");
92 100
93 // Add required resources. 101 // Add required resources.
94 source->AddResourcePath("policy.css", IDR_POLICY_CSS); 102 source->AddResourcePath("policy.css", IDR_POLICY_CSS);
95 source->AddResourcePath("policy.js", IDR_POLICY_JS); 103 source->AddResourcePath("policy.js", IDR_POLICY_JS);
104 source->AddResourcePath("uber_utils.js", IDR_UBER_UTILS_JS);
96 source->SetDefaultResource(IDR_POLICY_HTML); 105 source->SetDefaultResource(IDR_POLICY_HTML);
97 106
98 return source; 107 return source;
99 } 108 }
100 109
101 string16 GetPolicyScopeString(policy::PolicyScope scope) { 110 void GetStatusFromCore(const policy::CloudPolicyCore* core,
102 switch (scope) { 111 base::DictionaryValue* dict) {
103 case policy::POLICY_SCOPE_USER: 112 const policy::CloudPolicyStore* store = core->store();
104 return l10n_util::GetStringUTF16(IDS_POLICY_SCOPE_USER); 113 const policy::CloudPolicyClient* client = core->client();
105 case policy::POLICY_SCOPE_MACHINE: 114 const policy::CloudPolicyRefreshScheduler* refresh_scheduler =
106 return l10n_util::GetStringUTF16(IDS_POLICY_SCOPE_MACHINE); 115 core->refresh_scheduler();
107 } 116
108 NOTREACHED(); 117 bool no_error = store->status() == policy::CloudPolicyStore::STATUS_OK &&
109 return string16(); 118 client && client->status() == policy::DM_STATUS_SUCCESS;
119 string16 status = store->status() == policy::CloudPolicyStore::STATUS_OK &&
120 client && client->status() != policy::DM_STATUS_SUCCESS ?
121 policy::FormatDeviceManagementStatus(client->status()) :
122 policy::FormatStoreStatus(store->status(),
123 store->validation_status());
124 const em::PolicyData* policy = store->policy();
125 std::string client_id = policy ? policy->device_id() : std::string();
126 std::string username = policy ? policy->username() : std::string();
127 base::TimeDelta refresh_interval =
128 base::TimeDelta::FromMilliseconds(refresh_scheduler ?
129 refresh_scheduler->refresh_delay() :
130 policy::CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs);
131 base::Time last_refresh_time = refresh_scheduler ?
132 refresh_scheduler->last_refresh() : base::Time();
133
134 dict->SetBoolean("error", !no_error);
135 dict->SetString("status", status);
136 dict->SetString("clientId", client_id);
137 dict->SetString("username", username);
138 dict->SetString("refreshInterval",
139 TimeFormat::TimeRemainingShort(refresh_interval));
140 dict->SetString("timeSinceLastRefresh", last_refresh_time.is_null() ?
141 l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED) :
142 TimeFormat::TimeElapsed(base::Time::NowFromSystemTime() -
143 last_refresh_time));
110 } 144 }
111 145
112 string16 GetPolicyLevelString(policy::PolicyLevel level) { 146 void ExtractDomainFromUsername(base::DictionaryValue* dict) {
113 switch (level) { 147 std::string username;
114 case policy::POLICY_LEVEL_RECOMMENDED: 148 dict->GetString("username", &username);
115 return l10n_util::GetStringUTF16(IDS_POLICY_LEVEL_RECOMMENDED); 149 if (!username.empty())
116 case policy::POLICY_LEVEL_MANDATORY: 150 dict->SetString("domain", gaia::ExtractDomainName(username));
117 return l10n_util::GetStringUTF16(IDS_POLICY_LEVEL_MANDATORY);
118 }
119 NOTREACHED();
120 return string16();
121 }
122
123 base::DictionaryValue* GetPolicyDetails(
124 const policy::PolicyDefinitionList::Entry* policy_definition,
125 const policy::PolicyMap::Entry* policy_value,
126 const string16& error_message) {
127 base::DictionaryValue* details = new base::DictionaryValue();
128 details->SetString(PolicyUIHandler::kName,
129 ASCIIToUTF16(policy_definition->name));
130 details->SetBoolean(PolicyUIHandler::kSet, true);
131 details->SetString(PolicyUIHandler::kLevel,
132 GetPolicyLevelString(policy_value->level));
133 details->SetString(PolicyUIHandler::kScope,
134 GetPolicyScopeString(policy_value->scope));
135 details->Set(PolicyUIHandler::kValue, policy_value->value->DeepCopy());
136 if (error_message.empty()) {
137 details->SetString(PolicyUIHandler::kStatus,
138 l10n_util::GetStringUTF16(IDS_OK));
139 } else {
140 details->SetString(PolicyUIHandler::kStatus, error_message);
141 }
142 return details;
143 }
144
145 base::DictionaryValue* GetPolicyErrorDetails(const std::string& policy_name,
146 bool is_set) {
147 base::DictionaryValue* details = new base::DictionaryValue();
148 details->SetString(PolicyUIHandler::kName, ASCIIToUTF16(policy_name));
149 details->SetBoolean(PolicyUIHandler::kSet, is_set);
150 details->SetString(PolicyUIHandler::kLevel, "");
151 details->SetString(PolicyUIHandler::kScope, "");
152 details->SetString(PolicyUIHandler::kValue, "");
153 if (is_set)
154 details->SetString(PolicyUIHandler::kStatus,
155 l10n_util::GetStringUTF16(IDS_POLICY_UNKNOWN));
156 else
157 details->SetString(PolicyUIHandler::kStatus,
158 l10n_util::GetStringUTF16(IDS_POLICY_NOT_SET));
159 return details;
160 } 151 }
161 152
162 } // namespace 153 } // namespace
163 154
164 // An interface for querying status data. 155 // An interface for querying the status of cloud policy.
165 class CloudPolicyStatusProvider { 156 class CloudPolicyStatusProvider {
166 public: 157 public:
167 CloudPolicyStatusProvider() {} 158 CloudPolicyStatusProvider();
168 virtual ~CloudPolicyStatusProvider() {} 159 virtual ~CloudPolicyStatusProvider();
169 160
170 // Sets a callback to invoke upon status changes. 161 // Sets a callback to invoke upon status changes.
171 void SetStatusChangeCallback(const base::Closure& callback) { 162 void SetStatusChangeCallback(const base::Closure& callback);
172 callback_ = callback;
173 }
174 163
175 // Fills |status_dict| and returns true if the status is relevant. 164 virtual void GetStatus(base::DictionaryValue* dict);
176 virtual bool GetStatus(base::DictionaryValue* status_dict) {
177 return false;
178 }
179 165
180 protected: 166 protected:
181 void NotifyStatusChange() { 167 void NotifyStatusChange();
182 if (!callback_.is_null())
183 callback_.Run();
184 }
185 168
186 private: 169 private:
187 base::Closure callback_; 170 base::Closure callback_;
188 171
189 DISALLOW_COPY_AND_ASSIGN(CloudPolicyStatusProvider); 172 DISALLOW_COPY_AND_ASSIGN(CloudPolicyStatusProvider);
190 }; 173 };
191 174
192 // Status provider implementation that pulls cloud policy status from a 175 // Status provider implementation that pulls cloud policy status from a
193 // CloudPolicyCore instance provided at construction time. Also listens for 176 // CloudPolicyCore instance provided at construction time. Also listens for
194 // changes on that CloudPolicyCore and reports them through the status change 177 // changes on that CloudPolicyCore and reports them through the status change
195 // callback. 178 // callback.
196 class CloudPolicyCoreStatusProvider 179 class CloudPolicyCoreStatusProvider
197 : public CloudPolicyStatusProvider, 180 : public CloudPolicyStatusProvider,
198 public policy::CloudPolicyStore::Observer { 181 public policy::CloudPolicyStore::Observer {
199 public: 182 public:
200 explicit CloudPolicyCoreStatusProvider(policy::CloudPolicyCore* core) 183 explicit CloudPolicyCoreStatusProvider(policy::CloudPolicyCore* core);
201 : core_(core) { 184 virtual ~CloudPolicyCoreStatusProvider();
202 core_->store()->AddObserver(this);
203 }
204 virtual ~CloudPolicyCoreStatusProvider() {
205 core_->store()->RemoveObserver(this);
206 }
207 185
208 // CloudPolicyStatusProvider: 186 // policy::CloudPolicyStore::Observer implementation.
209 virtual bool GetStatus(base::DictionaryValue* status_dict) OVERRIDE { 187 virtual void OnStoreLoaded(policy::CloudPolicyStore* store) OVERRIDE;
210 return GetStatusFromCore(core_, status_dict); 188 virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE;
211 }
212 189
213 // policy::CloudPolicyStore::Observer: 190 protected:
214 virtual void OnStoreLoaded(policy::CloudPolicyStore* store) OVERRIDE {
215 NotifyStatusChange();
216 }
217 virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE {
218 NotifyStatusChange();
219 }
220
221 // Extracts status information from |core| and writes it to |status_dict|.
222 static bool GetStatusFromCore(policy::CloudPolicyCore* core,
223 base::DictionaryValue* status_dict);
224
225 private:
226 // Policy status is read from the CloudPolicyClient, CloudPolicyStore and 191 // Policy status is read from the CloudPolicyClient, CloudPolicyStore and
227 // CloudPolicyRefreshScheduler hosted by this |core_|. 192 // CloudPolicyRefreshScheduler hosted by this |core_|.
228 policy::CloudPolicyCore* core_; 193 policy::CloudPolicyCore* core_;
229 194
230 DISALLOW_COPY_AND_ASSIGN(CloudPolicyCoreStatusProvider); 195 DISALLOW_COPY_AND_ASSIGN(CloudPolicyCoreStatusProvider);
231 }; 196 };
232 197
233 // static 198 // A cloud policy status provider for user policy.
234 bool CloudPolicyCoreStatusProvider::GetStatusFromCore( 199 class UserPolicyStatusProvider : public CloudPolicyCoreStatusProvider {
235 policy::CloudPolicyCore* core, 200 public:
236 base::DictionaryValue* status_dict) { 201 explicit UserPolicyStatusProvider(policy::CloudPolicyCore* core);
237 policy::CloudPolicyStore* store = core->store(); 202 virtual ~UserPolicyStatusProvider();
238 policy::CloudPolicyClient* client = core->client();
239 policy::CloudPolicyRefreshScheduler* refresh_scheduler =
240 core->refresh_scheduler();
241 203
242 string16 status; 204 // CloudPolicyCoreStatusProvider implementation.
243 if (store->status() == policy::CloudPolicyStore::STATUS_OK && 205 virtual void GetStatus(base::DictionaryValue* dict) OVERRIDE;
244 client && client->status() != policy::DM_STATUS_SUCCESS) {
245 status = policy::FormatDeviceManagementStatus(client->status());
246 } else {
247 status = policy::FormatStoreStatus(store->status(),
248 store->validation_status());
249 }
250 status_dict->SetString("statusMessage", status);
251 206
252 base::Time last_refresh_time; 207 private:
253 if (refresh_scheduler) 208 DISALLOW_COPY_AND_ASSIGN(UserPolicyStatusProvider);
254 last_refresh_time = refresh_scheduler->last_refresh(); 209 };
255 status_dict->SetString(
256 "timeSinceLastFetch",
257 last_refresh_time.is_null() ?
258 l10n_util::GetStringUTF16(IDS_POLICY_NEVER_FETCHED) :
259 TimeFormat::TimeElapsed(base::Time::NowFromSystemTime() -
260 last_refresh_time));
261
262 const em::PolicyData* policy = store->policy();
263 status_dict->SetString(
264 "clientId", policy ? ASCIIToUTF16(policy->device_id()) : string16());
265 status_dict->SetString(
266 "user", policy ? UTF8ToUTF16(policy->username()) : string16());
267
268 int64 interval = policy::CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs;
269 if (refresh_scheduler)
270 interval = refresh_scheduler->refresh_delay();
271 status_dict->SetString(
272 "fetchInterval",
273 TimeFormat::TimeRemainingShort(
274 base::TimeDelta::FromMilliseconds(interval)));
275
276 return store->is_managed();
277 }
278 210
279 #if defined(OS_CHROMEOS) 211 #if defined(OS_CHROMEOS)
212 // A cloud policy status provider for device policy.
213 class DevicePolicyStatusProvider : public CloudPolicyCoreStatusProvider {
214 public:
215 explicit DevicePolicyStatusProvider(
216 policy::BrowserPolicyConnector* connector);
217 virtual ~DevicePolicyStatusProvider();
218
219 // CloudPolicyCoreStatusProvider implementation.
220 virtual void GetStatus(base::DictionaryValue* dict) OVERRIDE;
221
222 private:
223 std::string domain_;
224
225 DISALLOW_COPY_AND_ASSIGN(DevicePolicyStatusProvider);
226 };
227
280 // A cloud policy status provider that reads policy status from the policy core 228 // A cloud policy status provider that reads policy status from the policy core
281 // associated with the device-local account specified by |account_id| at 229 // associated with the device-local account specified by |account_id| at
282 // construction time. The indirection via account ID and 230 // construction time. The indirection via account ID and
283 // DeviceLocalAccountPolicyService is necessary because the device-local account 231 // DeviceLocalAccountPolicyService is necessary because the device-local account
284 // may go away any time behind the scenes, at which point the status message 232 // may go away any time behind the scenes, at which point the status message
285 // text will indicate CloudPolicyStore::STATUS_BAD_STATE. 233 // text will indicate CloudPolicyStore::STATUS_BAD_STATE.
286 class DeviceLocalAccountPolicyStatusProvider 234 class DeviceLocalAccountPolicyStatusProvider
287 : public CloudPolicyStatusProvider, 235 : public CloudPolicyStatusProvider,
288 public policy::DeviceLocalAccountPolicyService::Observer { 236 public policy::DeviceLocalAccountPolicyService::Observer {
289 public: 237 public:
290 DeviceLocalAccountPolicyStatusProvider( 238 DeviceLocalAccountPolicyStatusProvider(
291 const std::string& account_id, 239 const std::string& account_id,
292 policy::DeviceLocalAccountPolicyService* service) 240 policy::DeviceLocalAccountPolicyService* service);
293 : account_id_(account_id), 241 virtual ~DeviceLocalAccountPolicyStatusProvider();
294 service_(service) {
295 service_->AddObserver(this);
296 }
297 virtual ~DeviceLocalAccountPolicyStatusProvider() {
298 service_->RemoveObserver(this);
299 }
300 242
301 // CloudPolicyStatusProvider: 243 // CloudPolicyStatusProvider implementation.
302 virtual bool GetStatus(base::DictionaryValue* status_dict) OVERRIDE { 244 virtual void GetStatus(base::DictionaryValue* dict) OVERRIDE;
303 policy::DeviceLocalAccountPolicyBroker* broker =
304 service_->GetBrokerForAccount(account_id_);
305 if (broker) {
306 return CloudPolicyCoreStatusProvider::GetStatusFromCore(broker->core(),
307 status_dict);
308 }
309 245
310 status_dict->SetString("user", account_id_); 246 // policy::DeviceLocalAccountPolicyService::Observer implementation.
311 status_dict->SetString( 247 virtual void OnPolicyUpdated(const std::string& account_id) OVERRIDE;
312 "statusMessage", 248 virtual void OnDeviceLocalAccountsChanged() OVERRIDE;
313 policy::FormatStoreStatus(
314 policy::CloudPolicyStore::STATUS_BAD_STATE,
315 policy::CloudPolicyValidatorBase::VALIDATION_OK));
316 return true;
317 }
318
319 // policy::DeviceLocalAccountPolicyService::Observer:
320 virtual void OnPolicyUpdated(const std::string& account_id) OVERRIDE {
321 if (account_id == account_id_)
322 NotifyStatusChange();
323 }
324 virtual void OnDeviceLocalAccountsChanged() OVERRIDE {
325 NotifyStatusChange();
326 }
327 249
328 private: 250 private:
329 const std::string account_id_; 251 const std::string account_id_;
330 policy::DeviceLocalAccountPolicyService* service_; 252 policy::DeviceLocalAccountPolicyService* service_;
331 253
332 DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyStatusProvider); 254 DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyStatusProvider);
333 }; 255 };
334 #endif 256 #endif
335 257
336 //////////////////////////////////////////////////////////////////////////////// 258 // The JavaScript message handler for the chrome://policy page.
337 // 259 class PolicyUIHandler : public content::WebUIMessageHandler,
338 // PolicyUIHandler 260 public policy::PolicyService::Observer {
339 // 261 public:
340 //////////////////////////////////////////////////////////////////////////////// 262 PolicyUIHandler();
263 virtual ~PolicyUIHandler();
264
265 // content::WebUIMessageHandler implementation.
266 virtual void RegisterMessages() OVERRIDE;
267
268 // policy::PolicyService::Observer implementation.
269 virtual void OnPolicyUpdated(policy::PolicyDomain domain,
270 const std::string& component_id,
271 const policy::PolicyMap& previous,
272 const policy::PolicyMap& current) OVERRIDE;
273
274 private:
275 // Send a dictionary containing the names of all known policies to the UI.
276 void SendPolicyNames() const;
Mattias Nissler (ping if slow) 2013/02/04 16:05:16 nit: newline
bartfab (slow) 2013/02/04 17:11:04 Done.
277 // Send information about the current policy values to the UI. For each policy
278 // whose value has been set, a dictionary containing the value and additional
279 // metadata is sent.
280 void SendPolicyValues() const;
Mattias Nissler (ping if slow) 2013/02/04 16:05:16 nit: newline
bartfab (slow) 2013/02/04 17:11:04 Done.
281 // Send the status of cloud policy to the UI. For each scope that has cloud
282 // policy enabled (device and/or user), a dictionary containing status
283 // information is sent.
284 void SendStatus() const;
285
286 void HandleInitialized(const base::ListValue* args);
287 void HandleReloadPolicies(const base::ListValue* args);
288
289 void OnRefreshPoliciesDone() const;
290
291 policy::PolicyService* GetPolicyService() const;
292
293 bool initialized_;
294 std::string device_domain_;
295 base::WeakPtrFactory<PolicyUIHandler> weak_factory_;
296
297 // Providers that supply status dictionaries for user and device policy,
298 // respectively. These are created on initialization time as appropriate for
299 // the platform (Chrome OS / desktop) and type of policy that is in effect.
300 scoped_ptr<CloudPolicyStatusProvider> user_status_provider_;
301 scoped_ptr<CloudPolicyStatusProvider> device_status_provider_;
302
303 DISALLOW_COPY_AND_ASSIGN(PolicyUIHandler);
304 };
305
306 CloudPolicyStatusProvider::CloudPolicyStatusProvider() {
307 }
308
309 CloudPolicyStatusProvider::~CloudPolicyStatusProvider() {
310 }
311
312 void CloudPolicyStatusProvider::SetStatusChangeCallback(
313 const base::Closure& callback) {
314 callback_ = callback;
315 }
316
317 void CloudPolicyStatusProvider::GetStatus(base::DictionaryValue* dict) {
318 }
319
320 void CloudPolicyStatusProvider::NotifyStatusChange() {
321 if (!callback_.is_null())
322 callback_.Run();
323 }
324
325 CloudPolicyCoreStatusProvider::CloudPolicyCoreStatusProvider(
326 policy::CloudPolicyCore* core) : core_(core) {
327 core_->store()->AddObserver(this);
328 // TODO(bartfab): Add an observer that watches for client errors. Observing
329 // core_->client() directly is not safe as the client may be destroyed and
330 // (re-)created anytime if the user signs in or out on desktop platforms.
331 }
332
333 CloudPolicyCoreStatusProvider::~CloudPolicyCoreStatusProvider() {
334 core_->store()->RemoveObserver(this);
335 }
336
337 void CloudPolicyCoreStatusProvider::OnStoreLoaded(
338 policy::CloudPolicyStore* store) {
339 NotifyStatusChange();
340 }
341
342 void CloudPolicyCoreStatusProvider::OnStoreError(
343 policy::CloudPolicyStore* store) {
344 NotifyStatusChange();
345 }
346
347 UserPolicyStatusProvider::UserPolicyStatusProvider(
348 policy::CloudPolicyCore* core) : CloudPolicyCoreStatusProvider(core) {
349 }
350
351 UserPolicyStatusProvider::~UserPolicyStatusProvider() {
352 }
353
354 void UserPolicyStatusProvider::GetStatus(base::DictionaryValue* dict) {
355 if (!core_->store()->is_managed())
356 return;
357 GetStatusFromCore(core_, dict);
358 ExtractDomainFromUsername(dict);
359 }
360
361 #if defined(OS_CHROMEOS)
362 DevicePolicyStatusProvider::DevicePolicyStatusProvider(
363 policy::BrowserPolicyConnector* connector)
364 : CloudPolicyCoreStatusProvider(
365 connector->GetDeviceCloudPolicyManager()->core()) {
366 domain_ = connector->GetEnterpriseDomain();
367 }
368
369 DevicePolicyStatusProvider::~DevicePolicyStatusProvider() {
370 }
371
372 void DevicePolicyStatusProvider::GetStatus(base::DictionaryValue* dict) {
373 GetStatusFromCore(core_, dict);
374 dict->SetString("domain", domain_);
375 }
376
377 DeviceLocalAccountPolicyStatusProvider::DeviceLocalAccountPolicyStatusProvider(
378 const std::string& account_id,
379 policy::DeviceLocalAccountPolicyService* service)
380 : account_id_(account_id),
381 service_(service) {
382 service_->AddObserver(this);
383 }
384
385 DeviceLocalAccountPolicyStatusProvider::
386 ~DeviceLocalAccountPolicyStatusProvider() {
387 service_->RemoveObserver(this);
388 }
389
390 void DeviceLocalAccountPolicyStatusProvider::GetStatus(
391 base::DictionaryValue* dict) {
392 const policy::DeviceLocalAccountPolicyBroker* broker =
393 service_->GetBrokerForAccount(account_id_);
394 if (broker) {
395 GetStatusFromCore(broker->core(), dict);
396 } else {
397 dict->SetBoolean("error", true);
398 dict->SetString("status",
399 policy::FormatStoreStatus(
400 policy::CloudPolicyStore::STATUS_BAD_STATE,
401 policy::CloudPolicyValidatorBase::VALIDATION_OK));
402 dict->SetString("username", account_id_);
403 }
404 ExtractDomainFromUsername(dict);
405 dict->SetBoolean("publicAccount", true);
406 }
407
408 void DeviceLocalAccountPolicyStatusProvider::OnPolicyUpdated(
409 const std::string& account_id) {
410 if (account_id == account_id_)
411 NotifyStatusChange();
412 }
413
414 void DeviceLocalAccountPolicyStatusProvider::OnDeviceLocalAccountsChanged() {
415 NotifyStatusChange();
416 }
417 #endif
341 418
342 PolicyUIHandler::PolicyUIHandler() 419 PolicyUIHandler::PolicyUIHandler()
343 : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {} 420 : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
421 }
344 422
345 PolicyUIHandler::~PolicyUIHandler() { 423 PolicyUIHandler::~PolicyUIHandler() {
346 GetPolicyService()->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this); 424 GetPolicyService()->RemoveObserver(policy::POLICY_DOMAIN_CHROME, this);
347 } 425 }
348 426
349 void PolicyUIHandler::RegisterMessages() { 427 void PolicyUIHandler::RegisterMessages() {
350 #if defined(OS_CHROMEOS) 428 #if defined(OS_CHROMEOS)
351 policy::BrowserPolicyConnector* connector = 429 policy::BrowserPolicyConnector* connector =
352 g_browser_process->browser_policy_connector(); 430 g_browser_process->browser_policy_connector();
353 if (connector->IsEnterpriseManaged()) { 431 if (connector->IsEnterpriseManaged())
354 enterprise_domain_ = UTF8ToUTF16(connector->GetEnterpriseDomain()); 432 device_status_provider_.reset(new DevicePolicyStatusProvider(connector));
355 device_status_provider_.reset(
356 new CloudPolicyCoreStatusProvider(
357 connector->GetDeviceCloudPolicyManager()->core()));
358 }
359 433
360 chromeos::UserManager* user_manager = chromeos::UserManager::Get(); 434 const chromeos::UserManager* user_manager = chromeos::UserManager::Get();
361 if (user_manager->IsLoggedInAsPublicAccount()) { 435 if (user_manager->IsLoggedInAsPublicAccount()) {
362 policy::DeviceLocalAccountPolicyService* local_account_service = 436 policy::DeviceLocalAccountPolicyService* local_account_service =
363 connector->GetDeviceLocalAccountPolicyService(); 437 connector->GetDeviceLocalAccountPolicyService();
364 if (local_account_service) { 438 if (local_account_service) {
365 user_status_provider_.reset( 439 user_status_provider_.reset(
366 new DeviceLocalAccountPolicyStatusProvider( 440 new DeviceLocalAccountPolicyStatusProvider(
367 user_manager->GetLoggedInUser()->email(), local_account_service)); 441 user_manager->GetLoggedInUser()->email(), local_account_service));
368 } 442 }
369 } else { 443 } else {
370 policy::CloudPolicyManager* user_cloud_policy_manager = 444 policy::CloudPolicyManager* user_cloud_policy_manager =
371 connector->GetUserCloudPolicyManager(); 445 connector->GetUserCloudPolicyManager();
372 if (user_cloud_policy_manager) { 446 if (user_cloud_policy_manager) {
373 user_status_provider_.reset( 447 user_status_provider_.reset(
374 new CloudPolicyCoreStatusProvider(user_cloud_policy_manager->core())); 448 new UserPolicyStatusProvider(user_cloud_policy_manager->core()));
375 } 449 }
376 } 450 }
377 #else 451 #else
378 policy::CloudPolicyManager* user_cloud_policy_manager = 452 policy::CloudPolicyManager* user_cloud_policy_manager =
379 policy::UserCloudPolicyManagerFactory::GetForProfile( 453 policy::UserCloudPolicyManagerFactory::GetForProfile(
380 Profile::FromWebUI(web_ui())); 454 Profile::FromWebUI(web_ui()));
381 if (user_cloud_policy_manager) { 455 if (user_cloud_policy_manager) {
382 user_status_provider_.reset( 456 user_status_provider_.reset(
383 new CloudPolicyCoreStatusProvider(user_cloud_policy_manager->core())); 457 new UserPolicyStatusProvider(user_cloud_policy_manager->core()));
384 } 458 }
385 #endif 459 #endif
386 460
387 if (!user_status_provider_.get()) 461 if (!user_status_provider_.get())
388 user_status_provider_.reset(new CloudPolicyStatusProvider()); 462 user_status_provider_.reset(new CloudPolicyStatusProvider());
389 if (!device_status_provider_.get()) 463 if (!device_status_provider_.get())
390 device_status_provider_.reset(new CloudPolicyStatusProvider()); 464 device_status_provider_.reset(new CloudPolicyStatusProvider());
391 465
392 base::Closure update_callback(base::Bind(&PolicyUIHandler::SendDataToUI, 466 base::Closure update_callback(base::Bind(&PolicyUIHandler::SendStatus,
393 base::Unretained(this))); 467 base::Unretained(this)));
394 user_status_provider_->SetStatusChangeCallback(update_callback); 468 user_status_provider_->SetStatusChangeCallback(update_callback);
395 device_status_provider_->SetStatusChangeCallback(update_callback); 469 device_status_provider_->SetStatusChangeCallback(update_callback);
396 GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this); 470 GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this);
397 471
398 web_ui()->RegisterMessageCallback( 472 web_ui()->RegisterMessageCallback(
399 "requestData", 473 "initialized",
400 base::Bind(&PolicyUIHandler::HandleRequestData, 474 base::Bind(&PolicyUIHandler::HandleInitialized, base::Unretained(this)));
401 base::Unretained(this)));
402 web_ui()->RegisterMessageCallback( 475 web_ui()->RegisterMessageCallback(
403 "fetchPolicy", 476 "reloadPolicies",
404 base::Bind(&PolicyUIHandler::HandleFetchPolicy, 477 base::Bind(&PolicyUIHandler::HandleReloadPolicies,
405 base::Unretained(this))); 478 base::Unretained(this)));
406 } 479 }
407 480
408 void PolicyUIHandler::OnPolicyUpdated(policy::PolicyDomain domain, 481 void PolicyUIHandler::OnPolicyUpdated(policy::PolicyDomain domain,
409 const std::string& component_id, 482 const std::string& component_id,
410 const policy::PolicyMap& previous, 483 const policy::PolicyMap& previous,
411 const policy::PolicyMap& current) { 484 const policy::PolicyMap& current) {
412 DCHECK(domain == policy::POLICY_DOMAIN_CHROME); 485 DCHECK(domain == policy::POLICY_DOMAIN_CHROME);
413 DCHECK(component_id.empty()); 486 DCHECK(component_id.empty());
414 SendDataToUI(); 487 SendPolicyValues();
415 } 488 }
416 489
417 // static 490 void PolicyUIHandler::SendPolicyNames() const {
418 scoped_ptr<base::ListValue> PolicyUIHandler::GetPolicyStatusList( 491 base::DictionaryValue names;
419 const policy::PolicyMap& policies, 492 const policy::PolicyDefinitionList* list =
420 bool* any_policies_set) { 493 policy::GetChromePolicyDefinitionList();
421 scoped_ptr<base::ListValue> result(new base::ListValue()); 494 for (const policy::PolicyDefinitionList::Entry* entry = list->begin;
495 entry != list->end; ++entry) {
496 names.SetBoolean(entry->name, true);
497 }
498 web_ui()->CallJavascriptFunction("policy.Page.setPolicyNames", names);
499 }
500
501 void PolicyUIHandler::SendPolicyValues() const {
422 // Make a copy that can be modified, since some policy values are modified 502 // Make a copy that can be modified, since some policy values are modified
423 // before being displayed. 503 // before being displayed.
424 policy::PolicyMap policy_map; 504 policy::PolicyMap map;
425 policy_map.CopyFrom(policies); 505 map.CopyFrom(GetPolicyService()->GetPolicies(policy::POLICY_DOMAIN_CHROME,
506 std::string()));
426 507
427 // Get a list of all the errors in the policy values. 508 // Get a list of all the errors in the policy values.
428 const policy::ConfigurationPolicyHandlerList* handler_list = 509 const policy::ConfigurationPolicyHandlerList* handler_list =
429 g_browser_process->browser_policy_connector()->GetHandlerList(); 510 g_browser_process->browser_policy_connector()->GetHandlerList();
430 policy::PolicyErrorMap errors; 511 policy::PolicyErrorMap errors;
431 handler_list->ApplyPolicySettings(policy_map, NULL, &errors); 512 handler_list->ApplyPolicySettings(map, NULL, &errors);
432 handler_list->PrepareForDisplaying(&policy_map);
433 513
434 // Append each known policy and its status. 514 // Convert dictionary values to strings for display.
435 *any_policies_set = false; 515 handler_list->PrepareForDisplaying(&map);
436 std::vector<base::DictionaryValue*> unset_policies; 516
437 base::hash_set<std::string> known_names; 517 base::DictionaryValue values;
438 const policy::PolicyDefinitionList* policy_list = 518 for (policy::PolicyMap::const_iterator entry = map.begin();
439 policy::GetChromePolicyDefinitionList(); 519 entry != map.end(); ++entry) {
440 for (const policy::PolicyDefinitionList::Entry* policy = policy_list->begin; 520 base::DictionaryValue* value = new base::DictionaryValue;
441 policy != policy_list->end; ++policy) { 521 value->Set("value", entry->second.value->DeepCopy());
442 known_names.insert(policy->name); 522 if (entry->second.scope == policy::POLICY_SCOPE_USER)
443 const policy::PolicyMap::Entry* entry = policy_map.Get(policy->name); 523 value->SetString("scope", "user");
444 string16 error_message = errors.GetErrors(policy->name); 524 else
445 if (entry) { 525 value->SetString("scope", "machine");
446 *any_policies_set = true; 526 if (entry->second.level == policy::POLICY_LEVEL_RECOMMENDED)
447 result->Append(GetPolicyDetails(policy, entry, error_message)); 527 value->SetString("level", "recommended");
448 } else { 528 else
449 unset_policies.push_back(GetPolicyErrorDetails(policy->name, false)); 529 value->SetString("level", "mandatory");
450 } 530 string16 error = errors.GetErrors(entry->first);
531 if (!error.empty())
532 value->SetString("error", error);
533 values.Set(entry->first, value);
451 } 534 }
452 535
453 // Append unrecognized policy names. 536 web_ui()->CallJavascriptFunction("policy.Page.setPolicyValues", values);
454 for (policy::PolicyMap::const_iterator it = policy_map.begin();
455 it != policy_map.end(); ++it) {
456 if (!ContainsKey(known_names, it->first))
457 result->Append(GetPolicyErrorDetails(it->first, true));
458 }
459
460 // Append policies that aren't currently configured to the end.
461 for (std::vector<base::DictionaryValue*>::const_iterator it =
462 unset_policies.begin();
463 it != unset_policies.end(); ++it) {
464 result->Append(*it);
465 }
466
467 return result.Pass();
468 } 537 }
469 538
470 void PolicyUIHandler::HandleRequestData(const base::ListValue* args) { 539 void PolicyUIHandler::SendStatus() const {
471 SendDataToUI(); 540 scoped_ptr<base::DictionaryValue> device_status(new base::DictionaryValue);
541 device_status_provider_->GetStatus(device_status.get());
542 if (!device_domain_.empty())
543 device_status->SetString("domain", device_domain_);
544 scoped_ptr<base::DictionaryValue> user_status(new base::DictionaryValue);
545 user_status_provider_->GetStatus(user_status.get());
546 std::string username;
547 user_status->GetString("username", &username);
548 if (!username.empty())
549 user_status->SetString("domain", gaia::ExtractDomainName(username));
550
551 base::DictionaryValue status;
552 if (!device_status->empty())
553 status.Set("device", device_status.release());
554 if (!user_status->empty())
555 status.Set("user", user_status.release());
556
557 web_ui()->CallJavascriptFunction("policy.Page.setStatus", status);
472 } 558 }
473 559
474 void PolicyUIHandler::HandleFetchPolicy(const base::ListValue* args) { 560 void PolicyUIHandler::HandleInitialized(const base::ListValue* args) {
475 // Fetching policy can potentially take a while due to cloud policy fetches. 561 SendPolicyNames();
476 // Use a WeakPtr to make sure the callback is invalidated if the tab is closed 562 SendPolicyValues();
477 // before the fetching completes. 563 SendStatus();
564 }
565
566 void PolicyUIHandler::HandleReloadPolicies(const base::ListValue* args) {
478 GetPolicyService()->RefreshPolicies( 567 GetPolicyService()->RefreshPolicies(
479 base::Bind(&PolicyUIHandler::OnRefreshDone, 568 base::Bind(&PolicyUIHandler::OnRefreshPoliciesDone,
480 weak_factory_.GetWeakPtr())); 569 weak_factory_.GetWeakPtr()));
481 } 570 }
482 571
483 void PolicyUIHandler::OnRefreshDone() { 572 void PolicyUIHandler::OnRefreshPoliciesDone() const {
484 web_ui()->CallJavascriptFunction("Policy.refreshDone"); 573 web_ui()->CallJavascriptFunction("policy.Page.reloadPoliciesDone");
485 } 574 }
486 575
487 void PolicyUIHandler::SendDataToUI() { 576 policy::PolicyService* PolicyUIHandler::GetPolicyService() const {
488 policy::PolicyService* service = GetPolicyService(); 577 return Profile::FromWebUI(web_ui())->GetPolicyService();
489 bool any_policies_set = false;
490 base::ListValue* list =
491 GetPolicyStatusList(
492 service->GetPolicies(policy::POLICY_DOMAIN_CHROME, std::string()),
493 &any_policies_set).release();
494 base::DictionaryValue results;
495 results.Set("policies", list);
496 results.SetBoolean("anyPoliciesSet", any_policies_set);
497 base::DictionaryValue* dict = GetStatusData();
498 results.Set("status", dict);
499 web_ui()->CallJavascriptFunction("Policy.returnData", results);
500 } 578 }
501 579
502 policy::PolicyService* PolicyUIHandler::GetPolicyService() {
503 Profile* profile = Profile::FromWebUI(web_ui());
504 return profile->GetPolicyService();
505 }
506
507 base::DictionaryValue* PolicyUIHandler::GetStatusData() {
508 base::DictionaryValue* results = new base::DictionaryValue();
509
510 scoped_ptr<base::DictionaryValue> user_status_dict(
511 new base::DictionaryValue());
512 bool user_status_available =
513 user_status_provider_->GetStatus(user_status_dict.get());
514 user_status_dict->SetBoolean("display", user_status_available);
515 results->Set("userStatus", user_status_dict.release());
516
517 scoped_ptr<base::DictionaryValue> device_status_dict(
518 new base::DictionaryValue());
519 bool device_status_available =
520 device_status_provider_->GetStatus(device_status_dict.get());
521 device_status_dict->SetString("domain", enterprise_domain_);
522 device_status_dict->SetBoolean("display", device_status_available);
523 results->Set("deviceStatus", device_status_dict.release());
524
525 results->SetBoolean("displayStatusSection",
526 user_status_available || device_status_available);
527 return results;
528 }
529
530 ////////////////////////////////////////////////////////////////////////////////
531 //
532 // PolicyUI
533 //
534 ////////////////////////////////////////////////////////////////////////////////
535
536 PolicyUI::PolicyUI(content::WebUI* web_ui) : WebUIController(web_ui) { 580 PolicyUI::PolicyUI(content::WebUI* web_ui) : WebUIController(web_ui) {
537 web_ui->AddMessageHandler(new PolicyUIHandler); 581 web_ui->AddMessageHandler(new PolicyUIHandler);
538 582 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui),
539 // Set up the chrome://policy/ source. 583 CreatePolicyUIHTMLSource());
540 Profile* profile = Profile::FromWebUI(web_ui);
541 content::WebUIDataSource::Add(profile, CreatePolicyUIHTMLSource());
542 } 584 }
543 585
544 PolicyUI::~PolicyUI() { 586 PolicyUI::~PolicyUI() {
545 } 587 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698