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

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

Issue 17387002: Sending known policy names for extensions to chrome://policy page (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@anita-policies
Patch Set: Fixing accidentally-removed line in prev patch Created 7 years, 6 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
« no previous file with comments | « chrome/browser/resources/policy.js ('k') | 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/ui/webui/policy_ui.h" 5 #include "chrome/browser/ui/webui/policy_ui.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 14 matching lines...) Expand all
25 #include "chrome/browser/policy/cloud/message_util.h" 25 #include "chrome/browser/policy/cloud/message_util.h"
26 #include "chrome/browser/policy/configuration_policy_handler_list.h" 26 #include "chrome/browser/policy/configuration_policy_handler_list.h"
27 #include "chrome/browser/policy/policy_error_map.h" 27 #include "chrome/browser/policy/policy_error_map.h"
28 #include "chrome/browser/policy/policy_map.h" 28 #include "chrome/browser/policy/policy_map.h"
29 #include "chrome/browser/policy/policy_service.h" 29 #include "chrome/browser/policy/policy_service.h"
30 #include "chrome/browser/policy/policy_types.h" 30 #include "chrome/browser/policy/policy_types.h"
31 #include "chrome/browser/policy/profile_policy_connector.h" 31 #include "chrome/browser/policy/profile_policy_connector.h"
32 #include "chrome/browser/policy/profile_policy_connector_factory.h" 32 #include "chrome/browser/policy/profile_policy_connector_factory.h"
33 #include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h" 33 #include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
34 #include "chrome/browser/profiles/profile.h" 34 #include "chrome/browser/profiles/profile.h"
35 #include "chrome/common/chrome_notification_types.h"
35 #include "chrome/common/time_format.h" 36 #include "chrome/common/time_format.h"
36 #include "chrome/common/url_constants.h" 37 #include "chrome/common/url_constants.h"
38 #include "content/public/browser/notification_observer.h"
39 #include "content/public/browser/notification_registrar.h"
40 #include "content/public/browser/notification_service.h"
37 #include "content/public/browser/web_ui.h" 41 #include "content/public/browser/web_ui.h"
38 #include "content/public/browser/web_ui_data_source.h" 42 #include "content/public/browser/web_ui_data_source.h"
39 #include "content/public/browser/web_ui_message_handler.h" 43 #include "content/public/browser/web_ui_message_handler.h"
40 #include "google_apis/gaia/gaia_auth_util.h" 44 #include "google_apis/gaia/gaia_auth_util.h"
41 #include "grit/browser_resources.h" 45 #include "grit/browser_resources.h"
42 #include "grit/generated_resources.h" 46 #include "grit/generated_resources.h"
43 #include "policy/policy_constants.h" 47 #include "policy/policy_constants.h"
44 #include "ui/base/l10n/l10n_util.h" 48 #include "ui/base/l10n/l10n_util.h"
45 49
46 #if defined(OS_CHROMEOS) 50 #if defined(OS_CHROMEOS)
47 #include "chrome/browser/chromeos/login/user_manager.h" 51 #include "chrome/browser/chromeos/login/user_manager.h"
48 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 52 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
49 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" 53 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
50 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" 54 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
51 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom eos.h" 55 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom eos.h"
52 #else 56 #else
53 #include "chrome/browser/policy/cloud/user_cloud_policy_manager.h" 57 #include "chrome/browser/policy/cloud/user_cloud_policy_manager.h"
54 #include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h" 58 #include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
55 #endif 59 #endif
56 60
57 #if !defined(OS_ANDROID) && !defined(OS_IOS) 61 #if !defined(OS_ANDROID) && !defined(OS_IOS)
58 #include "chrome/browser/extensions/extension_service.h" 62 #include "chrome/browser/extensions/extension_service.h"
59 #include "chrome/browser/extensions/extension_system.h" 63 #include "chrome/browser/extensions/extension_system.h"
64 #include "chrome/browser/policy/policy_domain_descriptor.h"
65 #include "chrome/browser/policy/policy_schema.h"
60 #include "chrome/common/extensions/extension.h" 66 #include "chrome/common/extensions/extension.h"
61 #include "chrome/common/extensions/extension_set.h" 67 #include "chrome/common/extensions/extension_set.h"
62 #include "chrome/common/extensions/manifest.h" 68 #include "chrome/common/extensions/manifest.h"
63 #endif 69 #endif
64 70
65 namespace em = enterprise_management; 71 namespace em = enterprise_management;
66 72
67 namespace { 73 namespace {
68 74
69 content::WebUIDataSource* CreatePolicyUIHTMLSource() { 75 content::WebUIDataSource* CreatePolicyUIHTMLSource() {
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 265
260 private: 266 private:
261 const std::string user_id_; 267 const std::string user_id_;
262 policy::DeviceLocalAccountPolicyService* service_; 268 policy::DeviceLocalAccountPolicyService* service_;
263 269
264 DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyStatusProvider); 270 DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountPolicyStatusProvider);
265 }; 271 };
266 #endif 272 #endif
267 273
268 // The JavaScript message handler for the chrome://policy page. 274 // The JavaScript message handler for the chrome://policy page.
269 class PolicyUIHandler : public content::WebUIMessageHandler, 275 class PolicyUIHandler : public content::NotificationObserver,
276 public content::WebUIMessageHandler,
270 public policy::PolicyService::Observer { 277 public policy::PolicyService::Observer {
271 public: 278 public:
272 PolicyUIHandler(); 279 PolicyUIHandler();
273 virtual ~PolicyUIHandler(); 280 virtual ~PolicyUIHandler();
274 281
282 // content::NotificationObserver implementation.
283 virtual void Observe(int type,
284 const content::NotificationSource& source,
285 const content::NotificationDetails& details) OVERRIDE;
286
275 // content::WebUIMessageHandler implementation. 287 // content::WebUIMessageHandler implementation.
276 virtual void RegisterMessages() OVERRIDE; 288 virtual void RegisterMessages() OVERRIDE;
277 289
278 // policy::PolicyService::Observer implementation. 290 // policy::PolicyService::Observer implementation.
279 virtual void OnPolicyUpdated(const policy::PolicyNamespace& ns, 291 virtual void OnPolicyUpdated(const policy::PolicyNamespace& ns,
280 const policy::PolicyMap& previous, 292 const policy::PolicyMap& previous,
281 const policy::PolicyMap& current) OVERRIDE; 293 const policy::PolicyMap& current) OVERRIDE;
282 294
283 private: 295 private:
284 // Send a dictionary containing the names of all known policies to the UI. 296 // Send a dictionary containing the names of all known policies to the UI.
(...skipping 27 matching lines...) Expand all
312 bool initialized_; 324 bool initialized_;
313 std::string device_domain_; 325 std::string device_domain_;
314 base::WeakPtrFactory<PolicyUIHandler> weak_factory_; 326 base::WeakPtrFactory<PolicyUIHandler> weak_factory_;
315 327
316 // Providers that supply status dictionaries for user and device policy, 328 // Providers that supply status dictionaries for user and device policy,
317 // respectively. These are created on initialization time as appropriate for 329 // respectively. These are created on initialization time as appropriate for
318 // the platform (Chrome OS / desktop) and type of policy that is in effect. 330 // the platform (Chrome OS / desktop) and type of policy that is in effect.
319 scoped_ptr<CloudPolicyStatusProvider> user_status_provider_; 331 scoped_ptr<CloudPolicyStatusProvider> user_status_provider_;
320 scoped_ptr<CloudPolicyStatusProvider> device_status_provider_; 332 scoped_ptr<CloudPolicyStatusProvider> device_status_provider_;
321 333
334 content::NotificationRegistrar registrar_;
335
322 DISALLOW_COPY_AND_ASSIGN(PolicyUIHandler); 336 DISALLOW_COPY_AND_ASSIGN(PolicyUIHandler);
323 }; 337 };
324 338
325 CloudPolicyStatusProvider::CloudPolicyStatusProvider() { 339 CloudPolicyStatusProvider::CloudPolicyStatusProvider() {
326 } 340 }
327 341
328 CloudPolicyStatusProvider::~CloudPolicyStatusProvider() { 342 CloudPolicyStatusProvider::~CloudPolicyStatusProvider() {
329 } 343 }
330 344
331 void CloudPolicyStatusProvider::SetStatusChangeCallback( 345 void CloudPolicyStatusProvider::SetStatusChangeCallback(
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 if (!device_status_provider_.get()) 498 if (!device_status_provider_.get())
485 device_status_provider_.reset(new CloudPolicyStatusProvider()); 499 device_status_provider_.reset(new CloudPolicyStatusProvider());
486 500
487 base::Closure update_callback(base::Bind(&PolicyUIHandler::SendStatus, 501 base::Closure update_callback(base::Bind(&PolicyUIHandler::SendStatus,
488 base::Unretained(this))); 502 base::Unretained(this)));
489 user_status_provider_->SetStatusChangeCallback(update_callback); 503 user_status_provider_->SetStatusChangeCallback(update_callback);
490 device_status_provider_->SetStatusChangeCallback(update_callback); 504 device_status_provider_->SetStatusChangeCallback(update_callback);
491 GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this); 505 GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this);
492 GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this); 506 GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
493 507
508 registrar_.Add(this,
509 chrome::NOTIFICATION_EXTENSION_LOADED,
510 content::NotificationService::AllSources());
511 registrar_.Add(this,
512 chrome::NOTIFICATION_EXTENSION_UNLOADED,
513 content::NotificationService::AllSources());
514
494 web_ui()->RegisterMessageCallback( 515 web_ui()->RegisterMessageCallback(
495 "initialized", 516 "initialized",
496 base::Bind(&PolicyUIHandler::HandleInitialized, base::Unretained(this))); 517 base::Bind(&PolicyUIHandler::HandleInitialized, base::Unretained(this)));
497 web_ui()->RegisterMessageCallback( 518 web_ui()->RegisterMessageCallback(
498 "reloadPolicies", 519 "reloadPolicies",
499 base::Bind(&PolicyUIHandler::HandleReloadPolicies, 520 base::Bind(&PolicyUIHandler::HandleReloadPolicies,
500 base::Unretained(this))); 521 base::Unretained(this)));
501 } 522 }
502 523
524 void PolicyUIHandler::Observe(int type,
525 const content::NotificationSource& source,
526 const content::NotificationDetails& details) {
527 DCHECK(type == chrome::NOTIFICATION_EXTENSION_LOADED ||
528 type == chrome::NOTIFICATION_EXTENSION_UNLOADED);
529 SendPolicyNames();
530 SendPolicyValues();
531 }
532
503 void PolicyUIHandler::OnPolicyUpdated(const policy::PolicyNamespace& ns, 533 void PolicyUIHandler::OnPolicyUpdated(const policy::PolicyNamespace& ns,
504 const policy::PolicyMap& previous, 534 const policy::PolicyMap& previous,
505 const policy::PolicyMap& current) { 535 const policy::PolicyMap& current) {
506 SendPolicyValues(); 536 SendPolicyValues();
507 } 537 }
508 538
509 void PolicyUIHandler::SendPolicyNames() const { 539 void PolicyUIHandler::SendPolicyNames() const {
510 base::DictionaryValue names; 540 base::DictionaryValue names;
541
542 // Add Chrome policy names.
543 base::DictionaryValue* chrome_policy_names = new base::DictionaryValue;
511 const policy::PolicyDefinitionList* list = 544 const policy::PolicyDefinitionList* list =
512 policy::GetChromePolicyDefinitionList(); 545 policy::GetChromePolicyDefinitionList();
513 for (const policy::PolicyDefinitionList::Entry* entry = list->begin; 546 for (const policy::PolicyDefinitionList::Entry* entry = list->begin;
514 entry != list->end; ++entry) { 547 entry != list->end; ++entry) {
515 names.SetBoolean(entry->name, true); 548 chrome_policy_names->SetBoolean(entry->name, true);
516 } 549 }
550 names.Set("chromePolicyNames", chrome_policy_names);
551
552 #if !defined(OS_ANDROID) && !defined(OS_IOS)
553 // Add extension policy names.
554 base::DictionaryValue* extension_policy_names = new base::DictionaryValue;
555 extensions::ExtensionSystem* extension_system =
556 extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui()));
557 const ExtensionSet* extensions =
558 extension_system->extension_service()->extensions();
559 scoped_refptr<const policy::PolicyDomainDescriptor> policy_domain_descriptor;
560 policy_domain_descriptor = GetPolicyService()->
561 GetPolicyDomainDescriptor(policy::POLICY_DOMAIN_EXTENSIONS);
562 const policy::PolicyDomainDescriptor::SchemaMap& schema_map =
563 policy_domain_descriptor->components();
564
565 for (ExtensionSet::const_iterator it = extensions->begin();
566 it != extensions->end(); ++it) {
567 const extensions::Extension* extension = *it;
568 if (extension->location() == extensions::Manifest::COMPONENT)
569 continue;
570 base::DictionaryValue* extension_value = new base::DictionaryValue;
571 extension_value->SetString("name", extension->name());
572 policy::PolicyDomainDescriptor::SchemaMap::const_iterator schema =
573 schema_map.find(extension->id());
574 base::DictionaryValue* policy_names = new base::DictionaryValue;
575 if (schema != schema_map.end()) {
576 // Get policy names from the extension's policy schema.
577 // Store in a map, not an array, for faster lookup on JS side.
578 const policy::PolicySchemaMap* policies = schema->second->GetProperties();
579 policy::PolicySchemaMap::const_iterator it_policies;
580 for (it_policies = policies->begin(); it_policies != policies->end();
581 it_policies++) {
582 policy_names->SetBoolean(it_policies->first, true);
583 }
584 }
585 extension_value->Set("policyNames", policy_names);
586 extension_policy_names->Set(extension->id(), extension_value);
587 }
588 names.Set("extensionPolicyNames", extension_policy_names);
589 #endif
590
517 web_ui()->CallJavascriptFunction("policy.Page.setPolicyNames", names); 591 web_ui()->CallJavascriptFunction("policy.Page.setPolicyNames", names);
518 } 592 }
519 593
520 void PolicyUIHandler::SendPolicyValues() const { 594 void PolicyUIHandler::SendPolicyValues() const {
521 base::DictionaryValue all_policies; 595 base::DictionaryValue all_policies;
522 596
523 // Add chrome policies. 597 // Add Chrome policy values.
524 base::DictionaryValue* chrome_policies = new base::DictionaryValue; 598 base::DictionaryValue* chrome_policies = new base::DictionaryValue;
525 GetChromePolicyValues(chrome_policies); 599 GetChromePolicyValues(chrome_policies);
526 all_policies.Set("chromePolicies", chrome_policies); 600 all_policies.Set("chromePolicies", chrome_policies);
527 601
528 #if !defined(OS_ANDROID) && !defined(OS_IOS) 602 #if !defined(OS_ANDROID) && !defined(OS_IOS)
529 // Get extensions. 603 // Add extension policy values.
530 extensions::ExtensionSystem* extension_system = 604 extensions::ExtensionSystem* extension_system =
531 extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui())); 605 extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui()));
532 const ExtensionSet* extensions = 606 const ExtensionSet* extensions =
533 extension_system->extension_service()->extensions(); 607 extension_system->extension_service()->extensions();
608 base::DictionaryValue* extension_values = new base::DictionaryValue;
534 609
535 // Add policies for each extension.
536 base::DictionaryValue* extension_values = new base::DictionaryValue;
537 for (ExtensionSet::const_iterator it = extensions->begin(); 610 for (ExtensionSet::const_iterator it = extensions->begin();
538 it != extensions->end(); ++it) { 611 it != extensions->end(); ++it) {
539 const extensions::Extension* extension = *it; 612 const extensions::Extension* extension = *it;
540
541 // Skip this extension if it's a component extension.
542 if (extension->location() == extensions::Manifest::COMPONENT) 613 if (extension->location() == extensions::Manifest::COMPONENT)
543 continue; 614 continue;
544
545 base::DictionaryValue* extension_value = new base::DictionaryValue;
546
547 // Add name.
548 extension_value->SetString("name", extension->name());
549
550 // Add policies.
551 base::DictionaryValue* extension_policies = new base::DictionaryValue; 615 base::DictionaryValue* extension_policies = new base::DictionaryValue;
552 policy::PolicyNamespace policy_namespace = policy::PolicyNamespace( 616 policy::PolicyNamespace policy_namespace = policy::PolicyNamespace(
553 policy::POLICY_DOMAIN_EXTENSIONS, extension->id()); 617 policy::POLICY_DOMAIN_EXTENSIONS, extension->id());
554 policy::PolicyErrorMap empty_error_map; 618 policy::PolicyErrorMap empty_error_map;
555 GetPolicyValues(GetPolicyService()->GetPolicies(policy_namespace), 619 GetPolicyValues(GetPolicyService()->GetPolicies(policy_namespace),
556 &empty_error_map, extension_policies); 620 &empty_error_map, extension_policies);
557 extension_value->Set("policies", extension_policies); 621 extension_values->Set(extension->id(), extension_policies);
558
559 // Add entry to the dictionary.
560 extension_values->Set(extension->id(), extension_value);
561 } 622 }
562 all_policies.Set("extensionPolicies", extension_values); 623 all_policies.Set("extensionPolicies", extension_values);
563 #endif 624 #endif
564
565 web_ui()->CallJavascriptFunction("policy.Page.setPolicyValues", all_policies); 625 web_ui()->CallJavascriptFunction("policy.Page.setPolicyValues", all_policies);
566 } 626 }
567 627
568 void PolicyUIHandler::GetPolicyValues(const policy::PolicyMap& map, 628 void PolicyUIHandler::GetPolicyValues(const policy::PolicyMap& map,
569 policy::PolicyErrorMap* errors, 629 policy::PolicyErrorMap* errors,
570 base::DictionaryValue* values) const { 630 base::DictionaryValue* values) const {
571 for (policy::PolicyMap::const_iterator entry = map.begin(); 631 for (policy::PolicyMap::const_iterator entry = map.begin();
572 entry != map.end(); ++entry) { 632 entry != map.end(); ++entry) {
573 base::DictionaryValue* value = new base::DictionaryValue; 633 base::DictionaryValue* value = new base::DictionaryValue;
574 value->Set("value", entry->second.value->DeepCopy()); 634 value->Set("value", entry->second.value->DeepCopy());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 } 712 }
653 713
654 PolicyUI::PolicyUI(content::WebUI* web_ui) : WebUIController(web_ui) { 714 PolicyUI::PolicyUI(content::WebUI* web_ui) : WebUIController(web_ui) {
655 web_ui->AddMessageHandler(new PolicyUIHandler); 715 web_ui->AddMessageHandler(new PolicyUIHandler);
656 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui), 716 content::WebUIDataSource::Add(Profile::FromWebUI(web_ui),
657 CreatePolicyUIHTMLSource()); 717 CreatePolicyUIHTMLSource());
658 } 718 }
659 719
660 PolicyUI::~PolicyUI() { 720 PolicyUI::~PolicyUI() {
661 } 721 }
OLDNEW
« no previous file with comments | « chrome/browser/resources/policy.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698