Chromium Code Reviews| 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" | |
| 7 #include "base/values.h" | 8 #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" | 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_declarative; |
| 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 bool RulesFunction::RunImpl() { | |
| 35 std::string event_name; | 39 std::string event_name; |
| 36 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | 40 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
| 37 | 41 |
| 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 = | 42 RulesRegistryService* rules_registry_service = |
| 51 profile()->GetExtensionService()->GetRulesRegistryService(); | 43 profile()->GetExtensionService()->GetRulesRegistryService(); |
| 52 RulesRegistry* rules_registry = | 44 rules_registry_ = rules_registry_service->GetRulesRegistry(event_name); |
| 53 rules_registry_service->GetRulesRegistry(event_name); | 45 EXTENSION_FUNCTION_VALIDATE(rules_registry_); |
| 54 if (!rules_registry) { | 46 |
| 55 error_ = keys::kInvalidEventName; | 47 if (content::BrowserThread::CurrentlyOn(rules_registry_->GetOwnerThread())) { |
| 56 return false; | 48 RunImplOnCorrectThread(); |
| 49 SendResponseOnUIThread(); | |
| 50 } else { | |
| 51 content::BrowserThread::PostTaskAndReply( | |
| 52 rules_registry_->GetOwnerThread(), FROM_HERE, | |
| 53 base::Bind(&RulesFunction::RunImplOnCorrectThread, this), | |
| 54 base::Bind(&RulesFunction::SendResponseOnUIThread, this)); | |
| 57 } | 55 } |
| 58 | 56 |
| 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; | 57 return true; |
| 148 } | 58 } |
| 149 | 59 |
| 60 void RulesFunction::SendResponseOnUIThread() { | |
| 61 SendResponse(error_.empty() && !bad_message_); | |
|
not at google - send to devlin
2012/02/20 11:50:51
I think that you don't need to check for bad_messa
battre
2012/02/28 22:29:18
Done. - My goal is to get rid of SendResponseOnUIT
| |
| 62 } | |
| 63 | |
| 64 void AddRulesFunction::RunImplOnCorrectThread() { | |
| 65 scoped_ptr<AddRules::Params> params(AddRules::Params::Create(*args_)); | |
| 66 if (!params.get()) { | |
| 67 bad_message_ = true; | |
| 68 return; | |
| 69 } | |
| 70 | |
| 71 error_ = rules_registry_->AddRules(extension_id(), params->rules); | |
| 72 | |
| 73 if (error_.empty()) | |
| 74 result_.reset(AddRules::Result::Create(params->rules)); | |
| 75 } | |
| 76 | |
| 77 void RemoveRulesFunction::RunImplOnCorrectThread() { | |
| 78 scoped_ptr<RemoveRules::Params> params(RemoveRules::Params::Create(*args_)); | |
| 79 if (!params.get()) { | |
| 80 bad_message_ = true; | |
| 81 return; | |
| 82 } | |
| 83 | |
| 84 if (params->rule_identifiers.get()) { | |
| 85 error_ = rules_registry_->RemoveRules(extension_id(), | |
| 86 *params->rule_identifiers); | |
| 87 } else { | |
| 88 error_ = rules_registry_->RemoveAllRules(extension_id()); | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 void GetRulesFunction::RunImplOnCorrectThread() { | |
| 93 scoped_ptr<RemoveRules::Params> params(RemoveRules::Params::Create(*args_)); | |
| 94 if (!params.get()) { | |
| 95 bad_message_ = true; | |
| 96 return; | |
| 97 } | |
| 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 | |
| 150 } // namespace extensions | 112 } // namespace extensions |
| OLD | NEW |