Chromium Code Reviews| Index: chrome/browser/extensions/api/declarative/declarative_api.cc |
| diff --git a/chrome/browser/extensions/api/declarative/declarative_api.cc b/chrome/browser/extensions/api/declarative/declarative_api.cc |
| index 9f2f5cce902a9965203af67c514b97bf5df03663..878da9344b5d2949f96f4ac239d3c16d4d1cb17e 100644 |
| --- a/chrome/browser/extensions/api/declarative/declarative_api.cc |
| +++ b/chrome/browser/extensions/api/declarative/declarative_api.cc |
| @@ -10,10 +10,13 @@ |
| #include "base/values.h" |
| #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" |
| #include "chrome/browser/extensions/extension_system_factory.h" |
| +#include "chrome/browser/guestview/webview/webview_guest.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/extensions/api/events.h" |
| #include "chrome/common/extensions/api/extension_api.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/render_process_host.h" |
| +#include "content/public/browser/render_view_host.h" |
| using extensions::api::events::Rule; |
| @@ -21,15 +24,37 @@ namespace AddRules = extensions::api::events::Event::AddRules; |
| namespace GetRules = extensions::api::events::Event::GetRules; |
| namespace RemoveRules = extensions::api::events::Event::RemoveRules; |
| +namespace { |
| + |
| +using extensions::RulesRegistryService; |
| + |
| +const char kWebRequest[] = "declarativeWebRequest"; |
| +const char kWebView[] = "webview"; |
| + |
| +std::string GetWebRequestEventName(const std::string& event_name) { |
| + std::string web_request_event_name(event_name); |
| + if (web_request_event_name.find(kWebView) != std::string::npos) |
|
vabr (Chromium)
2013/10/25 20:40:24
[This is optional, and probably questionable, feel
Fady Samuel
2013/10/25 22:48:08
It doesn't hurt to be more restrictive. Done.
|
| + web_request_event_name.replace(0, sizeof(kWebView) - 1, kWebRequest); |
| + return web_request_event_name; |
| +} |
| + |
| +} // namespace |
| + |
| namespace extensions { |
| -RulesFunction::RulesFunction() : rules_registry_(NULL) {} |
| +RulesFunction::RulesFunction() |
| + : rules_registry_(NULL), |
| + webview_instance_id_(0) { |
| +} |
| RulesFunction::~RulesFunction() {} |
| bool RulesFunction::HasPermission() { |
| std::string event_name; |
| EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
| + if ((event_name.find(kWebView) != std::string::npos) && |
| + extension_->HasAPIPermission(extensions::APIPermission::kWebView)) |
| + return true; |
| Feature::Availability availability = |
| ExtensionAPI::GetSharedInstance()->IsAvailable( |
| event_name, extension_, Feature::BLESSED_EXTENSION_CONTEXT, |
| @@ -40,10 +65,31 @@ bool RulesFunction::HasPermission() { |
| bool RulesFunction::RunImpl() { |
| std::string event_name; |
| EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); |
| + event_name = GetWebRequestEventName(event_name); |
| + |
| + int webview_instance_id = 0; |
| + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &webview_instance_id)); |
| + int embedder_process_id = render_view_host()->GetProcess()->GetID(); |
| + |
| + // Note: This is structured for readability. |
| + // We can only install rules on a <webview> in a context with the webview |
| + // permission. |
| + if (extension_->HasAPIPermission(extensions::APIPermission::kWebView)) { |
| + if (!webview_instance_id) |
| + return false; |
| + } else { |
| + if (webview_instance_id) |
| + return false; |
| + } |
| + |
| + // If are not operating on a particular <webview> then the key is (0, 0). |
|
vabr (Chromium)
2013/10/25 20:40:24
grammar: remove "are"?
Fady Samuel
2013/10/25 22:48:08
Added "we"
|
| + RulesRegistryService::WebViewKey key( |
| + webview_instance_id ? embedder_process_id : 0, webview_instance_id); |
| RulesRegistryService* rules_registry_service = |
| RulesRegistryService::Get(profile()); |
| - rules_registry_ = rules_registry_service->GetRulesRegistry(event_name); |
| + rules_registry_ = rules_registry_service->GetRulesRegistry(key, event_name); |
| + |
| // Raw access to this function is not available to extensions, therefore |
| // there should never be a request for a nonexisting rules registry. |
| EXTENSION_FUNCTION_VALIDATE(rules_registry_.get()); |