15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/declarative/declarative_api.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/base64.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/web_contents.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/extensions_api_client.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_constants.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_guest.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/events.h" 210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "extensions/common/extension_api.h" 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing extensions::core_api::events::Rule; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace AddRules = extensions::core_api::events::Event::AddRules; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace GetRules = extensions::core_api::events::Event::GetRules; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace RemoveRules = extensions::core_api::events::Event::RemoveRules; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kWebRequest[] = "declarativeWebRequest."; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const char kWebViewExpectedError[] = "Webview event with Webview ID expected."; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool IsWebViewEvent(const std::string& event_name) { 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sample event names: 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // webViewInternal.onRequest. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // webViewInternal.onMessage. 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return event_name.compare(0, 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch strlen(webview::kWebViewEventPrefix), 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch webview::kWebViewEventPrefix) == 0; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)std::string GetWebRequestEventName(const std::string& event_name) { 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string web_request_event_name(event_name); 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (IsWebViewEvent(web_request_event_name)) { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_request_event_name.replace( 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, strlen(webview::kWebViewEventPrefix), kWebRequest); 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return web_request_event_name; 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConvertBinaryDictionaryValuesToBase64(base::DictionaryValue* dict); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Encodes |binary| as base64 and returns a new StringValue populated with the 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// encoded string. 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<base::StringValue> ConvertBinaryToBase64(base::BinaryValue* binary) { 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string binary_data = std::string(binary->GetBuffer(), binary->GetSize()); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string data64; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Base64Encode(binary_data, &data64); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<base::StringValue>(new base::StringValue(data64)); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Parses through |args| replacing any BinaryValues with base64 encoded 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// StringValues. Recurses over any nested ListValues, and calls 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ConvertBinaryDictionaryValuesToBase64 for any nested DictionaryValues. 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConvertBinaryListElementsToBase64(base::ListValue* args) { 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t index = 0; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (base::ListValue::iterator iter = args->begin(); iter != args->end(); 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++iter, ++index) { 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((*iter)->IsType(base::Value::TYPE_BINARY)) { 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::BinaryValue* binary = NULL; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (args->GetBinary(index, &binary)) 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci args->Set(index, ConvertBinaryToBase64(binary).release()); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if ((*iter)->IsType(base::Value::TYPE_LIST)) { 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::ListValue* list; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*iter)->GetAsList(&list); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConvertBinaryListElementsToBase64(list); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if ((*iter)->IsType(base::Value::TYPE_DICTIONARY)) { 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::DictionaryValue* dict; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*iter)->GetAsDictionary(&dict); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConvertBinaryDictionaryValuesToBase64(dict); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Parses through |dict| replacing any BinaryValues with base64 encoded 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// StringValues. Recurses over any nested DictionaryValues, and calls 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// ConvertBinaryListElementsToBase64 for any nested ListValues. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConvertBinaryDictionaryValuesToBase64(base::DictionaryValue* dict) { 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (base::DictionaryValue::Iterator iter(*dict); !iter.IsAtEnd(); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter.Advance()) { 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (iter.value().IsType(base::Value::TYPE_BINARY)) { 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::BinaryValue* binary = NULL; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (dict->GetBinary(iter.key(), &binary)) 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dict->Set(iter.key(), ConvertBinaryToBase64(binary).release()); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (iter.value().IsType(base::Value::TYPE_LIST)) { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::ListValue* list; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter.value().GetAsList(&list); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConvertBinaryListElementsToBase64(const_cast<base::ListValue*>(list)); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (iter.value().IsType(base::Value::TYPE_DICTIONARY)) { 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::DictionaryValue* dict; 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci iter.value().GetAsDictionary(&dict); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConvertBinaryDictionaryValuesToBase64( 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const_cast<base::DictionaryValue*>(dict)); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)RulesFunction::RulesFunction() 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : rules_registry_(NULL) { 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RulesFunction::~RulesFunction() {} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RulesFunction::HasPermission() { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_name; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (IsWebViewEvent(event_name) && 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extension_->permissions_data()->HasAPIPermission( 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) extensions::APIPermission::kWebView)) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Feature::Availability availability = 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ExtensionAPI::GetSharedInstance()->IsAvailable( 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci event_name, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extension_.get(), 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Feature::BLESSED_EXTENSION_CONTEXT, 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) source_url()); 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return availability.is_available(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool RulesFunction::RunAsync() { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string event_name; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int webview_instance_id = 0; 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &webview_instance_id)); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int embedder_process_id = render_view_host()->GetProcess()->GetID(); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool has_webview = webview_instance_id != 0; 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (has_webview != IsWebViewEvent(event_name)) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXTENSION_FUNCTION_ERROR(kWebViewExpectedError); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_name = GetWebRequestEventName(event_name); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If we are not operating on a particular <webview>, then the key is (0, 0). 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RulesRegistry::WebViewKey key( 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) webview_instance_id ? embedder_process_id : 0, webview_instance_id); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The following call will return a NULL pointer for apps_shell, but should 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // never be called there anyways. 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rules_registry_ = ExtensionsAPIClient::Get()->GetRulesRegistry( 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser_context(), key, event_name); 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(rules_registry_.get()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Raw access to this function is not available to extensions, therefore 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there should never be a request for a nonexisting rules registry. 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(rules_registry_.get()); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (content::BrowserThread::CurrentlyOn(rules_registry_->owner_thread())) { 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool success = RunAsyncOnCorrectThread(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(success); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> message_loop_proxy = 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetMessageLoopProxyForThread( 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) rules_registry_->owner_thread()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PostTaskAndReplyWithResult( 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) message_loop_proxy.get(), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&RulesFunction::RunAsyncOnCorrectThread, this), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&RulesFunction::SendResponse, this)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool EventsEventAddRulesFunction::RunAsyncOnCorrectThread() { 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConvertBinaryListElementsToBase64(args_.get()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AddRules::Params> params(AddRules::Params::Create(*args_)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = rules_registry_->AddRules(extension_id(), params->rules); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_.empty()) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_ = AddRules::Results::Create(params->rules); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_.empty(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool EventsEventRemoveRulesFunction::RunAsyncOnCorrectThread() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RemoveRules::Params> params(RemoveRules::Params::Create(*args_)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->rule_identifiers.get()) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = rules_registry_->RemoveRules(extension_id(), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *params->rule_identifiers); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = rules_registry_->RemoveAllRules(extension_id()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error_.empty(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool EventsEventGetRulesFunction::RunAsyncOnCorrectThread() { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<GetRules::Params> params(GetRules::Params::Create(*args_)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params.get()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<Rule> > rules; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params->rule_identifiers.get()) { 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) rules_registry_->GetRules( 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_id(), *params->rule_identifiers, &rules); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) rules_registry_->GetAllRules(extension_id(), &rules); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) results_ = GetRules::Results::Create(rules); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 225