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/web_request/web_request_api.h" | 5 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
390 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does | 390 // NOTE(benjhayden) New APIs should not use this sub_event_name trick! It does |
391 // not play well with event pages. See downloads.onDeterminingFilename and | 391 // not play well with event pages. See downloads.onDeterminingFilename and |
392 // ExtensionDownloadsEventRouter for an alternative approach. | 392 // ExtensionDownloadsEventRouter for an alternative approach. |
393 struct ExtensionWebRequestEventRouter::EventListener { | 393 struct ExtensionWebRequestEventRouter::EventListener { |
394 std::string extension_id; | 394 std::string extension_id; |
395 std::string extension_name; | 395 std::string extension_name; |
396 std::string sub_event_name; | 396 std::string sub_event_name; |
397 RequestFilter filter; | 397 RequestFilter filter; |
398 int extra_info_spec; | 398 int extra_info_spec; |
399 int embedder_process_id; | 399 int embedder_process_id; |
400 int embedder_routing_id; | |
401 int webview_instance_id; | 400 int webview_instance_id; |
402 base::WeakPtr<IPC::Sender> ipc_sender; | 401 base::WeakPtr<IPC::Sender> ipc_sender; |
403 mutable std::set<uint64> blocked_requests; | 402 mutable std::set<uint64> blocked_requests; |
404 | 403 |
405 // Comparator to work with std::set. | 404 // Comparator to work with std::set. |
406 bool operator<(const EventListener& that) const { | 405 bool operator<(const EventListener& that) const { |
407 if (extension_id < that.extension_id) | 406 if (extension_id < that.extension_id) |
408 return true; | 407 return true; |
409 if (extension_id == that.extension_id && | 408 if (extension_id == that.extension_id && |
410 sub_event_name < that.sub_event_name) | 409 sub_event_name < that.sub_event_name) |
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1166 | 1165 |
1167 bool ExtensionWebRequestEventRouter::AddEventListener( | 1166 bool ExtensionWebRequestEventRouter::AddEventListener( |
1168 void* profile, | 1167 void* profile, |
1169 const std::string& extension_id, | 1168 const std::string& extension_id, |
1170 const std::string& extension_name, | 1169 const std::string& extension_name, |
1171 const std::string& event_name, | 1170 const std::string& event_name, |
1172 const std::string& sub_event_name, | 1171 const std::string& sub_event_name, |
1173 const RequestFilter& filter, | 1172 const RequestFilter& filter, |
1174 int extra_info_spec, | 1173 int extra_info_spec, |
1175 int embedder_process_id, | 1174 int embedder_process_id, |
1176 int embedder_routing_id, | |
1177 int webview_instance_id, | 1175 int webview_instance_id, |
1178 base::WeakPtr<IPC::Sender> ipc_sender) { | 1176 base::WeakPtr<IPC::Sender> ipc_sender) { |
1179 | 1177 |
1180 if (!IsWebRequestEvent(event_name)) | 1178 if (!IsWebRequestEvent(event_name)) |
1181 return false; | 1179 return false; |
1182 | 1180 |
1183 EventListener listener; | 1181 EventListener listener; |
1184 listener.extension_id = extension_id; | 1182 listener.extension_id = extension_id; |
1185 listener.extension_name = extension_name; | 1183 listener.extension_name = extension_name; |
1186 listener.sub_event_name = sub_event_name; | 1184 listener.sub_event_name = sub_event_name; |
1187 listener.filter = filter; | 1185 listener.filter = filter; |
1188 listener.extra_info_spec = extra_info_spec; | 1186 listener.extra_info_spec = extra_info_spec; |
1189 listener.ipc_sender = ipc_sender; | 1187 listener.ipc_sender = ipc_sender; |
1190 listener.embedder_process_id = embedder_process_id; | 1188 listener.embedder_process_id = embedder_process_id; |
1191 listener.embedder_routing_id = embedder_routing_id; | |
1192 listener.webview_instance_id = webview_instance_id; | 1189 listener.webview_instance_id = webview_instance_id; |
1193 if (listener.webview_instance_id) | 1190 if (listener.webview_instance_id) |
1194 RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener")); | 1191 RecordAction(content::UserMetricsAction("WebView.WebRequest.AddListener")); |
1195 | 1192 |
1196 if (listeners_[profile][event_name].count(listener) != 0u) { | 1193 if (listeners_[profile][event_name].count(listener) != 0u) { |
1197 // This is likely an abuse of the API by a malicious extension. | 1194 // This is likely an abuse of the API by a malicious extension. |
1198 return false; | 1195 return false; |
1199 } | 1196 } |
1200 listeners_[profile][event_name].insert(listener); | 1197 listeners_[profile][event_name].insert(listener); |
1201 return true; | 1198 return true; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1234 | 1231 |
1235 listeners_[profile][event_name].erase(listener); | 1232 listeners_[profile][event_name].erase(listener); |
1236 | 1233 |
1237 helpers::ClearCacheOnNavigation(); | 1234 helpers::ClearCacheOnNavigation(); |
1238 } | 1235 } |
1239 | 1236 |
1240 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( | 1237 void ExtensionWebRequestEventRouter::RemoveWebViewEventListeners( |
1241 void* profile, | 1238 void* profile, |
1242 const std::string& extension_id, | 1239 const std::string& extension_id, |
1243 int embedder_process_id, | 1240 int embedder_process_id, |
1244 int embedder_routing_id, | |
1245 int webview_instance_id) { | 1241 int webview_instance_id) { |
1246 // Iterate over all listeners of all WebRequest events to delete | 1242 // Iterate over all listeners of all WebRequest events to delete |
1247 // any listeners that belong to the provided <webview>. | 1243 // any listeners that belong to the provided <webview>. |
1248 ListenerMapForProfile& map_for_profile = listeners_[profile]; | 1244 ListenerMapForProfile& map_for_profile = listeners_[profile]; |
1249 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin(); | 1245 for (ListenerMapForProfile::iterator event_iter = map_for_profile.begin(); |
1250 event_iter != map_for_profile.end(); ++event_iter) { | 1246 event_iter != map_for_profile.end(); ++event_iter) { |
1251 std::vector<EventListener> listeners_to_delete; | 1247 std::vector<EventListener> listeners_to_delete; |
1252 std::set<EventListener>& listeners = event_iter->second; | 1248 std::set<EventListener>& listeners = event_iter->second; |
1253 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); | 1249 for (std::set<EventListener>::iterator listener_iter = listeners.begin(); |
1254 listener_iter != listeners.end(); ++listener_iter) { | 1250 listener_iter != listeners.end(); ++listener_iter) { |
1255 const EventListener& listener = *listener_iter; | 1251 const EventListener& listener = *listener_iter; |
1256 // TODO(fsamuel): Investigate making <webview> instance IDs unique within | 1252 // TODO(fsamuel): Investigate making <webview> instance IDs unique within |
lazyboy
2013/08/30 17:10:11
This is what you are fixing too, so remove this TO
Fady Samuel
2013/08/30 17:20:15
Done.
| |
1257 // a process. | 1253 // a process. |
1258 if (listener.embedder_process_id == embedder_process_id && | 1254 if (listener.embedder_process_id == embedder_process_id && |
1259 listener.embedder_routing_id == embedder_routing_id && | |
1260 listener.webview_instance_id == webview_instance_id) | 1255 listener.webview_instance_id == webview_instance_id) |
1261 listeners_to_delete.push_back(listener); | 1256 listeners_to_delete.push_back(listener); |
1262 } | 1257 } |
1263 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { | 1258 for (size_t i = 0; i < listeners_to_delete.size(); ++i) { |
1264 EventListener& listener = listeners_to_delete[i]; | 1259 EventListener& listener = listeners_to_delete[i]; |
1265 content::BrowserThread::PostTask( | 1260 content::BrowserThread::PostTask( |
1266 content::BrowserThread::UI, | 1261 content::BrowserThread::UI, |
1267 FROM_HERE, | 1262 FROM_HERE, |
1268 base::Bind(&RemoveEventListenerOnUI, | 1263 base::Bind(&RemoveEventListenerOnUI, |
1269 profile, | 1264 profile, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1371 for (std::set<EventListener>::iterator it = listeners.begin(); | 1366 for (std::set<EventListener>::iterator it = listeners.begin(); |
1372 it != listeners.end(); ++it) { | 1367 it != listeners.end(); ++it) { |
1373 if (!it->ipc_sender.get()) { | 1368 if (!it->ipc_sender.get()) { |
1374 // The IPC sender has been deleted. This listener will be removed soon | 1369 // The IPC sender has been deleted. This listener will be removed soon |
1375 // via a call to RemoveEventListener. For now, just skip it. | 1370 // via a call to RemoveEventListener. For now, just skip it. |
1376 continue; | 1371 continue; |
1377 } | 1372 } |
1378 | 1373 |
1379 if (is_guest && | 1374 if (is_guest && |
1380 (it->embedder_process_id != webview_info.embedder_process_id || | 1375 (it->embedder_process_id != webview_info.embedder_process_id || |
1381 it->embedder_routing_id != webview_info.embedder_routing_id || | |
1382 it->webview_instance_id != webview_info.instance_id)) | 1376 it->webview_instance_id != webview_info.instance_id)) |
1383 continue; | 1377 continue; |
1384 | 1378 |
1385 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) | 1379 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) |
1386 continue; | 1380 continue; |
1387 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) | 1381 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) |
1388 continue; | 1382 continue; |
1389 if (it->filter.window_id != -1 && window_id != it->filter.window_id) | 1383 if (it->filter.window_id != -1 && window_id != it->filter.window_id) |
1390 continue; | 1384 continue; |
1391 if (!it->filter.types.empty() && | 1385 if (!it->filter.types.empty() && |
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2082 std::string sub_event_name; | 2076 std::string sub_event_name; |
2083 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); | 2077 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); |
2084 | 2078 |
2085 int webview_instance_id = 0; | 2079 int webview_instance_id = 0; |
2086 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); | 2080 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &webview_instance_id)); |
2087 | 2081 |
2088 base::WeakPtr<ChromeRenderMessageFilter> ipc_sender = ipc_sender_weak(); | 2082 base::WeakPtr<ChromeRenderMessageFilter> ipc_sender = ipc_sender_weak(); |
2089 | 2083 |
2090 int embedder_process_id = | 2084 int embedder_process_id = |
2091 ipc_sender.get() ? ipc_sender->render_process_id() : -1; | 2085 ipc_sender.get() ? ipc_sender->render_process_id() : -1; |
2092 int embedder_routing_id = routing_id(); | |
2093 | 2086 |
2094 const Extension* extension = | 2087 const Extension* extension = |
2095 extension_info_map()->extensions().GetByID(extension_id()); | 2088 extension_info_map()->extensions().GetByID(extension_id()); |
2096 std::string extension_name = extension ? extension->name() : extension_id(); | 2089 std::string extension_name = extension ? extension->name() : extension_id(); |
2097 | 2090 |
2098 bool is_guest = webview_instance_id != 0; | 2091 bool is_guest = webview_instance_id != 0; |
2099 // We check automatically whether the extension has the 'webRequest' | 2092 // We check automatically whether the extension has the 'webRequest' |
2100 // permission. For blocking calls we require the additional permission | 2093 // permission. For blocking calls we require the additional permission |
2101 // 'webRequestBlocking'. | 2094 // 'webRequestBlocking'. |
2102 if ((!is_guest && extra_info_spec & | 2095 if ((!is_guest && extra_info_spec & |
(...skipping 14 matching lines...) Expand all Loading... | |
2117 if (!is_guest && extensions::PermissionsData::GetEffectiveHostPermissions( | 2110 if (!is_guest && extensions::PermissionsData::GetEffectiveHostPermissions( |
2118 extension).is_empty()) { | 2111 extension).is_empty()) { |
2119 error_ = keys::kHostPermissionsRequired; | 2112 error_ = keys::kHostPermissionsRequired; |
2120 return false; | 2113 return false; |
2121 } | 2114 } |
2122 | 2115 |
2123 bool success = | 2116 bool success = |
2124 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( | 2117 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( |
2125 profile_id(), extension_id(), extension_name, | 2118 profile_id(), extension_id(), extension_name, |
2126 event_name, sub_event_name, filter, extra_info_spec, | 2119 event_name, sub_event_name, filter, extra_info_spec, |
2127 embedder_process_id, embedder_routing_id, webview_instance_id, | 2120 embedder_process_id, webview_instance_id, ipc_sender_weak()); |
2128 ipc_sender_weak()); | |
2129 EXTENSION_FUNCTION_VALIDATE(success); | 2121 EXTENSION_FUNCTION_VALIDATE(success); |
2130 | 2122 |
2131 helpers::ClearCacheOnNavigation(); | 2123 helpers::ClearCacheOnNavigation(); |
2132 | 2124 |
2133 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( | 2125 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( |
2134 &helpers::NotifyWebRequestAPIUsed, | 2126 &helpers::NotifyWebRequestAPIUsed, |
2135 profile_id(), make_scoped_refptr(GetExtension()))); | 2127 profile_id(), make_scoped_refptr(GetExtension()))); |
2136 | 2128 |
2137 return true; | 2129 return true; |
2138 } | 2130 } |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2298 } else if ((*it)->name().find("AdBlock") != std::string::npos) { | 2290 } else if ((*it)->name().find("AdBlock") != std::string::npos) { |
2299 adblock = true; | 2291 adblock = true; |
2300 } else { | 2292 } else { |
2301 other = true; | 2293 other = true; |
2302 } | 2294 } |
2303 } | 2295 } |
2304 } | 2296 } |
2305 | 2297 |
2306 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); | 2298 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); |
2307 } | 2299 } |
OLD | NEW |