OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/extensions/api/declarative/declarative_api.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/task_runner_util.h" | |
10 #include "base/values.h" | |
11 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" | |
12 #include "chrome/common/extensions/api/events.h" | |
13 #include "content/public/browser/browser_thread.h" | |
14 #include "content/public/browser/render_process_host.h" | |
15 #include "content/public/browser/render_view_host.h" | |
16 #include "extensions/browser/extension_system.h" | |
17 #include "extensions/browser/guest_view/web_view/web_view_constants.h" | |
18 #include "extensions/browser/guest_view/web_view/web_view_guest.h" | |
19 #include "extensions/common/extension_api.h" | |
20 #include "extensions/common/permissions/permissions_data.h" | |
21 | |
22 using extensions::api::events::Rule; | |
23 | |
24 namespace AddRules = extensions::api::events::Event::AddRules; | |
25 namespace GetRules = extensions::api::events::Event::GetRules; | |
26 namespace RemoveRules = extensions::api::events::Event::RemoveRules; | |
27 | |
28 | |
29 namespace extensions { | |
30 | |
31 namespace { | |
32 | |
33 const char kWebRequest[] = "declarativeWebRequest."; | |
34 const char kWebViewExpectedError[] = "Webview event with Webview ID expected."; | |
35 | |
36 bool IsWebViewEvent(const std::string& event_name) { | |
37 // Sample event names: | |
38 // webViewInternal.onRequest. | |
39 // webViewInternal.onMessage. | |
40 return event_name.compare(0, | |
41 strlen(webview::kWebViewEventPrefix), | |
42 webview::kWebViewEventPrefix) == 0; | |
43 } | |
44 | |
45 std::string GetWebRequestEventName(const std::string& event_name) { | |
46 std::string web_request_event_name(event_name); | |
47 if (IsWebViewEvent(web_request_event_name)) { | |
48 web_request_event_name.replace( | |
49 0, strlen(webview::kWebViewEventPrefix), kWebRequest); | |
50 } | |
51 return web_request_event_name; | |
52 } | |
53 | |
54 } // namespace | |
55 | |
56 RulesFunction::RulesFunction() | |
57 : rules_registry_(NULL) { | |
58 } | |
59 | |
60 RulesFunction::~RulesFunction() {} | |
61 | |
62 bool RulesFunction::HasPermission() { | |
63 std::string event_name; | |
64 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | |
65 if (IsWebViewEvent(event_name) && | |
66 extension_->permissions_data()->HasAPIPermission( | |
67 extensions::APIPermission::kWebView)) | |
68 return true; | |
69 Feature::Availability availability = | |
70 ExtensionAPI::GetSharedInstance()->IsAvailable( | |
71 event_name, | |
72 extension_.get(), | |
73 Feature::BLESSED_EXTENSION_CONTEXT, | |
74 source_url()); | |
75 return availability.is_available(); | |
76 } | |
77 | |
78 bool RulesFunction::RunAsync() { | |
79 std::string event_name; | |
80 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &event_name)); | |
81 | |
82 int webview_instance_id = 0; | |
83 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &webview_instance_id)); | |
84 int embedder_process_id = render_view_host()->GetProcess()->GetID(); | |
85 | |
86 bool has_webview = webview_instance_id != 0; | |
87 if (has_webview != IsWebViewEvent(event_name)) | |
88 EXTENSION_FUNCTION_ERROR(kWebViewExpectedError); | |
89 event_name = GetWebRequestEventName(event_name); | |
90 | |
91 // If we are not operating on a particular <webview>, then the key is (0, 0). | |
92 RulesRegistryService::WebViewKey key( | |
93 webview_instance_id ? embedder_process_id : 0, webview_instance_id); | |
94 | |
95 RulesRegistryService* rules_registry_service = | |
96 RulesRegistryService::Get(browser_context()); | |
97 rules_registry_ = rules_registry_service->GetRulesRegistry(key, event_name); | |
98 // Raw access to this function is not available to extensions, therefore | |
99 // there should never be a request for a nonexisting rules registry. | |
100 EXTENSION_FUNCTION_VALIDATE(rules_registry_.get()); | |
101 | |
102 if (content::BrowserThread::CurrentlyOn(rules_registry_->owner_thread())) { | |
103 bool success = RunAsyncOnCorrectThread(); | |
104 SendResponse(success); | |
105 } else { | |
106 scoped_refptr<base::MessageLoopProxy> message_loop_proxy = | |
107 content::BrowserThread::GetMessageLoopProxyForThread( | |
108 rules_registry_->owner_thread()); | |
109 base::PostTaskAndReplyWithResult( | |
110 message_loop_proxy.get(), | |
111 FROM_HERE, | |
112 base::Bind(&RulesFunction::RunAsyncOnCorrectThread, this), | |
113 base::Bind(&RulesFunction::SendResponse, this)); | |
114 } | |
115 | |
116 return true; | |
117 } | |
118 | |
119 bool EventsEventAddRulesFunction::RunAsyncOnCorrectThread() { | |
120 scoped_ptr<AddRules::Params> params(AddRules::Params::Create(*args_)); | |
121 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
122 | |
123 error_ = rules_registry_->AddRules(extension_id(), params->rules); | |
124 | |
125 if (error_.empty()) | |
126 results_ = AddRules::Results::Create(params->rules); | |
127 | |
128 return error_.empty(); | |
129 } | |
130 | |
131 bool EventsEventRemoveRulesFunction::RunAsyncOnCorrectThread() { | |
132 scoped_ptr<RemoveRules::Params> params(RemoveRules::Params::Create(*args_)); | |
133 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
134 | |
135 if (params->rule_identifiers.get()) { | |
136 error_ = rules_registry_->RemoveRules(extension_id(), | |
137 *params->rule_identifiers); | |
138 } else { | |
139 error_ = rules_registry_->RemoveAllRules(extension_id()); | |
140 } | |
141 | |
142 return error_.empty(); | |
143 } | |
144 | |
145 bool EventsEventGetRulesFunction::RunAsyncOnCorrectThread() { | |
146 scoped_ptr<GetRules::Params> params(GetRules::Params::Create(*args_)); | |
147 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
148 | |
149 std::vector<linked_ptr<Rule> > rules; | |
150 if (params->rule_identifiers.get()) { | |
151 rules_registry_->GetRules( | |
152 extension_id(), *params->rule_identifiers, &rules); | |
153 } else { | |
154 rules_registry_->GetAllRules(extension_id(), &rules); | |
155 } | |
156 | |
157 results_ = GetRules::Results::Create(rules); | |
158 | |
159 return true; | |
160 } | |
161 | |
162 } // namespace extensions | |
OLD | NEW |