| OLD | NEW |
| 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/extensions/api/declarative/declarative_api.h" | 5 #include "chrome/browser/extensions/api/declarative/declarative_api.h" |
| 6 | 6 |
| 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" |
| 7 #include "base/values.h" | 9 #include "base/values.h" |
| 8 #include "chrome/browser/extensions/api/declarative/declarative_api_constants.h" | |
| 9 #include "chrome/browser/extensions/api/declarative/rules_registry.h" | |
| 10 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" | 10 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" |
| 11 #include "chrome/browser/extensions/extension_service.h" | 11 #include "chrome/browser/extensions/extension_service.h" |
| 12 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/common/extensions/api/experimental.declarative.h" |
| 14 #include "content/public/browser/browser_thread.h" |
| 13 | 15 |
| 14 namespace keys = extensions::declarative_api_constants; | 16 using namespace extensions::api::experimental; |
| 15 | 17 |
| 16 namespace { | 18 namespace { |
| 17 | 19 |
| 18 // Adds all entries from |list| to |out|. Assumes that all entries of |list| | 20 // Adds all entries from |list| to |out|. Assumes that all entries of |list| |
| 19 // are strings. Returns true if successful. | 21 // are strings. Returns true if successful. |
| 20 bool AddAllStringValues(ListValue* list, std::vector<std::string>* out) { | 22 bool AddAllStringValues(ListValue* list, std::vector<std::string>* out) { |
| 21 for (ListValue::iterator i = list->begin(); i != list->end(); ++i) { | 23 for (ListValue::iterator i = list->begin(); i != list->end(); ++i) { |
| 22 std::string value; | 24 std::string value; |
| 23 if (!(*i)->GetAsString(&value)) | 25 if (!(*i)->GetAsString(&value)) |
| 24 return false; | 26 return false; |
| 25 out->push_back(value); | 27 out->push_back(value); |
| 26 } | 28 } |
| 27 return true; | 29 return true; |
| 28 } | 30 } |
| 29 | 31 |
| 30 } // namespace | 32 } // namespace |
| 31 | 33 |
| 32 namespace extensions { | 34 namespace extensions { |
| 33 | 35 |
| 34 bool AddRulesFunction::RunImpl() { | 36 RulesFunction::RulesFunction() : rules_registry_(NULL) {} |
| 37 |
| 38 RulesFunction::~RulesFunction() {} |
| 39 |
| 40 bool RulesFunction::RunImpl() { |
| 35 std::string event_name; | 41 std::string event_name; |
| 36 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | 42 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
| 37 | 43 |
| 38 ListValue* rules_list = NULL; | |
| 39 EXTENSION_FUNCTION_VALIDATE(args_->GetList(1, &rules_list)); | |
| 40 | |
| 41 std::vector<DictionaryValue*> rules; | |
| 42 for (ListValue::iterator i = rules_list->begin(); | |
| 43 i != rules_list->end(); | |
| 44 ++i) { | |
| 45 DictionaryValue* rule = NULL; | |
| 46 EXTENSION_FUNCTION_VALIDATE((*i)->GetAsDictionary(&rule)); | |
| 47 rules.push_back(rule); | |
| 48 } | |
| 49 | |
| 50 RulesRegistryService* rules_registry_service = | 44 RulesRegistryService* rules_registry_service = |
| 51 profile()->GetExtensionService()->GetRulesRegistryService(); | 45 profile()->GetExtensionService()->GetRulesRegistryService(); |
| 52 RulesRegistry* rules_registry = | 46 rules_registry_ = rules_registry_service->GetRulesRegistry(event_name); |
| 53 rules_registry_service->GetRulesRegistry(event_name); | 47 // Raw access to this function is not available to extensions, therefore |
| 54 if (!rules_registry) { | 48 // there should never be a request for a nonexisting rules registry. |
| 55 error_ = keys::kInvalidEventName; | 49 EXTENSION_FUNCTION_VALIDATE(rules_registry_); |
| 56 return false; | 50 |
| 51 if (content::BrowserThread::CurrentlyOn(rules_registry_->GetOwnerThread())) { |
| 52 RunImplOnCorrectThread(); |
| 53 SendResponseOnUIThread(); |
| 54 } else { |
| 55 content::BrowserThread::PostTaskAndReply( |
| 56 rules_registry_->GetOwnerThread(), FROM_HERE, |
| 57 base::Bind(base::IgnoreResult(&RulesFunction::RunImplOnCorrectThread), |
| 58 this), |
| 59 base::Bind(&RulesFunction::SendResponseOnUIThread, this)); |
| 57 } | 60 } |
| 58 | 61 |
| 59 error_ = rules_registry->AddRules(extension_id(), rules); | |
| 60 if (!error_.empty()) | |
| 61 return false; | |
| 62 | |
| 63 result_.reset(rules_list->DeepCopy()); | |
| 64 return true; | |
| 65 } | |
| 66 | |
| 67 bool RemoveRulesFunction::RunImpl() { | |
| 68 std::string event_name; | |
| 69 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | |
| 70 | |
| 71 Value* rule_identifiers = NULL; | |
| 72 EXTENSION_FUNCTION_VALIDATE(args_->Get(1, &rule_identifiers)); | |
| 73 | |
| 74 RulesRegistryService* rules_registry_service = | |
| 75 profile()->GetExtensionService()->GetRulesRegistryService(); | |
| 76 RulesRegistry* rules_registry = | |
| 77 rules_registry_service->GetRulesRegistry(event_name); | |
| 78 if (!rules_registry) { | |
| 79 error_ = keys::kInvalidEventName; | |
| 80 return false; | |
| 81 } | |
| 82 | |
| 83 switch (rule_identifiers->GetType()) { | |
| 84 case Value::TYPE_NULL: | |
| 85 error_ = rules_registry->RemoveAllRules(extension_id()); | |
| 86 break; | |
| 87 case Value::TYPE_LIST: { | |
| 88 std::vector<std::string> rule_identifiers_list; | |
| 89 EXTENSION_FUNCTION_VALIDATE( | |
| 90 AddAllStringValues(static_cast<ListValue*>(rule_identifiers), | |
| 91 &rule_identifiers_list)); | |
| 92 error_ = rules_registry->RemoveRules(extension_id(), | |
| 93 rule_identifiers_list); | |
| 94 break; | |
| 95 } | |
| 96 default: | |
| 97 error_ = keys::kInvalidDatatype; | |
| 98 break; | |
| 99 } | |
| 100 return error_.empty(); | |
| 101 } | |
| 102 | |
| 103 bool GetRulesFunction::RunImpl() { | |
| 104 std::string event_name; | |
| 105 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | |
| 106 | |
| 107 Value* rule_identifiers = NULL; | |
| 108 EXTENSION_FUNCTION_VALIDATE(args_->Get(1, &rule_identifiers)); | |
| 109 | |
| 110 RulesRegistryService* rules_registry_service = | |
| 111 profile()->GetExtensionService()->GetRulesRegistryService(); | |
| 112 RulesRegistry* rules_registry = | |
| 113 rules_registry_service->GetRulesRegistry(event_name); | |
| 114 if (!rules_registry) { | |
| 115 error_ = keys::kInvalidEventName; | |
| 116 return false; | |
| 117 } | |
| 118 | |
| 119 std::vector<DictionaryValue*> rules; | |
| 120 switch (rule_identifiers->GetType()) { | |
| 121 case Value::TYPE_NULL: | |
| 122 error_ = rules_registry->GetAllRules(extension_id(), &rules); | |
| 123 break; | |
| 124 case Value::TYPE_LIST: { | |
| 125 std::vector<std::string> rule_identifiers_list; | |
| 126 EXTENSION_FUNCTION_VALIDATE( | |
| 127 AddAllStringValues(static_cast<ListValue*>(rule_identifiers), | |
| 128 &rule_identifiers_list)); | |
| 129 error_ = rules_registry->GetRules(extension_id(), rule_identifiers_list, | |
| 130 &rules); | |
| 131 break; | |
| 132 } | |
| 133 default: | |
| 134 error_ = keys::kInvalidDatatype; | |
| 135 break; | |
| 136 } | |
| 137 | |
| 138 if (!error_.empty()) | |
| 139 return false; | |
| 140 | |
| 141 scoped_ptr<ListValue> result(new ListValue); | |
| 142 for (std::vector<DictionaryValue*>::iterator i = rules.begin(); | |
| 143 i != rules.end(); ++i) | |
| 144 result->Append(*i); | |
| 145 result_.reset(result.release()); | |
| 146 | |
| 147 return true; | 62 return true; |
| 148 } | 63 } |
| 149 | 64 |
| 65 void RulesFunction::SendResponseOnUIThread() { |
| 66 SendResponse(error_.empty()); |
| 67 } |
| 68 |
| 69 bool AddRulesFunction::RunImplOnCorrectThread() { |
| 70 scoped_ptr<AddRules::Params> params(AddRules::Params::Create(*args_)); |
| 71 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 72 |
| 73 error_ = rules_registry_->AddRules(extension_id(), params->rules); |
| 74 |
| 75 if (error_.empty()) |
| 76 result_.reset(AddRules::Result::Create(params->rules)); |
| 77 |
| 78 return error_.empty(); |
| 79 } |
| 80 |
| 81 bool RemoveRulesFunction::RunImplOnCorrectThread() { |
| 82 scoped_ptr<RemoveRules::Params> params(RemoveRules::Params::Create(*args_)); |
| 83 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 84 |
| 85 if (params->rule_identifiers.get()) { |
| 86 error_ = rules_registry_->RemoveRules(extension_id(), |
| 87 *params->rule_identifiers); |
| 88 } else { |
| 89 error_ = rules_registry_->RemoveAllRules(extension_id()); |
| 90 } |
| 91 |
| 92 return error_.empty(); |
| 93 } |
| 94 |
| 95 bool GetRulesFunction::RunImplOnCorrectThread() { |
| 96 scoped_ptr<RemoveRules::Params> params(RemoveRules::Params::Create(*args_)); |
| 97 EXTENSION_FUNCTION_VALIDATE(params.get()); |
| 98 |
| 99 std::vector<linked_ptr<Rule> > rules; |
| 100 if (params->rule_identifiers.get()) { |
| 101 error_ = rules_registry_->GetRules(extension_id(), |
| 102 *params->rule_identifiers, |
| 103 &rules); |
| 104 } else { |
| 105 error_ = rules_registry_->GetAllRules(extension_id(), &rules); |
| 106 } |
| 107 |
| 108 if (error_.empty()) |
| 109 result_.reset(GetRules::Result::Create(rules)); |
| 110 |
| 111 return error_.empty(); |
| 112 } |
| 113 |
| 150 } // namespace extensions | 114 } // namespace extensions |
| OLD | NEW |